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

File diff suppressed because it is too large Load Diff

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

View File

@@ -0,0 +1,267 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.12">
<POU Name="MEDIA_IO_FB" Id="{31f57afe-95b0-42bc-8207-3a8428599cb9}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK MEDIA_IO_FB EXTENDS Station_GENERAL_IO_FB
VAR_INPUT
Config : REFERENCE TO sMediaConfig;
SignalHorn AT %Q* : BOOL;
SignalLampRed AT %Q* : BOOL;
SignalLampYellow AT %Q* : BOOL;
SignalLampgGreen AT %Q* : BOOL;
SignalLampBlue AT %Q* : BOOL;
bOutVacuumPumpOff AT %Q* : BOOL;
DoorLock : ARRAY[1..3] OF Lock_FB;
END_VAR
VAR_OUTPUT
rInCDA AT %I* : DINT;
rInVacuum AT %I* : DINT;
rInN2 AT %I* : DINT;
FuseBlook AT %I* : ARRAY[1..NumberOfFuseBlock] OF BOOL;
ExhaustOk AT %I* : ARRAY[1..NumberOfExhaust] OF BOOL;
EStopCH1 AT %I* : ARRAY[1..NumberOfEmergencyStop] OF BOOL;
EStopCH2 AT %I* : ARRAY[1..NumberOfEmergencyStop] OF BOOL;
NoLeckage AT %I* : ARRAY[1..NumberOfLeckageSensor] OF BOOL;
bInCDAOk : BOOL;
bInN2Ok : BOOL;
bInVacOk : BOOL;
bInDoorClosedCh1 AT %I* : BOOL;
bInDoorClosedCh2 AT %I* : BOOL;
bOutMediaEnable AT %I* : BOOL;
END_VAR
VAR
Signal : REFERENCE TO sMediaSignal;
KOHTankStartHeating : BOOL;
TMAHTankStartHeating : BOOL;
DIWTankStartHeating : BOOL;
TimerAktorspannung : TON;
bVacuumPumpOffCheck : BOOL;
TimerVacuumPumpOff : TON;
END_VAR
VAR CONSTANT
NumberOfFuseBlock : SINT := 3;
NumberOfEmergencyStop : SINT := 8;
NumberOfLeckageSensor : SINT := 1;
// NumberOfOverFullSensor : SINT := 5;
// NumberOfAbfalltank : BYTE := 1;
NumberOfExhaust : SINT := 1;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[MediaCheck();
bInCDAOk := rInCDA > Config.MinCDA*1000 OR Config.MinCDA = 0;
bInN2Ok := rInN2 > Config.MinN2*1000 OR Config.MinN2 =0;
//bInVacOk := ABS(rInVacuum) > Config.MinVac*1000 OR Config.MinVac =0;
SignalHorn := ReportDialogMng.Horn;
SignalLampRed := ReportDialogMng.Ampel_Red;
SignalLampYellow := CMD[GeneralStation] <> StartCMD AND StationsStatus[GeneralStation].Ist.InitDone;
SignalLampgGreen := CMD[GeneralStation] = StartCMD;
FOR i := 1 TO 3 DO
DoorLock[i]();
END_FOR
(*IF NOT iStationStatus.Ist.Service THEN
bVacuumPumpOffCheck := FALSE;
FOR i := FirstStation TO LastStation DO
IF StationsStatus[i].Ist.Busy THEN
bVacuumPumpOffCheck := TRUE;
END_IF
IF StationsStatus[i].Ist.Service THEN
bVacuumPumpOffCheck := TRUE;
END_IF
END_FOR
bOutVacuumPumpOff := FALSE;
TimerVacuumPumpOff(IN := NOT bVacuumPumpOffCheck, PT := T#10M);
IF TimerVacuumPumpOff.Q THEN
bOutVacuumPumpOff := TRUE;
END_IF
END_IF
*)
IF NOT iStationStatus.Ist.Service THEN
bOutVacuumPumpOff := bCoolDown;
END_IF
]]></ST>
</Implementation>
<Action Name="HeatingSystem" Id="{8f427b2d-81f3-47c2-9f04-ae1cd5506b7d}">
<Implementation>
<ST><![CDATA[FOR i:= 1 TO 5 DO
Media_TankSystem[i]();
END_FOR
MediaTankHeaterSignal[4].Enable := MediaTankHeaterSignal[3].Enable;
MediaTankHeaterSignal[4].TargetTemperature := MediaTankHeaterSignal[3].TargetTemperature;
MediaTankHeaterSignal[5].Enable := MediaTankHeaterSignal[3].Enable;
MediaTankHeaterSignal[5].TargetTemperature := MediaTankHeaterSignal[3].TargetTemperature;
FOR i:= 1 TO 5 DO
MediaTemperatureController[i]();
END_FOR
FOR i := 1 TO 5 DO
MediaTankHeaterSignal[i].Enable := FALSE;
END_FOR
IF MediaArray[iStation][eMediaMedienNamen.KOHTankStartHeating].bReferenceControl THEN
MediaTankHeaterSignal[1].Enable := TRUE;
END_IF
IF MediaArray[iStation][eMediaMedienNamen.TMAHTankStartHeating].bReferenceControl THEN
MediaTankHeaterSignal[2].Enable := TRUE;
END_IF
IF MediaArray[iStation][eMediaMedienNamen.DIWTankStartHeating].bReferenceControl THEN
MediaTankHeaterSignal[3].Enable := TRUE;
MediaTankHeaterSignal[4].Enable := TRUE;
MediaTankHeaterSignal[5].Enable := TRUE;
END_IF
FOR i := 1 TO 2 DO
IF NOT StationsStatus[iStation].Ist.Service THEN
Media_TankSystem[i].bOutLoop := FALSE;
END_IF
IF MediaTankHeaterSignal[i].Enable OR MediaTankHeaterSignal[i].StartTurne THEN
Media_TankSystem[i].bOutLoop := TRUE;
END_IF
END_FOR
IF StationsStatus[iStation].Ist.Service THEN
Media_TankSystem[3].bOutLoop := FALSE;
END_IF
FOR i := 3 TO 5 DO
IF MediaTankHeaterSignal[i].Enable OR MediaTankHeaterSignal[i].StartTurne THEN
Media_TankSystem[3].bOutLoop := TRUE;
END_IF
END_FOR
IF Media_TankSystem[1].OutTankRefill THEN
LeviMixTank[1].cmd := ePumpCmd.StartFlow;
LeviMixTank[1].TargetFlow := Config.MixTargetFlow * (Config.MixRatio) / 100;
LeviMixTank[2].cmd := ePumpCmd.StartFlow;
LeviMixTank[2].TargetFlow := Config.MixTargetFlow * (100-Config.MixRatio) / 100;
MixTankDIWValve := TRUE;
MixToBufferTank := TRUE;
END_IF
IF Media_TankSystem[1].InTankFull THEN
LeviMixTank[1].cmd := ePumpCmd.Poff;
LeviMixTank[2].cmd := ePumpCmd.Poff;
IF NOT iStationStatus.Ist.Service THEN
MixTankDIWValve := FALSE;
MixToBufferTank := FALSE;
END_IF
END_IF
IF NOT Media_TankSystem[4].InTankNotEmpty OR NOT Media_TankSystem[5].InTankNotEmpty THEN
LeviMixTank[1].cmd := ePumpCmd.Poff;
LeviMixTank[2].cmd := ePumpCmd.Poff;
MixTankDIWValve := FALSE;
MixToBufferTank := FALSE;
END_IF]]></ST>
</Implementation>
</Action>
<Method Name="Initialization" Id="{80b9e36c-fa2a-4c37-b5ce-78419a5c43cf}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
VAR
ServiceName : ARRAY[1..3] OF ARRAY[0..NumberOfLanguages] OF T_MaxString;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[InitializationExt(iStation);
iMediaArray[eMediaMedienNamen.VacuumPumpOff].ServiceName[0] := 'Puddle Nozzle$NSF2 (0,1)';
iMediaArray[eMediaMedienNamen.VacuumPumpOff].ServiceName[1] := 'Puddledüse$NSF2 (0,1)';
iMediaArray[eMediaMedienNamen.VacuumPumpOff].bReferenceControl REF= bOutVacuumPumpOff;
ServiceName[1][0] := 'Door 1 Lock';
ServiceName[1][1] := 'Door 1 Lock';
ServiceName[2][0] := 'Door 2 Lock';
ServiceName[2][1] := 'Door 2 Lock';
ServiceName[3][0] := 'Door 3 Lock';
ServiceName[3][1] := 'Door 3 Lock';
FOR i := 1 TO 3 DO
DoorLock[i].Initialization(
iStation,
eMediaMedienNamen.DoorLock + i,
MEDIA_ErrorNr.eDoorClose + i,
MEDIA_ErrorNr.eDoorLockTimeOut + i,
ServiceName[i]
);
END_FOR]]></ST>
</Implementation>
</Method>
<Action Name="MediaCheck" Id="{c3f6e8ad-2d2b-4bfb-b981-8183feb67956}">
<Implementation>
<ST><![CDATA[DelayTimer(IN := TRUE, PT := T#5S);
IF NOT DelayTimer.Q THEN
RETURN;
END_IF
AlarmSend(iStation, MEDIA_ErrorNr.wActuatorPower, FALSE, eReportType.Error, sAvailableResponse.NoResponse, InAktorspannung);
AlarmSend(iStation, MEDIA_ErrorNr.wMediaSafety, FALSE, eReportType.Error, sAvailableResponse.NoResponse, Safety_PRG.MediaOk OR NOT InAktorspannung);
FOR i := 1 TO NumberOfEmergencyStop DO
AlarmSend(iStation, MEDIA_ErrorNr.eEStop1+ i-1, FALSE, eReportType.Error, sAvailableResponse.NoResponse, EStopCH1[i] AND EStopCH2[i]);
END_FOR
FOR i := 1 TO NumberOfFuseBlock DO
AlarmSend(iStation, MEDIA_ErrorNr.eFuseBlock1 + i-1, FALSE, eReportType.Error, sAvailableResponse.NoResponse, FuseBlook[i]);
END_FOR
IF NumberOfExhaust > 0 THEN
FOR i := 1 TO NumberOfExhaust DO
AlarmSend(iStation, MEDIA_ErrorNr.eExhaust1+ i-1, FALSE, eReportType.Error, sAvailableResponse.NoResponse, ExhaustOk[i]);
END_FOR
END_IF
FOR i := 1 TO NumberOfLeckageSensor DO
AlarmSend(iStation, MEDIA_ErrorNr.eLeakage1 + i-1, FALSE, eReportType.Error, sAvailableResponse.NoResponse, NoLeckage[i]);
END_FOR
TimerAktorspannung(IN := InAktorspannung, PT := T#10S);
IF TimerAktorspannung.Q THEN
AlarmSend(iStation, MEDIA_ErrorNr.eCDA, FALSE, eReportType.Error, sAvailableResponse.NoResponse,bInCDAOk);
AlarmSend(iStation, MEDIA_ErrorNr.eN2, FALSE, eReportType.Error, sAvailableResponse.NoResponse,bInN2Ok);
// AlarmSend(iStation, MEDIA_ErrorNr.eVacuum, FALSE, eReportType.Error, sAvailableResponse.NoResponse,bInVacOk);
END_IF
]]></ST>
</Implementation>
</Action>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,245 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4026.13">
<POU Name="MEDIA_MAIN_FB" Id="{c28cbc9e-e87c-4ffe-951e-c8ecddc3b3bb}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK MEDIA_MAIN_FB EXTENDS Station_GENERAL_MAIN_FB IMPLEMENTS I_STATION_CMD_CALL
VAR_INPUT
IO : MEDIA_IO_FB;
END_VAR
VAR_OUTPUT
END_VAR
VAR
Config : sMediaConfig;
ConfigOld : sMediaConfig;
i : INT;
PumpTimer : TON;
bAutoEnter : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{231267af-e423-4fde-b02d-c8b89e8056d1}">
<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[_VisuName := 'MEDIA';]]></ST>
</Implementation>
</Method>
<Method Name="INIT" Id="{3fbb1f09-149e-4f88-af9d-73251343ea7a}">
<Declaration><![CDATA[METHOD INIT : BOOL
VAR
i : int;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _Step OF
0:
FOR i := 1 TO 3 DO
IF NOT IO.DoorLock[i].Lock() THEN
RETURN;
END_IF
END_FOR
_Step := 10;
10:
FOR i := 1 TO vJulaboM DO
Julabo[i].rInTargetTemperature := 21;
Julabo[i].bInEnable := TRUE;
END_FOR
INIT := TRUE;
_Step := 0;
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="Initialization" Id="{330e0fdb-1091-4299-89b4-04cd520e3af1}">
<Declaration><![CDATA[METHOD Initialization : BOOL
VAR_INPUT
iStation : INT;
END_VAR
VAR
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[InitializationExt(iStation);
iStationStatus.NoStopServiceExit := TRUE;
iStationStatus.NoAutoStart := TRUE;
iStationStatus.NoOperationMode := TRUE;
ConfigManagement.Initialization(ADR(Config), ADR(ConfigOld), SIZEOF(Config), 'sMediaConfig', 'MEDIA');
ConfigPlausibility REF= Config.ConfigPlausibility;
iStationStatus.StationName := 'Media';
iStationStatus.ErrorList := 'MEDIA_ErrorNr';
IO.Initialization(iStation);
IO.Config REF= Config;
Safety_PRG.vMediaSafetyAvailable := TRUE;
Julabo[1].NAME := 'Julabo DIW';
Julabo[2].NAME := 'Julabo SEF';
Julabo[3].NAME := 'Julabo SF';
FOR i := 1 TO vJulaboM DO
Julabo[i].ControlIndex_Enable := eMediaMedienNamen.Julabo1On + i - 1;
Julabo[i].ErrorIndex_NoConnection := Media_ErrorNr.eJulaboCommunicationError+i-1;
Julabo[i].ErrorIndex_System := Media_ErrorNr.eJulaboSystemError+i-1;
Julabo[i].ErrorIndex_OutOfRange := Media_ErrorNr.eJulaboTempNotInRange+i-1;
Julabo[i].rInMinTemperature := 20;
Julabo[i].rInMaxTemperature := 80;
Julabo[i].Initialization(
iStation,
JulaboIPAddress[i]
);
END_FOR
LeviModbusMaster[1].iStation := iStation;
LeviModbusMaster[2].iStation := iStation;
LeviModbusMaster[3].iStation := iStation;
FOR i := 1 TO LeviNumberOfPump DO
CASE i OF
8,9:
LeviPump[i].vMixTank := TRUE;
ELSE
LeviPump[i].vAutoFill := TRUE;
END_CASE
LeviPump[i].Config REF= Config.PumpConfig[i];
LeviPump[i].EmptyErrorIndex := MEDIA_ErrorNr.eTankEmpty +i;
LeviPump[i].OverFullErrorIndex := MEDIA_ErrorNr.eTankOverFull +i;
LeviPump[i].Initialization(
iStation := iStation,
UnitID := INT_TO_BYTE(i),
eMediaMedienNamen.TankValve+i-1,
eMediaMedienNamen.TankFeed+i-1,
eMediaMedienNamen.TankDrain+i-1,
eMediaMedienNamen.TankRecirculation+i-1,
eMediaMedienNamen.TankDIW+i-1,
eMediaMedienNamen.TankClean+i-1,
MEDIA_ErrorNr.eFillTimeout + i
);
END_FOR
LeviPump[1].MB REF= LeviModbusMaster[1];
LeviPump[4].MB REF= LeviModbusMaster[1];
LeviPump[9].MB REF= LeviModbusMaster[1];
LeviPump[7].MB REF= LeviModbusMaster[2];
LeviPump[3].MB REF= LeviModbusMaster[2];
LeviPump[8].MB REF= LeviModbusMaster[2];
LeviPump[5].MB REF= LeviModbusMaster[3];
LeviPump[6].MB REF= LeviModbusMaster[3];
LeviPump[2].MB REF= LeviModbusMaster[3];
LeviPump[1].MediaName := 'Tank System 1 C2H4O2(99%)';
LeviPump[2].MediaName := 'Tank System 2 SF';
LeviPump[2].vTankRecirculation := TRUE;
LeviPump[3].MediaName := 'Tank System 3 HNO2(65%)';
LeviPump[4].MediaName := 'Tank System 4 C2H4O2(10%)';
LeviPump[5].MediaName := 'Tank System 5 HF(40%)';
LeviPump[6].MediaName := 'Tank System 6 SF';
LeviPump[7].MediaName := 'Tank System 7 HF(40%)';
LeviPump[8].MediaName := 'Tank System 8 (1+6) SEF';
LeviPump[8].vTankRecirculation := TRUE;
LeviPump[9].MediaName := 'Tank System 9 (3+7) FILMÄTZEN';
LeviPump[9].vTankRecirculation := TRUE;
Levi2PumpMixSystem[1].System REF= LeviPump[9];
Levi2PumpMixSystem[1].Pump1 REF= LeviPump[3];
Levi2PumpMixSystem[1].Pump2 REF= LeviPump[7];
Levi2PumpMixSystem[1].iStation := iStation;
Levi2PumpMixSystem[1].TargetFlow REF= Config.MixTargetFlow[1];
Levi2PumpMixSystem[1].TargetRatio REF= Config.MixRatio[1];
Levi2PumpMixSystem[1].TargetVolume REF= Config.MixTargetVolume[1];
Levi2PumpMixSystem[2].System REF= LeviPump[8];
Levi2PumpMixSystem[2].Pump1 REF= LeviPump[1];
Levi2PumpMixSystem[2].Pump2 REF= LeviPump[6];
Levi2PumpMixSystem[2].iStation := iStation;
Levi2PumpMixSystem[2].TargetFlow REF= Config.MixTargetFlow[2];
Levi2PumpMixSystem[2].TargetRatio REF= Config.MixRatio[2];
Levi2PumpMixSystem[2].TargetVolume REF= Config.MixTargetVolume[2];
HV_SCHUSTER.Initialization(
iStation := FirstHV,
IPAdress := '192.168.1.203',
Port := 7
);
HV_SCHUSTER.NoComErrorIndex := HV_ErrorNr.eNoCommunication;
iMediaArray[eMediaMedienNamen.AutoEnter].ServiceName[0] := _VisuName;
iMediaArray[eMediaMedienNamen.AutoEnter].ServiceName[1] := _VisuName;
iMediaArray[eMediaMedienNamen.AutoEnter].bReferenceControl REF= bAutoEnter;
iMediaArray[eMediaMedienNamen.AutoEnter].NoErrorInput := TRUE;
iMediaArray[eMediaMedienNamen.AutoEnter].InputAvailable := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="MAIN" Id="{2d83faa9-aac5-46d5-a5bf-b7d022b2d36d}">
<Declaration><![CDATA[METHOD MAIN : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[VisuElems.CURRENTLANGUAGE := Config.Language;
IF Config.Language = 'de' THEN
Language := 1;
ELSE
Language := 0;
END_IF
HV_SCHUSTER();
IO();
FOR i := 1 TO LeviNumberOfModbusMaster DO
LeviModbusMaster[i]();
END_FOR
FOR i := 1 TO LeviNumberOfPump DO
LeviPump[i]();
END_FOR
FOR i := 1 TO 2 DO
Levi2PumpMixSystem[i]();
END_FOR
FOR i := 1 TO vJulaboM DO
Julabo[i]();
END_FOR
IF bAutoEnter THEN
bAutoEnter := FALSE;
StationCMD.AutomaticEnter(iStation);
END_IF
iMediaArray[eMediaMedienNamen.AutoEnter].Input := iStationStatus.Ist.InitDone;]]></ST>
</Implementation>
</Method>
<Method Name="TurnOffAllMedia" Id="{d0aafb18-3800-45a2-b07a-8042f0a67795}">
<Declaration><![CDATA[METHOD TurnOffAllMedia : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>