Poll Multi Modbus RTU Slave e!Cockpit 750-8202

Maziar

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Entschuldigung, Ich kann nicht spreche deutsch sehr gut.

I am going to poll multiple Modbus slaves from my PFC200 750-8202 Controller using my function block (MbSlave). unfortunately when the program runs, The Controller polls the first slave and leaves the others. could you please take a look at my codes?
FUNCTION_BLOCK MbSlave
VAR_INPUT
//--Define Com Port and Slave ID as Input Variables--//
ComPort : WagoTypesCom.I_WagoSysComBase ;
Slave_ID : BYTE ;
END_VAR
VAR_OUTPUT
//--Data polled from Measuring Center as Output variable--//
SlvData: ARRAY[0..50] OF DWORD;
END_VAR
VAR
//--- Declare Modbus Master Serial ------
MbSlv : FbMbMasterSerial := ( xConnect := TRUE,udiBaudrate := 19200,usiDataBits := 8,eParity := WagoTypesCom.eTTYParity.None,eStopBits := WagoTypesCom.eTTYStopBits.One,eHandshake := WagoTypesCom.eTTYHandshake.None,ePhysical:= WagoTypesCom.eTTYPhysicalLayer.RS485_HalfDuplex,eFrameType := eMbFrameType.RTU,tTimeOut := T#1S);
//-------------------------------------------------------------------------------
//Declare Modbus Queries
Poll_A: ARRAY[0..2] OF typMbQuery() :=
// Slaveaddress //read Holding registers // Startaddress // Quantity of wanted registers
[( bFunctionCode := 3, uiReadAddress := 0 , uiReadQuantity := 20 ),//Q1 INT32
( bFunctionCode := 3, uiReadAddress := 100 , uiReadQuantity := 30 ),//Q2 INT16
( bFunctionCode := 3, uiReadAddress := 200 , uiReadQuantity := 10 )//Q3 INT16
];
iQryCounter : BYTE :=0;
iRegCounter : BYTE :=0;

FB_F_Trig:F_Trig;
xTxTrigger : BOOL :=TRUE; (* This variable will be automaticly reset by the masterif the job is done.*)
delay:TON;
ResponseList:ARRAY [0..2] OF typMbResponse; //Store Query Response in array

END_VAR
//--- delay between two requests ----------------------
FB_F_Trig (clk:=xTxTrigger);
IF FB_F_Trig.Q THEN
xTxTrigger :=TRUE;
iQryCounter := (iQryCounter+1) MOD 3;//Next Query
END_IF
//---Fill the Slave ID
Poll_A[iQryCounter].bUnitId := Slave_ID;
//--- call the master for first query --------------
MbSlv(
I_Port := ComPort, // Link Serial Port
utQuery := Poll_A[iQryCounter],
xTrigger := xTxTrigger,
utResponse := ResponseList[iQryCounter] // Read responses
);
//--Reset the Counters------------------------------
iRegCounter := 0 ;
//-----------------------------------------
// Store response in SlvData
//-----------------------------------------
WHILE iRegCounter < Poll_A[iQryCounter].uiReadQuantity DO
CASE iQryCounter OF
0:
//Convert 2X16bit to 32bit
SlvData[iRegCounter/2] := ResponseList[iQryCounter].awData[iRegCounter+1] OR SHL(ResponseList[iQryCounter].awData[iRegCounter],16) ;
iRegCounter := iRegCounter + 2 ;
1:
//Convert 1X16bit to 32bit
SlvData[iRegCounter+10] := WORD_TO_DWORD(ResponseList[iQryCounter].awData[iRegCounter]) ;
iRegCounter := iRegCounter + 1 ;
2:
//Convert 1X16bit to 32bit
SlvData[(iRegCounter/4)+40] := WORD_TO_DWORD(ResponseList[iQryCounter].awData[iRegCounter]) ;
iRegCounter := iRegCounter + 4 ;

END_CASE

END_WHILE
1638285580269.png
Vielen Dank für eure Unterstützung!
 
Hallo,

eine serielle Schnittstelle kann nur von einem Funktionsbaustein verwendet werden.
Daher sollten die restlichen Instanzen des FbMbMasterSerial auch einen Fehler ausgeben.

Es müssen alle Slaves von einem Funktionsbaustein abgefragt werden.

Grüße
 
Hallo,

FbMbMasterMultiQuerySerial ist im PDF aus der Bibliothek WagoAppPlcModbus gut erklärt.
Aus den einzelnen Codeschnipseln kann man sich das Beispiel zusammenkopieren.

Ich persönlich sehe keinen direkten Vorteil im FbMbMasterMultiQuerySerial.
Würde daher den FbMbMasterSerial weiter verwenden.

Ich habe einen Funktionsbaustein der den FbMbMasterSerial kapselt und die Query, Response und einen Status nach außen reicht.
Für jeden Slave kann dann ein eigener Funktionsbaustein angelegt werden, der über die Query, Response und den Status auf den Master zugreifen kann.
Über den Status kann der Zugriff gesteuert werden, so dass nicht mehrere Slaves gleichzeitig auf den Master zugreifen.
Der Status hat die Werte Init, Free, Occupied, Done.

Meiner Meinung nach erhalte ich die gleiche Funktionialität wie beim FbMbMasterMultiQuerySerial ohne die objektorientierte Programmierung.

Grüße
 
Hallo Tobsucht

Hätten sie evtl. ein Beispiel wie man diesen Funktionsbaustein konfiguriert?

Ich versuche gerade eine alte Schneider SPS Quantum (unterstützt Modbus TCP/IP) via Modubs diverse Register auszulesen.
Mit folgender Video Anleitung von Wago habe ich es bereits probiert aber ohne Erfolg:
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

Der Wago Support hat mit gesagt das wir dies auch mit Funktionsblöcken aus der Libary WagoAppPlcModbus machen könnten.
Ich habe aber dies Libary noch nie genutzt.

Wir verwendne folgenden WAGO Controller:

Controller PFC100; 2 x ETHERNET; ECO​

Art.-Nr. 750-8100

Gruss Inel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Schneider beginnt bei Adresse 1.
Wenn die Quantum als Server arbeitet müssen die Variablen auf Adressen gelegt werden.
Erfolgt die Kommunikation über eine NOE muss das Ethernetprotokoll auf dieser richtig eingestellt sein.
Sonst ist in der Quantum nichts zu programmieren.
Läuft hingegen die Wago als Server muss in der Quantum die Kommunikation programmiert werden.

Am besten du benutzt den Configurator für die Einstellungen und nicht die Lib.
 
Hallo Holgermaik
Schneider beginnt bei Adresse 1.
Wenn die Quantum als Server arbeitet müssen die Variablen auf Adressen gelegt werden.
Erfolgt die Kommunikation über eine NOE muss das Ethernetprotokoll auf dieser richtig eingestellt sein.
Sonst ist in der Quantum nichts zu programmieren.
Läuft hingegen die Wago als Server muss in der Quantum die Kommunikation programmiert werden.

Am besten du benutzt den Configurator für die Einstellungen und nicht die Lib.
Danke, werde dies mal berücksichtigen und mich dan nochmals melden :=)
 
