«Домашняя» SCADA для Arduino
![«Домашняя» SCADA для Arduino](/wp-content/uploads/2017/04/Ill_SCADA.png)
Arduino больше предназначено для использования бытовых и рутинных задач. В основном эти контроллеры рассматривают для создания различных игрушечных прототипов. Всё таки можно найти действительно стоящее применение данных девайсов. SCADA для arduino — это одно из решений, позволяющее вести полный контроль за каким-либо процессом в любой точке мира. Это решение ещё называют «Интернет вещей». Существует великое множество сложных и неподъёмных SCADA — систем для различных проектов. Давайте рассмотрим некоторые из них.
Из этой статьи вы узнаете:
Подключение MasterSCADA и Arduino
Подключение Arduino и Remote XY
Всем привет друзья, с вами Гридин Семён. В этой статье я хотел поделиться с вами своими мыслями по поводу применения SCADA систем вкупе с Arduino.
Кстати, недавно мы с моей невестой выезжали на природу. Было очень тепло и светло, почти как летом. Правда, к сожалению до шашлыков дело не дошло :- (. А как вы отдыхаете, дорогие читатели, выезжали вы на природу??
Теперь давайте вернёмся к нашему диалогу. Теоретически можно подключить любую SCADA — систему к любому оборудованию, лишь бы был OPC — сервер и нужный протокол для передачи тех или иных данных…
Мы с вами рассмотрим два варианта подключений. Вариант с нашей любимой Master SCADA и с готовой системой RemoteXY для Arduino. Рассмотрим их различия, достоинства и недостатки.
Подключение MasterSCADA и Arduino
Что нам для этого нужно:
- Установить Master SCADA 3.7 на 32 точки — бесплатная версия;
- Установить Master OPC universal Modbus на 32 тега — тоже бесплатная версия;
- Конечно Arduino UNO;
- Написать скетч и настроить обе программы;
Дистрибутивы программ вы можете скачать с официального сайта ИНСАТ. Устанавливаете на компьютер и идём дальше.
Для того, чтобы вся эта штука заработала, нам нужно скачать библиотеки для Ардуино, чтобы он опрашивался по протоколу Modbus в режиме Slave. Для этого нужно скачать библиотеку SimpleModbusSlaveV9. Скачать можно отсюда. Как установить библиотеку, я писал статью.
Пример будет с измерением длины. Реализован он будет с помощью Ардуино и датчика дальномера HC-SR04.
Пишем скетч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | //подключаем библиотеку #include <SimpleModbusSlave.h> //объявляем переменные #define echoPin 2 #define trigPin 3 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); } 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; // Полученные значения передаем в OPC modbus_update(); holdingRegs[2] = cm; //адрес 2 holdingRegs[3] = cm; //адрес 2 } |
Далее настраиваем OPC-сервер. Создаём устройство в дереве объектов. Добавляем подключение через COM-порт. В моём случае 3 порт. Обязательно указывайте в настройках.
Далее добавляем устройство:
После этого вносим теги, которые вы хотите опрашивать:
Нулевой адрес обязателен. Так как без него произойдёт смещение адресации. Нажимаем на кнопочку пуск, и выскочит вот такая вот картинка:
Это всё конечно здорово! Но нам надо увидеть эти данные на мнемосхеме, правильно. Тогда поступаем следующим образом — открываем MasterSCADA, создаём проект и делаем следующие настройки.
Ищем ОРС-сервер и добавляем его:
Добавляем ОРС-переменную нашего любимого датчика-дальномера:
Смотрите на сайте строительство домов из блока. Смотрите www.b2b.real.su подключить телефонию в офис.
Далее добавляем Связываем теги и выводим это всё на мнемосхему. После этого запускаем всё хозяйство.
А теперь давайте рассмотрим другую не менее интересную SCADA-систему для плат Ардуино.
Подключение Arduino и Remote XY
Remote XY — это специально разработанная программа для небольших контроллеров. Есть три типа подключений — это через bluetooth, WI-FI и Ethernet. Мнемосхему можно создавать прям в браузере. Главная фишка ПО — это управление с телефона или планшета. Для более подробного изучения заходите на официальный сайт разработчиков.
А мы с вами попробуем написать программу. Соединиться с помощью Ethernet-шильда W5100 по LAN-кабелю. Запустим процесс измерения влажности и температуры с помощью датчика DHT11. Ну что, поехали…
Что нам нужно:
- контроллер Arduino UNO;
- Ethernet W5100 шильд;
- датчик DTH11;
- Доступ к программе Remote XY;
- Хорошее настроение;
Ethernet W5100 шильд соединяется с Arduino, разместив их одну над другой. Необходимо обеспечить подключение Ethernet-шильда к локальной сети.
Скачайте библиотеку RemoteXY. И загрузите такой скетч в контроллер:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | /* RemoteXY select connection mode and include library */ #define REMOTEXY_MODE__W5100_SPI #include <Ethernet.h> /* Ethernet shield used pins: 10(SS) */ #include <SPI.h> /* SPI interface used pins: 11(MOSI), 12(MISO), 13(SCK) */ #include <RemoteXY.h> /* RemoteXY connection settings */ #define REMOTEXY_ETHERNET_MAC "DE:AD:BE:EF:EF:ED" #define REMOTEXY_SERVER_PORT 6377 /* RemoteXY configurate */ unsigned char RemoteXY_CONF[] = { 0,25,88,0,4,5,67,4,53,14 ,30,6,0,11,67,4,53,34,30,6 ,0,11,66,193,15,21,34,4,6,66 ,129,49,21,34,4,1,66,129,15,41 ,68,4,4,129,0,14,14,38,6,0 ,84,101,109,112,101,114,97,116,117,114 ,101,58,0,129,0,15,34,28,6,0 ,72,117,109,105,100,105,116,121,58,0 ,129,0,44,25,10,6,0,48,194,176 ,67,0 }; /* this structure defines all the variables of your control interface */ struct { /* output variable */ char text_temp[11]; /* string end zero UNICODE */ char text_hum[11]; /* string end zero UNICODE */ signed char level_temp_down; /* =0..100 level position */ signed char level_temp_up; /* =0..100 level position */ signed char level_hum; /* =0..100 level position */ /* other variable */ unsigned char connect_flag; /* =1 if wire connected, else =0 */ } RemoteXY; #include "DHT.h" #define DHTPIN 2 DHT dht(DHTPIN, DHT11); void setup() { RemoteXY_Init (); // TODO you setup code } void loop() { RemoteXY_Handler (); // TODO you loop code // use the RemoteXY structure for data transfer float temp = dht.readTemperature(); float hum = dht.readHumidity(); dtostrf(temp, 0, 1, RemoteXY.text_temp); dtostrf(hum, 0, 1, RemoteXY.text_hum); if (temp<0) { RemoteXY.level_temp_up = 0; RemoteXY.level_temp_down = min (-temp*2,100); } else if (temp>0) { RemoteXY.level_temp_up = min(temp*2,100); RemoteXY.level_temp_down = 0; } else { RemoteXY.level_temp_up = 0; RemoteXY.level_temp_down = 0; } RemoteXY.level_hum = hum; } |
Потом скачайте приложение Remote XY на PlayMarket или AppStore. В открывшемся окне необходимо указать IP адрес, который был выдан Ethernet шильду роутером. В WEB-интерфейсе роутера можно посмотреть список подключенных устройств. Девайс можно идентифицировать по MAC-адресу в скетче.
В итоге должна получиться вот такая картинка:
На сегодня у меня всё. Спасибо вам за то, что вы со мной, дорогие читатели. Подписывайтесь на новости блога. Пишите в комментах, пишите письма, я всегда отвечу по возможности. С вами был Гридин Семён. Пока — пока!!!
С уважением, Гридин Семён
Семен! Мне нужна Ваша помощь. Я — бывший полковник, доцент, 66 лет. Преподаю в Академии Можайского. Заинтересовался системами SCADA. Как программист, практик я 0. Но хочу, чтобы дипломник соединил Master SCADA с ARDUINO, а еще с каким либо ARM, апример,STM 32. дипломника пока не получается по Вашим инструкциям. Готов заплатить за помощь.
Добрый день, давайте начнём с того, что пытается соединить ваш дипломник. Arduino или STM 32? Arduino как он соединяет с MasterSCADA? По Modbus? У ребят от Simple-SCADA есть замечательные видеоуроки. Посмотреть можете здесь «Как мне помогла SCADA в автоматизации производства?». Я думаю, должно помочь.
Ищите проект FLProg. Там и скада своя есть.
Вообще не знал, что у FLProga есть SCADA. И как она? Как интерфейс? Есть графики? Архивы? Тренды?![;-)](/wp-content/themes/gridin/assets/smiles/icon_wink.gif)
Здравствуйте! Занимаюсь подключением Ардуино MEGA 2560 к SCADA-системе и у меня возникло несколько камней преткновения:
1) С начала не мог разобраться как мне со SCADA отправить некое число на Ардуино, потом разобрался: надо вместо «holdingRegs[2] = cm» написать "cm = holdingRegs[2]« — теперь переменной cm будет присваиваться значение, которое мы кинем в OPC-переменную holdingRegs[2]. (Этот лирический пункт)
2) В моем проекте управление Ардуино осуществляется также с сенсорного экрана(TFT3.2» с алиэкспрес за 600 руб) и я столкнулся с тем, что когда я добавил программный код для работы с OPC-сервером, я потерял возможность ввода температура с сенс. дисплея. Как я понял, это связано с ходом программного кода, т.е. когда я присваиваю переменной gradus значение температуры с сенс.экрана, то возникает конфликт логики и внизу кода значению graus заново переприсваивается значение OPC-переменной gradus = holdingRegs[2]. Я сумел обойти этот конфликт логики, кинув строку holdingRegs[2] = gradus в блок программы отвеч. за ввод температуры (в этот момент мы наоборот присваиваем ОРС-переменной значение температуры). Но такой «маневр» выручает не везде, т.к. программа у меня многоопциональная, так скажем, и конфликт порой никак нельзя разрешить! Скажите можно ли вот эти варианты строк gradus = holdingRegs[2] и holdingRegs[2] = gradus написать в программе так, чтобы они работали в обе стороны без описанных выше ухищрений. Или подобное подключение к SCADA, описанное в данной статье, не предполагает одновременного задания параметров и со SCADA-системы и с сенсорного экрана?
3) OPC-переменная для Ардуино holdingRegs[], как я понял, работает только с целыми числами, т.е. если мы переменную типа float или double равную 23,8 кинем в holdingRegs[], то она сразу отсечет десятичную часть и оставит только число 23. Можно ли как-то записывать в эти ОРС-переменные дробные числа? Как я пришел к такому выводу — долгая история (ели интересует, могу написать), если я не прав — поправьте меня!
Скетч не работает. Постоянно вываливает ошибку «expected unqualified-id before numeric constant»
Очень полезный пример, на основе него разобрался, подключил DS18b20, а также релейный модуль.
Да с переменной Floot вышла проблема, пришлось умножать на 100 и отправлять как integer, потом соответственно умножать на 0,01
Аналогично с переменной Byte также пришлось переводить в integer. (для управления реле)
Спасибо большое за статью, помогла с дипломной работой) Но, мне кажется, в настройке ОПС сервера на компуктере ошибка… (первый пример с мастер скадой) В ардуино вы заливаете скетч, где настраиваете модбас с двумя стоп-битами (SERIAL_8N2), а в Мастере ОРС выставляете только один стоп-бит…![:???:](/wp-content/themes/gridin/assets/smiles/icon_confused.gif)
Есть такой Грешок, спасибо за замечание…
Необходима ваша помощь, подскажите как в Ардуино устройству задать адрес для опроса.
Т. е. в ОРС сервере к СОМ порту все подключается и дальше возникает ошибка в опросе устройства.
В коде последние строчки, попробуйте пощёлкать.
Здравствуйте, хотел бы задать вопрос. Я приступил к реализации управления шаговым двигателем с MasterScada, шаговый двигатель подключён к ардуино через драйвер а4988. При работе двигателя(задано направление и скорость вращения) наблюдается не плавное вращение, двигатель работает рывками, и происходит это в момент обмена данными между OPC-сервером и ардуино. При отключении OPC работа двигателя становится плавной, существует ли способ решения данной проблемы? OPC сервер настраивал как написано в примере.
существует, нужно «разделять» управление двигателем и передачу данных.
Семён не могли бы вы помочь.
что может являться причиной?
COM5.arduino:Ошибка опроса устройства
COM5.arduino:Включен таймаут ошибки запроса 1
arduino:Ошибка выполнения команды 3 <> в устройстве 1 from arduino:HOLDING_REGISTERS
Это скорее всего ошиблись с адресами регистров. функция не прочитала ваш регистр.