Т.к. в существующей теме новичку не дают написать больше 3 постов (как дружелюбно!), пришлось создать новую тему.
Ардуина Нано, подключается через адаптер MAX485 по RS-485 к OPC серверу ОВЕН.
Пины подключены одинаково. Библиотеки используются разные и вот проблема.
С этой библиотекой все работает:
#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();
}
А вот с этой никак не хочет.
/*
библиотека ModbusRtu
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
*/
#define SerialTxControl 6 // Пин 6 будет переключать режим приёмник/передатчик
/*
6 DE+RE
TX DI
RX RO
и питание завести на модуль TTL to rs-485
*/
#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() {
// put your setup code here, to run once:
slave.begin(9600);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
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 );
}
Хочу решить проблему. Та библиотека, которая работает, не дает возможность реализовать самодиагностику - мне надо понимать, идет обмен по модбасу или нет.
Ну и вообще, это не правильно, что одна библиотека работает, а другая нет. Все должно работать.
Если по существу - то одного факта использования СофтСериала на пинах 0 и 1 достаточно, чтобы сделать вывод что автор чайник и вряд ли может судить, какая библиотека работает, а какая нет
Точно так же, как в первом. Использовать СофтСериал вместо Сериал.
Можешь просто скопировать кусок кода из первого скетча во второй.
Только пины выбирать не 0 и 1.
Или взять плату с более чем одним Сериал портом - например Мегу, СТМ32 или Нано Эвери
В принципе, оно работает и на этих пинах, причину я нашел.
Это же последовательный порт? По нему и надо данные гонять, зачем другие пины тратить?
Тем более, девайс не подключен по USB, через него только прошивка заливается.