• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z odczytem Modbus RTU - MAX485
#1
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);





}
 
Odpowiedź
#2
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(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 ?
 
Odpowiedź
#4
RT,TX i GND, po stronie RS485 wystarczy spiąć A i B.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(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
 
Odpowiedź
#6
(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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości