ПК - master, Arduino mega slave. На Пк стоит Simple Scada для отображения состояния устройств. связь с Arduino осуществляется по протоколу RS-485 с помощью Insat OPC-сервера.
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/
#define DIR 10 // переключатель прием\передача
modbusDevice regBank;
modbusSlave slave;
void setup()
{
regBank.setId(1); ///Set Slave ID
regBank.add(10003);//№1-предавария
regBank.add(10004);//№2-авария
regBank.add(10005);//№2-предавария
regBank.add(10006);//№3-авария
regBank.add(10007);//№3-предавария
regBank.add(10008);//№4-авария
regBank.add(10009);//№4-предавария-К
regBank.add(10010);//№1-авария_Ввел доп.регистр 10,т.к. регистр 2 подвисал Simple Scada
// Add Digital Output registers = Modbus Memory Area (COILS)
//Управление нагрузкой (цифровые выходы)
regBank.add(12);//Вкл нагрузки на D12
regBank.add(13);//Вкл нагрузки на D13
slave._device = ®Bank;
slave.setBaud(9600);
// slave.setBaud(19200);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(DIR, HIGH); // включаем передачу_всегда начинаем работать с передачи
}
void loop(){
//Контроль за устройствами (цифровые входы)
while(1){
//Digital Input
byte DI2 = digitalRead(2); //№1-авария
if (DI2 >= 1)regBank.set(10010,1);
if (DI2 <= 0)regBank.set(10010,0);
byte DI3 = digitalRead(3); //№1-предавария
if (DI3 >= 1)regBank.set(10003,1);
if (DI3 <= 0)regBank.set(10003,0);
byte DI4 = digitalRead(4);//№2-авария
if (DI4 >= 1)regBank.set(10004,1);
if (DI4 <= 0)regBank.set(10004,0);
byte DI5 = digitalRead(5);//№2-предавария
if (DI5 >= 1)regBank.set(10005,1);
if (DI5 <= 0)regBank.set(10005,0);
byte DI6 = digitalRead(6);//№3-авария
if (DI6 >= 1)regBank.set(10006,1);
if (DI6 <= 0)regBank.set(10006,0);
byte DI7 = digitalRead(7);//№3-предавария
if (DI7 >= 1)regBank.set(10007,1);
if (DI7 <= 0)regBank.set(10007,0);
byte DI8 = digitalRead(8);//№4-авария
if (DI8 >= 1)regBank.set(10008,1);
if (DI8 <= 0)regBank.set(10008,0);
byte DI9 = digitalRead(9);//№4-предавария-К
if (DI9 >= 1)regBank.set(10009,1);
if (DI9 <= 0)regBank.set(10009,0);
//Digital output
//Управление нагрузкой (цифровые выходы)
// int DO11 = regBank.get(11);
int DO12 = regBank.get(12);
//if (DO12 >= 1)regBank.set(10002,1);
if (DO12 >= 1)regBank.set(10003,1);
if (DO12 >= 1)regBank.set(10004,1);
if (DO12 >= 1)regBank.set(10005,1);
if (DO12 >= 1)regBank.set(10006,1);
if (DO12 >= 1)regBank.set(10007,1);
if (DO12 >= 1)regBank.set(10008,1);
if (DO12 >= 1)regBank.set(10009,1);
if (DO12 >= 1)regBank.set(10010,1); //Ввел доп.регистр 10,т.к. регистр 2 подвисал Simple Scada
int DO13 = regBank.get(13);
if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);
slave.run();
}
}