Seite 2 von 4

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 11:50 am
von alexbeer
Eraser hat geschrieben: Do Feb 20, 2020 9:46 am Weil er bei den Eingängen direkt auf Parameter umgeschaltet hat und dort dann einen Wert eingetragen hat.
Das ist mir auch schon aufgefallen.
Ist das ggf ein kleiner Bug, dass fest verdrahtete Parameter in den Eingängen nicht über den LE-Code wiederhergestellt werden?

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 12:16 pm
von Eraser
Ich denke nicht, da es ja Eingänge sind und die Beschaltung ausserhalb der Logik geschieht. Der Wert könnte ja auch von z.B. einer GA kommen.

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 2:14 pm
von Robert_Mini
Richtig! Siehe “3) Optionen für Eingänge festlegen” in app.php/kb/viewarticle?a=91

Man könnte die Parameter an ein Objekt verknüpfen, macht aber bei fixen, anlagenspezifischen Werten keinen Sinn (und ggf. Probleme nach Stromausfall, etc.).

Lg
Robert

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 4:27 pm
von alexbeer
Das macht schon Sinn, dass die Ein-und Ausgänge nicht per Coding vorgelegt werden.

Um eine konsistente UserExperience zu haben, sollte m.E. auch keine Unterscheidung zwischen GA und Parameter gemacht werden.
Andernfalls würde die Frage aufkommen:
Warum wird der Parameter nach LE-Codinh Import vorbelegt und die GA nicht?

Wenn sich der Anwender komplett um die "Verdrahtung" der Ein- und Ausgänge nach LE-Code-Import kümmern muss, ist es konsistentes Verhalten.

VG Alex

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 7:12 pm
von Robert_Mini
alexbeer hat geschrieben: Do Feb 20, 2020 11:50 am Ist das ggf ein kleiner Bug, dass fest verdrahtete Parameter in den Eingängen nicht über den LE-Code wiederhergestellt werden?
Ganz kann ich eurer Diskussion nicht folgen.

Aber dieses Verhalten ist so absolut richtig. Gerade bei einer schrittweisen Entwicklung (wie in diesem Tutorial) oder bei einem Update eines Logikbausteines möchte ich nicht alle Parameter oder auch Objekte neu verknüpfen.

Da hat Stefans Team ganze Arbeit geleistet, damit diese Verknüpfungen erhalten bleiben, sowohl bei Code Anpassungen als auch bei Definition zusätzlicher Ein-/Ausgänge!!!

lg
Robert

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Do Feb 20, 2020 7:26 pm
von Robert_Mini
Weiter geht es mit Schritt 5:
Hier kommt nun das Zählen der Rückspülungen und die Füllstandsberechnung hinzu.

Schritt 5:
  • Mit dem Modul Polynomial wird zuerst bei jedem Aufruf der Logik die Variable $FuellstandNeu berechnet, indem vom bisherigen Wert $Fuellstand der Wert für $I_HoeheRueckspuelung abgezogen wird ( "-" vor der Variable! $I_HoeheRueckspuelung).
  • Wurde eine Rückspülung erkannt ($Rueckspuelung_Neu = true), wird mittels dem Modul Latch der neue Wert auf $Fuellstand gespeichert.
  • Das Vorgehen für das Zählen der Rückspülungen ist analog, nur ohne dem "-" im Polynom ;) .
Die nächsten Schritte gibt's später (oder morgen).
Und nun her mit den Fragen!

Lg Robert

Bild

Code: Alles auswählen

