python

ScadaPy возможности применения modbus протокола

  • вторник, 17 октября 2017 г. в 03:13:24
https://habrahabr.ru/post/340196/
  • Python


В продолжение статей здесь, здесь, здесь и здесь., хочу привести примеры простого использования python скриптов из серии ScadaPy, как в сфере домашней автоматизации, так и на производственных предприятиях.


1. Модули ADAM от Advantech и ScadaPy.


Простой пример использования python для опроса модулей Advantech Серии 4000.


Для считывания данных и передачи команд управления используется собственный протокол DCON. Когда-то давно была распространена программа от этого производителя и называлась, если не ошибаюсь, Adam View или GeniDAQ. Мы в свое время с нее начинали, было очень интересно. На сегодняшний день мне достались несколько модулей, которые вполне еще работоспособны.


image

Перечень команд для опроса дается в документации к каждому модулю. Можно прочитать здесь.


Для опроса используется интерфейс 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.

image

Библиотеки положил здесь на github.com


2. ScadaPy и модуль master_ping.py.


Используется для обнаружения пропадания связи с подчиненными серверами на удаленных объектах. Через равные промежутки времени осуществляется отправка ICMP пакета на удаленный сервер, в случае отсутствия связи происходит отображение на мнемосхеме. Конечно желательно добавить какую — нибудь звуковую сигнализацию с квитированием.


image

Библиотеки положил здесь на github.com


3. ScadaPy и модуль генератора Smartgen.


Об этом я писал ранее здесь.

Как вариант реализации программы контроля ошибок работы генератора и его текущего состояния. Очень важные параметры из всех это уровень топлива, нагрузочные токи и температурный режим двигателя. Как правило именно эти параметры проверяются регулярно в процессе работы генератора.


image

Возможен консольный вариант, мне он больше нравится


image

Библиотеки положил здесь на github.com


4. ScadaPy и модуль master_http.


Опишу недавний пример реализации.

Установлено устройство I-8831 на объекте, работает по протоколу Modbus TCP. Имеет 32 дискретных входа. Необходимо контролировать состояние «блинкеров» ячеек отходящих фидеров подстанции. Жестких требований по режиму real-time нет, так как далеко в горах находится, достаточно раз в 15 минут получать информацию.


image

Реализовал с помощью библиотек 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