Hallo,
ich bin neu hier und versuche seit einiger Zeit mit einer Wago PFC200 eine elektronische Last anzusteuern. Zur Kommunikation dient ein zusätzliches Modul an der Last. Dieses erlaubt die Kommunikation via Modbus TCP (auf dem Port 502) und Modbus RTU (auf dem Standard-Port 5025 und allen anderen). Die Daten selbst werden über ein Patchkabel übertragen.
Ich arbeite in e!Cockpit mit dem Baustein
FbMbMasterTcp, um mit Modbus TCP die Last anzusteuern, was soweit auch ganz gut funktioniert. Nun möchte ich ein Programm (ModbusTCP_1), das sich um die wiederkehrenden Standardanfragen kümmert. Dieses wird regelmäßig von PLC_PRG aufgerufen und bekommt nur die Daten mit, die übergeben werden. Die Register sind schon im Programm deklariert. In PLC_PRG werden die Daten verarbeitet bzw. weitergeleitet, was auch klappt.
Nun habe ich zwei Probleme, die ich nicht gelöst bekomme:
Problem 1: Ich kann einzelne Register nicht auslesen. Konkret geht es hier um die aktuellen Messwerte der Last. Ich empfange das Echo, welches besagt, dass ich die Register auslesen möchte, awData bleibt jedoch leer (0).
Problem 2 (ist vermutlich simpler): Ich möchte in drei unterschiedliche Register nacheinander verschiedene Werte schreiben und anschließend drei weitere Register auslesen. Das Ganze soll noch mit einer IF-Bedingung kombiniert werden, sodass die nächste Anfrage nur gesendet wird, wenn die Anfrage, die zuletzt gesendet wurde, in utResponse zu finden ist. Eigentlich dachte ich, ich könnte das recht einfach lösen, aber alle Versuche und auch ein Lösungsvorschlag mit einer Joblist, aus einem anderen Beitrag hier, haben bei mir nur zu Fehlern geführt (zumal ich die Register nicht auslesen kann, siehe erstes Problem).
Die Variablen hätte ich wie folgt deklariert:
Code:
PROGRAM ModbusTCP_1
VAR_INPUT
// Sollwerte von U I und P werden übergeben und sollen nacheinander gesendet werden.
// Wurde ein Wert gesendet soll erst die Antwort (ein Echo) überprüft werden
// im Anschluss werden die Werte gemessen und zurück ans Hauptprogramm gegebenausgegeben.
wertU: WORD;
wertI: WORD;
wertP: WORD;
// Istwert Strom lesen: (regNr:=16#03, readAdd:= 16#01FB, readQua:=1, writAdd:=0, writQua:=0);
// Istwert Spannung lesen: (regNr:=16#03, readAdd:= 16#01FC, readQua:=1, writAdd:=0, writQua:=0);
// Istwert Leistung lesen: (regNr:=16#03, readAdd:= 16#01FD, readQua:=1, writAdd:=0, writQua:=0);
END_VAR
VAR_OUTPUT
messWertU: WORD;
messWertI: WORD;
messWertP: WORD;
END_VAR
VAR
// Spannung
regNrU: BYTE := 16#06;
writAddU: WORD := 16#01F4;
writQuaU: WORD := 1;
// Strom
regNrI: BYTE := 16#06;
writAddI: WORD := 16#01F5;
writQuaI: WORD := 1;
// Leistung
regNrP: BYTE := 16#06;
writAddP: WORD := 16#01F6;
writQuaP: WORD := 1;
myTcpMaster : FbMbMasterTcp := ( xConnect := TRUE,
sHost := '192.168.1.6', // IP of the remote server
wPort := 502, // port at the remote server
utKeepAlive := ( xEnable := TRUE, // use keep alive
tMaxIdleTime := T#5S, // Maximum time of inactivity
tInterval := T#2S, // Interval between two successive KA-Packets
udiProbes := 5 // Number of KA retry before giving up
),
eFrameType := eMbFrameType.ETHERNET,
tTimeOut := T#30MS
);
utQuery : typMbQuery := ( bUnitId := 0, // Slaveaddress
bFunctionCode := 0, // write input registers
uiReadAddress := 0, // Startaddress
uiReadQuantity := 0, // Quantity of wanted registers
uiWriteAddress := 0, // Startadresse
uiWriteQuantity := 0, // Quantity of wanted registers
awWriteData := [124(0)] // array to write
);
xTxTrigger : BOOL; (* Set this variable once for start a job. This variable will be automaticly reset by the master if the job is done.*)
utResponse : typMbResponse; (* After the job is done you can find at this structure the result.*)
tonDelay : TON := (PT := T#30MS); // This is the silence time between two requests
END_VAR
Im Programm wollte ich bFuctionCode bis awWriteData immer mit den passenden Informationen überschreiben.
Ich muss dazu sagen, ich hatte mit Wago und Modbus noch nie etwas am Hut und bin, was das angeht, absoluter Anfänger. Verschiedene Dokus und das ein oder andere Video hatten mich bei meinen Problemen leider nicht groß weitergebracht.
Bin für jeden Tipp dankbar.
Viele Dank.