Modbus TCP Verständnisfrage

snej

Level-1
Beiträge
73
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich habe eine allgemeine Frage zu Modbus TCP. Habe gelesen das der Modbus Server quasi Slave ist und der Modbus Client der Master.

Ich habe eine Beckhoff Steuerung, die Daten von mehreren Sabo Steuerungen lesen soll. Wäre es nach der oben genannten Definition sinnvoll auf den Sabo Steuerungen einen Modbus Server aufzusetzen der die Daten bereit stellt und die Beckhoff Steuerung die Daten von der Sabo zyklisch (benötige die Daten dauerhaft) anfragt? Das würde ja bedeuten ich habe mehrere Server und einen Client. Hört sich für mich erstmal komisch an. Wobei es ja andersrum wieder richtig wäre. Ich habe mehrere Slaves und einen Master. Das ganze hat mich ein wenig verwirrt! Bin für jede Hilfe dankbar.

Gibt es eine komfortablere Lösung als meine genannte?

Gruß Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab nochmal eine weitere Frage. Mit dem lesen klappt soweit alles ganz gut. Da ich die Daten zyklisch abrufen möchte habe ich mir eine Art Blinker für den execute Eingang am FB von Beckhoff programmiert.

Genauso wollte ich das jetzt auch mit den Daten, die geschrieben werden sollen, machen. Nur leider ist der Wert, wenn am execute Eingang ein false anliegt, immer auf 0. Ein dauerhaftes Signal an den execute Eingang anlegen bringt auch nichts, da der FB nur ausgeführt wird, wenn dort eine positive Flanke anliegt.

Code:
IF Execute[2] THEN 
   Execute[1] := TRUE; 
ELSE 
   Execute[2]:=TRUE; 
END_IF
 
fbReadReg.sIPAddr := IP;
fbReadReg.nTCPPort := 502;
fbReadReg.nQuantity := 16;
fbReadReg.nMBAddr := 16;
fbReadReg.cbLength := SIZEOF(PumpRegisterIN);
fbReadReg.pDestAddr := ADR(PumpRegisterIN);
fbReadReg.bExecute := Execute[1];
fbReadReg.tTimeout := T#2s;
 
fbWriteReg.sIPAddr := IP;
fbWriteReg.nTCPPort := 502;
fbWriteReg.nQuantity := 16;
fbWriteReg.nMBAddr := 0;
fbWriteReg.cbLength := SIZEOF(PumpRegisterOUT);
fbWriteReg.pSrcAddr := ADR(PumpRegisterOUT);
fbWriteReg.bExecute := Execute[1];
fbWriteReg.tTimeout := T#2s;
 
IF Execute[1] THEN 
   Execute[2] := FALSE; 
END_IF

Execute[1] := FALSE;
 
fbReadReg();
fbWriteReg();

Gruß Jens
 
... Nur leider ist der Wert, wenn am execute Eingang ein false anliegt, immer auf 0. Ein dauerhaftes Signal an den execute Eingang anlegen bringt auch nichts, da der FB nur ausgeführt wird, wenn dort eine positive Flanke anliegt.
...

würde es dann eventuell so funktionieren ?

Weiterarbeiten würdest du mit ...Register...[1], da diese die gültigen Werte haben, ......[0] sind ja deiner Info nach immer 0

Code:
Execute[1] := not Execute[1]; 
 
fbReadReg.sIPAddr := IP;
fbReadReg.nTCPPort := 502;
fbReadReg.nQuantity := 16;
fbReadReg.nMBAddr := 16;
fbReadReg.cbLength := SIZEOF(PumpRegisterIN[Execute[1]]);
fbReadReg.pDestAddr := ADR(PumpRegisterIN[Execute[1]]);
fbReadReg.bExecute := Execute[1];
fbReadReg.tTimeout := T#2s;
 
fbWriteReg.sIPAddr := IP;
fbWriteReg.nTCPPort := 502;
fbWriteReg.nQuantity := 16;
fbWriteReg.nMBAddr := 0;
fbWriteReg.cbLength := SIZEOF(PumpRegisterOUT[Execute[1]]);
fbWriteReg.pSrcAddr := ADR(PumpRegisterOUT[Execute[1]]);
fbWriteReg.bExecute := Execute[1];
fbWriteReg.tTimeout := T#2s;
 
fbReadReg();
fbWriteReg();
 
Peinlich, dass mir das nicht eingefallen ist.
Code:
execute := NOT execute;
Dank dir. Und dabei versuch ich immer möglichst kurz und knapp zu schreiben. Naja so ist das wohl, wenn man andere Sachen im Kopf hat.

Das Problem war allerdings ein anderes. Habe es aber mittlerweile herausgefunden. Ich habe die Funktionsaufrufe in einem FB um ihn für mehrere Pumpen zu benutzen. Habe ausversehen bei 2 Bausteinen sie selbe IP angelegt und mir somit den Wert immer wieder überschrieben, da ich aus 2 FBs auf ein und den selben Modbus Server geschrieben habe.

Trotzdem danke für eure Mühe und meinen Code konnte ich ja so auch noch verfeinern. Dafür nochmal ein echtes Lob an dieses Forum. Ist echt TOP.
 
Zurück
Oben