Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей. |
Существует несколько способов взаимодействия Arduino со scada-системой SIMP Light, одним из которых является управление через Modbus RTU. Этот способ не требует установки и использования какого либо OPC-сервера, взаимодействие SIMP Light и Arduino ведется НАПРЯМУЮ.
Arduino
Электронный конструктор и удобная платформа быстрой разработки электронных устройств. Программируется через USB без использования программаторов.
Modbus
Открытый коммуникационный протокол, основанный на архитектуре ведущий-ведомый (master-slave).
При взаимодействии SIMP Light и Arduino: scada-система выступает в роли Modbus Master, а Arduino выполняет функцию Modbus Slave.
Для начала работы необходимо:
Затем необходимо настроить порт, по которому будет происходить передача данных. Если вы не знаете к какому порту подключена плата, обратитесь к "Диспетчеру устройств" в системе Windows, и откройте раздел "Порты (COM и LPT)" - там будет указан используемый COM-порт.
После того как определен номеру порта, к которому подключена "Arduino UNO", необходимо указать его в программе "Arduino IDE".
Загрузите библиотеку Modbus в "Arduino IDE", и добавьте ее в проект.
Итак, среда разработки готова к реализации проектов с использованием протокола "MODBUS RTU". Далее будет представлен код 4-х демонстрационных проектов:
1) Подключение датчика температуры DHT22 и получение данных с него в систему SIMP Light.
2) Подключение модуля реле (4 реле) и управление ими из системы SIMP Light.
3) Подключение кнопки (сухого контакта) и отображение её статуса в системе SIMP Light.
4) Подключение светодиода и управление им из системы SIMP Light.
В конце статьи есть ссылки на архивы, которые включают код для Arduino и проект для системы SIMP Light.
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" и загружен на Arduino, можно создавать проект в системе SIMP Light. Последовательность шагов описана ниже.
Открываем модуль "Управление проектами" (SIMP Project manager) и создаём новый проект.
После создания проекта запускаем модуль "Редактор каналов" , если появляется дополнительное окно, в котором предлагается выбрать OPC-сервера, то убираем все галочки, если такие есть, так как в данном проекте не понадобятся сторонние OPC-сервера.
Далее заходим в настройку Modbus драйвера, создаем узел (COM) и настраиваем его параметры:
Далее, в узле создается новое устройство, в нем также необходима настройка параметров:
Затем в устройстве необходимо создать тег, в котором будут отображаться данные с Arduino:
Когда настроены все параметры, необходимо нажать кнопку "ОК" и протестировать работоспособность:
Проект DHT22 просто показывает, как система SIMP Light получает данные и отображает их.
Теперь создадим в этом же проекте другое устройство, чтобы показать, что в системе SIMP Light можно управлять устройством, которое подключено к Arduino.
Когда создали устройство "Реле" и все его теги, и настроили их, нажимаем "ОК" и можно протестировать:
Везде вывелось значение "False", потому что ни одно реле не было включено.
Теперь зайдем в модуль "Редактор мнемосхем", где создадим мнемосхему и добавим элементы, благодаря которым можно будет управлять реле.
Сейчас мы создадим новую мнемосхему и добавим на нее необходимые элементы:
После того, как добавлены элементы на мнемосхему, необходимо настроить каждый элемент. Далее будет показана настройка двух элементов, это "панель" и "кнопка (тип "тумблер")" (для остальных идентичных элементов настройка такая же, кроме пункта "Привязка к каналу").
Теперь необходимо сохранить мнемосхему и запустить ее в модуле "Монитор":
Мы специально оставили включенными первое и третье реле, чтобы показать в "Тесте каналов" как изменились значения каналов.
И в конце, обещанные ссылки на архивы с проектами:
- Проект "DHT 22" - DHT22.rar
- Проект "Кнопка" - Button.rar
- Проект "Реле" - Relais.rar
- Проект "Светодиод" - Led.rar