Implemented stuff to get ready for jet measurement

This commit is contained in:
2026-03-12 00:37:23 +01:00
parent 19be407e08
commit f7bb4f2920
17 changed files with 954 additions and 165 deletions

View 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>

View File

@@ -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>

View File

@@ -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.