Решил создать союз между arduino и Master Scada.

Почему именно Master Scada? Отвечу: Master Scada работает через собственный OPC сервер имеющий множество настроек, что позволяет хорошо рассмотреть процесс опроса каналов, ну и он бесплатный на 32 канала).

Для теста воспользовался двумя ультразвуковыми дальномерами HC-04 и платой arduino uno.

Передачу осуществил по протоколу modbus.

Чтобы воспользоваться в arduino библиотекой SimpleModbusSlaveV9, нужно её сперва установить.

Скетч залитый в arduino:

//подключаем библиотеку
#include <SimpleModbusSlave.h>
//объявляем переменные
#define echoPin 2
#define trigPin 3
#define echoPin1 4
#define trigPin1 5

enum
{
ADC_VAL,
PWM_VAL,
HOLDING_REGS_SIZE=4 //вводим количество каналов

};

unsigned int holdingRegs[HOLDING_REGS_SIZE];

void setup()
{

modbus_configure(&Serial, 115200, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs); //вводим скорость опроса

modbus_update_comms(115200, SERIAL_8N2, 1);

// для УЗ датчиков

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
}

void loop()
{
int duration, cm;

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58;

int duration1, cm1;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
cm1 = duration1 / 58;
delay(100);


// Полученные значения передаем в OPC
modbus_update();
holdingRegs[1] =cm1; //адрес 1
holdingRegs[2] = cm; //адрес 2
holdingRegs[3] = cm; //адрес 2


}

Далее настраиваем OPC. Выбираем номер порта и скорость опроса:



Создаем устройство выставляем время ответа и период опроса:



Добавляем Тэги, для каждого параметра свой тэг. Вводим в графе адрес значение соответствующее holdingRegs[ ]:



И запускаем:



Теперь переходим к настройке MasterScada.

Соединяем OPC сервер со скадой рисуем мнемосхему для визуализации:



И запускаем:



Сбоев в работе обнаружено не было, в перспективе подключение датчиков с токовым выходом 4-20 мА и использование платформы arduino как модуль сбора данных и индикации на небольших объектах.

Если кому интересно могу описать обмен arduino + Delphi

Комментарии (13)


  1. gorbln
    01.03.2016 14:47

    Спасибо за статью.
    Вы передаёте три параметра, но используете четыре канала. Каков физический смысл канала 0? Это обязательный канал, или он добавлен "про запас"?

    P.S. Ещё бы описание, как в мастерскаде работать с UART-ом. То есть, приходит пакет, мы его парсим и отдаём скаде. Я так понимаю, этим OPC сервер как раз занимается. Не поделитесь толковой ссылкой?


  1. Goska
    01.03.2016 16:01
    +1

    канал 0 обязателен без него передача работать не будет.

    OPC сервер можно настроить по разному. с UART не работал, но попробовать можно, думаю получится
    http://www.insat.ru/prices/info.php?pid=6944 ссылка на OPC сервер Modbus Universal MasterOPC Server 32. Версия 3.1.14


  1. kail
    01.03.2016 22:41
    +1

    MasterSCADA не имеет собственного OPC-сервера, она просто работает по протоколу OPC.
    Собственно, кроме OPC она умеет только с ограниченным количеством ПЛК общаться. Другие системы зачастую сами могут общаться с оборудованием напрямую.

    Да, у разработчика этой скады есть modbus OPC сервер с бесплатной версией на 32 тега. Также есть у них и другие OPC-сервера, наиболее функциональный и перспективный — Multi-Protocol MasterOPC, состоящий из основы и плагинов, которые они потихоньку пилят. Демо-версия может работать с 1 устройством.
    Но вместо Modbus MasterOPC к MasterSCADA вполне могут купить Lectus, потому что он дешевле.

    Для объекта 32 тега маловато, конечно. Bool-значения можно упаковывать в слова (до 32 бит), в мастерскаде есть готовые блоки для упаковки-распаковки. Но это может показаться несколько неудобным.


    1. gorbln
      02.03.2016 10:13

      Спасибо за информацию.
      У меня задача небольшая — отображение в красивом виде параметров лабораторного стенда. Думаю, 32 каналов мне хватит. Навскидку, что-то около 8-10 каналов получается. Но хотелось бы получать и отображать отладочную информацию с испытуемого прибора, а он общается по UART.


      1. Goska
        02.03.2016 12:12

        А что за прибор если не секрет?


        1. gorbln
          02.03.2016 13:53

          Электропневматический позиционер. Шайтан-машина, питающаяся от токового входа 4...20 мА, при этом содержащая регулятор положения, и управляющая пневматическим выходом с расходом под 100 л/мин. Из внешних интерфейсов может HART и UART.


      1. kail
        02.03.2016 12:24
        +1

        С красивым отображением у мастерскады дела так себе, но рабоче-крестьянскую мнемосхему и небольшой проектик можно накидать очень быстро.

        Если под UART понимается обычный TTL 5В, то преобразователь ttl-usb за 1-1,5$ вам поможет. Modbus OPC сервер требует com-порт или TCP адрес-порт.


        1. gorbln
          02.03.2016 13:55

          UART 3-вольтовый, но да, именно адаптер за 3 доллара на палёном FTDI я и использую =)
          Про опц сервер понял, посмотрю, что там и как


  1. gorbln
    02.03.2016 11:20

    Если кому интересно могу описать обмен arduino + Delphi

    Мне интересно. Ну, то есть, я представляю что и как, но интересует, какие компоненты используются сейчас для общения по COM порту.


    1. Goska
      02.03.2016 11:51
      +1

      Последний раз использовал компонент comdrv32 — полёт нормальный


  1. sim31r
    08.03.2016 17:04
    +1

    Решал примерно такую же задачу, но выбрал не COM порт, а Ethernet Shield на W5100:
    https://www.arduino.cc/en/Main/ArduinoEthernetShield
    очень удобно, поверх него так же можно гонять Modbus TCP (обычно SCADA с ним без OPC работает, напрямую), автоматически решается проблема с гальванической развязкой, удаленностью, масштабируемостью. Проверял на "перегрузки" в локальной офисной сети, где постоянный сетевой шум от 2000 компьютеров, изредка пропадали пинги, но никаких зависаний за несколько суток работы (не все ПЛК с этим справляются кстати, ICP просто зависали). В выделенной сети вообще всё хорошо работает.


    1. gorbln
      09.03.2016 11:02

      Интересно!
      А как формировали пакет? Есть какое-то описание?


      1. sim31r
        09.03.2016 20:08
        +1

        Если речь о пакете modbus TCP, я его формирование "перенес" на верхний уровень, для обеспечения большей гибкости.
        Например программа Lectus OPC может работать не только в режиме Modbus TCP, а в режиме Modbus over TCP. Сразу идет запрос в том виде, как он будет передан по RS232, RS485 (с контрольной суммой). Ранее запросы у меня принимала Moxa Nport server, а тут я то же самое сделал на Arduino + 2 шилда, копеечный RS485 и Ethernet Shield. Еще раньше работал с Moxa Nport server как с виртуальными портами, у них есть драйвер специальный, но удобнее оказалось работать с ними как с TCP сервером, никаких СОМ портов в системе, как-то стабильнее и логичнее. Далее запросы перенаправляются на модули ввода-вывода с интерфейсом modbus rtu.