UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

[NEUHEIT] Tutorial: Schritt für Schritt zur Custom-Logik "Entkalkungsanlage"

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

alexbeer
Reactions:
Beiträge: 394
Registriert: Mi Sep 12, 2018 1:11 am
Wohnort: NRW
Hat sich bedankt: 212 Mal
Danksagung erhalten: 251 Mal

#11

Beitrag 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?
VG Alex
Timberwolf122 (TWS 2500) // Wartungs-VPN: offen // Reboot: jederzeit
Benutzeravatar

Eraser
Reactions:
Beiträge: 646
Registriert: So Aug 12, 2018 1:51 pm
Wohnort: Amstetten, Österreich
Hat sich bedankt: 205 Mal
Danksagung erhalten: 275 Mal

#12

Beitrag 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.
mfg
Wolfgang

Timberwolf 2500 #151 / VPN offen / Reboot nach Rücksprache
+ PBM #938

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#13

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

alexbeer
Reactions:
Beiträge: 394
Registriert: Mi Sep 12, 2018 1:11 am
Wohnort: NRW
Hat sich bedankt: 212 Mal
Danksagung erhalten: 251 Mal

#14

Beitrag 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
VG Alex
Timberwolf122 (TWS 2500) // Wartungs-VPN: offen // Reboot: jederzeit

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#15

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#16

Beitrag 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

  ]
}
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#17

Beitrag 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"],
  ]
}
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#18

Beitrag 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]	
  ]
}
Zuletzt geändert von Robert_Mini am Sa Feb 22, 2020 9:39 am, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Benutzeravatar

Eraser
Reactions:
Beiträge: 646
Registriert: So Aug 12, 2018 1:51 pm
Wohnort: Amstetten, Österreich
Hat sich bedankt: 205 Mal
Danksagung erhalten: 275 Mal

#19

Beitrag 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.
mfg
Wolfgang

Timberwolf 2500 #151 / VPN offen / Reboot nach Rücksprache
+ PBM #938

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#20

Beitrag von Robert_Mini »

@Eraser: Danke! Hast natürlich recht.

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

Lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Antworten

Zurück zu „Logikengine & Logik-Editor“