Подружить Arduino nano со СКАДА Simplight по Modbus RTU

КронА

✩✩✩✩✩✩✩
19 Мар 2024
1
0
Всем привет. Необходимо передавать из Ардуинки в Скаду некие значения.
Подключил ее через модуль MAX485 по RS-485 к ОРС серверу ОВЕН.
Поставил несколько библиотек по работе с Modbus и понял, что есть проблемы....

С этой библиотекой все работает:
C++:
#include <SoftwareSerial.h>
#include <ModbusRTUSlave.h>

#define MODBUS_ADDR 1

  const byte rxPin = 0; // RO
  const byte txPin = 1; // DI
  const byte dePin = 6; // DE+RE
 
  SoftwareSerial mySerial(rxPin, txPin);
  ModbusRTUSlave modbus(mySerial, dePin);  // serial port, driver enable pin for rs-485
  uint16_t holdingRegisters[125];

void setup() {
  modbus.configureHoldingRegisters(holdingRegisters, 125); // unsigned 16 bit integer array of holding register values, number of holding registers
  modbus.begin(MODBUS_ADDR, 9600);
}

void loop() {
  holdingRegisters[0]=doza[i]; 
  holdingRegisters[1]=current_doza*100; // переводим в целое
  holdingRegisters[2]=koef*100;         // переводим в целое
  modbus.poll();
}
Но в ней нет возможности контролировать идет обмен с ОРС сервером или нет.

Посоветовали использовать более продвинутую библиотеку, где такой контроль есть.
А с ней почему-то нифига не работает.
C++:
/*
библиотека ModbusRtu
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
*/

#define SerialTxControl 6 // Пин 6 будет переключать режим приёмник/передатчик
/*
 6 DE+RE
 TX DI
 RX RO
 */

#include <ModbusRtu.h>

#define MODBUS_ID 1
Modbus slave(MODBUS_ID, Serial, SerialTxControl);

#define stlPin  13           // номер выхода индикатора работы расположен на плате Arduino

int state; // результат взаимодействия с сервером

uint16_t HoldingRegs[125]; // массив данных modbus

float var1=1;
float var2=0;

unsigned long tempus = 0UL;      //Период опроса модбас

void setup() {
 
  slave.begin(9600); 
  Serial.begin(9600); 
}

void loop() {
 
 
  var1++;
  if (var1>100) var1=1;
  var2 = var1*2;
  Serial.print(var1);
  Serial.print("  ");
  Serial.println(var2);

  HoldingRegs[0] = var1*100;
  HoldingRegs[1] = var2*100;
  HoldingRegs[2] = (var1+var2)*100;

   state = slave.poll( HoldingRegs, 125);           // обработка сообщений
   if (state > 4) {                             // если получили пакет без ошибок - зажигаем светодиод на 50 мс
    tempus = millis() + 50;
    digitalWrite(stlPin, HIGH);
   }
   if (millis() > tempus) digitalWrite(stlPin, LOW );
  
}
Что тут не так???