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>

File diff suppressed because one or more lines are too long

View File

@@ -101,16 +101,27 @@
</Instance>
<Mappings>
<OwnerA>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 103 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankAceticAcidLow._fbWaterValve.xOpenValve" VarB="Byte 2^Output[6]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankHydrofluoricAcid._fbWaterValve.xOpenValve" VarB="Byte 2^Output[7]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankNitricAcid._fbWaterValve.xOpenValve" VarB="Byte 2^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSulfuricAcid._fbWaterValve.xOpenValve" VarB="Byte 2^Output[4]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 104 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankAceticAcidHigh._fbDrainValve.xOpenValve" VarB="Byte 1^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankAceticAcidHigh._fbWaterValve.xOpenValve" VarB="Byte 0^Output[4]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankAceticAcidLow._fbDrainValve.xOpenValve" VarB="Byte 1^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankFilmetch._fbDrainValve.xOpenValve" VarB="Byte 0^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankFilmetch._fbWaterValve.xOpenValve" VarB="Byte 0^Output[3]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankHydrofluoricAcid._fbDrainValve.xOpenValve" VarB="Byte 1^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankHydrofluoricAcidMixing._fbDrainValve.xOpenValve" VarB="Byte 0^Output[7]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankHydrofluoricAcidMixing._fbWaterValve.xOpenValve" VarB="Byte 0^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankNitricAcid._fbDrainValve.xOpenValve" VarB="Byte 1^Output[3]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSEF._fbDrainValve.xOpenValve" VarB="Byte 0^Output[6]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSEF._fbWaterValve.xOpenValve" VarB="Byte 0^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSulfuricAcid._fbDrainValve.xOpenValve" VarB="Byte 1^Output[4]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSulfuricAcidMixing._fbDrainValve.xOpenValve" VarB="Byte 1^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbMediaCabinet._fbTankSulfuricAcidMixing._fbWaterValve.xOpenValve" VarB="Byte 0^Output[0]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 26 (TM-X5K_CB-NEC20E)">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner.diXOffset" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7"/>

View File

@@ -2677,7 +2677,7 @@ External Setpoint Generation:
</Properties>
</DataType>
</DataTypes>
<Instance TmcHash="{C3D1172C-C3FF-CE61-14D7-FC4C273B8DEA}">
<Instance TmcHash="{6F9D093A-93DD-18C8-E5C5-A2C7DAE3FFFF}">
<Vars VarGrpType="1">
<Name>PlcTask Inputs</Name>
<Var>