//================ Schritt 5 =====================
//Fuellstand und Zähler Rückspülungen berechnen
{
  "Input": [
        ["Temperatur Rueckspülung","Temperatur gemessen an der Rückspülleitung","$I_Temp","a"],
		["Delta T Rückspülung","Schwelle zur Erkennung Temperaturabfall bei Rückspülung","$I_DeltaT","c"],
		["Zeitkonstante Glättung","Zeitkonstante der geglätteten Temperatur, gegen die Delta T gemessen wird","$I_Glaettung","c"],
		["Dauer Rückspülung","Dauer für Ausgabe Rückspülung aktiv","$I_RS_Dauer","c"],
		["Sperrzeit nach Rückspülung","Mindestzeit, bevor wieder eine Rückspülung erkannt wird","$I_Sperrzeit","c"],
		["Trigger nachfüllen","Trigger für Nachfüllen je Sack","$I_TriggerNachfuellen","c"],
		["Füllstandserhöhung je Sack","","$I_HoeheSack","c"],
		["Füllstandsverringerung je Rückspülung","","$I_HoeheRueckspuelung","c"]
  ],
  "Output": [
		["Rückspülung Jahr","Anzahl Rückspülungen im aktuellen Jahr","$RS_Anzahl","c"],
		["Füllstand aktuell","Aktueller Füllstand","$Fuellstand","c"],
		["Warnung Füllstand","Trigger GA für Warnung","$Warnung","c"],
		["Temperatur geglättet","Temperatur nach Tiefpassfilter","$TempGeglaettet","c"],
			
		// Debug Ausgänge
		["_Temp_CResult","Vergleich der Temperaturen","$Temp_CResult","c"],
		["_And_Sperrre_Aktiv","Temperatur nach Tiefpassfilter","$Sperre_Aktiv","c"],
		["_And_RS_Neu","Temperatur nach Tiefpassfilter","$Rueckspuelung_Neu","c"],
		["_Rückspülung Aktiv","Rückspülung läuft","$RS_Stat","c"]
  ],
  "Level": [
		["$I_Temp","float",20.0],
		["$TempGeglaettet","float",20.0],
		["$I_DeltaT","float",3.0],
		["$I_Sperrzeit","float",3.0],
		["$I_RS_Dauer","float",3.0],
		
		["$I_Glaettung","float",36000.0],
		["$I_TriggerNachfuellen","bool",false],
		["$I_HoeheSack","float",25.0],
		["$I_HoeheRueckspuelung","float",2.0],
		["$RS_Anzahl","integer",0],
		["$Fuellstand","float",0.0],
		// Zusätzlich
		["$FuellstandNeu","float",0.0],
		["$RS_AnzahlNeu","integer",0],
		
		["$Warnung","bool",false],
		//
		["$Temp_Schwelle","float",0.0],
		["$Temp_CResult","bool",false],
		["$TimerStat","bool",false],
		["$RS_Stat","bool",false],
		["$Sperre_Aktiv","bool",false],
		["$Sperrzeit_Gesamt","float",3.0],
		["$Rueckspuelung_Neu","bool",false],
		
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Konst0","float",0.0],
		["$Konst1","float",1.0]
  ],
  "Module": [
		// Temperatur Glättung
		["Lowpass","$I_Temp","$TempGeglaettet","$I_Glaettung"],
		
		// Vergleich T aktuell < (T geglättet - DeltaT)
		["Polynomial", "$Konst1", "$Temp_Schwelle",["$TempGeglaettet", "-$I_DeltaT"]],
		["Comparator" , "$I_Temp" , "-$Temp_CResult" , "$Temp_Schwelle"],
		
		// Rueckspuelung erkennen
		["And",["$Temp_CResult","-$Sperre_Aktiv"], "$Rueckspuelung_Neu"],
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		
		// Fuellstand neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$FuellstandNeu",["$Fuellstand", "-$I_HoeheRueckspuelung"]],
		["Latch","$FuellstandNeu","$Fuellstand","$Rueckspuelung_Neu",0],
		// Zaehler neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$RS_AnzahlNeu",["$RS_Anzahl", "$Konst1"]],
		["Latch","$RS_AnzahlNeu","$RS_Anzahl","$Rueckspuelung_Neu",0],
		
		// Timer Sperre und Rückspülung
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		["Monoflop","$Temp_CResult","$KonstFalse","$RS_Stat","$I_RS_Dauer",0],
		["Monoflop","$Temp_CResult","$KonstFalse","$Sperre_Aktiv","$Sperrzeit_Gesamt",0]
		
		// Trigger Nachfuellung => Fuellstand erhöhen

  ]
}

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Fr Feb 21, 2020 12:43 pm
von Robert_Mini
Weiter geht es mit Schritt 6:
Hier kommt nun der Trigger für das Nachfüllen hinzu. Dieser erhöht die Anzahl der nachgefüllten Säcke um +1 und den Füllstand um den Wert des Eingangs Füllstandserhöhung.

