Подключение 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/
Что дальше?
|
|
|
|
