Modbus RTU TimeOut möglich?

pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Modbus RTU TimeOut möglich?

 · 
Posted: 23.01.2021 - 09:59  ·  #1
Hallo Leute,

ich habe da ein Problem mit einer Steuerung, ich greife über einen Konverter Ethernet auf Modbus RTU RS485 auf meine Modbus-Steuerung zu. Im Prinzip läuft das schon seit vielen Jahren so. Aktuell wurden einige Umbaumaßnahmen im Netz getätigt (Neue Router, neue Netzsegmente usw.), seit dem Umbau kommt es ab und an vor, das die Kommunikation zwischen dem Konverter und unserer Steuerung mittendrinnen abgebrochen wird. Ist dies der Fall, reagiert der AVRco Modbus-Treiber plötzlich nicht mehr.

Eigentlich dachte ich immer, beim Modbus-RTU gilt eine Strenge Zeitschiene, also müsste doch der Slave nach einen TimeOut ein <NOK> senden und auf einen neuen Befehl warten.

Das macht er aber nicht, ist in dem RTU-Treiber irgendwie die Möglichkeit den Timer dafür anzupassen?

Im Ascii-Treiber habe ich das gefunden:
Code
Procedure mb_SetModBusTimeout (time: word);
{set timeout in ms} Function mb_GetModBusTimeout: word;
{get timeout in ms}

Beim RTU habe ich nichts gefunden.

Wenn ich die Steuerung bei diesem Problem resete läuft es wieder, kann ich irgendwo den ModbusRTU Treiber neustarten, ohne reset?

Wenn es hier keine saubere TimeOut Funktion im Treiber gibt, würde ich es mit einem Workaround machen. ich würde einen Timer mitlaufen lassen, wenn 5 Minuten lang kein neues Telegramm kommt und verarbeitet wird, würde ich die Steuerung per Software reseten. So würden diese abgesetzten Steuerungen nach spätestens 5 Minuten wieder laufen.

Oder hat Jemand eine andere Idee?

Thorsten
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Modbus RTU TimeOut möglich?

 · 
Posted: 25.01.2021 - 15:59  ·  #2
This is what body of RTU process looks like:
Code
process WaitForRTU(30, 60 : iData); // this is called when modbus rtu message has arrived
var
  ...
begin
  SetMB_RTUstart;
  WaitSema(mb_RTUsema);
  ...
end;


WaitForRTU() is waiting for a received message semaphore set by Rolf's ASM timer routine. If you can make a reproducable example of message which stops RTU engine then Rolf and I can take a look if we can also reproduce that and see if it is indeed a bug.

Maybe Rolf can say if only MODBUS driver can be reset by code. I don't know how except cpu restart. With ASCII driver I had full control so I have implemented timeout, but with RTU interrupt part of the driver was made by Rolf and receiving RTU message is beyond my control.

I can just say that there are diagnostic counters which you can check if they change:
Code
procedure mb_ResetDiagnosticCounters;
begin
  CPT1_BusMessageCount            := 0;
  CPT2_BusCommunicationErrorCount := 0;
  CPT3_SlaveExceptionErrorCount   := 0;
  CPT4_SlaveMessageCount          := 0;
  CPT5_SlaveNoResponseCount       := 0;
  CPT6_SlaveNAKCount              := 0;
  CPT7_SlaveBusyCount             := 0;
  CPT8_BusCharacterOverrunCount   := 0;
  //
  CPT_CommEventCounter            := 0;
end;


You might also want to take a look at setAfterRegisterRead() and similar functions where you might want to put your software watchdog timeout reset.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Modbus RTU TimeOut möglich?

 · 
Posted: 11.02.2021 - 10:29  ·  #3
Hello Avra,

thank you for the Info.

>>Maybe Rolf can say if only MODBUS driver can be reset by code.
@rolf;
Hast Du eine Idee, wie ich den Neustart des Modbus-RTU Treibers bewerkstelligen kann ohne ein Reset der kompletten Steuerung zu machen?

Thorsten
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   62   76 · Page-Gen-Time: 0.033085s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI