Ich habe diesmal wieder die Teilschritte zwischengespeichert, mit denen ich eine neue Logik zur Überwachung bzw. Protokollierung einer Entkalkungsanlage mittels T-Fühler an der Rückspülleitung erstellt habe.
Diskussion gab es hier dazu: viewtopic.php?f=47&t=1878&start=10#p20140, ich habe das Prinzip seit 7 Jahren am WireGate als Plugin laufen - funktioniert tadellos. Je nach Installation und Umgebungsbedingungen, könnte ein kleine Anpassung der Parameter notwendig sein.
Hinweis:
Ich werde in 8-10 Schritten beschreiben, wie man von der Anlage der Logik bis zum fertigen Modul mit ein/ausblendbaren (=optionalen) Ausgängen kommt und dazwischen schrittweise im Dokmode testet.
Da ich das ganze in 3-4 Postings und mehrere Tage aufteile, können Interessierte dazwischen jederzeit fragen! Also der ideale Zeitpunkt für alle, die sich bisher noch nicht an Custom Logiken heran gewagt haben.
Am Ende werde ich alle Schritte in das 1. Posting einfügen, also keine Angst, dass das ganze unleserlich wird.
Lg
Robert
Auf geht's!
Funktion:
Der aktuelle Temperaturwert wird laufend gegen die mittlere Umgebungstemperatur (Tiefpass über zb 10h) verglichen. Unterschreitet die aktuelle Temperatur diese um mehr als dT=3°C, wird dies als Rückspülung gewertet und die Erkennung für zb 2h gesperrt, bevor erneut das Unterschreiten gewertet wird.
Die Logik zählt die Anzahl der Rückspülungen und berechnet damit die Füllstandshöhe der Entkalkungsanlage. Beim Unterschreiten der Minimumhöhe, wird der Ausgang Warnung auf true gesetzt. Beim Empfang von true auf dem Nachfülleingang wird die Anzahl der nachgefüllten Säcke +1 gezählt und der Füllstand um zb 20cm erhöht.
Weiters wird für Rückspülung und Nachfüllen der letzte Zeitpunkt gespeichert. Für alle Werte kann durch Setzen der Sendeoption ein zyklisches Senden oder nur Senden bei Änderung eingestellt werden. Die Anzahl der nachgefüllten Säcke und Rückspülungen wird bei Jahreswechsel zurück gesetzt.
Schritt 1:
- Alle bereits bekannten Ein-/Ausgänge anlegen und Variablennamen dafür vergeben
- Eingänge erhalten bei mir immer ein "I_" vorangestellt.
- Zugehörige Varablen richtig im Abschnitt Level definieren
- Die Funktionen der Reihenfolge nach grob per Kommentare beschreiben (was zu Beginn bekannt ist)
Code: Alles auswählen
//============== Schritt 1 ===============
{
"Input": [
["Temperatur Rueckspülung","Temperatur gemessen an der Rückspülleitung","$I_Temp","c"],
["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"],
["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"]
],
"Level": [
["$I_Temp","float",20.0],
["$TempGeglaettet","float",20.0],
["$I_DeltaT","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],
["$Warnung","bool",false],
//
["$KonstTrue","bool",true],
["$KonstFalse","bool",false],
["$Konst0","float",0.0],
["$Konst1","float",1.0]
],
"Module": [
// Temperatur Glättung
// Vergleich T aktuell < (T geglättet - DeltaT)
// Wenn Rueckspuelung, dann Fuellstand + Zaehler neu berechnen
// Timer Sperre
// Trigger Nachfuellung => Fuellstand erhöhen
]
}
- Module hinzufügen. Ich kopiere dazu meist die Syntax aus der Knowledge Base (app.php/kb/viewarticle?a=115) und passe die Variablennamen an.
- Modul Lowpass (Tiefpass): Das Ergebnis wird mit der Variable $TempGeglaettet verbunden, die auch mit dem Ausgang "Temperatur geglättet" verbunden ist.
- Modul Polynomial hinzufügen, um von $TempGeglaettet den Wert $I_Delta abzuziehen => Ergebnis $TempSchwelle.
- Mittel Comparator vergleichen, ob der aktuelle Temperaturwert unter $Tempschwelle liegt => die Variable $Temp_CResult wird dann true.
- $Temp_CResult und $Temp_Schwelle werden temporär auf 2 zusätzliche Ausgänge geschrieben.
- Im Dokmode kann man sofort testen (noch keine Ein-/Ausgänge verknüpfen), ob die 3 ersten Module richtig funktionieren:
- Parameter für Glättung und dT fix setzen und Logik speichern!
- Dann Ist-Temp. eingeben zb 20C, dann zb 16C eingeben und die Werte von $Temp_CResult und $Temp_Schwelle prüfen.
Code: Alles auswählen
//================ Schritt 2 =====================
{
"Input": [
["Temperatur Rueckspülung","Temperatur gemessen an der Rückspülleitung","$I_Temp","c"],
["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"],
["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","Temperatur nach Tiefpassfilter","$Temp_CResult","c"],
["_Temp_Schwelle","Temperatur nach Tiefpassfilter","$Temp_Schwelle","c"]
],
"Level": [
["$I_Temp","float",20.0],
["$TempGeglaettet","float",20.0],
["$I_DeltaT","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],
["$Warnung","bool",false],
//
["$Temp_Schwelle","float",0.0],
["$Temp_CResult","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"]
// Wenn Rueckspuelung, dann Fuellstand + Zaehler neu berechnen
// Timer Sperre
// Trigger Nachfuellung => Fuellstand erhöhen
]
}