Implemented stuff to get ready for jet measurement
This commit is contained in:
19
PLC/01_Stationen/MediaStation/DUTs/E_LeviPumpState.TcDUT
Normal file
19
PLC/01_Stationen/MediaStation/DUTs/E_LeviPumpState.TcDUT
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TcPlcObject Version="1.1.0.1">
|
||||
<DUT Name="E_LeviPumpState" Id="{bcd971a7-4a89-44e9-a91b-53458e7d6d43}">
|
||||
<Declaration><![CDATA[{attribute 'qualified_only'}
|
||||
{attribute 'strict'}
|
||||
{attribute 'to_string'}
|
||||
TYPE E_LeviPumpState :
|
||||
(
|
||||
OFF := 1,
|
||||
SPEED_CTRL := 2,
|
||||
FLOW_CTRL := 3,
|
||||
SAFE_SPEED_CTRL := 7,
|
||||
SAFE_FLOW_CTRL := 8,
|
||||
HYDR_IDENT := 32
|
||||
)WORD;
|
||||
END_TYPE
|
||||
]]></Declaration>
|
||||
</DUT>
|
||||
</TcPlcObject>
|
||||
@@ -29,6 +29,9 @@ STRUCT
|
||||
|
||||
// (9) Filmetch
|
||||
stTankFilmetch : ST_HMI_Tank;
|
||||
|
||||
// Valve filmetch
|
||||
stValveFilmetch : ST_HMI_VALVE_DATA;
|
||||
END_STRUCT
|
||||
END_TYPE
|
||||
]]></Declaration>
|
||||
|
||||
22
PLC/01_Stationen/MediaStation/DUTs/ST_LeviPumpStatus.TcDUT
Normal file
22
PLC/01_Stationen/MediaStation/DUTs/ST_LeviPumpStatus.TcDUT
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TcPlcObject Version="1.1.0.1">
|
||||
<DUT Name="ST_LeviPumpStatus" Id="{a7d91135-e782-4458-9cdc-855a45a5eb97}">
|
||||
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
|
||||
TYPE ST_LeviPumpStatus :
|
||||
STRUCT
|
||||
eState : E_LeviPumpState;
|
||||
wActSpeed : WORD;
|
||||
wActFlow : WORD;
|
||||
wSpeedSP : WORD;
|
||||
wFlowSP : WORD;
|
||||
wActPumpError : WORD;
|
||||
wActFlowError : WORD;
|
||||
wActPumpWarning : WORD;
|
||||
wActFlowWarning : WORD;
|
||||
wActPumpMsg : WORD;
|
||||
wActFlowMsg : WORD;
|
||||
END_STRUCT
|
||||
END_TYPE
|
||||
]]></Declaration>
|
||||
</DUT>
|
||||
</TcPlcObject>
|
||||
216
PLC/01_Stationen/MediaStation/POUs/FB_LeviPump.TcPOU
Normal file
216
PLC/01_Stationen/MediaStation/POUs/FB_LeviPump.TcPOU
Normal file
@@ -0,0 +1,216 @@
|
||||
<?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>
|
||||
@@ -42,7 +42,19 @@ VAR
|
||||
|
||||
// Flowsensors
|
||||
//_fbFlowSensors16 : FB_Levi_LFC6IO
|
||||
|
||||
|
||||
// Filmetch valve, NC -> Recirculating back into tank
|
||||
_fbValveFilmetchOut : FB_Valve('');
|
||||
|
||||
// General valve config for valves with no feedback
|
||||
_stValveConfig : ST_ValveConfig;
|
||||
|
||||
// Modbus master for Pumps
|
||||
_fbMBMaster : FB_ModbusMaster;
|
||||
_fbLeviPump9 : FB_LeviPump;
|
||||
_xEnablePump : BOOL;
|
||||
|
||||
_xTest : BOOL;
|
||||
END_VAR
|
||||
]]></Declaration>
|
||||
<Implementation>
|
||||
@@ -98,7 +110,41 @@ _fbTankFilmetch(
|
||||
xReleaseErrors:= xReleaseErrors,
|
||||
xReleaseManualMode:= xReleaseManualMode,
|
||||
xConfirmAlarms:= xConfirmAlarms,
|
||||
stHMIInterface:= stHMIInterface.stTankFilmetch);]]></ST>
|
||||
stHMIInterface:= stHMIInterface.stTankFilmetch);
|
||||
|
||||
// Valves
|
||||
_fbValveFilmetchOut(
|
||||
xReleaseErrors:= xReleaseErrors,
|
||||
stValveConfig:= _stValveConfig,
|
||||
xReleaseManualMode:= xReleaseManualMode,
|
||||
xConfirmAlarms:= xConfirmAlarms,
|
||||
stHMIInterface:= stHMIInterface.stValveFilmetch);
|
||||
|
||||
_fbMBMaster();
|
||||
|
||||
_fbLeviPump9(
|
||||
byAddr:= 9,
|
||||
xEnable:= _xEnablePump,
|
||||
rSpeedSP:= 2000,
|
||||
fbModbusMaster:= _fbMBMaster);
|
||||
|
||||
]]></ST>
|
||||
</Implementation>
|
||||
<Method Name="FB_Init" Id="{860f10c9-69ca-4ad7-9edc-00af754d0af0}">
|
||||
<Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.
|
||||
//The return value is not evaluated. For a specific influence, you can also declare the
|
||||
//methods explicitly and provide additional code there with the standard initialization
|
||||
//code. You can evaluate the return value.
|
||||
METHOD FB_Init: BOOL
|
||||
VAR_INPUT
|
||||
bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
|
||||
bInCopyCode: BOOL; // TRUE: the instance will be copied to the copy code afterward (online change)
|
||||
END_VAR
|
||||
]]></Declaration>
|
||||
<Implementation>
|
||||
<ST><![CDATA[_stValveConfig.xHasOpenFeedback := FALSE;
|
||||
_stValveConfig.xHasClosedFeedback := FALSE;]]></ST>
|
||||
</Implementation>
|
||||
</Method>
|
||||
</POU>
|
||||
</TcPlcObject>
|
||||
@@ -3,6 +3,7 @@
|
||||
<POU Name="FB_Tank" Id="{d029e65c-5c27-470b-8bee-fea9f0455669}" SpecialFunc="None">
|
||||
<Declaration><![CDATA[FUNCTION_BLOCK FB_Tank
|
||||
VAR_INPUT
|
||||
xOpenPumpValve : BOOL;
|
||||
xReleaseErrors : BOOL;
|
||||
xReleaseManualMode : BOOL;
|
||||
xConfirmAlarms : BOOL;
|
||||
@@ -74,6 +75,7 @@ _fbDrainValve(
|
||||
stHMIInterface:= stHMIInterface.stDrainValve);
|
||||
|
||||
_fbPumpValve(
|
||||
xAutomaticOpen := xOpenPumpValve,
|
||||
xReleaseErrors:= xReleaseErrors,
|
||||
stValveConfig:= _stValveConfig,
|
||||
xReleaseManualMode:= xReleaseManualMode,
|
||||
@@ -119,8 +121,7 @@ M_HandleHMIOutput();
|
||||
// Copy to output buffer
|
||||
xOverfull := (NOT i_xOverfull);
|
||||
xFull := i_xFull;
|
||||
xEmpty := (NOT i_xEmpty);
|
||||
]]></ST>
|
||||
xEmpty := (NOT i_xEmpty);]]></ST>
|
||||
</Implementation>
|
||||
<Method Name="FB_Init" Id="{9c6d1842-9c2e-4437-b40f-941f77668ffe}">
|
||||
<Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.
|
||||
|
||||
Reference in New Issue
Block a user