Подключение ARDUINO к Симп Лайт через MODBUS RTU
Последнее изменение:
Существует несколько способов взаимодействия Arduino со СКАДА Симп Лайт, одним из которых является управление через Modbus RTU.
Этот способ не требует установки и использования какого либо OPC-сервера, взаимодействие СКАДА и Ардуино ведется НАПРЯМУЮ.
Arduino — это электронный конструктор и удобная платформа быстрой разработки электронных устройств. Программируется через USB без использования программаторов.
Modbus — открытый коммуникационный протокол, основанный на архитектуре ведущий-ведомый (master-slave).
В этом методе приложение SCADA выступает в роли Modbus Master, а Arduino выполняет функцию Modbus Slave.
Для начала работы, необходимо скачать и установить приложение Arduino IDE - https://www.arduino.cc/en/main/software
Затем нужно загрузить библиотеку, которая необходима для работы с Modbus - https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
Далее необходимо выбрать модель Arduino, с которой вы работаете. В нашем случае это модель Arduino UNO.
Затем необходимо настроить порт, по которому происходить передача данных. Если вы не знаете к какому порту подключена плата, сделайте следующее:
После того как узнали к какому номеру порта подключена Arduino UNO, необходимо указать его в программе Arduino IDE.
Загрузите библиотеку Modbus в Arduino IDE и добавьте ее в проект.
Среда разработки готова к реализации проектов с использованием протокола MODBUS RTU/
Далее будет представлен код 4-х демонстрационных проектов:
1) Подключение датчика температуры DHT22 и получение данных с него в СКАДА Симп Лайт
2) Подключение модуля реле (4 реле) и управление ими из СКАДА Симп Лайт
3) Подключение кнопки (сухого контаката) и отображение её статуса в СКАДА Симп Лайт
4) Подключение светодиода и управление им из СКАДА Симп Лайт
В конце статьи есть ссылки на архивы, которые включают код для Ардуино и проект для СКАДЫ Симп Лайт.
1. Подключение датчика температуры DHT22
#include <iarduino_DHT.h> #include <ModbusRtu.h> #include <SoftwareSerial.h> #include <DHT.h> #define ID 1 // адрес ведомого #define DHTPIN 12 // номер входа, подключенный к датчику температуры #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); iarduino_DHT sensor1(3); Modbus slave(ID, 0, 0); int _gtv1; int _gtv2; uint16_t au16data[11]; unsigned long _dht1Tti = 0UL; void setup() { // настраиваем последовательный порт ведомого slave.begin(9600); dht.begin(); } void loop() { float _dht1t = dht.readHumidity(); // Считывание влажности float _dht1h = dht.readTemperature(); // Считывание температуры sensor1.read(); slave.poll(au16data, 11); _gtv1 = _dht1t; _gtv2 = _dht1h; au16data[1] = _gtv1; // DHT - pin3 au16data[2] = _gtv2; }
2. Подключение модуля реле (4 реле).
#include <ModbusRtu.h> #define ID 1 // адрес ведомого #define Relay 2 // номер входа, подключенный к реле №1 #define Relay2 4 // номер входа, подключенный к реле №2 #define Relay3 7 // номер входа, подключенный к реле №3 #define Relay4 8 // номер входа, подключенный к реле №4 #define stlPin 13 // номер выхода индикатора работы расположен на плате Arduino //Задаём ведомому адрес, последовательный порт, выход управления TX Modbus slave(ID, 0, 0); int8_t state = 0; // массив данных modbus uint16_t au16data[11]; void setup() { // настраиваем входы и выходы io_setup(); // настраиваем последовательный порт ведомого slave.begin( 9600 ); } void io_setup() { pinMode(Relay, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(Relay3, OUTPUT); pinMode(Relay4, OUTPUT); digitalWrite(Relay, HIGH); digitalWrite(Relay2, HIGH); digitalWrite(Relay3, HIGH); digitalWrite(Relay4, HIGH); } void loop() { // обработка сообщений state = slave.poll( au16data, 11); if ( state > 4){ digitalWrite(Relay, LOW); digitalWrite(Relay2, LOW); digitalWrite(Relay3, LOW); digitalWrite(Relay4, LOW); } io_poll(); } void io_poll() { //Копируем Coil[1] в Discrete[0] au16data[0] = au16data[1]; //Выводим значение регистра 1.3 на светодиод //Сохраняем состояние кнопки в регистр 0.3 digitalWrite(Relay2, bitRead( au16data[1], 0 )); digitalWrite(Relay3, bitRead( au16data[1], 1 )); digitalWrite(Relay4, bitRead( au16data[1], 2 )); digitalWrite(Relay, bitRead( au16data[1], 3 )); }
3. Подключение кнопки.
#include <ModbusRtu.h> #define ID 1 // адрес ведомого #define btnPin 2 // номер входа, подключенный к кнопке #define stlPin 13 // номер выхода индикатора работы расположен на плате Arduino //Задаём ведомому адрес, последовательный порт, выход управления TX Modbus slave(ID, 0, 0); int8_t state = 0; unsigned long tempus; // массив данных modbus uint16_t au16data[11]; void setup() { // настраиваем входы и выходы io_setup(); // настраиваем последовательный порт ведомого slave.begin( 9600 ); } void io_setup() { pinMode(btnPin, INPUT); } void loop() { // обработка сообщений state = slave.poll( au16data, 11); io_poll(); } void io_poll() { //Копируем Coil[1] в Discrete[0] au16data[0] = au16data[1]; //Выводим значение регистра 1.3 на светодиод //Сохраняем состояние кнопки в регистр 0.3 bitWrite( au16data[0], 3, digitalRead( btnPin )); }
4. Подключение светодиода.
#include <ModbusRtu.h> #define ID 1 // адрес ведомого #define stlPin 13 // номер выхода индикатора работы расположен на плате Arduino #define ledPin 2 // номер входа, подключенный к светодиоду Modbus slave(ID, 0, 0); int8_t state = 0; uint16_t au16data[11]; void setup() { // настраиваем входы и выходы io_setup(); // настраиваем последовательный порт ведомого slave.begin( 9600 ); pinMode(ledPin, OUTPUT); // устанавливаем номер входа (Pin 2) как выход } void io_setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); } void loop() { state = slave.poll(au16data, 11); if ( state > 4){ digitalWrite(ledPin, LOW); } io_poll(); } void io_poll() { // Копируем Coil[1] в Discrete[0] au16data[0] = au16data[1]; //Выводим значение регистра 1.3 на светодиод //Сохраняем состояние кнопки в регистр 0.3 digitalWrite( ledPin, bitRead( au16data[1], 3 )); }
После того как код записан в Arduino IDE его необходимо загрузить на саму плату Arduino UNO:
Когда код записан в программе Arduino IDE и загружен на Адруино, можно создать проект в СКАДА Симп Лайт.
Последовательность шагов описана ниже.
Открываем SIMP Project manager и создаём новый проект.
После создания проекта открываем проект (запускаем Редактор каналов) , если появляется дополнительное окно, в котором предлагается выбрать OPC Сервера, то убираем все галочки, если такие есть, так как в данном проекте не понадобятся сторонние OPC Сервера.
Далее заходим в настройку Modbus драйвера и создаем узел (COM) и настраиваем его параметры:
Далее в узле создается новое устройство, в нем также необходима настройка параметров:
Затем в устройстве необходимо создать тег, в котором будут отображаться данные с Arduino:
Когда настроили все параметры нажимаем ОК и тестируем:
Проект DHT22 просто показывает, как SCADA Simp Light получает данные и отображает их.
Теперь создадим в этом же проекте другое устройство, чтобы показать, что в SCADA Simp Light можно управлять устройством, которое подключено к Arduino.
Когда создали устройство "Реле" и все его теги и настроили их, нажимаем ОК и можно протестировать:
Везде вывелось "False" потому, что ни один реле не был включен.
Теперь зайдем в редактор мнемосхем, где создадим мнемосхему и добавим элементы, благодаря которым можно будет управлять реле.
Сейчас мы создадим новую мнемосхему и добавим на нее необходимые элементы:
После того как добавили элементы на мнемосхему, нужно настроить каждый элемент. Далее будет показана настройка двух элементов, это "панель" и "кнопка (тип "тумблер")", для остальных идентичных элементов настройка такая же, кроме пункта "Привязка к каналу", он будет разный.
Теперь необходимо сохранить мнемосхему и запустить ее в Мониторе:
Мы специально оставили включенными первое и третье реле, чтобы показать в "Тесте каналов" как изменились значения каналов.
Архивы с проектами:
1) Проект "DHT 22" - DHT22.rar
2) Проект "Кнопка" - Button.rar
3) Проект "Реле" - Relais.rar
4) Проект "Светодиод" - Led.rar
Более подробную документацию по СКАДА Симп Лайт можно получить по ссылке: https://simplight.ru/manual/
Что дальше?
Задать вопрос | Скачать бесплатную версию на 32 тега |
Заказать счёт | Посмотреть цены |