easy-forum
Deutsch - Software => easySoft => Thema gestartet von: ML10000000000000 am August 18, 2024, 14:25:40 Nachmittag
-
Hab mir ne Steuerung für Klima, Licht, Bewässerung gebastelt.
Richtig stark wäre, wenn jemand voll im Thema easy ist und den Code verbessern könnte, damit alle die Interesse an einer Anbausteuerung haben, auch sauberen Code verwenden können.
Soweit läuft alles. Ich setze die Software bereits so ein. (Bin Mechatronik-Techniker u. ehr im Thema S7 SPS / Codeesys bewandert - aber auch nur die basics für den Hausgebrauch😂)
Wer Fragen zur verwendeten Hardware hat, gerne melden. Ist aber eigentlich selbsterklärend..
Im wesentlichen stecken alle Funktionen (verbesserungsfähig) drin, aber z.B. sehe ich in der Simulation, dass der Balken für die Anzuchtphase toggelt, wenn das letzte drittel der Blütephase aktiv wird).
Wenn also jemand den Code verbessern u. wieder hochladen kann, haben dann alle was davon..
Gruß an die Gemeinde
-
Hallo ML,
hab mir mal dein Programm angeschaut. Bin leider auf Grund der kargen Kommentierung nicht ganz durchgestiegen. Vlt solltest du eine grobe Beschreibung liefern was du wo machst.
Was mir aber gleich aufgefallen ist, sind die Überschneidungen von Merkern und MB/MW. zB im UF Wochentime, schreibst du die Minuten in MB01, gleichzeitig beschreibst du auch M01-03. Das beist sich und du solltest du MB02 verwenden.
Auch im Hauptprogramm sind Überschneidungen: MW12 "Laufzeit in Wochen" und der M179 "stop Blüte 1". M179 ist Teil des MW12!!
Siehe auch MB01 und M04!!
Dein Merkeraufteilung ist nicht optimal. Verwende besser zum speichern von Sollwerten MW im oberen Bereich (ab MW33 oder MW257), dann hast du genug Merkerbits für das Programm übrig. Remanente Merker kann man im oberen Bereich (bis M512) nutzen. Schau mal unter Projekt-> Merkerbereichsbelegung, das ist das schön aufgelistet.
Du hast ein RS UF gemacht, brauchst du garnicht, den gibts schon mit den Spulen "setzen" und "rücksetzen".
Heizung und Lüftung liegen sehr nahe aneinander. Funktioniert das so, oder geht bei steigender Temperatur die Hzg aus und direkt der Lüfter an und umgekehrt?
Scalierung Temperatur: am LS -20 - 80°C -> im Textbaustein hast du aber Wertebereich 0-100 eingestellt.
Bei den ganzen Berechnungen und Vergleichen die du machst, drängt sich ST als Sprache auf. Viel einfacher und wesentlich kompakter.
Gruß Thomas
-
Servus Thomas,
danke, dass Du Dir die Zeit genommen hast.
Ja, die Doppelbelegung von Merkern ist mir auch schon aufgefallen, hatte extra versucht keine doppelt zu verwenden aber finde den Aufbau in EASY etwas unschön, dass ein verwendeter Merker noch einmal verwendet werden kann.
Danke für den Tipp mit der Merkerbereichsbelegung.
Ja, es läuft alles und die Heizung schaltet genau ein, wenn der Lüfter aufhört (aber schön ist das alles nicht, dass ist klar...). ST ist so gar nicht meine Welt, daher wird das nie passieren..
Skalierung Temp. - das habe ich wohl nicht ganz verstanden. Wertebereich 0-100 skalieren auf -20 - 80 (habe ich es dann in einem Baustein anders oder wie meinst Du?)
PS: Wenn ich diesen Horror an hin u her übergeben kommentiere, wirds vermutlich nicht viel besser nachvollziehbar😂
Ich habe aber leider keine bessere Lösung gefunden, dieses Programm in easy zu Programmieren.
Besten Dank u. Grüße aus Bayern
-
Also aus der Bereichstabelle werde ich nicht so richtig schlau...irgendwie ist da ja alles nicht richtig nutzbar.
Woraus entstehen die Konflikte?!
Z.B.
M30:Schreibkonflikt; MB4:nicht vollständig nutzbar
M30 wir nur einmal verwendet (dachte erst es liegt eine Doppelbelegung des Merker 30 vor).
Geiler Tipp mit der Tabelle aber wie bekomme ich nun die Schreibkonflikte gelöst?
-
Ein Konflikt entsteht wenn man zB M04 benutzt und gleichzeitig das MB1 oder das MW1. M1-8 sind Teil des MB1. M1-16 ist Teil des MW1, M17-32 ist Teil des MW2 usw
Wenn du den M03 setzt, so hat das MB1 den Wert 4 ohne das du das MB1 beschrieben hast.
Übrigens, wo ist der Unterschied zu S7, wenn du M0.3 setzt und gleichzeitig MW0 für etwas anderes benutzen willst? Auch hier ist der Merker Teil des MW.
-
Wenn es nicht dringend ist, könnte ich mich im September mal mit der Optimierung befassen. Vielleicht hast du noch Ideen zur Erweiterung oder so.
-
Servus Thomas,
danke, dass Du Dir erneut die Zeit nimmst hier mein verlorenes Wissen wieder aufzufrischen💪😂.
Ja, ich hab massenhaft Ideen für die easy, wobei die nur mein privater "working-prototype" ist. Die Eigentl. Hauptidee soll(te) auf RPi-Basis laufen und Programm & Websocket (realtime) über WLAN bereitstellen - hab schon viele CAD Daten fürs Gehäuse u. Schaltplan sowie Platinen-Layouts und Excel Dateien mit Vorgaben etc......an der EMV für die Platine sowie an den Kosten des Spritzgusses fürs Gehäuse / Investoren etc. scheitert es (noch) gibt noch 2 riesige USPs aber die sollte ich nicht einfach im Netz raus hauen..wer weiß😂 - das wäre DAS PRODUKT AM MARKT - aber naja).
Bin SPS technisch offensichtlich deutlich weiter weg von von den Basics als ich dachte (sagen wir, es liegt am jahrelangen C/Python Programmieren).
Aber auf die wundervoll eindeutige Fehlermeldungen wie: "Fehlercode in Untergeordnetem Register 15641146464674674" von Siemens kann ich auch gut verzichten, nicht dass noch der Eindruck entsteht, ich könnte Siemens leiden..(aber Du hast vollkommen recht mit Merker-Werte-Bereichen und Überschneidungen - bin da einfach hirnlos ans Werk gegangen).
M01 - M08 = Bit 0-7 des Merkerbyte 1 (MB1) - ja, da dämmert was...macht jetzt wieder sinn..
Vielen Dank Dir schonmal💪👍✌️
-
Hallo ML,
Ich hab da mal was geschrieben. Wenn du mit Python was schreibst, bist du von ST nicht so weit weg wie du denkst ;)
Das Programm solte nicht schwer zu lesen sein. Die Hysteresen und Parameter hab ich eingearbeitet. Schau es dir mal an.
Du hast noch einen Sollwert Luftfeuchte, habe aber nichts gefunden wie du den regeln willst. Ausbaufähig ist das Programm leicht.
Man kann leicht eine Visu mit Galileo und zB XV100-E4 machen oder auch den Webserver aktivieren um aus der Ferne zu steuern.
Gruß Thomas
-
Hey Thomas,
ja, möglich..😜 mir sind c und c++ schon zu verschieden😂😉
Finde die Ausführung auf ner easy als standalone am besten.
Die Soll_Luftfeuchte finde ich selbst grad nicht mehr im Programm😂...muss ein Planungsfehler wegen der parallelen Planung von dem anderen Projekt gewesen sein (da sollte es über U-Schallnebler gehen - Luftfeuchte muss aber ehr minimiert werden in der Praxis also Lufttrockner wäre sinnvoller aber erstmal egal, weil ehr keine freien Ausgänge mehr vorhanden sind).
Also besten Dank für Deine Umsetzung! Erinnert mich an die Technikerschule (sehr sauber💪). ST wird nie meine Sprache werden aber das meiste kann ich nachvollziehen. Finde es schwer beim einlesen zu verstehen, welcher Merker hier was macht aber das is ja am Ende egal wenns läuft😂
Einzig die "00:00 Uhr Problematik" ist etwas schlecht, da die Beleuchtung von 20:00 - 08.00 perfekt ist wegen der Kühle der Nacht.
Verbesserungen für eine gute Version:
Die Option mit dem bewässern über die WT ist extrem "quick&dirty" - besser wäre, den abstand in Tagen einstellen zu können (statt der WT einen Merker mit der Anzahl an tagen abstand zwischen den Bewässerungsvorgängen z.B. 1 für jeden tag 3 für jeden 3. tag usw.) - es war auch geplant, dass man die Erdfeuchte also auch die Bewässerungsabstände je Phase am Display einstellen kann - z.B.:
Anzucht -> bewässern: alle 3 tage ; Erdfeuchte: 50%
Wachstum -> bewässern: alle 2 tage ; Erdfeuchte: 30%
Blüte -> bewässern: alle 1 tage ; Erdfeuchte: 50%
Gut wäre noch eine Oder Verknüpfung beim lüften, sodass der Lüfter in regelmäßigen abständen die Luft austauscht, auch wenn die Solltemperatur dauerhaft unterschritten wird (CO2 Austausch vor allem in der Dunkel/Nachphase).
Hast Du eigentl. persönliches Interesse an dem Projekt oder einfach Freude am Programmieren und helfen?
Ach ja, wenn Du mal lachen willst über meine Python "Fähigkeiten": https://www.youtube.com/watch?v=YKbZPxObD34
-
Ich mache das aus Spaß am programmieren.
Die Bewässerung hab ich über 2punktregler gemacht, weiß nicht was du mit WT meinst. Aber das mit den bewässern alle 1-3 Tage geht auch zu machen. Durch die Case ist es recht flexibel, phasenabhängig die entsprechenden Werte zu laden.
Bei den Merkern brauchst du nur kurz mit der Maus drüber halten und der Kommentar wird angezeigt. Ist eigentlich alles beschriftet.
Die Schaltuhr kann man entsprechend anpassen, kein Problem. Evtl auch mit Startzeit und dann Laufzeit oder so.
Man muss nur die Info haben welche abläufe implementiert werden sollen.
Gruß Thomas
-
Du bist ja ein coooler Hund!
Ok mit den Kommentaren wirds durchschaubar👌😂
Mit WT meine ich den Wochen-Timer Baustein in meinem FUB Chaos, den ich missbraucht hab um das Bewässern nicht täglich zu aktivieren.
Wenn Du noch Lust und Laune hast:
Die 00:00 Uhr Geschichte bekomm ich in FUB sicher nicht mal eben hin...aber für den Endanwender ist es schon gut, wenn er einstellen kann, was er will und es wird ausgeführt.
In den Menüs für die Phasen könnte die Infozeile unten weg u dafür eine Zeile mit der variablen zum Einstellen der Bewässerungstage je nach Phase (abstand bis zum auslösen eines counters u dann rücksetzten - sowie, ein timer welcher den gießvorgang zeitlich begrenzt z.B. fix auf 1 Std. - muss ja nicht verändert werden)
andernfalls muss ich mir ST dann leider doch mal intensiv ansehen, weil ist ja echt praktisch! wüsste nicht wie "switch-case" in FUB gehen sollte und so wirds deutlich schöner als in FUB...aber was der Bauer nicht kennt, ne...
Gruß Markus
-
Das sind so Infos die ich vorher noch nicht hatte. Ich werde es einarbeiten und mal testen.
-
So es müsste jetzt mit den vorgeschlagenen Änderungen laufen. Probier es mal aus.
Gruß Thomas
-
Respekt! Schläfst Du auch mal od. bist du 24/7 am Programmieren😉💪
Ich probiere es später mal ausgiebig aus.. bin mir aber sicher, dass es läuft, so wie Du deine Codes ausführst👌
Ich berichte! Besten Gruß bis dahin..
-
Servus Thomas,
bin erst jetzt dazu gekommen...also in der Simulation ist ST ja wirklich noch schöner zum Prüfen als FUP🤢😂
Soweit so gut, Lichtsteuerung passt. Lüften / heizen passen.
Die Restlaufzeitberechnung zeigt nach Ablauf 255 und nicht 0 an, sonst perfekt!
Zusatzlüften ist nicht ganz klar...wenn deine Abkürzungen "Vz" und "NL", Startzeit und Dauer bedeuten, geht es nicht😉😂.
Im Menü "Regelparameter 3" muss man noch die haken setzten für P1 P3 sonst hängt man in dem Menü fest.
Wässern auf 0 = ganz aus (wäre sinnvoll - hab versucht es zu ändern aber finde nichts, wo der Wert des Merkers zw. 0-3 limitiert wird).
Wenn der Zyklus einmal durchgelaufen ist, muss man einmal "DEL" drücken um mit "OK" wieder "RUN" setzen zu können.
Wird IA04 benutzt (kann nichts finden - ist das die Luftfeuchte - die kann eh raus) - ist in der Simulation aktiv aber hat keine Funktion.
Besten Gruß, Markus
-
Hallo Markus,
ich hab schon ein paar kleine Fehler eliminiert und noch was hinzugefügt.
Man kann jetzt auf der letzten Seite alle Parameter mit Grundwerten laden. ist auch gut in der Simulation zu gebrauchen.
Schau mal durch ob die so sinnvoll sind. Ich bin da zu wenig Gärtner. ;)
Die Restlaufzeitberechnung zeigt nach Ablauf 255 und nicht 0 an, sonst perfekt!
gefixt
Im Menü "Regelparameter 3" muss man noch die haken setzten für P1 P3 sonst hängt man in dem Menü fest.
gefixt
Zusatzlüften ist nicht ganz klar...wenn deine Abkürzungen "Vz" und "NL", Startzeit und Dauer bedeuten, geht es nicht
Zwangslüften wird gemacht nach x Stunden für x Minuten, wenn nicht durch den Regler schon gelüftet wurde. Vz = Verzögerung, Nl = Nachlauf
Im Menü "Regelparameter 3" muss man noch die haken setzten für P1 P3 sonst hängt man in dem Menü fest.
gefixt
Wässern auf 0 = ganz aus (wäre sinnvoll - hab versucht es zu ändern aber finde nichts, wo der Wert des Merkers zw. 0-3 limitiert wird).
Hat das einen bestimmten Grund? Mann könnte den Timeout Bewässern auf 0 setzen.
Wenn der Zyklus einmal durchgelaufen ist, muss man einmal "DEL" drücken um mit "OK" wieder "RUN" setzen zu können.
Hatte ich extra so gemacht. Muss dann wohl noch angezeigt werden, das das Programmende ereicht wurde. Der Status auf Seite 1 zeigt jetzt an in welchem Programmschritt man ist.
Wird IA04 benutzt (kann nichts finden - ist das die Luftfeuchte - die kann eh raus) - ist in der Simulation aktiv aber hat keine Funktion.
Nun ja, eine Info über die Luftfeuchte wäre vlt ganz sinnvoll. Wir leiden ja nicht unter Speichermangel ;D
Gruß Thomas
-
Also erstmal, RIESEN RESPEKT! So verdammt Schnell, super nett und kompetent wie Du bist, sollte sich dein Chef glücklich schätzen! So od. so, ich tue es!!!
Lustig, die Idee von Dir, die Grundwerte zu laden hatte ich auch schon, wollte Dich aber nicht mit immer neuen Baustellen nerven😂 spart endlos Zeit beim testen💪💪💪
Zwangslüften nach z.B. 2 Stunden für 15 Minuten heißt dann konkret, dass der Lüfter alle 2 Std. für 10min. aktiv ist, egal ob die Heizung auch aktiv ist korrekt?
On Top wäre, wenn das Netz nur außerhalb der Lichtzeit aktiv ist (weil, sonst z.B. gerade gelüftet wurde um die Temperatur zu regeln und dann geht der Lüfter erneut durch die Zwangsbelüftung an - das wäre für den CO2 Austausch unnötig und würde evtl. sogar die Heizung aktivieren weil zu viel Kühlung erzeugt würde).
Wässern auf 0 setzen zu können hat sich erledigt, weil Du es ja jetzt noch geiler gemacht hast und die Soll-Erdfeuchte individuell pro Phase eingepflegt hast (wollte ich gerade sagen, dass das cool wäre und Du hast es schon drin😶 sehr cool!)
EDIT: Beim Testen merk ich grad, dass man auch MB94 also die SOLL-Erdfeuchte-Anzucht nicht auf < 20% setzen kann..aber ich den es ist egal, wenn dann halt der Topf ein paar Tage sinnlos gegossen wird..
Verriegelung Zyklusende - 👍 wenn mans weiß😂
IA04 -> SOLL-Luftfeuchte? Also einfach als Profilaxe für eine Erweiterung? Check es nicht...Luftfeuchte wird ja nicht geregelt...
Welches Bier trinkst Du, ich schick dir ne Pulle🍺 Top Hilfe Thoms!
Gruß Markus
Habs mal noch zusätzlich beschriftet:
0345 MW34:= 250; //Temp. Sollwert in 0,1C°
0346 MB69:= 10; //Hysterese Lüfter in 0,1C°
0347 MB71:= 10; //Hysterese Heizung in 0,1C°
0348 MB72:= 20; //Regelabstand Heizung-Lüfter in 0,1C°
0349 MB73:= 00; //Luftfeuchte Soll in % (keine Funktion)
0350 MB76:= 15; //Bewässerungdauer in min.
0351 MB77:= 10; //Hysterese Erdfeuchte
0352 MB78:= 20; //Startzeit Bewässerung in std. (Pumpe starten um xx Uhr)
0353 MB79:= 30; //Pulszeit Pumpe in sec. (Pumpe AN für xx sec.)
0354 MB80:= 60; //Pausezeit Pumpe in sec. (Pumpe AUS für xx sec.)
0355 MB81:= 4; //ZwangsLüften alle xx std.
0356 MB82:= 15; //ZwangsLüften für xx min.
0357 MB87:= 7; //Dauer Anzuchtphase in Tagen
0358 MB89:= 20; //Licht EIN Uhrzeit Anzucht in std.
0359 MB90:= 0; //Licht EIN Uhrzeit Anzucht in min.
0360 MB91:= 12; //Licht AUS Uhrzeit Anzucht in std.
0361 MB92:= 0; //Licht AUS Uhrzeit Anzucht in min.
0362 MB93:= 3; //Bewässern alle x Tage
0363 MB94:= 20; //Erdfeuchte Soll Anzucht in %
0364 MB96:= 30; //Dauer Wachstumsphase in Tagen
0365 MB98:= 20; //Licht EIN Uhrzeit Wachstum in std.
0366 MB99:= 0; //Licht EIN Uhrzeit Wachstum in min.
0367 MB100:= 12; //Licht AUS Uhrzeit Wachstum in std.
0368 MB101:= 0; //Licht AUS Uhrzeit Wachstum in min.
0369 MB102:= 3; //Bewässern alle x Tage
0370 MB103:= 20; //Erdfeuchte Soll Wachstum in %
0371 MB106:= 60; //Dauer Blütephase in Tagen
0372 MB108:= 20; //Licht EIN Uhrzeit Blüte in std.
0373 MB109:= 0; //Licht EIN Uhrzeit Blüte in min.
0374 MB110:= 8; //Licht AUS Uhrzeit Blüte in std.
0375 MB111:= 0; //Licht AUS Uhrzeit Blüte in min.
0376 MB112:= 1; //Bewässern alle x Tage
0377 MB113:= 50; //Erdfeuchte Soll Blüte in %
-
Hab das mal bei mir in der Mittagspause schon eingefügt.
Was meinst du mit :
On Top wäre, wenn das Netz nur außerhalb der Lichtzeit aktiv ist (weil, sonst z.B. gerade gelüftet wurde um die Temperatur zu regeln und dann geht der Lüfter erneut durch die Zwangsbelüftung an - das wäre für den CO2 Austausch unnötig und würde evtl. sogar die Heizung aktivieren weil zu viel Kühlung erzeugt würde).
Der Timer Zwangslüften wird zurück gesetzt sobald der Lüfter angesteuert wird. Willst du da noch eine Sperrzeit einfügen?
Die Begrenzungen der Eingabewerte hab ich in den Textanzeigen gemacht. Die kann man noch anpassen um unsinnige Eingaben zu begrenzen.
-
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;
-
Ah ok, da werden die 20-80 limitiert. Werde das auf 0-80 setzen damit ich so die Bewässerung während der Anzuchtphase ganz ausschalten kann.
Zwangslüften nur wenn LED aus (verhindert dann unnötige Temperaturschwankungen). Also quasi eine Sperrzeit während der Belichtungszeit.
Falls Dir ganz langweilig ist, könnte man noch die Soll-Temperatur individuell pro Phase regeln.
Sonst fällt mir dann für die Aktion echt nix mehr ein😂
Man kann die letzte Version perfekt benutzen, daher sehe ich die Sache soweit als fertig..
-
Hat Spaß gemacht das zu entwickeln.
Du kamst ja auch mit einem kompletten Programm hier an und hast dir schon Gedanken gemacht das umzusetzen.
Falls Dir ganz langweilig ist, könnte man noch die Soll-Temperatur individuell pro Phase regeln.
Dann trage doch einfach eine Zuweisung hinter die Erdfeuchte Soll in der Case ein in den 3 Phasen. Als Speicher kannst du remanente MW ab MB117 nehmen, die müssten noch frei sein.
MW34:= MW59; //Temperatursollwert Anzucht laden
Jetzt noch die Einträge auf den D-Bausteinen der Phasenwerte machen, einzelne Sollwertvorgabe löschen und fertig bist du.
Die Pulle Bier hatte ich gestern abend schon :D also alles fresh. ;)
Gruß Thomas
-
Mir auch! Hab sogar (bedingt) gefallen an ST gefunden (ist so sehr viel strukturierter als FUP bei dem Programmumfang).
Hab die Software jetzt auf meiner Steuerung im Einsatz u bemerkt, dass der Lüfter nach dem Zwangslüften nicht mehr aus geht.
Lag am T04 -> der muss am EN nach Ablauf der Verzögerung einmal kurz zurück gesetzt werden u. läuft erst dann weiter. Hab das mit "and not T04Q1" ergänzt in der EN Bedingung des T04. Funktioniert so, ist aber evtl. nicht sauber.
Und die Pumpe geht anfangs (beim allerersten mal) für eine Pulsdauer an auch wenn sie das nicht sollte. Das liegt glaub ich daran, dass C02 den Wert in MB114 erst im Moment des "start-drückens" läd, aber in dem Moment ist die Bedingung QV >= SH (0=0) erfüllt sodass der Timer T02 startet und einmal eine Pulsdauer lang bewässert. Kann man C02OF mit initialisieren sodass es als "Startswert" "false" ist (der dann natürlich direkt überschrieben wird, wenn die Bedingung QV >= SH erfüllt ist). In c ging das easy mit dem belegen der Variablen mit einem wert aber in ST check ichs jetzt nicht😜 da hilft heute auch kein Bier mehr😂🍺✌️
Hab mal meine veränderte Version mit angehängt. Das mit der Pumpe ist nur kür aber das mit dem Lüfter ist gut wenn er wieder aus gehen kann.
Besten Gruß Markus
-
Ich setze mich nächste Woche mal dran und arbeite die Punkte ab.
Vlt fällt mir noch was zur Bewässerung ein.
Bis dahin, Gruß Thomas
-
So, ich hab die Punkte noch abgearbeitet. Musste allerdings die Menueseiten für die Phasensollwerte verdoppeln, weil nicht mehr alles drauf gepasst hat.
Hab die Software jetzt auf meiner Steuerung im Einsatz u bemerkt, dass der Lüfter nach dem Zwangslüften nicht mehr aus geht.
Lag am T04 -> der muss am EN nach Ablauf der Verzögerung einmal kurz zurück gesetzt werden u. läuft erst dann weiter. Hab das mit "and not T04Q1" ergänzt in der EN Bedingung des T04. Funktioniert so, ist aber evtl. nicht sauber.
Doch, so sollte es sein, hast völlig recht. Hab ich wohl übersehen. Jetzt passt es.
Und die Pumpe geht anfangs (beim allerersten mal) für eine Pulsdauer an auch wenn sie das nicht sollte.
Ist gefixt, Zähler ist erst aktiv 1 Zyklus nach dem Wertladen.
Gruß Thomas
-
Wie schon die vorherigen mal aber diesmal zum finalen male... -> SAU STARK!!!
Also ich würde sagen, dass ist jetzt echt klasse so und falls noch andere Gärtner Freude dran finden umso besser.
Besten Dank Dir!
Gruß Markus✌️
-
Hätte da noch eine Frage an den SPS Profi...
Weißt Du, ob man die easy über MODBUS TCP steuern kann?
Also wie bei einer Industriemaschine einen Steuerungsrechner mit WIN IOT LTSC der dann über den MODBUS schreiben und lesen kann?
Dann könnte man ja richtig geile GUIs bauen.. Falls es geht, gibt es Einschränkungen oder kann ich über den MODUS auf alles zugreifen?
Viell. geh ich doch weg vom Raspberry für mein Großprojekt.
Besten Gruß Markus
-
Na klar geht das mit Modbus TCP.
Deshalb habe ich schon bestimmte Merker und MB zusammengefasst um effizienter zu kommunizieren.
Die Merker 489 und 490 sind schon als start/Stop Befehle über Modbus vorgesehen.
Hatte ich anfangs auch schon geschrieben, zB mit Galileo auf einem XV Panel oder gleich eine Webvisu bauen. Die soll jetzt auch besser sein ab v8.25, hab es noch nicht probiert.
Wenn die Steuerung über Netzwerk erreichbar ist, kannst du vieles machen. Hab auch schon Virtuino IOT probiert und mir Dashboards gebaut zum fernbedienen vom Handy aus.
-
Cool! Auch schon von einem Windows PC aus mit einem C# + JS code? Dann wäre ich nicht an das nicht ganz günstige Galileo Display gebunden...
Ja stimmt, hattest du schon erwähnt. Das es generell geht weiß ich aber eben vermutlich nur sehr simple GUI's.
Deswegen dachte ich, warum nicht in C# den Server handeln u über die Ethernetkarte mit der SPS Kommunizieren.
Ist dann zwar nicht Echtzeitfähig aber aber das ist ja egal bei der Anwendung.
Ein JavaScript hätte eben die volle Bandbreite an optischen Gestaltungs- und Performanceleven.
Webvisu seh ich mir mal an✌️
Dass DU die Optionen schon mit Eingeplant und angelegt hast wundert mich jetzt so gar nicht😊💪💪💪 STARK!!!
-
Aus lust an der Freude, hab ich mir gerade die Merkerbereichbelegung angehesen...warum ist in deinem sauberen code alles ROT in der liste? schreibkonflikte..so ganz versteh ich das iwie nicht😂
-
warum ist in deinem sauberen code alles ROT in der liste
Nun das liegt wohl an der wirklich simplen Prüfung. Wird auf eine Variable an mehr als einer Stelle geschrieben ist die sofort rot, unabhängig davon wie das gemacht wurde. Gerade in ST gibt es Anweisungen bei denen das beabsichtigt ist ( IF THEN ELSE, oder auch in CASE wo ein Merker zB abhängig von der Casevariable mal true oder false gesetzt wird. So auch im Programm in den Phasen die Sollwert zugewiesen werden.
Übrigens ist nicht nur der Zugriff auf die E4 per Modbus TCP möglich, sondern auch über JSON API zB mit Node Red. Wäre das was für dich? Da gibt's auch Anleitungen auf YT dazu.
Gruß Thomas
-
Ah ok, das erklärt auch warum, man diesen "fehler" nicht weg bekommt egal wohin man den merker legt.. macht aus software-prüfungstechnischer sicht schon auch sinn, ist aber unschön.. naja.. der fehler liegt also im fehler👌😂
wenn der zugriff per tcp modbus auf alles (register?) möglich ist, ist das perfekt so. dann kann ich in c# die kommunikation managen u html css js für die gui verwenden aber die steuerungslogik bleibt auf der sps selbst. klasse!
hast du erfahrungen mit dem ding hier: AkYtec PR102.24.2.2
letztenendes brauch ich ne sps mit 8 relais und 6 digital ausgänge oder eben 14 digitalausgänge (+optok + relais).. aber finde bei eaton nur erweiterungen.. gibts da was als ein block?
besten gruß markus
-
Das Teil kannte ich noch nicht.
Was spricht gegen eine E4 mit Erweiterung, dann hast du genug IO
-
Naja, es kostet weniger und bei dem AkYtec ding ist ein analogausgang drin den ich auch gern hätte... bin noch am evaluieren was es wird.
-
wüsste nicht, wie ich das in ST umsetze aber hab in python einen timer gebastelt, der checkt ob sich die aktuelle zeit innerhalb der EIN-AUS zeit befindet und wenn man eine if abfrage macht für den fall dass der timer über mitternacht läuft..
hat den vorteil, dass bei einem stromausfall 5 min nach dem einschaltpunkt (wie in der ST version) die steuerung wieder alles richtig setzt und nicht erst beim nächsten zyklus..
ist für mein projekt jetzt nicht so wichtig aber fand die lösung schön und schlank..
if start_time > end_time
return jetzt >= start_time or jetzt < end_time # gibt als ergebnis wahr aus, wenn eine der beiden fallunterscheidungen wahr ist: startzeit <= aktueller zeit oder aktuelle zeit < endzeit - wahr = AN
else:
return start_time <= jetzt < end_time # wenn erste prüfung (if) nicht ausgeführt -> normalfall (timer läuft nicht über mitternacht) dann prüfen ob startzeit <= aktuelle zeit < endzeit
gruß markus
-
Also nach langem suchen u überlegen hab ich ne lösung denk ich..
easy e4 + erweiterung + gateway tcp-rtu -> da hängen dann 2 sensoren u 7 treiber für schrittmotoren drauf
dann würde ich hinkommen..
frage: hab ich irgendwo einen denkfehler? (weil die tcp rtu geschichte ist so an die 10 jahre her)😂
-
Sorry, hatte nicht die Zeit.
Mit deinem Vorschlag mit Modbus I/O sollte es funktionieren.
Das mit dem Stromausfall und der Uhr muss ich mal testen. Stellt sich die Frage ob das nötig ist, wie oft startet die Steuerung neu nach Stromausfall? Theoretisch kannste über Fernzugriff einfach per Hand einschalten.
-
Alles easy😉 du bist ja kein verkaufsberater für eaton....
Stromausfall ist nur so ein wort case.. wenn man mal was ändert, muss man so auch nicht auf den nächsten phasen trigger um 00 warten aber das sind nur so spielereien, stimmt schon..
Hab die bussysteme mal in der schule gelernt aber keine plan mehr😂 soweit ich das verstehe müsste es so gehen:
-pc (tcu)
easy sps - switch
-gateway (rtu) - schrittmotortreiber rs485 - sensor rs485 (3x)
auf dem pc läuft dann eine gui in c# über den ethernetport via modbus tcp protokoll....
kennst du dich in der thematik (eaton / sps software seitig) aus?
ich integrier gerade aktives kühlen heizen entfeuchten befeuchten u co2 zuführen.
hab das als testaufbau mit 2 kompressoren...läuft soweit sehr gut...hab aber alles in python umgestzt (fürs testen). wenn klar ist, wie die logik dahinter gut funktioniert, könnte ich dich gegen bezahlung mal für ein "größeres" projekt in der art wie beschrieben gewinnen? wird noch dauern, bis alles 100% klar ist (hydrosystem mit wasser- temp EC pH -> aktiver regelung ist bisher nur theorie). wäre viel aktoren/sensoren über rtu modbus einbinden u dann die IN/OUT merker/variablen für die tcp modbus kommukikation erstellen damit ich dann den c# code mit den merkern/variablen verknüpfen kann....
wenn das einer in ST umsetzen kann, dann DU💪✌️
-
Hast du schon mal in betracht gezogen einen Raspi mit Codesys Runtime und Webvisu zu verwenden? Die Lizenz dafür kostet glaube ich 55€ pro Gerät.
dann könntest du irgendeine kompatible I/O Platine verwenden.
-
habe ich so schonmal verbaut ja, aber ist mir zu schwammig das ganze. funktioniert schon sehr gut. wobei man dann auch die codesys soft sps webvisu hat (geht so von der optik her).. aber rpi kann auf langzeit probleme machen u bei den rpi preisen kannste direkt ne sps nehmen. zudem hat der rpi 4 ernsthafte wlan probleme. was bei dem preis mal so gar nicht geht. die waren mal geil und günstig. aus günstig is mal nicht mehr am start..😂
ne ich bin sicher, dass ich das ganze so umsetzten will. aber für die ST sps software brauch ich hilfe. wird dann doch sehr umfangreich werden.
wie sieht es da bei dir aus? also ernsthaft gegen bezahlung...
-
Ja kann ich schon machen. Für mich ist eher das Problem, immer genügend Zeit dafür zu haben.
Sonst habe ich aber hier im Forum einen Grundsatz für mich, ich mache alles freiwillig ohne Bezahlung. Das soll auch so bleiben.
-
Vielleicht klappt es ja auch mit hilfe zur selbsthilfe.. hab das meiste in den letzten nächten schon umgesetzt.. ST und ich können viell doch noch freunde werden (dank dir)🍺✌️
aber mit den merkern bin ich nicht soooo ganz sicher... könntest du mal kurz sagen, ob die aufteilung generell so sinn macht. dass immer ein roter fehler gezeigt wird, wenn an 2 stellen auf einen merker geschrieben wird ist (jetzt) klar, aber vor lauter rot is nicht ganz klar ob da überschneidungen in der merker aufteilung sind.
nochmal zum verständnis: sobald ein MB benutzt wird, welches im bereich eines zb MD liegt, ist dieser nicht mehr vollständig (konfliktfrei) nutzbar korrekt?
weil das projekt eines schönen tages mal in einem gerät für den endverbraucher münden soll, wäre es für diese finale software version besser, wenn das nicht frei zugänglich im netz landet...deswegen auch das bez angebot.
aber hey du bist logiker: ich schreib dir einfach außerhalb vom chat -> bedingung erfüllt✔️😂
nur spaß, wird ehr nicht nötig sein...soweit sieht das alles schon sehr ganz gut aus. bei den RTU u TCP Modbus geschichten wirds nochmal spannend....da würde ich mich über Deine erfahrung/hilfe sehr freuen!
-
nochmal zum verständnis: sobald ein MB benutzt wird, welches im bereich eines zb MD liegt, ist dieser nicht mehr vollständig (konfliktfrei) nutzbar korrekt?
Korrekt.
Schick mir deine Mailadr per PM, dann kann man das Projekt anhängen und es geht nicht öffentlich.