-> Hier kostenlos registrieren
Moin zusammen,
ich habe ein Problem mit ModBus Master.
Ich habe von Wago eine Anleitung für einen MoBus Master bekommen, der läuft sehr stabil und hat eine Error Meldung bei Ausfall des Gerätes.
Aber das schreiben auf einzelne Register ist sehr langsam.
Hat jemand Erfahrungen wie man eine Verbindung schnell und sicher hinbekommt?
Viele Grüße
Diese Programmieung funktioniert, aber ist sehr langsam.
ich habe ein Problem mit ModBus Master.
Ich habe von Wago eine Anleitung für einen MoBus Master bekommen, der läuft sehr stabil und hat eine Error Meldung bei Ausfall des Gerätes.
Aber das schreiben auf einzelne Register ist sehr langsam.
Hat jemand Erfahrungen wie man eine Verbindung schnell und sicher hinbekommt?
Viele Grüße
Diese Programmieung funktioniert, aber ist sehr langsam.
Code:
-------------------------Master----------------------------
FUNCTION_BLOCK fbMaster
VAR_INPUT
I_Port : WagoTypesCom.I_WagoSysComBase;
udiBaudrate : UDINT := 19200;
eParity : eTTYParity := eTTYParity.Even;
tScanRate : TIME := T#200MS;
END_VAR
VAR_OUTPUT
sError : STRING := 'startup';
END_VAR
VAR_IN_OUT
I_Master : typMasterQuery;
END_VAR
VAR
oMaster : WagoAppPlcModbus.FbMbMasterSerial :=(
xConnect := TRUE,
usiDataBits := 8,
eStopBits := eTTYStopBits.One,
eHandshake := eTTYHandshake.None,
ePhysical := eTTYPhysicalLayer.RS485_HalfDuplex,
tTimeOut := T#1S,
eFrameType := eMbFrameType.RTU );
wState : WORD;
xSendQuery : BOOL;
oDelay : TON;
END_VAR
oMaster(
I_Port := I_Port,
udiBaudrate := udiBaudrate,
eParity := eParity,
utQuery := I_Master.oQuery,
xTrigger := xSendQuery,
utResponse := I_Master.oResponse );
CASE wState OF
0:
IF oMaster.xIsConnected THEN
I_Master.eState := eMasterState.FREE;
wState := 10;
END_IF
oMaster.oStatus.ShowResult(
sDescription => sError );
10:
IF I_Master.eState = eMasterState.START THEN
xSendQuery := TRUE;
I_Master.eState := eMasterState.BUSY;
wState := 20;
END_IF
20:
IF NOT xSendQuery THEN
oMaster.oStatus.ShowResult(
sDescription => sError );
I_Master.sError := sError;
I_Master.xError := oMaster.xError;
I_Master.eState := eMasterState.DONE;
wState := 30;
END_IF
30:
oDelay(
IN := TRUE,
PT := tScanRate );
IF oDelay.Q THEN
oDelay( IN := FALSE );
wState := 10;
END_IF
END_CASE
TYPE eMasterState :
(
INIT := 0,
FREE := 1,
START := 2,
BUSY := 3,
DONE := 4
);
END_TYPE
TYPE typMasterQuery :
STRUCT
oQuery : typMbQuery;
oResponse : typMbResponse;
eState : eMasterState;
sError : STRING;
xError : BOOL;
END_STRUCT
END_TYPE
-----------------Slave--------------------------
FUNCTION_BLOCK FbEAP_Neu_2
VAR_INPUT
bSlaveAddress : BYTE;
wOutput: WORD;
xOutPut0 :BOOL;
xOutPut1 :BOOL;
END_VAR
VAR_OUTPUT
xError : BOOL;
sError : STRING;
wHand , wHand2: WORD;
END_VAR
VAR_IN_OUT
I_Master : typMasterQuery;
Trigger1: BOOL;
Trigger2: BOOL;
END_VAR
VAR
wState : WORD;
wIndex : WORD;
aJobs : ARRAY [1..MAX_JOB_Modbus] OF typMbQuery :=[
(bFunctionCode := 4, uiReadAddress := 1, uiReadQuantity := 1), //1
//(bFunctionCode := 16, uiWriteAddress := 0, uiWriteQuantity := 1), //16
(bFunctionCode := 5, uiWriteAddress := 0, uiWriteQuantity := 1), //16
(bFunctionCode := 5, uiWriteAddress := 1, uiWriteQuantity := 1), //16
(bFunctionCode := 4, uiReadAddress := 1, uiReadQuantity := 1) //1
];
END_VAR
VAR CONSTANT
MAX_JOB_Modbus : WORD := 4;
END_VAR
CASE wState OF
0:
IF I_Master.eState = eMasterState.FREE THEN
wIndex := ( wIndex MOD MAX_JOB_Modbus) + 1;
//aJobs[wIndex].awWriteData[0] := TO_WORD(xOutPut0);
IF wIndex = 2 THEN
IF Trigger1 THEN
Trigger1 := FALSE;
aJobs[wIndex].awWriteData[0] := TO_WORD(xOutPut0);
ELSE
wIndex := ( wIndex MOD MAX_JOB_Modbus) + 1;
END_IF
END_IF
IF wIndex = 3 THEN
IF Trigger2 THEN
Trigger2 := FALSE;
aJobs[wIndex].awWriteData[0] := TO_WORD(xOutPut1);
ELSE
wIndex := ( wIndex MOD MAX_JOB_Modbus) + 1;
END_IF
END_IF
I_Master.oQuery := aJobs[wIndex];
I_Master.oQuery.bUnitId := bSlaveAddress;
I_Master.eState := eMasterState.START;
wState := 10;
END_IF
10:
IF I_Master.eState = eMasterState.DONE THEN
sError := I_Master.sError;
xError := I_Master.xError;
IF NOT xError THEN
CASE wIndex OF
1:
wHand := I_Master.oResponse.awData[0] ;
4:
wHand2 := I_Master.oResponse.awData[0] ;
END_CASE
END_IF
I_Master.eState := eMasterState.FREE;
wState := 0;
END_IF
END_CASE
Zuletzt bearbeitet: