# PFC200 750-8212 e!Cockpit ModBus RTU Status auslesen



## Nilzon (13 Januar 2021)

Hallo zusammen, 

verwende einen OFC200 750-8212 mit e!Cockpit. 
ModBus RTU läuft über die onBoard-Schnittstelle (COM1). 
Der PFC200 ist ModBus Master.
Verwendet wird der integrierte ModBus-Konfigurator.

Nun gibt es ja wenn man über e!Cockpit online ist diese gekachelte Statusanzeige. 
Da wird auch ein ModBus RTU Fehler angezeigt, wenn ich einen Slave abschalte. 
Nun möchte ich schlicht und einfach diesen ModBus RTU-Fehler in der Programmierung verwenden. 
Sodass ich merke, wenn ein Slave ausgefallen ist. 

Und hier stehe ich komplett auf dem Schlauch. 
Die Suche habe ich bemüht, erfolglos. Wobei die natürlich nur was liefert, wenn man die richtigen Begriffe eingibt. 
Das Einzige, was ich bisher fand war IoConfig_Globals.MODBUSSLAVE_rtu.GetErrorCode();
Der Wert ist jedoch immer 0. Egal ob der Fehler ansteht oder nicht

Bitte gebt mir einen Schubs in die richtige Richtung. 
Wie komme ich an die Fehlermeldung. Idealerweise pro Slave. Damit ich weiß, welcher da ausgefallen ist. 
Mit der Bibliothekslösung in I/O-Pro wusste ich wie das geht. 
Aber hier, mit dem integrierten Konfigurator komm ich nicht weiter.

Ganz herzlichen Dank uns schöne Grüße,
Nilzon


----------



## shg (13 Januar 2021)

Hi,

ich hatte ein ähnliches Problem.
Meine ModbusSlaves haben ein Register in denen die eigene Adresse steht. So hat z.b. der Slave 1 die Netzwerkadresse 1 usw. 
Ich frage im Programm die Slaves nach ihren Adressen und vergleiche sie mit einem Erwartungswert z.b. für den Slave 1 mit der Netzwerkadresse 1 wäre das... 1. Reisst die Verbindung zum Slave ab, kann diese Abfrage nicht mehr stattfinden und es wird der Ersatzwert "0" geliefert (musst Du aber im Konfigurator einstellen). Dieses Abfrageergebnis passt mit dem Erwartungswert "1" nicht zusammen... Fehlermeldung. Würde das noch kurzzeitpuffern.

Grusd


----------



## Nilzon (14 Januar 2021)

Danke. Das ist ein anderer Ansatz, an den ich noch nicht gedacht hatte. 
Ich werde mir den Konfigurator anschauen. Über die Ersatzwertbildung bin ich noch nicht gestolpert. Da ich den Konfigurator wie ein rohes Ei behandeln muss, damit e!C nicht abstürzt war ich da nicht sehr intensiv an Forschen.

Vielleicht weiß auch noch jemand, wie man den Status ausliest der in e!C angezeigt wird. Das lässt mir trotz dieser sehr guten Umgehungslösung keine Ruhe, denn der Wert ist ja offensichtlich irgendwo vorhanden, wenn e!C sofort einen Modbus RTU Fehler anzeigt.


----------



## Thruser (14 Januar 2021)

Hallo,

in dem WAGO Beispiel von hier: Fehlererkennung bei Ausfall von einem Teilnehmer bei einer  ModBus RTU Verbindung

wird GetChannelErrorCode verwendet.

Gruß


----------



## Nilzon (14 Januar 2021)

Verdammt, wieso fand ich das nicht selbst. Ich weiß doch wie Leute gesehen werden, die zu dämlich für die Benutzung der Suchfunktion sind. Dazu will ich nicht gehören.

Ganz herzlichen Dank für den Hinweis.
Das werde ich später ausprobieren und dann werde ich mich melden.


----------



## Nilzon (14 Januar 2021)

So, hier das Ergebnis bislang. 

Die in #2 vorgeschlagene Idee ist nachvollziehbar. 
Ich fand im Konfigurator die Stelle nicht, wo man die Ersatzwertbildung parametriert. 
Deswegen kam ich hier noch nicht weiter. 
Eine Einstellung zum Ersatzwert fand ich nur bei den Modbus-Slave-Einstellungen. Meinen PFC200 verwende ich als Master.
Ansonsten schweigt sich die Doku dazu aus.

Die in #4 vorgeschlagene Funktion brachte mich etwas weiter. 
Nachdem ich nun einen Ansatz für weitere Recherche gefunden habe, ist WagoSysModbusDiag wohl dasselbe wie WagoTypesModbus.
Die empfohlene Funktion GetChannelErrorCode(1) aus dem verlinkten Thread bezieht sich auf einen einzelnen Modbus-Kanal, hier Kanal 1. 
Das funktioniert. 
Ich trennte den Slave von der Spannung und bekam ein Timeout.

Die weitere Recherche ergab, dass es auch noch GetErrorCode() gibt. 
Das soll laut Doku den Slave selbst diagnostizieren und ist eigentlich was ich suche. 
Es gibt da neben CONNECT_FAILED auch Fehler wie RTU_CONFIG_FAILED. 
Das ist irreführend, denn diese Methode funktioniert nicht bei Modbus RTU.
Hier steht immer NO_ERROR. 
Steht hier: Fehlererkennung bei Ausfall von einem Teilnehmer bei einer  ModBus RTU Verbindung
Bei Modbus RTU führt der Weg also über GetChannelErrorCode(#).

Vielen Dank!


----------

