Files
infineon_legacy_plc/PLC/8 Media/POUs/MEDIA_IO_FB.TcPOU
2026-01-08 11:08:17 +01:00

267 lines
7.9 KiB
XML

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