Simple Modbus Master FB Register lesen

feeelix

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe in meinem Programm auf einer Wago PFC 100 eine Modbusverbindung mittels dem SimpleModbusTCP Master FB aus der Wago Bibliothek aufgebaut.

Verbindung usw klappt super.

Allerdings kann ich maximal 125 Register gleichzeitig vom Slave lesen wenn ich das richtig verstanden habe...

Jetzt möchte ich aber meine Register 0 bis 10 und 200 bis 210 auslesen und in Variablen (im Code array_1 bzw array_2) im Programm ablegen, auch das funktioniert soweit, allerdings werden ab und zu kurzzeitig die Werte vom Reg. 0 bis 10 in die Variablen geschrieben wo eigentlich 200 bis 210 rein sollen.

Habe schon Verzögerungen zwischen den Anweisungen eingebaut, bringt aber nicht viel...

Hier mal ein Ausschnitt von meinem Code:

Mache ich irgendwas grundsätzlich falsch??

Case x OF
1: (**)
2:
IF NOT xModbusRW THEN

(* Register 200 bis 210 lesen*)
utQuery.bUnitId := 1;
utQuery.bFunctionCode := 16#04; // read input registers
utQuery.uiReadAddress := 200; // Startaddress
utQuery.uiReadQuantity := 10; // Quantity of wanted registers
xModbusRW := TRUE;

ELSE
array_1 := utResponse.awData; (* Registerinhalt 200 bis 210 speichern *)

(* Nächste Anweisung verzögern*)
IF z > 30 THEN
x := 3;
z := 0;
ELSE
z := z +1;
END_IF
END_IF

3: (**)
4:
IF NOT xModbusRW THEN

(* Register 0 bis 10 lesen *)
utQuery.bFunctionCode := 16#04; // read input registers
utQuery.uiReadAddress := 0; // Startaddress
utQuery.uiReadQuantity := 10; // Quantity of wanted registers
xModbusRW := TRUE;

ELSE
array_2 := utResponse.awData; (* Registerinhalt 0 bis 10 speichern *)

(* Nächste Anweisung verzögern*)
IF z > 30 THEN
x := 5;
z := 0;
ELSE
z := z +1;
END_IF
END_IF
end_Case

//--- call cyclic the master --------------
myTcpMaster( utQuery := utQuery,
xTrigger := xModbusRW,
utResponse := utResponse
);



Hoffentlich verständlich.. Danke schon mal für eure Mühe!

VG
Felix
 
Moin Felix,

da Du ja aus den Schritten 1&3 nicht selbsttätig rauskommst, mußt Du die Schritte ja von außen noch irgendwo beeinflussen. Da würde ich mal schauen, ob Du auch wirklich nur in Schritt 4 wechselst, wenn Du in einem Warteschritt bist.

Gruß
Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vorweg: Ich habe keine Ahnung von dem Wago Modbus FB.

Was soll die Wartezeit zwischen den Leseaufträgen bringen? Und wenn, dann muß das in Deinem Programm vermutlich ein eigener Schritt sein. Eine Schrittkette darf gerne mehr als 5 Schritte haben, da muß man nicht 3 verschiedene Dinge in einen Schritt quetschen.

Wenn ein Leseauftrag beendet ist, kann direkt der nächste Leseauftrag gestartet werden. Und das ist der perfekte Zeitpunkt, um die Auftragsparameter zu ändern, sprich einen anderen Registerbereich anzusprechen. Schau mal hier, wie simpel der Wechsel zwischen mehreren Leseaufträgen (Jobs) realisiert werden kann:
ModbusMaster (PRG)
Code:
PROGRAM ModbusMaster
VAR_INPUT
    Jobliste: ARRAY [0..1] OF typMbQuery := [
        ( //JOB 0, Eingänge lesen (Registerzugriff, inklusive digitale Eingänge)
            bUnitId:= 1,
            bFunctionCode:= 4,
            uiReadAddress:= 0,
            uiReadQuantity:= 3,
            uiWriteAddress:= 0,
            uiWriteQuantity:= 0,
            awWriteData:= [125(0)]
        ),
        ( //JOB 1, Ausgänge schreiben (Registerzugriff)
            bUnitId:= 1,
            bFunctionCode:= 16,
            uiReadAddress:= 0,
            uiReadQuantity:= 0,
            uiWriteAddress:= 512,
            uiWriteQuantity:= 1,
            awWriteData:= [125(0)]
        )];