Schritt 6:
  • Gleich wie bei den vorigen Schritten wird bei jedem Aufruf der Logik die Variable für $Saecke_AnzahlNeu und $FüllstandNeu mittels Polynom berechnet.
  • Dabei wird $Saecke_AnzahlNeu um 1 erhöht, zu $FüllstandNeu wird $I_HoeheSack addiert.
  • Mittels Latch wird anschließend der jeweils neue Wert übernommmen, wenn die Variable $I_TriggerNachfuellen den Wert true vom Eingang bekommt.
  • Im letzten Schritt wird mittels Multiplexer die Variable $I_TriggerNachfuellen auf 0 gesetzt.
    Hinweis: Im DokMode ist der Eingang daher nie mit true zu sehen, da die Logik den Wert sofort wieder mit 0 überschreibt.
  • Abschließend im DokMode den Trigger testen (Parameter am Eingang "Füllstandserhöhung je Sack" nicht vergessen! In meinem Fall habe ich den Wert 20 verwendet und den Nachfülltrigger 2x mal getriggert). Danach habe ich eine Entkalkung simuliert (Eingang 20°, dann 16°), so dass am Ende 38 als Ergebnis im Screenshot stehen.
Den nächsten Schritt gibt's später => Jahresreset.

Lg Robert

Bild

Code: Alles auswählen

//================ Schritt 6 =====================
//Trigger Nachfüllen => Fuellstand und Zähler Säcke neu berechnen
{
  "Input": [
        	["Temperatur Rueckspülung","Temperatur gemessen an der Rückspülleitung","$I_Temp","a"],
		["Delta T Rückspülung","Schwelle zur Erkennung Temperaturabfall bei Rückspülung","$I_DeltaT","c"],
		["Zeitkonstante Glättung","Zeitkonstante der geglätteten Temperatur, gegen die Delta T gemessen wird","$I_Glaettung","c"],
		["Dauer Rückspülung","Dauer für Ausgabe Rückspülung aktiv","$I_RS_Dauer","c"],
		["Sperrzeit nach Rückspülung","Mindestzeit, bevor wieder eine Rückspülung erkannt wird","$I_Sperrzeit","c"],
		["Trigger nachfüllen","Trigger für Nachfüllen je Sack","$I_TriggerNachfuellen","c"],
		["Füllstandserhöhung je Sack","","$I_HoeheSack","c"],
		["Füllstandsverringerung je Rückspülung","","$I_HoeheRueckspuelung","c"]
  ],
  "Output": [
		["Rückspülung Jahr","Anzahl Rückspülungen im aktuellen Jahr","$RS_Anzahl","c"],
		["Füllstand aktuell","Aktueller Füllstand","$Fuellstand","c"],
		["Warnung Füllstand","Trigger GA für Warnung","$Warnung","c"],
		["Temperatur geglättet","Temperatur nach Tiefpassfilter","$TempGeglaettet","c"],
			
		// Debug Ausgänge
		["_Temp_CResult","Vergleich der Temperaturen","$Temp_CResult","c"],
		["_And_Sperrre_Aktiv","Temperatur nach Tiefpassfilter","$Sperre_Aktiv","c"],	
		["_And_RS_Neu","Temperatur nach Tiefpassfilter","$Rueckspuelung_Neu","c"],
		["_Rückspülung Aktiv","Rückspülung läuft","$RS_Stat","c"]
  ],
  "Level": [
		["$I_Temp","float",20.0],
		["$TempGeglaettet","float",20.0],
		["$I_DeltaT","float",3.0],
		["$I_Sperrzeit","float",3.0],
		// zusätzlich
		["$I_RS_Dauer","float",3.0],
		
		["$I_Glaettung","float",36000.0],
		["$I_TriggerNachfuellen","bool",false],
		["$I_HoeheSack","float",25.0],
		["$I_HoeheRueckspuelung","float",2.0],
		["$RS_Anzahl","integer",0],
		["$RS_AnzahlNeu","integer",0],
		["$Fuellstand","float",0.0],
		["$FuellstandNeu","float",0.0],
		// Zusätzlich
		["$Saecke_Anzahl","integer",0],
		["$Saecke_AnzahlNeu","integer",0],
		
		["$Warnung","bool",false],
		//
		["$Temp_Schwelle","float",0.0],
		["$Temp_CResult","bool",false],
		["$TimerStat","bool",false],
		["$RS_Stat","bool",false],
		["$Sperre_Aktiv","bool",false],
		["$Sperrzeit_Gesamt","float",3.0],
		["$Rueckspuelung_Neu","bool",false],
		
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Konst0","float",0.0],
		["$Konst1","float",1.0]
  ],
  "Module": [
		// Temperatur Glättung
		["Lowpass","$I_Temp","$TempGeglaettet","$I_Glaettung"],
		
		// Vergleich T aktuell < (T geglättet - DeltaT)
		["Polynomial", "$Konst1", "$Temp_Schwelle",["$TempGeglaettet", "-$I_DeltaT"]],
		["Comparator" , "$I_Temp" , "-$Temp_CResult" , "$Temp_Schwelle"],
		
		// Rueckspuelung erkennen
		["And",["$Temp_CResult","-$Sperre_Aktiv"], "$Rueckspuelung_Neu"],
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		// Fuellstand neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$FuellstandNeu",["$Fuellstand", "-$I_HoeheRueckspuelung"]],
		["Latch","$FuellstandNeu","$Fuellstand","$Rueckspuelung_Neu",0],
		// Zaehler neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$RS_AnzahlNeu",["$RS_Anzahl", "$Konst1"]],
		["Latch","$RS_AnzahlNeu","$RS_Anzahl","$Rueckspuelung_Neu",0],
		
		// Timer Sperre und Rückspülung
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		["Monoflop","$Temp_CResult","$KonstFalse","$RS_Stat","$I_RS_Dauer",0],
		["Monoflop","$Temp_CResult","$KonstFalse","$Sperre_Aktiv","$Sperrzeit_Gesamt",0],
		
		// Trigger Nachfuellung => Fuellstand + Sackanzahl erhöhen
		["Polynomial", "$Konst1", "$Saecke_AnzahlNeu",["$Saecke_Anzahl", "$Konst1"]],
		["Latch","$Saecke_AnzahlNeu","$Saecke_Anzahl","$I_TriggerNachfuellen",0],
		["Polynomial", "$Konst1", "$FuellstandNeu",["$Fuellstand", "$I_HoeheSack"]],
		["Latch","$FuellstandNeu","$Fuellstand","$I_TriggerNachfuellen",0],
		// Triggereingang auf False setzen
		["Multiplexer",["$I_TriggerNachfuellen","$KonstFalse"],"$I_TriggerNachfuellen","$I_TriggerNachfuellen"],
  ]
}

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Fr Feb 21, 2020 9:32 pm
von Robert_Mini
Weiter geht es mit Schritt 7:
Hier wird das automatische, jährliche Rücksetzen der Zähler für Rückspülungen und Anzahl der nachgefüllten Säcken umgesetzt.

