Arduino Polska Forum

Pełna wersja: Problem z odczytem Modbus RTU - MAX485
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć, 
Mam problem z odczytem rejestrów po Modbusie RTU via moduł MAX485 - Arduino Nano. 
Skonfigurowałem jak w poniższym kodzie, za pomocą biblioteki ArduinoModbus i ArduinoRS485, nie mam już pomysłu co robię nie tak, siedzę nad tym od rana, chyba trzeba będzie swoją bibliotekę napisać.
Serial wyświetla mi, że dane zostały wpisane z powodzeniem, na płytce mruga dioda TX, ale za chiny symulatorze nie mogę nic odczytać, ani się z nim połączyć. 
RI podłączone do RX, DI do TX, już nawet zdefiniowałem te piny, bo myślałem, że tam coś jest nie tak. DE i RE mam zmostkowane, nie chciałem ich używać, ale potem już próbowałem podłączenie ich pod PIN 2 i inne, ale również bezskutecznie. Są jakieś "haczyki" w komunikacji Nano po RS485 protokołem Modbus? 
Napisałem możliwie najprostszy kod, żeby tylko zobaczyć jakąkolwiek odpowiedź, ale nic. 
Z góry dziękuję  Rolleyes

Kod:
#include <ArduinoRS485.h>
#include <ArduinoModbus.h>
#include <SoftwareSerial.h>

SoftwareSerial RS485Serial(0, 1);

const int numCoils = 1;
const int numHoldingRegisters = 1;



void setup() {

Serial.begin(9600);
while(!Serial);



Serial.println("Modbus RTU server");

if (!ModbusRTUServer.begin(1, 9600)) {
  Serial.println("Blad serwera Modbus RTU");
  while(1);

}

ModbusRTUServer.configureCoils(0x00, numCoils);
ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters);




}

void loop() {

ModbusRTUServer.poll();

bool bul;
int liczba;

bul = 1;
liczba = 23;

if (ModbusRTUServer.coilWrite(0, bul)) {
    Serial.println("Coil write successful");
  } else {
    Serial.println("Coil write failed");
  }

  if (ModbusRTUServer.holdingRegisterWrite(0, liczba)) {
    Serial.println("Holding register write successful");
  } else {
    Serial.println("Holding register write failed");
  }


delay(100);





}
Albo sobie bierzesz płytkę z automatycznym przełączaniem kierunku transmisji, albo sobie to jednak obsługujesz w kodzie. Poza tym poprawność połączenia możesz sobie spawdzić dwoma modułami RS485, drugi podłącz do PC za pomocą adaptera USB-UART-RS485, albo gotowym USB-RS485, wtedy po prostu powinno działać Serial.print.
No i używasz pinów 0 i 1 do modbus, a te piny w NANO są używane przez Serial do drukowania na USB do PC.
(04-02-2025, 13:18)kaczakat napisał(a): [ -> ]Albo sobie bierzesz płytkę z automatycznym przełączaniem kierunku transmisji, albo sobie to jednak obsługujesz w kodzie. Poza tym poprawność połączenia możesz sobie spawdzić dwoma modułami RS485, drugi podłącz do PC za pomocą adaptera USB-UART-RS485, albo gotowym USB-RS485, wtedy po prostu powinno działać Serial.print.
No i używasz pinów 0 i 1 do modbus, a te piny w NANO są używane przez Serial do drukowania na USB do PC.

Próbowałem na innych pinach, też lipa, nie wiem, może coś trafione jest. Wieczorem spróbuję z wersją modułu o dwóch pinach do komunikacji - RX TX, może będzie łatwiej ?
RT,TX i GND, po stronie RS485 wystarczy spiąć A i B.
(04-02-2025, 18:20)kaczakat napisał(a): [ -> ]RT,TX i GND, po stronie RS485 wystarczy spiąć A i B.
 

Szczerze, nie wiem jaki był problem, naprawdę. Osiwiałem dziś prawie przez te pierniczone biblioteki, których są masy i połowa z nich nie działa i nie wiadomo tak naprawdę co jest w środku. Sprzętowo wszystko śmiga, bo skrobnąłem w gołym cpp kod i jest elegancko.  Huh
(04-02-2025, 22:19)Rodziu napisał(a): [ -> ]
(04-02-2025, 18:20)kaczakat napisał(a): [ -> ]RT,TX i GND, po stronie RS485 wystarczy spiąć A i B.
 

Szczerze, nie wiem jaki był problem, naprawdę. Osiwiałem dziś prawie przez te pierniczone biblioteki, których są masy i połowa z nich nie działa i nie wiadomo tak naprawdę co jest w środku. Sprzętowo wszystko śmiga, bo skrobnąłem w gołym cpp kod i jest elegancko.  Huh

To jest problem ogólny - czy użyć gotowej biblioteki, czy napisać własny kod. W pierwszym przypadku trzeba poświęcić czas na zapoznanie się z dokumentacją (która często nie wszystko opisuje), czasami też doświadczalnie rozpoznać jak to działa (i często przekonanć się, że biblioteka jest nieodpowiednia). W drugim przypadku mamy zwykle dobrze opisaną sytuację (datasheety układów scalonych lub opisy protokołów) ale trzeba więcej napisać. Ogólnie najgorszą częścią pracy programisty jest zajmowanie się cudzym kodem.