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

    В продолжение статей здесь, здесь, здесь и здесь., хочу привести примеры простого использования 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

    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.