Arduino+Modbus+MasterScada

    Решил создать союз между 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
    • 0
      Спасибо за статью.
      Вы передаёте три параметра, но используете четыре канала. Каков физический смысл канала 0? Это обязательный канал, или он добавлен "про запас"?

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

        OPC сервер можно настроить по разному. с UART не работал, но попробовать можно, думаю получится
        http://www.insat.ru/prices/info.php?pid=6944 ссылка на OPC сервер Modbus Universal MasterOPC Server 32. Версия 3.1.14
        • +1
          MasterSCADA не имеет собственного OPC-сервера, она просто работает по протоколу OPC.
          Собственно, кроме OPC она умеет только с ограниченным количеством ПЛК общаться. Другие системы зачастую сами могут общаться с оборудованием напрямую.

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

          Для объекта 32 тега маловато, конечно. Bool-значения можно упаковывать в слова (до 32 бит), в мастерскаде есть готовые блоки для упаковки-распаковки. Но это может показаться несколько неудобным.
          • 0
            Спасибо за информацию.
            У меня задача небольшая — отображение в красивом виде параметров лабораторного стенда. Думаю, 32 каналов мне хватит. Навскидку, что-то около 8-10 каналов получается. Но хотелось бы получать и отображать отладочную информацию с испытуемого прибора, а он общается по UART.
            • 0
              А что за прибор если не секрет?
              • 0
                Электропневматический позиционер. Шайтан-машина, питающаяся от токового входа 4...20 мА, при этом содержащая регулятор положения, и управляющая пневматическим выходом с расходом под 100 л/мин. Из внешних интерфейсов может HART и UART.
              • +1
                С красивым отображением у мастерскады дела так себе, но рабоче-крестьянскую мнемосхему и небольшой проектик можно накидать очень быстро.

                Если под UART понимается обычный TTL 5В, то преобразователь ttl-usb за 1-1,5$ вам поможет. Modbus OPC сервер требует com-порт или TCP адрес-порт.
                • 0
                  UART 3-вольтовый, но да, именно адаптер за 3 доллара на палёном FTDI я и использую =)
                  Про опц сервер понял, посмотрю, что там и как
            • 0
              Если кому интересно могу описать обмен arduino + Delphi

              Мне интересно. Ну, то есть, я представляю что и как, но интересует, какие компоненты используются сейчас для общения по COM порту.
              • +1
                Последний раз использовал компонент comdrv32 — полёт нормальный
              • +1
                Решал примерно такую же задачу, но выбрал не COM порт, а Ethernet Shield на W5100:
                https://www.arduino.cc/en/Main/ArduinoEthernetShield
                очень удобно, поверх него так же можно гонять Modbus TCP (обычно SCADA с ним без OPC работает, напрямую), автоматически решается проблема с гальванической развязкой, удаленностью, масштабируемостью. Проверял на "перегрузки" в локальной офисной сети, где постоянный сетевой шум от 2000 компьютеров, изредка пропадали пинги, но никаких зависаний за несколько суток работы (не все ПЛК с этим справляются кстати, ICP просто зависали). В выделенной сети вообще всё хорошо работает.
                • 0
                  Интересно!
                  А как формировали пакет? Есть какое-то описание?
                  • +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.

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