Подключение 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.


Image 916


Затем необходимо настроить порт, по которому происходить передача данных. Если вы не знаете к какому порту подключена плата, сделайте следующее:


Image 917



После того как узнали к какому номеру порта подключена Arduino UNO, необходимо указать его в программе Arduino IDE.


Image 918



Загрузите библиотеку Modbus в Arduino IDE и добавьте ее в проект.


Image 919



Среда разработки готова к реализации проектов с использованием протокола 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:


Image 920



Когда код записан в программе Arduino IDE и загружен на Адруино, можно создать проект в СКАДА Симп Лайт.

Последовательность шагов описана ниже.


Открываем SIMP Project manager и создаём новый проект. 

После создания проекта открываем проект (запускаем Редактор каналов) , если появляется дополнительное окно, в котором предлагается выбрать OPC Сервера, то убираем все галочки, если такие есть, так как в данном проекте не понадобятся сторонние OPC Сервера. 


 Далее заходим в настройку Modbus драйвера и создаем узел (COM) и настраиваем его параметры: 


Image 922


Image 924



Далее в узле создается новое устройство, в нем также необходима настройка параметров:


Image 925



Затем в устройстве необходимо создать тег, в котором будут отображаться данные с Arduino:


Image 926



Когда настроили все параметры нажимаем ОК и тестируем: 


Image 927



Проект DHT22 просто показывает, как SCADA Simp Light получает данные и отображает их.


Теперь создадим в этом же проекте другое устройство, чтобы показать, что в SCADA Simp Light можно управлять устройством, которое подключено к Arduino.


Image 929



Когда создали устройство "Реле" и все его теги и настроили их, нажимаем ОК и можно протестировать:


Image 930


Везде вывелось "False" потому, что ни один реле не был включен. 


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


Image 932



Сейчас мы создадим новую мнемосхему и добавим на нее необходимые элементы:


Image 933



После того как добавили элементы на мнемосхему, нужно настроить каждый элемент. Далее будет показана настройка двух элементов, это "панель" и "кнопка (тип "тумблер")", для остальных идентичных элементов настройка такая же, кроме пункта "Привязка к каналу", он будет разный.


Image 934



Теперь необходимо сохранить мнемосхему и запустить ее в Мониторе:


Image 935



Мы специально оставили включенными первое и третье реле, чтобы показать в "Тесте каналов" как изменились значения каналов.


Image 936



Архивы с проектами:

1) Проект "DHT 22" - DHT22.rar

2) Проект "Кнопка" - Button.rar

3) Проект "Реле" - Relais.rar

4) Проект "Светодиод" - Led.rar


Более подробную документацию по СКАДА Симп Лайт можно получить по ссылке: https://simplight.ru/manual/


Что дальше?

Image 234 Задать вопрос

Image 235Скачать бесплатную версию на 32 тега

Image 237 Заказать счёт

Image 236 Посмотреть цены

Эта статья была полезна для 53 людей. Эта статья помогла Вам?

Сервис поддержки клиентов работает на платформе UserEcho