I had the same issue. Digital Twins worked the best for me:
FUNCTION_BLOCK FbSpecialSlave EXTENDS FbDigitalTwinMbSlaveDevice
VAR_INPUT
bUnitId : BYTE := 1;
tScanRate : TIME := T#200MS;
END_VAR
VAR_OUTPUT
xError : BOOL;
sInfo : STRING;
wValue1 : WORD;
wValue2 : WORD;
wValue3 : WORD;
END_VAR
VAR
xTrigger : BOOL;
m_FbQuery_0 : WagoAppPLCModbus.FbQuery(THIS^);
m_FbQuery_1 : WagoAppPLCModbus.FbQuery(THIS^);
m_FbQuery_2 : WagoAppPLCModbus.FbQuery(THIS^);
wState : WORD;
oDelay : TON;
END_VAR
CASE wState OF
0:
IF IMbMasterMultiQuery = 0 THEN
RETURN;
ELSIF NOT IMbMasterMultiQuery.xConnected THEN
RETURN;
ELSE
wState := 10;
END_IF
10:
oDelay(
IN := TRUE,
PT := tScanRate );
IF oDelay.Q THEN
oDelay(
IN := FALSE );
m_FbQuery_0.bUnitId := bUnitId;
m_FbQuery_0.bFunctionCode := 3;
m_FbQuery_0.uiReadAddress := 0;
m_FbQuery_0.uiReadQuantity := 1;
protAttachMbQuery(m_FbQuery_0);
m_FbQuery_1.bUnitId := bUnitId;
m_FbQuery_1.bFunctionCode := 3;
m_FbQuery_1.uiReadAddress := 1;
m_FbQuery_1.uiReadQuantity := 1;
protAttachMbQuery(m_FbQuery_1);
m_FbQuery_2.bUnitId := bUnitId;
m_FbQuery_2.bFunctionCode := 3;
m_FbQuery_2.uiReadAddress := 2;
m_FbQuery_2.uiReadQuantity := 1;
protAttachMbQuery(m_FbQuery_2);
END_IF
END_CASE
This FB has two methods
METH: onError
(*
after each request with errors is method called
*)
METHOD onError : bool
VAR_INPUT
IQuery : I_Query;
utResponse : typMbResponse;
oStatus : WagoSysErrorBase.FbResult;
END_VAR
xError := TRUE;
sInfo := oStatus.GetDescription();
METH onResponse:
METHOD onResponse : BOOL
VAR_INPUT
IQuery : I_Query;
utResponse : typMbResponse;
END_VAR
xError := FALSE;
sInfo := 'OK';
IF IQuery = m_FbQuery_0.IQuery THEN
wValue1 := utResponse.awData[0];
ELSIF
IQuery = m_FbQuery_1.IQuery THEN
wValue2 := utResponse.awData[0];
ELSIF
IQuery = m_FbQuery_2.IQuery THEN
wValue3 := utResponse.awData[0];
END_IF
No use the FbMbMasterMultiQuerySerial as your Master. connect the IMbMasterMultiQuery from your master to the Slave Devices. I_Port ist the 750-652 Card.
I hope this helps.
Cheers