Настраиваем Modbus на плате Arduino Nano с помощью Arduino IDE.

В данном уроке мы будем передавать данные через сеть Modbus RTU. Использовать мы будем библиотеку SimpleModbusSlave.h  которую можно скачать  SimpleModbusSlaveV9.

Для преобразования сигналов микроконтроллера в RTS-485, мы будем использовать плату:

Единственно в данной плате есть маленький нюанс (возможно у Вас такого не будет): мы используем подключение микроконтроллера с другими устройствами через UART:  Rx — Tx и Tx — Rx, тут же надо подключать Rx — Rx, Tx — Tx. 

Передавать мы будем три значения — это температура, влажность и число, которое будет постоянно меняться. Данное число нам нужно будет для определения работы modbus в целом. Мы не знаем каким устройствам мы будем подключать нашу систему, и может оказаться так, что микроконтроллер зависнет, а мы не будем об этом знать, а так считывая значение переменной которая постоянно меняется мы сможем понять, что данные у нас бегают считывая каждый раз разные значения.

Рассмотрим структуру нашей программы:

Первое, что мы будем использовать это перечисления: enum, вначале у нас будут идти имена переменных в которых мы будем хранить наши данные — это T0, P1 и N2, дальше у нас идет переменная в которой мы храним размер массива в котором у нас будут храниться наши переменные. Так как переменные в перечислении принимают целое число которое зависит от места расположения в перечислении, в нашем случаи переменная HOLDING_REGS_SIZE будет иметь число 3.

Дальше мы настраиваем сам modbus: 

modbus_configure, где указываем серийный порт, в нашем случаи он у нас один, скорость передачи данных — у меня максимальная скорость на которой данные еще передавались составили 115200, после идет 

#include <SimpleModbusSlave.h> 

enum {D10,RS0,HOLDING_REGS_SIZE};
unsigned int holdingRegs[HOLDING_REGS_SIZE];

void setup() {
// put your setup code here, to run once:
modbus_configure(&Serial,9600,SERIAL_8N2,1,2,HOLDING_REGS_SIZE, holdingRegs);
modbus_update_comms(9600,SERIAL_8N2,1);
pinMode(LED_BUILTIN,OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
modbus_update();
int sensorValue =analogRead(A0);
float voltage = sensorValue*(5.0/1023.0);
holdingRegs[D10]=voltage*10;
holdingRegs[RS0]=int (analogRead(A0));

}