Momentan sieht es so aus:
//Aufruf Echtzeituhr
RC01 (
EN := ,
DT => ,
E1 => ,
YY => ,
MM => ,
DD => ,
WD => ,
HR => ,
MN => ,
SC => );
//Tagesflanke erzeugen
M02:= RC01WD <> MB84;
MB84:=RC01WD;
//Einlesen, filtern und scalieren der Sensoren
//Temperatur (Bereich Messumformer -20 - 80°C) Ausgabe in 0,1°C
FT01 (
EN := true,
I1 := IA02,
TG := 90,
KP := 100,
CY => ,
QV => );
LS01 (
EN := true,
I1 := FT01QV,
X1 := 0,
Y1 := -200,
X2 := 4095,
Y2 := 800,
QV => );
//Erdfeuchte in %
FT02 (
EN := true,
I1 := IA01,
TG := 80,
KP := 100,
CY => ,
QV => );
LS02 (
EN := true,
I1 := FT02QV,
X1 := 0,
Y1 := 0,
X2 := 4095,
Y2 := 100,
QV => );
//relative Luftfeuchte in %
FT03 (
EN := true,
I1 := IA03,
TG := 80,
KP := 100,
CY => ,
QV => );
LS03 (
EN := true,
I1 := FT03QV,
X1 := 0,
Y1 := 0,
X2 := 4095,
Y2 := 100,
QV => );
//Belüftung 2-Punktregler mit Hysterese
//es braucht zur Änderung nur die Solltemperatur verstellt zu werden, alles andere sind Regelparameter die
//nur zur IBN einmal eingestellt werden
//alle Temperaturwerte sind in 0,1°C um eine gute Auflösung / Regelung zu bekommen
IF LS01QV > (MW34 + MB69) THEN
M06:= true;
ELSIF LS01QV < (MW34) THEN
M06:= false;
ELSE ;
END_IF;
//Zwangsbelüftungspuls nach x Stunden ohne Lüfteranforderung zum Luftaustausch
T04 (
EN := M03 and not M06,
RE := ,
ST := ,
I1 := (MB81*60),
I2 := MB82,
Q1 => ,
QV => );
//Lüfterausgang ansteuern
Q03:= (M06 or T04Q1) and M03;
//Heizung 2-Punktregler mit Hysterese und Regelabstand zur Solltemperatur
//der Regelabstand besimmt wie weit unter der Solltemperatur die Heizung anfängt zu regeln
IF LS01QV > (MW34 - MB72) THEN //Heizung aus
M07:= false;
ELSIF LS01QV < (MW34 - MB72 - MB71) THEN //Heizung ein
M07:= true;
ELSE ;
END_IF;
Q04:= M07 and M03; //Ausgang Heizung schalten
//Bewässerungstageszähler
C02 (
EN := true,
C_ := (MB78 = RC01HR), //Bewässerungsstartzeit erreicht
D_ := ,
SE := ,
RE := T05Q1 or (LS02QV >= MB115) or not M03,//reset Zähler wenn Timeout oder Erdfeuchte erreicht
SH := MB114, //1=jeden Tag, ... 3=jeden 3.Tag bewässern
SL := ,
SV := ,
OF => ,
FB => ,
CY => ,
ZE => ,
QV => );
//Timeout Bewässerung erreicht
T05 (
EN := C02OF,
RE := ,
ST := ,
I1 := MB76,
I2 := ,
Q1 => ,
QV => );
//Bewässerung mit Puls/Pause um eine Trägheit zu erzeugen,
//damit der Boden Zeit hat das Wasser gleichmäßig aufzunehmen.
T02 (
EN := C02OF,
RE := ,
ST := ,
I1 := MB79, //Pulszeit in s
I2 := MB80, //Pausenzeit in s
Q1 => ,
QV => );
//Wasserpumpe einschalten, wenn Tank nicht leer
Q02:= T02Q1 and I01;
//Fehler Tank leer verzögert setzen und mit DEL-Taste resetten
T03 (
EN := not I01,
RE := M11 and P07,
ST := ,
I1 := T#30s,
I2 := ,
Q1 => ,
QV => );
IF T03Q1 THEN
M11:= true;
END_IF;
IF M11 and P07 THEN
M11:= false;
END_IF;
//Lichtsteuerung, Umschaltung erfolgt erst bei erreichen der nächsten Schaltzeit in Sekunde 0
//man könnte auch noch den M04 mit einer Handflanke umschalten
IF (RC01HR = MB259) and (RC01MN = MB260) and (RC01SC = 0) THEN //Ausschaltzeit hh:mm erreicht
M04:= false; //Licht anfordern aus
ELSIF (RC01HR = MB257) and (RC01MN = MB258) and (RC01SC = 0) THEN //Einschaltzeit hh:mm erreicht
M04:= true; //Licht anfordern ein
ELSE ;
END_IF;
Q01:= M04 and M03; //Ausgang Licht schalten
M09:= (C01QV = 1) and P05; //Start vom Display
M10:= (C01QV = 1) and P07; //Stop vom Display
//Schrittkette Wachstumsphasen
//0= stop/init; 1= Anzuchtphase; 2= Wachstumsphase; 3= Blütenphase;
CASE MB85 OF
0: //Initialisierungsschritt
M03:= false;
MB86:= 0; //Anzucht Zähler nullen
MB95:= 0; //Wachstum Zähler nullen
MB105:= 0; //Blüte Zähler nullen
IF M489 or M09 THEN //Programm starten
MB85:= 1;//gehe zu Anzuchtphase
END_IF;
1: //Anzuchtphase
M03:= true; // Programm läuft
IF M02 THEN //Tage hochzählen
MB86:= MB86+1;
END_IF;
MB88:= MB87-MB86; //Restzeitanzeige
//Schaltzeiten Licht auf die ArbeitswerteMB laden
MB257:= MB89;
MB258:= MB90;
MB259:= MB91;
MB260:= MB92;
MB114:= MB93; //Bewässerungstage laden
MB115:= MB94; //Erdfeuchte Soll laden
IF MB86 > MB87 THEN //Ende Anzuchtphase erreicht
MB86:= MB86 - 1;
MB88:= 0;
MB85:= 2;//gehe zu Wachstumsphase
END_IF;
IF M490 or M10 THEN MB85:= 0; //Stop/Abbruch
END_IF;
2: //Wachstumsphase
M03:= true; // Programm läuft
IF M02 THEN //Tage hochzählen
MB95:= MB95+1;
END_IF;
MB97:= MB96-MB95; //Restzeitanzeige
//Schaltzeiten Licht auf die ArbeitswerteMB laden
MB257:= MB98;
MB258:= MB99;
MB259:= MB100;
MB260:= MB101;
MB114:= MB102; //Bewässerungstage laden
MB115:= MB103; //Erdfeuchte Soll laden
IF MB95 > MB96 THEN //Ende Wachstumsphase erreicht
MB95:= MB95 - 1;
MB97:= 0;
MB85:= 3;//gehe zu Blühphase
END_IF;
IF M490 or M10 THEN MB85:= 0; //Stop/Abbruch
END_IF;
3: //Blühphase
M03:= true; // Programm läuft
IF M02 THEN //Tage hochzählen
MB105:= MB105+1;
END_IF;
MB107:= MB106-MB105; //Restzeitanzeige
//Schaltzeiten Licht auf die ArbeitswerteMB laden
MB257:= MB108;
MB258:= MB109;
MB259:= MB110;
MB260:= MB111;
MB114:= MB112; //Bewässerungstage laden
MB115:= MB113; //Erdfeuchte Soll laden
IF MB105 > MB106 THEN //Ende Blühphase erreicht
MB105:= MB105 - 1;
MB107:= 0;
MB85:= 4;//gehe zu Programmende
END_IF;
IF M490 or M10 THEN MB85:= 0; //Stop/Abbruch
END_IF;
4: //Programmende erreicht, mit Stopmerker zurück zu init
M03:= false;
M05:= true;
IF M490 or M10 THEN
MB85:= 0; // gehe zu Initialisierungsschritt
END_IF;
ELSE
MB85:= 0; //falls ein anderer Wert, SK initialisieren
END_CASE;
//Displayansteuerung
IF M11 THEN //roter Hintergrund bei Wassertank leer
LE04:= true;
LE05:= false;
LE06:= false;
ELSIF M03 and not M11 THEN //grüner Hintergrund wenn Programm läuft
LE04:= false;
LE05:= true;
LE06:= false;
ELSE //sonst weißer Hintergrund
LE04:= false;
LE05:= false;
LE06:= true;
END_IF;
C01 (
EN := ,
C_ := P03 or P01, //hoch blättern
D_ := P01, //runter blättern
SE := C01FB,
RE := C01OF or T06Q1,
SH := 9,
SL := -1,
SV := 8,
OF => ,
FB => ,
CY => ,
ZE => ,
QV => );
//Startseite
D01 (
EN := C01QV = 0,
AI := ,
Q1 => ,
AO => );
//Sollwerte
D02 (
EN := C01QV = 1,
AI := ,
Q1 => ,
AO => );
//Anzucht
D03 (
EN := C01QV = 2,
AI := ,
Q1 => ,
AO => );
//Wachstum
D04 (
EN := C01QV = 3,
AI := ,
Q1 => ,
AO => );
//Blüte
D05 (
EN := C01QV = 4,
AI := ,
Q1 => ,
AO => );
//Regelparameter 1
D06 (
EN := C01QV = 5,
AI := ,
Q1 => ,
AO => );
//Regelparameter 2
D07 (
EN := C01QV = 6,
AI := ,
Q1 => ,
AO => );
//Regelparameter 3
D08 (
EN := C01QV = 7,
AI := ,
Q1 => ,
AO => );
//Werkseinstellung laden
D09 (
EN := C01QV = 8,
AI := ,
Q1 => ,
AO => );
//Fehlermeldung Wasser
D20 (
EN := M11,
AI := ,
Q1 => ,
AO => );
//Werkseinstellungen laden mit 3s OK Taste auf D09
T06 (
EN := (C01QV = 8) and P05 and not M03,
RE := ,
ST := ,
I1 := T#3s,
I2 := ,
Q1 => ,
QV => );
IF T06Q1 THEN
MW34:= 250; //Temp. Sollwert in 0,1C°
MB69:= 10; //Hysterese Lüfter in 0,1C°
MB71:= 10; //Hysterese Heizung in 0,1C°
MB72:= 20; //Regelabstand Heizung in 0,1C°
MB73:= 60; //Luftfeuchte Soll in % (keine Funktion)
MB76:= 30; //max Bewässerungdauer in min.
MB77:= 10; //Hysterese Erdfeuchte in %
MB78:= 20; //Startzeit Bewässerung um xx Uhr
MB79:= 30; //Pulszeit Pumpe in sec. (Pumpe AN für xx sec.)
MB80:= 60; //Pausezeit Pumpe in sec. (Pumpe AUS für xx sec.)
MB81:= 4; //ZwangsLüften nach xx std. ohne Lüfteransteuerung
MB82:= 15; //ZwangsLüften für xx min.
MB87:= 7; //Dauer Anzuchtphase in Tagen
MB89:= 20; //Licht EIN Uhrzeit Anzucht in std.
MB90:= 0; //Licht EIN Uhrzeit Anzucht in min.
MB91:= 12; //Licht AUS Uhrzeit Anzucht in std.
MB92:= 0; //Licht AUS Uhrzeit Anzucht in min.
MB93:= 3; //Bewässern alle x Tage
MB94:= 20; //Erdfeuchte Soll Anzucht in %
MB96:= 30; //Dauer Wachstumsphase in Tagen
MB98:= 20; //Licht EIN Uhrzeit Wachstum in std.
MB99:= 0; //Licht EIN Uhrzeit Wachstum in min.
MB100:= 12; //Licht AUS Uhrzeit Wachstum in std.
MB101:= 0; //Licht AUS Uhrzeit Wachstum in min.
MB102:= 3; //Bewässern alle x Tage
MB103:= 20; //Erdfeuchte Soll Wachstum in %
MB106:= 60; //Dauer Blütephase in Tagen
MB108:= 20; //Licht EIN Uhrzeit Blüte in std.
MB109:= 0; //Licht EIN Uhrzeit Blüte in min.
MB110:= 8; //Licht AUS Uhrzeit Blüte in std.
MB111:= 0; //Licht AUS Uhrzeit Blüte in min.
MB112:= 1; //Bewässern alle x Tage
MB113:= 50; //Erdfeuchte Soll Blüte in %
END_IF;