ScadaPy Creator для python
Ускорение процесса создания modbus.py
Очередной раз хочется поделиться своим опытом и результатами экспериментов в области промышленной автоматизации.
В настоящий момент мы немного поменяли концепцию построения системы опроса устройств с использованием языка python.
Большинство модулей SCADA систем строится по принципу связки «исполняемый файл — файл настройки».
Исполняемый файл — это как правило скомпилированный бинарный файл, который непосредственно занимается опросом подчиненных устройств по определенному протоколу, его еще могут называть «драйвером протокола».
Параметры опроса (порт, адреса, скорость и т.д.) для драйвера записываются в файл настройки, который бывает разных типов. Это может быть таблица или таблицы в какой-либо СУБД, например, часто используется SQLite или Firebird, может также использоваться файл xml.
Работая с различными устройствами, мы пришли к выводу, что было бы очень удобно иметь в наличие уже скомпилированный файл драйвера со всеми настройками (переменными) внутри, хорошо было бы еще иметь возможность корректировать драйвер уже на сервере при организации опроса устройств.
Для подобной цели рассматривался вариант создания приложения, которое на основе конфигурационного файла xml будет создавать драйвер на python.
Основное условие — программа, формирующая код драйвера, должна обязательно работать и в Windows и в Linux.
Первоначально решили сделать приложение на PyQt, но откровенно говоря, для нас оказалось довольно сложно писать программу в такой связке, не имея в наличие полноценной визуальной IDE для построения интерфейса пользователя.
Ранее приходилось часто делать программы на C Builder и Delfi, поэтому обратили свой взор в сторону Lazarus. Попробовали скомпилировать программы на разных ОС — результатом остались довольны.
Решили попытаться написать приложение на Lazarus IDE 1.8.2., назвали его ScadaPy Creator.
Все настройки конфигурации сохраняются в одном единственном файле xml.
После компиляции на выходе мы имеем драйвер modbus, драйвер счетчика Меркурий-230, сервер http Json и файл html в качестве клиента.
Как это работает
Запускаем драйвер modbus или Меркурий-230 для опроса устройств.
Получив ответы согласно описанным переменным, драйвер передает данные по UDP протоколу на порт 64000. Запускаем Json HTTP сервер, который в свою очередь получает данные от драйвера и формирует пакет в формате json для http запросов.
Запускаем в браузере html файл клиента и видим уже обработанные данные в трех форматах — json, текстовом и в виде SVG картинки.
Далее можно редактировать и html и SVG под свои нужды.
Мне, откровенно говоря, достаточно представления данных в виде простой таблицы, а для кого-то лучше информация воспринимается в виде мнемосхемы.
Подобный вариант использования python скриптов был неоднократно опробован на удаленных подстанциях, где установлены объектовые серверы на базе ОС Linux и доступ туда имелся только по SSH.
Разумеется, для создания полноценной SCADA системы, со множеством входных сигналов и измерений этот вариант не подходит, там однозначно нужно применять
стабильно работающий софт от проверенных производителей.
Вот типичный вариант, что называется, из последнего.
Задача:
Имеется устройство, работающее по протоколу modbus — датчик температуры и влажности Lumel P18.
Нужно получать значения температуры и влажность каждые пять минут и отображать на экране монитора в любом виде.
Устройство находится далеко, на расстоянии около 90 км от офиса.
Для начала создаем проект.
У Р18 температура берется по двум адресам 7002 и 7003, 32 бит, число с плавающей запятой, а влажность берется по двум адресам 7004 и 7005, 32 бит, число с плавающей запятой.
Кроме температуры и влажности, имеется возможность отображать и более развернутую информацию на объекте: относительная и абсолютная влажность, точка росы и т.д.
После генерации, будут созданы два файла modbus.py и jserver.py.
Отправляем эти файлы на сервер объекта, а на компьютере клиента запускаем jclient.html.
Можно конечно файл html переместить и на web сервер.
Вот в принципе и все.
Проект с примерами можно скачать здесь.
P.S.
Осталась одна проблема, решение которой мы пока не нашли.
Запущенный драйвер опроса отбирает 100% ресурсов процессора, если запустить два драйвера, то соответственно каждый отбирает по 50%. На работе объектового сервера это никак не отражается, но почему так?
Приветствуется любая критика, замечания и советы, но конструктивная и по существу.