Schritt 7:
  • Zuerst eine Fehlerkorrektur: In den beiden Monoflops wird als Trigger die Variable $Rueckspuelung_Neu benötigt ( ["Monoflop","$Rueckspuelung_Neu","$KonstFalse","$RS_Stat","$I_RS_Dauer",0]), damit die Timer nur bei einer neuen Rückspülung gestartet werden. Ansonsten konnte der Timer Rückspülung auch innerhalb der Sperrzeit neu gestartet werden, was zwar keine Zählfehler bewirkte, aber fälschlicherweise eine erneute Rückspülung am Ausgang "Rückspülung aktiv" anzeigte.
Für das Reset geht es wie folgt weiter:
  • Es wird eine String Variable $ResetJahr angelegt: ["$ResetJahr","string","1 0 0 1 1 *"]. Diese definiert in der um Sekunden erweiterten Cron-Syntax den einen Zeitpunkt, im Beispiel oben 1sec nach Mitternacht im 1. Monat des Jahres. Details siehe KB: app.php/kb/viewarticle?a=115#Cron
  • Mittels Cron Modul wird die Logik zu diesem Zeitpunkt getriggert, die Variable $ResetJahrTrigger nimmt dabei den Wert true an.
  • Dadurch wird mittels Latch (["Latch","$Konst0","$RS_Anzahl","$ResetJahrTrigger",0]) der Zähler für die Anzahl der Rückspülungen $RS_Anzahl mit 0 (per $Konst0) überschrieben.
  • Das gleiche passiert mit der Variable $Saecke_Anzahl, die damit ab dem Jahreswechsel ebenfalls wieder von 0 zu zählen beginnt.
  • Das ganze kann man im DokMode testen, indem man für den Cron Trigger einen Zeitpunkt 5min in der Zukunft definiert zB "1 25 18 * * *", dann wird der Reset um 18:25:01 ausgelöst. Einfach Logik starten, eine Rückspülung auslösen und dann warten, ob um 18:25 der Reset stattfindet.
