This commit is contained in:
2026-01-08 11:08:17 +01:00
commit fe882dc444
311 changed files with 511562 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.8">
<DUT Name="sPumpConfig" Id="{9abed313-1fe2-45c1-b2c3-88ae8339c65d}">
<Declaration><![CDATA[TYPE sPumpConfig :
STRUCT
TargetPressure : LREAL;
RefillMaxTime : LREAL;
CleaningCycles : INT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.8">
<GVL Name="LEVI_GVL" Id="{c0a02d29-10d8-495c-b8d5-33003fb00d77}">
<Declaration><![CDATA[VAR_GLOBAL
LeviModbusMaster : ARRAY[1..LeviNumberOfModbusMaster] OF ModbusMaster_FB;
LeviPump : ARRAY[1..LeviNumberOfPump] OF LeviPumpIn_FB;
VisuLeviPump : REFERENCE TO LeviPumpIn_FB := LeviPump[1];
Levi2PumpMixSystem : ARRAY[1..2] OF Levi2PumpMixSystem_FB;
END_VAR
VAR_GLOBAL CONSTANT
LeviNumberOfPump : INT := 9;
LeviNumberOfModbusMaster : INT := 3;
LeviNumberOfModbusQueue : UDINT := 3;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
<POU Name="Levi2PumpMixSystem_FB" Id="{ece2ff75-6acd-40f3-8c3a-ce486569e98e}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK Levi2PumpMixSystem_FB
VAR_INPUT
iStation : INT;
TargetVolume : REFERENCE TO LREAL;
TargetFlow : REFERENCE TO LREAL;
TargetRatio : REFERENCE TO LREAL;
System : REFERENCE TO LeviPumpIn_FB;
Pump1 : REFERENCE TO LeviPumpIn_FB;
Pump2 : REFERENCE TO LeviPumpIn_FB;
END_VAR
VAR_OUTPUT
END_VAR
VAR
Step : INT;
END_VAR
VAR PERSISTENT
MixSystemOk : BOOL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF StationsStatus[iStation].Soll.Stop THEN
IF Step > 10 THEN
MixSystemOk := FALSE;
Step := 0;
END_IF
END_IF
CASE Step OF
0:
IF System.bOutStartMix THEN
IF System.bInTankFull THEN
System.bOutStartMix := 0;
ELSE
Step := 10;
END_IF
END_IF
10:
IF System.bOutInitDone AND Pump1.bOutInitDone AND Pump2.bOutInitDone THEN
Step := 20;
END_IF
20:
IF Pump1.StartVolume(TargetVolume*(1-TargetRatio/100), TargetFlow*(1-TargetRatio/100)) AND
Pump2.StartVolume(TargetVolume*(TargetRatio/100), TargetFlow*(TargetRatio/100)) THEN
Pump1.bOutVolumeDone := FALSE;
Pump2.bOutVolumeDone := FALSE;
Step := 30;
END_IF
30:
// System.bOutRefill := FALSE;
System.bOutStartMix := FALSE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,232 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.11">
<POU Name="LeviPumpIn_FB" Id="{c6a82a9d-ea54-43ce-a41e-f059e64c3d4d}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK LeviPumpIn_FB EXTENDS LeviPump_FB
VAR_INPUT
vTankRecirculation : BOOL;
bInStartCleanning : BOOL;
Config : REFERENCE TO sPumpConfig := DummyConfig;
bOutRecirculation AT %Q* : BOOL;
END_VAR
VAR_OUTPUT
Comment : T_MaxString;
bOutCleanningDone : BOOL;
END_VAR
VAR
bOutDrain AT %Q* : BOOL;
bOutTankDIW AT %Q* : BOOL;
DummyConfig : sPumpConfig;
CleanIndex : INT;
fbFormat : FB_FormatString;
format : STRING;
RefillDIWTimeout : TON;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
bOutDrain := FALSE;
bOutRecirculation := FALSE;
bOutTankDIW := FALSE;
END_IF
PumpMain();
IF bInStartCleanning THEN
Cleanning();
END_IF
MediaArray[iStation][CleanIndex].Input := bOutCleanningDone;
IF RefillMaxTime <> 0 THEN
RefillDIWTimeout(IN := bOutTankDIW, PT := LREAL_TO_TIME(RefillMaxTime*1000));
END_IF
IF RefillDIWTimeout.Q OR bInTankFull THEN
bOutTankDIW := FALSE;
END_IF
IF bCoolDown THEN
IF vTankRecirculation THEN
IF vPressurePump THEN
rInTargetPressure := 0.1;
END_IF
bOutRecirculation := FALSE;
ELSE
InCMD := ePumpCmd.Poff;
END_IF
END_IF
//IF RefillDIWTimeout.Q THEN
// Error := TRUE;
// error_index := AlarmSend(iStation, ErrorIndexRefillTimeOut, TRUE, eReportType.Info, sAvailableResponse.Ok, FALSE);
//END_IF]]></ST>
</Implementation>
<Method Name="Cleanning" Id="{5638e75f-3a36-4219-ae8a-d808363a1edf}">
<Declaration><![CDATA[METHOD Cleanning : BOOL
VAR_INPUT
END_VAR
VAR_INST
Step : INT;
Counter : INT;
Timer : TON;
TimeLeft : LREAL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[IF iStationStatus.Soll.Stop THEN
Step := 0;
bInStartCleanning := FALSE;
Comment := '';
RETURN;
END_IF
CASE Step OF
0:
bOutCleanningDone := FALSE;
Counter := 0;
Step := 10;
10:
bOutDrain := TRUE;
IF NOT bInTankNotEmpty THEN
Step := Step +1;
END_IF
CASE Language OF
0:
Comment := 'Waiting for the tank to empty.';
1:
Comment := 'Warten, bis der Tank leer ist.';
END_CASE
11:
Timer(IN := TRUE, PT := T#10S);
IF Timer.Q THEN
Timer(IN := FALSE);
bOutDrain := FALSE;
Step := 20;
END_IF
TimeLeft := TIME_TO_LREAL(Timer.PT - Timer.ET)/1000;
CASE Language OF
0:
format := 'Waiting %0.1fs.';
1:
format := 'Warten %0.1fs.';
END_CASE
fbFormat(
sFormat := format,
arg1 := F_LREAL(TimeLeft),
sOut => Comment
);
20:
CASE Language OF
0:
Comment := 'Waiting for the tank to be filled with water.';
1:
Comment := 'Warten, bis der Tank mit Wasser gefüllt ist.';
END_CASE
bOutTankDIW := TRUE;
IF bInTankFull THEN
bOutTankDIW := FALSE;
Step := 30;
END_IF
30:
bOutDrain := TRUE;
IF NOT bInTankNotEmpty THEN
Step := Step +1;
END_IF
CASE Language OF
0:
Comment := 'Waiting for the tank to empty.';
1:
Comment := 'Warten, bis der Tank leer ist.';
END_CASE
31:
Timer(IN := TRUE, PT := T#10S);
IF Timer.Q THEN
Timer(IN := FALSE);
bOutDrain := FALSE;
Step := 40;
END_IF
TimeLeft := TIME_TO_LREAL(Timer.PT - Timer.ET)/1000;
CASE Language OF
0:
format := 'Waiting %0.1fs.';
1:
format := 'Warten %0.1fs.';
END_CASE
fbFormat(
sFormat := format,
arg1 := F_LREAL(TimeLeft),
sOut => Comment
);
40:
Counter := Counter +1;
IF Counter >= Config.CleaningCycles THEN
Step := 50;
ELSE
Step := 20;
END_IF
50:
Comment := '';
bInStartCleanning := FALSE;
bOutCleanningDone := TRUE;
Step := 0;
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="Initialization" Id="{e6ad9208-b5a0-4b2c-8767-8e262db0b887}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
UnitID : BYTE;
OutletValveIndex : INT;
TankFeedIndex : INT;
TankDrainIndex : INT;
RecirculationIndex : INT;
TankDIWIndex : INT;
CleanIndex : INT;
ErrorIndexRefillTimeOut : int;
END_VAR
VAR
Counter : INT;
ReadInfo : sModbusReadInfo;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[F_Initialization(iStation, UnitID, OutletValveIndex, TankFeedIndex, ErrorIndexRefillTimeOut);
THIS^.ErrorIndexRefillTimeOut := ErrorIndexRefillTimeOut;
MediaArray[iStation][TankDrainIndex].ServiceName[0] := 'Drain';
MediaArray[iStation][TankDrainIndex].ServiceName[1] := 'Abfluss';
MediaArray[iStation][TankDrainIndex].bReferenceControl REF= bOutDrain;
MediaArray[iStation][RecirculationIndex].ServiceName[0] := 'Recirculation';
MediaArray[iStation][RecirculationIndex].ServiceName[1] := 'Rezirkulation';
MediaArray[iStation][RecirculationIndex].bReferenceControl REF= bOutRecirculation;
MediaArray[iStation][TankDIWIndex].ServiceName[0] := 'DIW';
MediaArray[iStation][TankDIWIndex].ServiceName[1] := 'DIW';
MediaArray[iStation][TankDIWIndex].bReferenceControl REF= bOutTankDIW;
THIS^.CleanIndex := CleanIndex;
MediaArray[iStation][CleanIndex].ServiceName[0] := 'Clean';
MediaArray[iStation][CleanIndex].ServiceName[1] := 'Reinigen';
MediaArray[iStation][CleanIndex].bReferenceControl REF= bInStartCleanning;
MediaArray[iStation][CleanIndex].InputAvailable := TRUE;
MediaArray[iStation][CleanIndex].NoErrorInput := TRUE;
rInProcessPressure REF= Config.TargetPressure;
RefillMaxTime REF= Config.RefillMaxTime;
]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff