Files
KD_Pliessnig_Reinraum/Logical/Machine/ConMon/Main.st
T
2026-08-31 13:26:17 +02:00

206 lines
8.0 KiB
Smalltalk

PROGRAM _INIT
//Modbus Kommunikation
FUBs.MBMOpen.ascii := 0; //RTU
FUBs.MBMOpen.timeout := 1000; //min 250
//Ansteuerung über CS1030
FUBs.MBMOpen.pDevice := ADR ('IF6.ST1.IF1');
FUBs.MBMOpen.pMode := ADR ('PHY=RS485 /PA=N /DB=8 /SB=1 /BD=9600');
FUBs.MBMOpen.pConfig := ADR ('AIRConf');
Status.enAirCom := enAIR_INIT;
FUBs.LCRMovAvgFlt_pDiff.enable := TRUE;
FUBs.LCRMovAvgFlt_pDiff.base := 3000;
END_PROGRAM
PROGRAM _CYCLIC
//Sensor per Modbus ansprechen
CASE Status.enAirCom OF
enAIR_INIT:
//Variablenflags aufräumen
FUBs.MBMOpen.enable := FALSE;
FUBs.MBMMaster.enable := FALSE;
FUBs.MBMClose.enable := FALSE;
Status.enAirCom := enAIR_OPEN;
enAIR_OPEN:
FUBs.MBMOpen.enable := TRUE;
IF (FUBs.MBMOpen.status = ERR_OK) THEN
FUBs.MBMMaster.ident := FUBs.MBMOpen.ident;
FUBs.MBMClose.ident := FUBs.MBMOpen.ident;
FUBs.MBMOpen.enable := FALSE;
Status.enAirCom := enAIR_MASTER;
ELSIF (FUBs.MBMOpen.status < ERR_FUB_ENABLE_FALSE) THEN
//FixME ERROR
END_IF
enAIR_MASTER:
FUBs.MBMMaster.enable := TRUE;
IF (FUBs.MBMMaster.status = ERR_OK) THEN
//Istwerte einlesen
Environment.iParticle25 := AirValues.iParticle25;
Environment.iParticle10 := AirValues.iParticle10;
Environment.iParticle25a := AirValues.iParticle25a;
Environment.iParticle10a := AirValues.iParticle10a;
Environment.iParticle25b := AirValues.iParticle25b;
Environment.iParticle10b := AirValues.iParticle10b;
Environment.iParticle25c := AirValues.iParticle25c;
Environment.iParticle10c := AirValues.iParticle10c;
Environment.iParticle25d := AirValues.iParticle25d;
Environment.iParticle10d := AirValues.iParticle10d;
Environment.iParticle25e := AirValues.iParticle25e;
Environment.iParticle10e := AirValues.iParticle10e;
Environment.iParticle25f := AirValues.iParticle25f;
Environment.iParticle10f := AirValues.iParticle10f;
Environment.rTemperature1 := INT_TO_REAL (AirValues.iTemperature1) * 0.1;
Environment.rTemperature2 := INT_TO_REAL (AirValues.iTemperature2) * 0.1;
Environment.rHumidity1 := INT_TO_REAL (AirValues.iHumidity1) * 0.1;
Environment.rHumidity2 := INT_TO_REAL (AirValues.iHumidity2) * 0.1;
Environment.rAirPreasure := INT_TO_REAL (AirValues.iBaroPreassure); //Barometrischen Luftdruck verwenden
rDiffpressureRaw := - INT_TO_REAL (AirValues.iDiffPreassure) * 0.3; // Wert * 3
Environment.rDiffPreassure := rDiffpressureFlitered;
gLogValue := Environment;
END_IF
END_CASE;
FUBs.LCRMovAvgFlt_pDiff.x := rDiffpressureRaw;
FUBs.LCRMovAvgFlt_pDiff ();
IF (FUBs.LCRMovAvgFlt_pDiff.status = ERR_OK) THEN
rDiffpressureFlitered := FUBs.LCRMovAvgFlt_pDiff.y;
END_IF
//===================================
//Werte nicht Ok
//Partikelanzahl überschritten
blTempNOk := (Environment.iParticle25 > gLimits.iParticle25) OR
(Environment.iParticle10 > gLimits.iParticle10) OR
(Environment.iParticle25a > gLimits.iParticle25) OR
(Environment.iParticle10a > gLimits.iParticle10) OR
(Environment.iParticle25b > gLimits.iParticle25) OR
(Environment.iParticle10b > gLimits.iParticle10) OR
(Environment.iParticle25c > gLimits.iParticle25) OR
(Environment.iParticle10c > gLimits.iParticle10) OR
(Environment.iParticle25d > gLimits.iParticle25) OR
(Environment.iParticle10d > gLimits.iParticle10) OR
(Environment.iParticle25e > gLimits.iParticle25) OR
(Environment.iParticle10e > gLimits.iParticle10) OR
(Environment.iParticle25f > gLimits.iParticle25) OR
(Environment.iParticle10f > gLimits.iParticle10);
FUBs.TOFParticleNOk.PT := t#2s; //Kurze verbesserung ignorieren
FUBs.TOFParticleNOk.IN := blTempNOk;
FUBs.TOFParticleNOk ();
FUBs.TONParticleNOK.PT := t#60s;
FUBs.TONParticleNOK.IN := FUBs.TOFParticleNOk.Q;
FUBs.TONParticleNOK ();
//Luftdruck zu gering
FUBs.TOFPreassureNOK.PT := t#3s;
FUBs.TOFPreassureNOK.IN := (Environment.rDiffPreassure < gLimits.rDiffPreassure);
FUBs.TOFPreassureNOK ();
FUBs.TONPreassureNOK.IN := FUBs.TOFPreassureNOK.Q;
FUBs.TONPreassureNOK.PT := t#90s;
FUBs.TONPreassureNOK ();
IF FUBs.TONParticleNOK.Q OR FUBs.TONPreassureNOK.Q THEN
Status.bAirNOk := TRUE;
END_IF
//Meldungen Senden
IF EDGEPOS (Status.bAirNOk AND NOT Status.bSurveilanceDisabled) THEN
gMailCmd.bSendAirNok := TRUE;
gTweetCmd.bSendAirNok := TRUE;
END_IF
VC_Ctrl.usDisablesVCs.0 := FALSE; //Hide disabled VCs
//Werte Ok
FUBs.TOFParticleOk.PT := t#1s;
FUBs.TOFParticleOk.IN := (Environment.iParticle25 < gLimits.iParticle25) AND
(Environment.iParticle10 < gLimits.iParticle10) AND
(Environment.iParticle25a < gLimits.iParticle25) AND
(Environment.iParticle10a < gLimits.iParticle10) AND
(Environment.iParticle25b < gLimits.iParticle25) AND
(Environment.iParticle10b < gLimits.iParticle10) AND
(Environment.iParticle25c < gLimits.iParticle25) AND
(Environment.iParticle10c < gLimits.iParticle10) AND
(Environment.iParticle25d < gLimits.iParticle25) AND
(Environment.iParticle10d < gLimits.iParticle10) AND
(Environment.iParticle25e < gLimits.iParticle25) AND
(Environment.iParticle10e < gLimits.iParticle10) AND
(Environment.iParticle25f < gLimits.iParticle25) AND
(Environment.iParticle10f < gLimits.iParticle10);
FUBs.TOFParticleOk ();
FUBs.TONParticleOK.PT := t#10s;
FUBs.TONParticleOK.IN := FUBs.TOFParticleOk.Q;
FUBs.TONParticleOK ();
FUBs.TOFPreassureOK.PT := t#4s;
FUBs.TOFPreassureOK.IN := (Environment.rDiffPreassure > gLimits.rDiffPreassure);
FUBs.TOFPreassureOK ();
FUBs.TONPreassureOK.PT := t#10s;
FUBs.TONPreassureOK.IN := FUBs.TOFPreassureOK.Q;
FUBs.TONPreassureOK ();
VC_Ctrl.ResetError.usStatus.0 := NOT Status.bAirNOk;
//Bedienen sperren wenn nicht alles Ok
VC_Ctrl.ResetError.usStatus.1 := NOT FUBs.TONParticleOK.Q OR NOT FUBs.TONPreassureOK.Q;
//Werte wieder Ok Meldung senden
IF EDGEPOS (VC_Ctrl.ResetError.usStatus.1) AND Status.bAirNOk THEN
gMailCmd.bSendAirOk := TRUE;
gTweetCmd.bSendAirOk := TRUE;
END_IF
IF EDGEPOS (VC_Ctrl.ResetError.bCommand) THEN
Status.bAirNOk := FALSE;
gMailCmd.bSendAirOkAck := TRUE;
gTweetCmd.bSendAirOkAck := TRUE;
END_IF
//VerborgeneTaster
FUBs.TOFShowHidenMenu.IN := VC_Ctrl.HiddenMenu.bCommand;
FUBs.TOFShowHidenMenu.PT := t#10s;
FUBs.TOFShowHidenMenu ();
//Ueberwachung deaktivieren
IF VC_Ctrl.DisableSurveilance.bCommand AND NOT Status.bSurveilanceDisabled THEN
Status.bSurveilanceDisabled := TRUE;
gTweetCmd.bSendSurvDisabled := TRUE;
END_IF
IF VC_Ctrl.EnableSurveilance.bCommand AND Status.bSurveilanceDisabled THEN
Status.bSurveilanceDisabled := FALSE;
gTweetCmd.bSendSurvEnabled := TRUE;
END_IF
//Anzeige
VC_Ctrl.DisableSurveilance.usStatus.0 := NOT FUBs.TOFShowHidenMenu.Q OR Status.bSurveilanceDisabled;
VC_Ctrl.EnableSurveilance.usStatus.0 := NOT FUBs.TOFShowHidenMenu.Q OR NOT Status.bSurveilanceDisabled;
VC_Ctrl.usSurvDisabled.0 := NOT Status.bSurveilanceDisabled;
//Ausgänge
bOuAirNOk := Status.bAirNOk;
//===================================
//Fubs ausführen
FUBs.MBMOpen ();
FUBs.MBMMaster ();
FUBs.MBMClose ();
END_PROGRAM
PROGRAM _EXIT
(* Insert code here *)
END_PROGRAM