216 lines
5.2 KiB
XML
216 lines
5.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1">
|
|
<POU Name="FB_LeviPump" Id="{5bcbb8cf-d053-4b79-9a6f-fd1b82880719}" SpecialFunc="None">
|
|
<Declaration><![CDATA[FUNCTION_BLOCK FB_LeviPump
|
|
VAR_INPUT
|
|
byAddr : BYTE;
|
|
xEnable : BOOL;
|
|
rSpeedSP : REAL;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
rSpeedPV : REAL;
|
|
END_VAR
|
|
VAR_IN_OUT
|
|
fbModbusMaster : FB_ModbusMaster;
|
|
END_VAR
|
|
VAR
|
|
_iState : INT;
|
|
|
|
_stMBReq : ST_Modbus_Req;
|
|
_stPollReq : ST_Modbus_Req;
|
|
|
|
_rSpeedSPOld : REAL := 0.0;
|
|
_wStateReq : WORD;
|
|
|
|
_wSpeedSP : WORD;
|
|
_xDebug : WORD := 2000;
|
|
_wFlowSP : WORD;
|
|
_wFlowSPOld : WORD;
|
|
|
|
_xMBReqDone : BOOL;
|
|
_xMBReqError : BOOL;
|
|
|
|
// Polling data
|
|
_tonPollTimer : TON;
|
|
_timPollingTime : TIME := T#500MS;
|
|
_stPumpStatus : ST_LeviPumpStatus;
|
|
_xMBPollDone : BOOL := TRUE;
|
|
_xMBPollError : BOOL;
|
|
|
|
_xTest : BOOL;
|
|
END_VAR
|
|
VAR CONSTANT
|
|
REG_STATE_REQ : WORD := 16#4000;
|
|
REG_SPEED_SP : WORD := 16#4001;
|
|
REG_FLOW_SP : WORD := 16#4002;
|
|
|
|
REG_STATUS : WORD := 16#4000;
|
|
REG_STATUS_SIZE : WORD := 11;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Polling of pump state
|
|
_tonPollTimer(IN := TRUE, PT := _timPollingTime);
|
|
// IF _tonPollTimer.Q AND (_xMBPollDone) THEN
|
|
IF _tonPollTimer.Q AND _xTest THEN
|
|
_tonPollTimer(IN := FALSE);
|
|
|
|
M_GetPumpStatus();
|
|
END_IF
|
|
|
|
CASE _iState OF
|
|
// Idle
|
|
0:
|
|
IF xEnable THEN
|
|
// Enable pump in speed ctrl
|
|
M_SendStateChangeReq(wState := E_LeviPumpState.SPEED_CTRL);
|
|
|
|
_iState := 10;
|
|
END_IF
|
|
|
|
// Wait for command to be done
|
|
10:
|
|
IF _xMBReqDone THEN
|
|
_iState := 20;
|
|
END_IF
|
|
|
|
IF _xMBReqError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Enabled
|
|
20:
|
|
// Disable pump if requested
|
|
IF (NOT xEnable) THEN
|
|
M_SendStateChangeReq(wState := E_LeviPumpState.OFF);
|
|
_iState := 40;
|
|
END_IF
|
|
|
|
// Send new speed setpoint cmd when changed
|
|
IF rSpeedSP <> _rSpeedSPOld THEN
|
|
_rSpeedSPOld := rSpeedSP;
|
|
M_SendSpeedSP(wSpeed := REAL_TO_WORD(rSpeedSP));
|
|
_iState := 30;
|
|
END_IF
|
|
|
|
IF _wFlowSP <> _wFlowSPOld THEN
|
|
M_SendFlowSP(wFlow := _xDebug);
|
|
_wFlowSPOld := _wFlowSP;
|
|
_iState := 30;
|
|
END_IF
|
|
|
|
// Wait for new command to be done
|
|
30:
|
|
IF _xMBReqDone THEN
|
|
_iState := 20;
|
|
END_IF
|
|
|
|
IF _xMBReqError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
|
|
// Wait for disable command to be done
|
|
40:
|
|
IF _xMBReqDone THEN
|
|
_iState := 0;
|
|
END_IF
|
|
|
|
IF _xMBReqError THEN
|
|
_iState := 900;
|
|
END_IF
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
<Method Name="M_GetPumpStatus" Id="{c29d3781-24af-49d0-ae91-bc8bbcd19d13}">
|
|
<Declaration><![CDATA[METHOD PRIVATE M_GetPumpStatus
|
|
VAR_INPUT
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Send pump state change request
|
|
_stPollReq.bySlaveAddr := byAddr;
|
|
_stPollReq.eCmd := E_Modbus_Cmd.READ_INPUTS;
|
|
_stPollReq.wStartAddr := REG_STATUS;
|
|
_stPollReq.pvData := ADR(_stPumpStatus);
|
|
_stPollReq.wDataSize := SIZEOF(_stPumpStatus);
|
|
_stPollReq.wQuantity := 8;
|
|
_stPollReq.pxDone := ADR(_xMBPollDone);
|
|
_stPollReq.pxError := ADR(_xMBPollError);
|
|
|
|
// Put request into queue
|
|
fbModbusMaster.M_Enqueue(stReq := _stPollReq);]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="M_SendFlowSP" Id="{db46ab38-50c8-48c4-b96a-5a58f673f453}">
|
|
<Declaration><![CDATA[METHOD M_SendFlowSP
|
|
VAR_INPUT
|
|
wFlow : WORD;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Copy requested speed into internal buffer
|
|
_wFlowSP := wFlow;
|
|
|
|
// Send pump state change request
|
|
_stMBReq.bySlaveAddr := byAddr;
|
|
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
|
|
_stMBReq.wStartAddr := REG_FLOW_SP;
|
|
_stMBReq.pvData := ADR(_wFlowSP);
|
|
_stMBReq.wDataSize := SIZEOF(_wFlowSP);
|
|
_stMBReq.wQuantity := 1;
|
|
_stMBReq.pxDone := ADR(_xMBReqDone);
|
|
_stMBReq.pxError := ADR(_xMBReqError);
|
|
|
|
// Put request into queue
|
|
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="M_SendSpeedSP" Id="{a9bf2f20-217d-46ed-911b-cac69c35be30}">
|
|
<Declaration><![CDATA[METHOD PRIVATE M_SendSpeedSP
|
|
VAR_INPUT
|
|
wSpeed : WORD;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Copy requested speed into internal buffer
|
|
_wSpeedSP := wSpeed;
|
|
|
|
// Send pump state change request
|
|
_stMBReq.bySlaveAddr := byAddr;
|
|
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
|
|
_stMBReq.wStartAddr := REG_SPEED_SP;
|
|
_stMBReq.pvData := ADR(_wSpeedSP);
|
|
_stMBReq.wDataSize := SIZEOF(_wSpeedSP);
|
|
_stMBReq.wQuantity := 1;
|
|
_stMBReq.pxDone := ADR(_xMBReqDone);
|
|
_stMBReq.pxError := ADR(_xMBReqError);
|
|
|
|
// Put request into queue
|
|
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
<Method Name="M_SendStateChangeReq" Id="{74415361-bb7e-4c06-b3ba-110b75c5772b}">
|
|
<Declaration><![CDATA[METHOD PRIVATE M_SendStateChangeReq
|
|
VAR_INPUT
|
|
wState : WORD;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Copy requested state into internal buffer
|
|
_wStateReq := wState;
|
|
|
|
// Send pump state change request
|
|
_stMBReq.bySlaveAddr := byAddr;
|
|
_stMBReq.eCmd := E_Modbus_Cmd.WRITE_HOLDING;
|
|
_stMBReq.wStartAddr := REG_STATE_REQ;
|
|
_stMBReq.pvData := ADR(_wStateReq);
|
|
_stMBReq.wDataSize := SIZEOF(_wStateReq);
|
|
_stMBReq.wQuantity := 1;
|
|
_stMBReq.pxDone := ADR(_xMBReqDone);
|
|
_stMBReq.pxError := ADR(_xMBReqError);
|
|
|
|
// Put request into queue
|
|
fbModbusMaster.M_Enqueue(stReq := _stMBReq);]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
</POU>
|
|
</TcPlcObject> |