Abschließend wird noch ein wenig aufgräumt:
  • Debug Ausgänge auskommentieren oder (später) entsprechende Zeilen löschen.
  • Der Ausgang "Säcke Jahr" wird nach oben gereiht (durch die Reihenfolge im Abschnitt Output).
  • Einzelne Ausgänge als optional einstellen indem hinter die Variable ein ? gestellt wird: ["Rückspülung Aktiv","Rückspülung läuft","$RS_Stat?","c"]. Damit sind diese Ausgänge per "+" einblendbar, wenn man sie benötigt, ansonsten sind sie ausgeblendet und die Logikzelle bleibt übersichtlich. In diesem Schritt für "Rückspülung aktiv" und "Temperatur geglättet" umgesetzt, könnte man später auch für "Warnung" und "Säcke/Jahr" machen.
Den nächsten Schritt gibt's morgen => Warnung bei zu geringem Füllstand.

Lg Robert

Bild

Code: Alles auswählen

//================ Schritt 7 =====================
//Aufräumen + Jahresreset + Output Saecke
{
  "Input": [
        	["Temperatur Rueckspülung","Temperatur gemessen an der Rückspülleitung","$I_Temp","a"],
		["Zeitkonstante Glättung","Zeitkonstante der geglätteten Temperatur, gegen die Delta T gemessen wird","$I_Glaettung","c"],
		["Delta T Rückspülung","Schwelle zur Erkennung Temperaturabfall bei Rückspülung","$I_DeltaT","c"],
		["Dauer Rückspülung","Dauer für Ausgabe Rückspülung aktiv","$I_RS_Dauer","c"],
		["Sperrzeit nach Rückspülung","Mindestzeit, bevor wieder eine Rückspülung erkannt wird","$I_Sperrzeit","c"],
		["Füllstandsverringerung je Rückspülung","","$I_HoeheRueckspuelung","c"],
		["Trigger nachfüllen","Trigger für Nachfüllen je Sack","$I_TriggerNachfuellen","c"],
		["Füllstandserhöhung je Sack","","$I_HoeheSack","c"]
  ],
  "Output": [
		["Rückspülung Jahr","Anzahl Rückspülungen im aktuellen Jahr","$RS_Anzahl","c"],
		["Rückspülung Aktiv","Rückspülung läuft","$RS_Stat?","c"],
		["Füllstand aktuell","Aktueller Füllstand","$Fuellstand","c"],
		["Säcke Jahr","Anzahl der nachgefüllten Säcke im laufenden Jahr","$Saecke_Anzahl","c"],
		["Warnung Füllstand","Trigger GA für Warnung","$Warnung","c"],
		["Temperatur geglättet","Temperatur nach Tiefpassfilter","$TempGeglaettet?","c"]
		
		//["_And_Sperrre_Aktiv","Temperatur nach Tiefpassfilter","$Sperre_Aktiv","c"],	
		// Debug Ausgänge
		//["_Temp_CResult","Vergleich der Temperaturen","$Temp_CResult","c"],
		//["_And_RS_Neu","Temperatur nach Tiefpassfilter","$Rueckspuelung_Neu","c"],
		
  ],
  "Level": [
		["$I_Temp","float",20.0],
		["$TempGeglaettet","float",20.0],
		["$I_DeltaT","float",3.0],
		["$I_Sperrzeit","float",3.0],
		// zusätzlich
		["$I_RS_Dauer","float",3.0],
		
		["$I_Glaettung","float",36000.0],
		["$I_TriggerNachfuellen","bool",false],
		["$I_HoeheSack","float",25.0],
		["$I_HoeheRueckspuelung","float",2.0],
		["$RS_Anzahl","integer",0],
		["$RS_AnzahlNeu","integer",0],
		["$Fuellstand","float",0.0],
		["$FuellstandNeu","float",0.0],
		["$Saecke_Anzahl","integer",0],
		["$Saecke_AnzahlNeu","integer",0],
		// Zusätzlich
		["$ResetJahr","string","1 0 0 1 1 *"],
		["$ResetJahrTrigger","bool",false],
		
		["$Warnung","bool",false],
		//
		["$Temp_Schwelle","float",0.0],
		["$Temp_CResult","bool",false],
		["$TimerStat","bool",false],
		["$RS_Stat","bool",false],
		["$Sperre_Aktiv","bool",false],
		["$Sperrzeit_Gesamt","float",3.0],
		["$Rueckspuelung_Neu","bool",false],
		
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Konst0","float",0.0],
		["$Konst1","float",1.0]
  ],
  "Module": [
		["Cron","$KonstTrue","$ResetJahrTrigger",0,"$ResetJahr"],
		// Temperatur Glättung
		["Lowpass","$I_Temp","$TempGeglaettet","$I_Glaettung"],
		
		// Vergleich T aktuell < (T geglättet - DeltaT)
		["Polynomial", "$Konst1", "$Temp_Schwelle",["$TempGeglaettet", "-$I_DeltaT"]],
		["Comparator" , "$I_Temp" , "-$Temp_CResult" , "$Temp_Schwelle"],
		
		// Rueckspuelung erkennen
		["And",["$Temp_CResult","-$Sperre_Aktiv"], "$Rueckspuelung_Neu"],
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		// Fuellstand neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$FuellstandNeu",["$Fuellstand", "-$I_HoeheRueckspuelung"]],
		["Latch","$FuellstandNeu","$Fuellstand","$Rueckspuelung_Neu",0],
		// Zaehler neu berechnen und merken, wenn Rueckspuelung erkannt
		["Polynomial", "$Konst1", "$RS_AnzahlNeu",["$RS_Anzahl", "$Konst1"]],
		["Latch","$RS_AnzahlNeu","$RS_Anzahl","$Rueckspuelung_Neu",0],
		
		// Timer Sperre und Rückspülung
		["Polynomial", "$Konst1", "$Sperrzeit_Gesamt",["$I_RS_Dauer", "$I_Sperrzeit"]],
		["Monoflop","$Rueckspuelung_Neu","$KonstFalse","$RS_Stat","$I_RS_Dauer",0],
		["Monoflop","$Rueckspuelung_Neu","$KonstFalse","$Sperre_Aktiv","$Sperrzeit_Gesamt",0],
		
		// Trigger Nachfuellung => Fuellstand + Sackanzahl erhöhen
		["Polynomial", "$Konst1", "$Saecke_AnzahlNeu",["$Saecke_Anzahl", "$Konst1"]],
		["Latch","$Saecke_AnzahlNeu","$Saecke_Anzahl","$I_TriggerNachfuellen",0],
		["Polynomial", "$Konst1", "$FuellstandNeu",["$Fuellstand", "$I_HoeheSack"]],
		["Latch","$FuellstandNeu","$Fuellstand","$I_TriggerNachfuellen",0],
		// Triggereingang auf False setzen
		["Multiplexer",["$I_TriggerNachfuellen","$KonstFalse"],"$I_TriggerNachfuellen","$I_TriggerNachfuellen"],
		
		// Trigger Reset Jahr => Anzahl Rueckspuelungen auf 0 setzen
		["Latch","$Konst0","$RS_Anzahl","$ResetJahrTrigger",0],
		["Latch","$Konst0","$Saecke_Anzahl","$ResetJahrTrigger",0]	
  ]
}

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Sa Feb 22, 2020 8:25 am
von Eraser
Beim Cron-String müsste [1 0 0 1 1 *] stehen oder?
Mit 1 0 0 1 würde es jeden Monat aktiv werden.

Re: Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Verfasst: Sa Feb 22, 2020 9:40 am
von Robert_Mini
@Eraser: Danke! Hast natürlich recht.

Hab gleich noch einen Hinweis für das Testen des Crons hinzugrfügt.

Lg
Robert