Добрый день, уважаемые читатели!
Расскажу вам о своём проекте, который делаю в свободное время уже три года.
Работаю в компании занимающейся автоматизацией на должности программиста контроллеров. Последнее время, в основном, используем Siemens, ПЛК SIMATIC S7 и пакет визуализации WinCC, но есть опыт и по другим производителям. Профиль компании – нефтегазовый сектор (резервуарные парки, насосные, железнодорожные эстакады, причальные комплексы, системы пожаротушения).
Наверное, с самого первого проекта, меня интересовал вопрос тестирования программного обеспечения до этапа пуско-наладки на реальном оборудовании. Не так давно, на хабре был пост — Программирование ПЛК Siemens на Simatic Step7, и адреналин, про который говорилось в комментариях, знаком мне не понаслышке.
В настоящий момент, используя мою программную платформу, мы можем избавиться от большей части ошибок и отладить автоматизированные функции в комфортных условиях офиса (а не сидя на катушке кабеля, в неотапливаемом помещении, в морозный зимний день).
Введение
В упрощённом виде наша АСУТП состоит из следующих компонентов:
- Датчики (давления, температуры) и исполнительные механизмы (задвижки, насосы).
- Программируемый логический контроллер (ПЛК).
- Система визуализации (SCADA, HMI).
От датчиков и исполнительных механизмов сигналы поступают в ПЛК, обрабатываются и передаются в систему визуализации, с которой взаимодействует человек-оператор. Команды оператора передаются обратно в ПЛК, который генерирует нужные сигналы для управления исполнительными механизмами. Автоматизированные функции и противоаварийные защиты (ПАЗ) реализуются в ПЛК.
У нас в разработке, обычно, участвуют два человека. Один пишет программу для ПЛК, второй делает систему визуализации. Сейчас стараемся задействовать третьего – тестировщика. Не могу сказать, что мы реализуем очень сложные алгоритмы управления, но есть своя специфика, связанная, прежде всего, с размерами системы. Например, мой текущий проект в сумме имеет приблизительно 2300 сигналов, большая часть из которых входные (около 1500).
Для тестирования, стенд, состоящий из ПЛК и системы визуализации, собираем в офисе. Некоторые производители предлагают программные симуляторы ПЛК, так что, иногда, можно обойтись обычной компьютерной техникой. Например, S7PLCSim от Siemens:
Остаётся вопрос с датчиками и исполнительными механизмами, которые связаны с нашей системой через дискретные/аналоговые входные/выходные сигналы.
Некоторые компании производители ПЛК предоставляют инструменты для программной имитации входных сигналов. Например, через среду программирования Step7 контроллеров Siemens можно значение любого входного сигнала, в реальном ПЛК, задать принудительно (форсировать), а если вы используете симулятор контроллера, просто установить через графический интерфейс. На приведённой выше иллюстрации: IB 10 – байт входов, IW 5 – слово входов, QB 7 и QW 2 – выхода, а MD 123 – двойное слово во внутренней памяти котроллера.
Другой подход, который необходимо упомянуть, это имитация входных сигналов на уровне железа. Для нас данный подход неудобен – слишком много времени тратится на подключение. Кроме того, в офисе, обычно, есть только модуль процессора от ПЛК, а модули для подключения входных/выходных сигналов, которые ставятся в отдельных шкафах, стоят на складе или уже отправлены для монтажа к заказчику.
Понятно, что таким средствами, можно провести простую проверку прохождения сигналов от контроллера в систему визуализации и обратно. Можно отладить не очень сложные автоматические алгоритмы, благо, что в Step7 есть точки останова (breakpoints). Но если в алгоритме участвует несколько единиц оборудования (несколько насосов + обвязка из задвижек и датчиков) это достаточно сложно.
Идея
Вот уже несколько лет для каждого своего проекта, помимо программы для ПЛК, я создаю программный симулятор автоматизируемого объекта. Англоязычные источники иногда называют подобные системы — Factory Acceptance Test (FAT) simulator (симулятор для заводской приёмки) и классифицируют их по степени достоверности симуляции. В сети совсем не много информации по созданию подобных симуляторов, в основном используются Matlab + Simulink, LabView, кто-то реализует симуляцию внутри ПЛК. Есть специальные средства разработки – WinMOD, Mynah MiMiC, Siemens SIMIT, APROS.
После некоторых размышлений, решил попробовать создать свою платформу. Прежде всего, было желание изучить что-то новое (.NET и С#). Обстоятельства сложились удачно, и наша компания, для одного из проектов, приобрела готовую библиотеку OPC клиента. Это позволило мне сконцентрироваться на основной задаче.
Чтобы создать программный симулятор для стенда с реальным ПЛК необходимо предусмотреть в нём подмену данных получаемых с физических входов на имитационные. К сожалению, это приходится делать в самой программе контроллера. Следующий шаг – обеспечить доступ к этим данным через OPC интерфейс. После этого, можно приступать к написанию программы ПЛК и созданию симулятора автоматизируемого объекта.
Если использовать S7PLCSim – в подмене данных нет необходимости. При этом систему визуализации придётся запустить на той же машине вместе с S7PLCSim и симулятором объекта (ограничение S7PLCSim). В случае нехватки мощности можно попробовать разнести их с помощью бесплатной утилиты NetToPLCSim.
Платформа
Платформа, которую я разработал, похожа на примитивную среду для создания систем визуализации. Работу можно разбить на три этапа:
- Создание переменных (Item). Их всего три типа:
- Internal — внутренняя переменная, которая используется для связи между объектами внутри симулятора.
- OPC — переменная связанная с внешним OPC сервером. В данном случае симулятор выступает OPC клиентом.
- S7PLCSim — данная переменная предназначена для связи с симулятором контроллера SIMATIC S7. Поддерживаются области памяти I, Q, M и DB.
На текущей стадии развития, платформа позволяет подключение только к одному симулятору контроллера SIMATIC S7 и одному OPC серверу. Зато, все переменные видны по OPC, так как платформа является OPC сервером.
Добавлять и удалять переменные можно во время работы симулятора. Система не позволит удалить переменную, которая используется.
- Создание объектов симуляции. В настоящий момент, реализовано 13 типов объектов. Среди них есть совсем примитивные – дискретный и аналоговый датчики, и достаточно сложные – генератор аналоговых сигналов и задвижка. Один из типов объектов позволяет писать скрипты на C#. Конфигурируя каждый объект симуляции, пользователь устанавливает переменные (Item), которые будет читать или писать данный объект, а также другие его параметры.
Объекты можно добавлять, удалять и редактировать его свойства во время работы симулятора.
- Создание интерфейса пользователя. Как база используется панель с закладками (TabControl). На каждом созданном экране можно размещать отображения объектов симуляции. Например, аналоговый датчик, можно отобразить его в виде ползунка, поля для ввода значения или графика, в любом месте панели. Один и тот же объект можно вывести любое количество раз, на одной или нескольких панелях, в разных видах.
Для того чтобы удалить объект симуляции необходимо сначала удалить все его отображения на всех панелях.
Конфигурация симулятора сохраняются в виде XML файла с простой структурой:
<ProcessSimulator> <Items> [Переменные] </Items> <SimulationObjects> [Объекты симуляции] </SimulationObjects> <Screens> [Панели с отображениями объектов симуляции] </Screens> </ProcessSimulator>
Это позволяет редактировать его вручную, генерировать скриптами, например в Excel, а также полноценно использовать систему контроля версий.
Так может выглядеть интерфейс симулятора:
Возможности
Создание симулятора автоматизируемого объекта даёт множество преимуществ:
- Удобство разработки и тестирования. Создавая программу для ПЛК и параллельно с ней симулятор объекта, я могу проверить каждый участок кода и смоделировать практически любую ситуацию. Разработчик системы визуализации, также, пользуется всеми удобствами симулятора, не вникая, при этом, в программу ПЛК (и не дёргая меня, каждый раз, когда хочет что-то проверить). Более-менее нормальный графический интерфейс позволяет привлечь к тестированию системы человека, который не принимал участия в её создании, а значит, найдёт больше ошибок, чем любой из создателей. Кроме того, даже на объекте, можно переключить систему в режим симуляции, что-то доработать и проверить полностью программным методом, без использования реального оборудования.
- Демонстрация работы программной части системы независимо от степени готовности всего остального.
- Обучение операторов. Работа системы в режиме симуляции позволяет оператору более подробно, и главное без стресса, изучить работу системы (и найти ошибки).
- Упрощение гарантийного сопровождения системы. Если воссоздать условия возникновения ошибки, иногда, можно обойтись без командировки на объект.
Дальнейшее развитие
Так как это мой первый опыт создания чего-то серьёзного на С#, прежде всего, хотелось бы переработать архитектуру:
- Выделить слой отвечающего за внешние соединения и реализовать их в виде подключаемых модулей (Plug-in). Это позволит подключаться к нескольким OPC серверам и экземплярам Siemens SIMATIC S7PLCSim. Кроме того, облегчит добавление других типов соединений, например Modbus.
- Внедрить класс визуальных элементов не связанных с симуляционными объектами. В настоящий момент, любой элемент интерфейса пользователя на экране обязательно связан с объектом симуляции, что не очень удобно. Иногда действительно не хватает возможности чего-нибудь нарисовать, вставить картинку или просто написать поясняющий текст.
- Создать систему подключаемых модулей (Plug-in) для объектов симуляции и их отображений. Основное направления развития платформы – расширение библиотеки объектов симуляции, поэтому удобство их создания и интеграции является ключевым фактором.
Сайт
На сайте automation.ucoz.com можно скачать демонстрационную версию. Она не ограничена по времени, но в ней можно создать только 20 переменных и 10 объектов симуляции (все типы, кроме С# скриптов).
Автор: Alexor