Opened 13 years ago

Closed 13 years ago

#118 closed Aufgabe (fixed)

Agilent - Modbus

Reported by: Melanie Hermann Owned by: Melanie Hermann
Priority: sofort Milestone:
Component: Protokolle Version:
Severity: Fehler Keywords:
Cc:

Description

Die Kommunikation scheint beim Timeout versetzt zu sein:
Anfrage1 -> Keine Antwort
Anfrage2 -> Antwort1
Anfrage3 -> Antwort2
...

Wird TID verwendet?

Kommunikation muss in diesem Zustand wieder in Takt gebracht werden!

Attachments (7)

Test_ModbusMaster_Zeitsync.xlsx (11.3 KB ) - added by Melanie Hermann 13 years ago.
Zeiten der Modbusanfragen ohne/mit MesswerkZeitsync
m_SWMesswerte_mitSync.pcap (11.0 KB ) - added by Melanie Hermann 13 years ago.
m_SWMesswerte_mitSync.2.pcap (11.0 KB ) - added by Melanie Hermann 13 years ago.
m_SWStatus_mitSync.pcap (3.4 KB ) - added by Melanie Hermann 13 years ago.
m_SWChannelStatus_mitSync.pcap (2.1 KB ) - added by Melanie Hermann 13 years ago.
m_SWMesswerte_mitSync&verängertemTimeout.pcap (12.5 KB ) - added by Melanie Hermann 13 years ago.
Timeout_Ueberackern_03.04.2013.bmp (2.4 MB ) - added by Melanie Hermann 13 years ago.

Change History (14)

comment:1 by Melanie Hermann, 13 years ago

TID wird nicht verwendet! TID ist immer Null!

comment:2 by Melanie Hermann, 13 years ago

1.Lösungsschritt:
TId (Transaction Identifier) in Modbus-Master eingebaut.
Das Messwerk antwortet immer mit dem vorgegebenen TId.

comment:3 by Melanie Hermann, 13 years ago

2.Lösungsschritt:
Falls TId in Frage und Antwort unterschiedlich sind, wird eine Meldung im Diagnose-Log ausgegeben.

TODO: Was tun? Modbus-Master neu starten? Port neu? Warten, dann nochmal Receive?

comment:4 by Melanie Hermann, 13 years ago

Update: Es gibt 2 Probleme!

1.) Problem: GC9300 - Controller zeigt ein "Timeout" an, obwohl die Kommunikation zwischen Controller und Messwerk weiterhin besteht.

2.) Problem: Modbus läuft asynchron. D.h., dass der Controller auf eine Anfrage immer die Antwort für die vorherige Anfrage erhält. Somit entsteht ein "Timeout".

by Melanie Hermann, 13 years ago

Zeiten der Modbusanfragen ohne/mit MesswerkZeitsync

comment:5 by Melanie Hermann, 13 years ago

1.) Problem:
Dieses Problem besteht in der aktuellen Version (V1.330-062) nicht mehr!
Aber durch Testen wurde herausgefunden, dass das Problem durch Folgendes verursacht wird:
Der Controller sendet verschieden Anfragen-Pakete an das Messwerk. 'm_SWStatus', 'm_SWStatusChannel[x]' und 'm_SWMesswerte'.
Der Alarm "Timeout" wird dann angezeigt, wenn nicht alle Werte innerhalb der angegebenen Timeout-Zeit vom Messwerk geliefert wurden. ('WerteGuelitg()' in 'HolWerte()' schlägt immer fehl.)
Normalerweise benötigen die Blöcke folgenden Zeiten bis zur kompletten Beantwortung:
'm_SWStatus' ~ 1200 msec
'm_SWChannelStatus[x]' ~ 600 msec
'm_SWMesswerte' ~ 4000 msec
Ein Problem entsteht erst, wenn während der Bearbeitung in 'HolWerte()' ein weitere Modbusanfrage (z.B. Zeitsync an das Messwerk) zwischenreingeschoben wird. Denn dann erhöht sich die Zeit und es können nicht mehr alle Werte rechtzeitig vom Messwerk geliefert werden. Auch wenn das Messwerk nun antwortet und fast alle Werte geschickt hat, erscheint am Controller "Timeout", weil nicht ALLE Werte rechtzeitig geschickt wurden.
Ein zusätzlicher MesswerkZeitsync verlängert die Zeiten der Blöcke folgendermaßen:
'm_SWStatus' ~ 2600 msec
'm_SWChannelStatus[x]' ~ 1900 msec
'm_SWMesswerte' ~ 54000 msec
Da die Timeoutzeit in 'HolWerte()' auf 5000 msec eingestellt ist, entsteht hier ein "Timeout".
Siehe TracTicket-Anhänge.

Lösung:

  • Ab V1.330-062 wird der MesswerkZeitsync direkt in CGc verschickt. Somit können sich Sync und Blockabarbeitung nicht mehr in die Quere kommen. In vorherigen Versionen wurde der Sync aus CGcApp geschickt. Somit konnte es passieren, dass dieser Sync genau während einer Blockabarbeitung geschickt wurde.
  • Ab V1.331-063 wird die Timeoutzeit in 'HolWerte()' wurde von 5000 ms auf 6000 msec erhöht. Damit bei der Abarbeitung von 'm_SWMesswerte' ein größerer Zeitpuffer besteht.
Version 0, edited 13 years ago by Melanie Hermann (next)

by Melanie Hermann, 13 years ago

Attachment: m_SWMesswerte_mitSync.pcap added

by Melanie Hermann, 13 years ago

by Melanie Hermann, 13 years ago

Attachment: m_SWStatus_mitSync.pcap added

by Melanie Hermann, 13 years ago

by Melanie Hermann, 13 years ago

comment:6 by Melanie Hermann, 13 years ago

2.) Problem:
Dieses Problem kann nur entstehen, wenn der Controller eine Anfrage schickt und nicht innerhalb der angegebenen Timeoutzeit in 'recvtimo()' eine Antwort erhält.
Der Controller schickt dann die nächste Anfrage. Falls das Messwerk aber einfach zu lange zum Antworten gebraucht hat, hier länger als 5 Sekunden, und dann jetzt erst antwortet entsteht ein Problem. Der Modbus wird asynchron.
Der Controller erhält nun immer die Antwort auf die vorherige Anfrage. Somit passen Frage und Antwort nie zusammen und der Controller meldet ein "Timeout".
Dieses Phänomen ist im TracTicket-Anhang zu sehen.

Lösung:

  • Erhöhung der Timeoutzeit in 'recvtimo()' von 5 Sek. auf 10 Sek.
  • Wenn in 'recvtimo()' ein Timeout entsteht wird ein DummyRead gemacht, kurz gewartet und das Receive wird wiederholt. Falls ein zweites Timeout kommt, wird wieder ein DummyRead gemacht, kurz gewartet und das Receive erneut wiederholt. Beim dritten Timeout hintereinander wird der ModbusMaster-Socket geschlossen/geöffnet. recvtimo-Timeout-Meldung: "Receive Header Fehler: Operation timed out".
  • Wenn in 'Receive()' erkannt wird, dass sich Frage/Antwort "überholt" haben, dann wird hier genau gleich, wie oben für 'recvtimo()'-Timeout beschrieben, vorgegangen. "Überholt"-Meldung: "TId Soll: x, TId Empfangen: y".
Last edited 13 years ago by Melanie Hermann (previous) (diff)

by Melanie Hermann, 13 years ago

comment:7 by Melanie Hermann, 13 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.