Modbus в Ардуино через MAX485

Т.к. в существующей теме новичку не дают написать больше 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 );
   
}

OPC сервер ругается “Ошибка контрольной суммы”. Размерность массива указывал разную, результат одинаковый.

Подряд.

Нет, пытаюсь ответить на последний пост, получаю:

Произошла ошибка: Новые пользователи в данный момент могут оставлять только 3 ответа в теме.

а от форума что хотите? если совет - то пользуйтесь той библиотекой, с которой проблем нет

Хочу решить проблему. Та библиотека, которая работает, не дает возможность реализовать самодиагностику - мне надо понимать, идет обмен по модбасу или нет.
Ну и вообще, это не правильно, что одна библиотека работает, а другая нет. Все должно работать.

Бедненький!

Начать тему с наезда на здешние правила – прямой путь к получению быстрой и качественной помощи!

По существу есть что сказать? Или хотите посамоутверждаться?

Фига борзый чел. Всё должно работать. Чините, холопы.

Пока тут некоторые упражняются в словоблудии, я нашел причину, все заработало. Но холопам не скажу. Ибо нехрен.

Если по существу - то одного факта использования СофтСериала на пинах 0 и 1 достаточно, чтобы сделать вывод что автор чайник и вряд ли может судить, какая библиотека работает, а какая нет

1 лайк

скорее стыдно, наверняка нашел свою глупую ошибку

Кстати, во втором случае вы тоже используете один и тот же порт и для вывода в Монитор и для Модбаса - так ничего хорошего не выйдет

Нет, ибо не вижу в этой теме никакого “существа”.

Так точно! И как Вы догадались?

Верю!

И правильно!

Удачи!

Вот все-таки, что глум животворящий делает. Уже которых новичок чудесным образом проблемы решает. САМ!!! )))

Наерна, надо тебя с этого форума выкинуть. Ибо нехрен.

Ну а гуру местные, вместо того, чтобы подсказать новичку, решили за его счет поутверждаться. Красавцы, чо.

А ты видишь хоть один знак вопроса в своем первом посте? В чем помогать-то?

А что подсказывать-то? - в обоих случаях подключение неправильное.
На Нано пины 0 и 1 ЗАНЯТЫ адаптером USB. Эти пины нельзя использовать для Модбас.

Меняй пины и после этого пробуй.

Подскажи, плз, как прописать во втором скетче другие пины?

Точно так же, как в первом. Использовать СофтСериал вместо Сериал.
Можешь просто скопировать кусок кода из первого скетча во второй.
Только пины выбирать не 0 и 1.

Или взять плату с более чем одним Сериал портом - например Мегу, СТМ32 или Нано Эвери

В принципе, оно работает и на этих пинах, причину я нашел.
Это же последовательный порт? По нему и надо данные гонять, зачем другие пины тратить?
Тем более, девайс не подключен по USB, через него только прошивка заливается.