Added automatic filling with water in media cabinet

- Tanks in media cabinet can now automatically be filled with water via HMI
This commit is contained in:
2026-03-10 18:44:41 +01:00
parent f4562af86f
commit 19be407e08
4 changed files with 79 additions and 16 deletions

View File

@@ -31,6 +31,9 @@ VAR
_wFillingValveSafetyIntlkUsed : T_INTERLOCK;
_wFillingValveSafetyIntlk : T_INTERLOCK;
_xStartEmptyTank : BOOL;
_xStartFillTankWater : BOOL;
_iState : INT;
_xFirstCycle : BOOL := TRUE;
@@ -43,6 +46,8 @@ END_VAR
_wFillingValveSafetyIntlkUsed.0 := 1;
END_IF
M_HandleHMIInput();
// Overfull is NC so true if ok
_wFillingValveSafetyIntlk.0 := i_xOverfull;
_fbFillingValve(
@@ -78,15 +83,13 @@ _fbPumpValve(
CASE _iState OF
// Idle
0:
// Start emptying tank
IF stHMIInterface.stEmptyButton.xRequest THEN
stHMIInterface.stEmptyButton.xRequest := FALSE;
IF _xStartEmptyTank THEN
_xStartEmptyTank := FALSE;
_iState := 10;
END_IF
// Start filling tank with water
IF stHMIInterface.stFillButton.xRequest THEN
stHMIInterface.stFillButton.xRequest := FALSE;
IF _xStartFillTankWater THEN
_xStartFillTankWater := FALSE;
_iState := 20;
END_IF
@@ -102,11 +105,22 @@ CASE _iState OF
// Fill tank with water
20:
_fbWaterValve.xAutomaticOpen := TRUE;
IF xFull THEN
;
_fbWaterValve.xAutomaticOpen := FALSE;
_iState := 0;
END_IF
END_CASE]]></ST>
END_CASE
M_HandleHMIOutput();
// Copy to output buffer
xOverfull := (NOT i_xOverfull);
xFull := i_xFull;
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.
@@ -124,6 +138,29 @@ END_VAR
_stValveConfig.xHasClosedFeedback := FALSE;]]></ST>
</Implementation>
</Method>
<Method Name="M_HandleHMIInput" Id="{ff85cf86-15cf-4e14-ac8d-98aa206cdc7d}">
<Declaration><![CDATA[METHOD PRIVATE M_HandleHMIInput : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Start emptying tank
IF stHMIInterface.stEmptyButton.xRequest THEN
stHMIInterface.stEmptyButton.xRequest := FALSE;
IF stHMIInterface.stEmptyButton.xRelease THEN
_xStartEmptyTank := TRUE;
END_IF
END_IF
// Start filling tank with water
IF stHMIInterface.stFillButton.xRequest THEN
stHMIInterface.stFillButton.xRequest := FALSE;
IF stHMIInterface.stFillButton.xRelease THEN
_xStartFillTankWater := TRUE;
END_IF
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_HandleHMIOutput" Id="{8939e00b-3459-4b5e-a4b3-7b489eec260a}">
<Declaration><![CDATA[METHOD PRIVATE M_HandleHMIOutput : BOOL
VAR_INPUT
@@ -133,7 +170,22 @@ END_VAR
<ST><![CDATA[// Overfull sensor is NC
stHMIInterface.xOverfull := (NOT i_xOverfull);
stHMIInterface.xFull := i_xFull;
stHMIInterface.xEmpty := i_xEmpty;]]></ST>
stHMIInterface.xEmpty := (NOT i_xEmpty);
stHMIInterface.stFillButton.xRelease := i_xOverfull AND (NOT i_xFull);
stHMIInterface.stEmptyButton.xRelease := i_xEmpty;
IF _fbWaterValve.IsOpen THEN
stHMIInterface.stFillButton.eFeedback := 1;
ELSE
stHMIInterface.stFillButton.eFeedback := 0;
END_IF
IF _fbDrainValve.IsOpen THEN
stHMIInterface.stEmptyButton.eFeedback := 1;
ELSE
stHMIInterface.stEmptyButton.eFeedback := 0;
END_IF]]></ST>
</Implementation>
</Method>
</POU>