Всем привет. Необходимо передавать из Ардуинки в Скаду некие значения.
Подключил ее через модуль MAX485 по RS-485 к ОРС серверу ОВЕН.
Поставил несколько библиотек по работе с Modbus и понял, что есть проблемы....
С этой библиотекой все работает:
Но в ней нет возможности контролировать идет обмен с ОРС сервером или нет.
Посоветовали использовать более продвинутую библиотеку, где такой контроль есть.
А с ней почему-то нифига не работает.
Что тут не так???
Подключил ее через модуль 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 );
}