END_VAR
VAR
    iJobCounter:INT:=0;
    xTrigger:BOOL:=TRUE;
    FB_F_Trig:F_Trig;
   
    Responseliste:ARRAY [0..1] OF typMbResponse;
           
    FB_ModbusMasterTCP:FbMbMasterTcp;
END_VAR

//Aufruf des Kommunikationsbausteins
FB_ModbusMasterTCP (xConnect:=TRUE,
                    sHost:='192.168.12.114',
                    wPort:=502,
                    eFrameType:=eMbFrameType.Ethernet,
                    tTimeOut:=T#2S,
                    utQuery:=Jobliste[iJobCounter],
                    xTrigger:=xTrigger,
                    utResponse:=Responseliste[iJobCounter]);

//Auf Jobende warten
FB_F_Trig (clk:=xTrigger);

//Jobende erfolgt, nächsten Job starten
IF FB_F_Trig.Q THEN
    xTrigger :=TRUE;
    iJobCounter := (iJobCounter+1) MOD 2;
END_IF

PS: Du liest nicht die Register 0..10 und 200..210 sondern 0..9 und 200..209

Harald
 
Vorweg: Ich habe keine Ahnung von dem Wago Modbus FB.

Was soll die Wartezeit zwischen den Leseaufträgen bringen? Und wenn, dann muß das in Deinem Programm vermutlich ein eigener Schritt sein. Eine Schrittkette darf gerne mehr als 5 Schritte haben, da muß man nicht 3 verschiedene Dinge in einen Schritt quetschen.

Wenn ein Leseauftrag beendet ist, kann direkt der nächste Leseauftrag gestartet werden. Und das ist der perfekte Zeitpunkt, um die Auftragsparameter zu ändern, sprich einen anderen Registerbereich anzusprechen. Schau mal hier, wie simpel der Wechsel zwischen mehreren Leseaufträgen (Jobs) realisiert werden kann:


PS: Du liest nicht die Register 0..10 und 200..210 sondern 0..9 und 200..209

Harald
Hallo Freund,

Ich habe eine Frage, ob Sie mir helfen könnten.
Ich lese einen Modbus-RTU-Zähler, aber er hat viele Register. Haben Sie die erweiterte serielle Modbus-Bibliothek für mehrere Abfragen verwendet? Ich mache das im E-Cockpit Wago. Ich muss die Bibliothek nutzen, da ich aufgefordert werde, die Baudrate und die Geräte-ID über eine Benutzeroberfläche zu konfigurieren. Die einzige Möglichkeit, die Parameter zu manipulieren, ist die Verwendung der Bibliothek und nicht über die RTU-Konfiguration, die ich auf einfache Weise in E-Cockpit oder Codesys durchführen kann. Aber dann muss ich eine Funktion erstellen, in der ich die genannten Änderungen zulassen und so viele einfügen kann, wie ich möchte. Nehmen wir an, ich lese ab Register 3000 mit der Menge 60, nach 3120 mit der Menge 60. Und so weiter mit allen Registern, die ich lesen muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Freund,

Ich habe eine Frage, ob Sie mir helfen könnten.
Ich lese einen Modbus-RTU-Zähler, aber er hat viele Register. Haben Sie die erweiterte serielle Modbus-Bibliothek für mehrere Abfragen verwendet?

in dem von @PN/DP zitierten Beitrag wird das doch durch die unterschiedlichen Jobs in der Joblist gemacht. Du mußt nur den FB für die serielle Version nehmen, dazu hast Du ja auch schon einen Beitrag gefunden

Gruß
 
Zurück
Oben