Hallo,

FbMbMasterMultiQuerySerial ist im PDF aus der Bibliothek WagoAppPlcModbus gut erklärt.
Aus den einzelnen Codeschnipseln kann man sich das Beispiel zusammenkopieren.

Ich persönlich sehe keinen direkten Vorteil im FbMbMasterMultiQuerySerial.
Würde daher den FbMbMasterSerial weiter verwenden.

Ich habe einen Funktionsbaustein der den FbMbMasterSerial kapselt und die Query, Response und einen Status nach außen reicht.
Für jeden Slave kann dann ein eigener Funktionsbaustein angelegt werden, der über die Query, Response und den Status auf den Master zugreifen kann.
Über den Status kann der Zugriff gesteuert werden, so dass nicht mehrere Slaves gleichzeitig auf den Master zugreifen.
Der Status hat die Werte Init, Free, Occupied, Done.

Meiner Meinung nach erhalte ich die gleiche Funktionialität wie beim FbMbMasterMultiQuerySerial ohne die objektorientierte Programmierung.

Grüße
Hallo Tobsucht,
Ich erstelle einen Funktionsblock für mehrere Abfragen, aber manchmal gibt er nicht die richtigen Daten zurück.
Könnten Sie mich bitte mit einem Beispiel-Multi-Query-Funktionsblock anleiten?
Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

FbMbMasterMultiQuerySerial ist im PDF aus der Bibliothek WagoAppPlcModbus gut erklärt.
Aus den einzelnen Codeschnipseln kann man sich das Beispiel zusammenkopieren.

Ich persönlich sehe keinen direkten Vorteil im FbMbMasterMultiQuerySerial.
Würde daher den FbMbMasterSerial weiter verwenden.

Ich habe einen Funktionsbaustein der den FbMbMasterSerial kapselt und die Query, Response und einen Status nach außen reicht.
Für jeden Slave kann dann ein eigener Funktionsbaustein angelegt werden, der über die Query, Response und den Status auf den Master zugreifen kann.
Über den Status kann der Zugriff gesteuert werden, so dass nicht mehrere Slaves gleichzeitig auf den Master zugreifen.
Der Status hat die Werte Init, Free, Occupied, Done.

Meiner Meinung nach erhalte ich die gleiche Funktionialität wie beim FbMbMasterMultiQuerySerial ohne die objektorientierte Programmierung.

Grüße
Sorry mate, do you have an example how you made it? I can not read multiples slaves with multiples queries each one.
 
Zurück
Oben