206 lines
8.0 KiB
Smalltalk
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
|
|
|