• 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 komunikacja via RS485 ModbusRTU
#1
Witam, mam nadzieje, ze pisze w dobrym dziale Smile
Jakis czas temu szukałem na tym forum rekomendacji dotyczącej dwukierunkowego licznika z protokołem ModbusRTU, koniec końców zakupiłem cos takiego: https://www.fif.com.pl/pl/index.php?cont...hment=1093 (pełna dokumentacja, również z adresami poszczególnych rejestrów).

Docelowo, chcę zczytywać dane z licznika za pomocą NodeMCU v2 i konwertera UART -> RS485 by potem można było wysyłać dane na serwer. Układ połączyłem nastepujaco:

NodeMCU:        Konwerter:
3.3V           ->  3.3V
GND           ->  GND
D7              ->  RO
D8              ->  DI
D6              ->  RSE

Oraz złącze A konwertera ze złączem A licznika, analogicznie z B.


Do obsługi protokołu ModbusRTU użyłem biblioteki https://github.com/Trialcommand/ESP8266-...RTU-Master, jest ona odpowiednio zmodyfikowana by działała z ESP8266, jednak pojawiły się dwa problemy. Program nie kompilował się z racji na nadpisywanie nazw funkcji z oryginalnej biblioteki SoftwareSerial, dla świętego spokoju pozmieniałem nazwy plików nagłówkowych; oprocz tego, zdałem sobie sprawę, że musze jakoś obsluzyc konwerter z którego korzystam - wymaga on podania stanu wysokiego na pin RST by wysylac dane oraz stanu niskiego by nasłuchiwać. Poczyniłem zatem parę modyfikacji w bibliotece, są one opisane i oznaczone w plikach.


Teoretycznie wszystko powinno być ok, jednak dalej nie jestem wstanie skomunikować się z licznikiem. Biblioteka ma pewną obsługę błędów i po wgraniu następującego programu:
Kod:
#include "ModbusMaster232.h"
#include "SoftwareSerialForESP.h"

#define SLAVE_ADDRESS 1
#define RX_SOFTWARE_PIN D7
#define TX_SOFTWARE_PIN D8

#define EXAMPLE_REGISTER 0
#define REGISTER_SIZE 1

ModbusMaster232 node(SLAVE_ADDRESS);

void setup() {
 Serial.begin(9600);
 delay(100);
 node.begin(9600, D6);

 //pinMode(D6, HIGH); //
}

void loop() {
 Serial.print("Response status: ");
 String hexResponseStatus(node.readDiscreteInputs(EXAMPLE_REGISTER, REGISTER_SIZE), HEX);
 Serial.println(hexResponseStatus);
 Serial.print("Response: ");
 Serial.println(node.getResponseBuffer(0));
 node.clearResponseBuffer();
 delay(5000);
}
otrzymuje status odpowiedzi 0xE2 który odpowiada ResponseTimedOut. Co zatem może być jeszcze nie tak? Wiem, że zagadnienie jest dość obszerne i możliwe, że to o co pytam to błachostka, ale zaznaczam, że mam bardzo małe doświadczenie jeśli chodzi o obsługę protokołów. Niestety nie posiadam też analizatora stanów logicznych (dotrze do mnie dopiero w przyszłym tygodniu).
 
Odpowiedź
  


Wiadomości w tym wątku
Problem z komunikacja via RS485 ModbusRTU - przez qbic - 02-06-2019, 03:18

Skocz do:


Przeglądający: 1 gości