В продолжение статей здесь, здесь, здесь и здесь., хочу привести примеры простого использования python скриптов из серии ScadaPy, как в сфере домашней автоматизации, так и на производственных предприятиях.
1. Модули ADAM от Advantech и ScadaPy.
Простой пример использования python для опроса модулей Advantech Серии 4000.
Для считывания данных и передачи команд управления используется собственный протокол DCON. Когда-то давно была распространена программа от этого производителя и называлась, если не ошибаюсь, Adam View или GeniDAQ. Мы в свое время с нее начинали, было очень интересно. На сегодняшний день мне достались несколько модулей, которые вполне еще работоспособны.
Перечень команд для опроса дается в документации к каждому модулю. Можно прочитать здесь.
Для опроса используется интерфейс rs485. В наличие оказалась только модель ввода вывода 4050, поэтому обработку написал для этой модели. Линии ввода 7 разрядов, линии вывода 8 разрядов.
Чтобы прочитать данные отправляем в порт команду ‘$016\r’
$ — управляющий символ
01 – адрес устройства
6 – команда
serialPort.write('$016\r')
dataIn = serialPort.read(8)
serialPort.flushInput()
В ответ будет получено 8 байт вида !007F00. Информационные байты 3 и 4 сообщают о состоянии дискретных входов DI, а байты 1 и 2 сообщают о состоянии дискретных выходов DO. Ниже дается код расшифровки.
if(dataIn[0]=='!'):
byteDI = str(bin(int('0x'+dataIn[3]+dataIn[4],16))[2:] ).zfill(7)
byteCoil = str(bin(int('0x'+dataIn[1]+dataIn[2],16))[2:] ).zfill(8)
В дальнейшем, состояние дискретных входов ADAM-4050 располагаются в slave части программы в регистрах DISCRETE_INPUTS, а состояние дискретных выходов передается в регистры COILS.
Библиотеки положил здесь на github.com
2. ScadaPy и модуль master_ping.py.
Используется для обнаружения пропадания связи с подчиненными серверами на удаленных объектах. Через равные промежутки времени осуществляется отправка ICMP пакета на удаленный сервер, в случае отсутствия связи происходит отображение на мнемосхеме. Конечно желательно добавить какую — нибудь звуковую сигнализацию с квитированием.
Библиотеки положил здесь на github.com
3. ScadaPy и модуль генератора Smartgen.
Об этом я писал ранее здесь.
Как вариант реализации программы контроля ошибок работы генератора и его текущего состояния. Очень важные параметры из всех это уровень топлива, нагрузочные токи и температурный режим двигателя. Как правило именно эти параметры проверяются регулярно в процессе работы генератора.
Возможен консольный вариант, мне он больше нравится
Библиотеки положил здесь на github.com
4. ScadaPy и модуль master_http.
Опишу недавний пример реализации.
Установлено устройство I-8831 на объекте, работает по протоколу Modbus TCP. Имеет 32 дискретных входа. Необходимо контролировать состояние «блинкеров» ячеек отходящих фидеров подстанции. Жестких требований по режиму real-time нет, так как далеко в горах находится, достаточно раз в 15 минут получать информацию.
Реализовал с помощью библиотек Modbus_tk и requests. Принцип простой, данные получаем по протоколу Modbus TCP и отправляем на сервер по http методом GET. Все предельно просто.
import requests.packages.urllib3
resp = requests.get('http://myserver.ru/alive.php?v='+val+'&d='+d+'&r='+reg+'&s='+st+'&dv='+device, timeout=5 )
Возможна реализация и с добавлением SSL, а также логином и паролем.
from requests.auth import HTTPBasicAuth
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings() # чтобы не сообщал о непроверенном сертификате
resp = requests.get('https://myserver.ru/alive.php?v='+val+'&d='+d+'&r='+reg+'&s='+st+'&dv='+device, timeout=3, verify=False ,auth=HTTPBasicAuth(login, password))
# verify=False – не проверять самоподписной сертификат
# login, password – указать логин и пароль
На стороне сервера можно ограничиться одним PHP скриптом с функцией сохранения в базу данных. Как пример я указал сохранение в файл.
$val=$_GET['v'];
$ind=$_GET['d'];
$reg=$_GET['r'];
$state=$_GET['s'];
$device=$_GET['dv'];
$dt=Date("d.m.Y");
$now = DateTime::createFromFormat('U.u', microtime(true));
$tm = $now->format("m-d-Y H:i:s.u");
$getData=$tm.' '.$state.' '.$device.' '.$reg.' '.$val;
$fp=fopen('./alive.log','a+');
if($fp)
{
fputs($fp,$getData."\n");
}
fclose($fp);
Библиотеки положил здесь на github.com