Der nächste Schritt ist etwas umfangreicher, war aber nicht sinnvoll trennbar.
1) Die wesentliche Ergänzung ist das Modul Clocksignal. Damit wird die Logik zyklisch im Intervall $DauerDimmen aufgerufen). Sollte ggf. später auf $DauerDimmIntervall umbenannt werden.
2) Um zu erkennen, ob Clocksignal die Logik aufgerufen hat, wird zu Beginn immer der letzte $Takt gespeichert (Latch Zeile 2)
3) $DimmwertNeu wird nur dann auf den Ausgang übernommen, wenn $Takt <> $TaktLast
4) In Zeile 1 wird nun der letzte Ausgangswert $O_Dimmwert auf $DimmwertLast gespeichert.
5) UND Verknüpfung: Getriggert & DPT3>0 & StatusDimmen==False => $DimmenRelativStart = True
6) Zusätzliche Variable $StatusDimmen wird True, wenn $DimmenRelativStart == True
7) Die Übernahme des Rückmeldewertes wird ebenfalls auf diese Bedingung $DimmenRelativStart == True geändert. Damit wird verhindert, dass ein Rückmeldeobjektes während eines Dimmvorganges übernommen wird.
8) Stopp-Telegramm erkennen (UND Getriggert & DPT3==0 & $StatusDimmen==True => $DimmenRelativStopp = True)
9) $DimmenRelativStopp = True ==> $StatusDimmen wieder auf False setzen.
10) Sehr speziell (aber hier kommt Erfahrung ins Spiel): $TaktLast muss beim Ende des Dimmvorganges ebenfalls auf false gesetzt werden, da der Takt des Clocksignal immer mit True startet. Ansonsten würde je nach Zustand des Clocksignals beim Dimmende manchmal der nächste Dimmvorgang erst beim 2. Takt gestartet.
2) Änderung Rückmeldeobjekt => Dimmwert wird nicht verändert, da Clocksignal nicht abgelaufen ist (22:51:35). ClockTriggered wird kurzzeitig false!
3) Stopp-Telegramm => Dimmwert bleibt erhalten, Dimmvorgang endet, kein weiterer Trigger durch Clocksignal, da nun inaktiv.
Code: Alles auswählen
/**===========================================================
Kommentar
============================================================*/
{
"Level":[
// Eingänge
["$I_DimmbefehlRelativ","integer",0],
["$I_DimmbefehlAbsolut","integer",0],
["$I_RueckmeldungDimmen","float",0.0],
["$I_Schrittweite","float",5.0],
["$I_DauerDimmen","float",10.0],
["$I_DimmwertMax","float",100.0],
["$I_DimmwertMin","float",0.0],
// Ausgänge
["$O_Dimmwert","float",0.0],
["$O_StatusSchalten","bool",false],
["$StatusDimmen","bool",false],
["$DimmRelTouched","bool",false],
["$DimmenRelativStart","bool",false],
["$DimmenRelativStopp","bool",false],
["$DimmwertLast","float",0.0],
["$DimmwertNeu","float",0.0],
["$DimmRichtung","float",0.0],
["$Bit0b","bool",false],
["$Bit1b","bool",false],
["$Bit2b","bool",false],
["$Bit3b","bool",false],
["$Konst1","float",1.0],
["$KonstTrue","bool",true],
["$KonstFalse","bool",false],
["$Takt","bool",false],
["$TaktLast","bool",false],
["$ClockTriggered","bool",false]
],
"Module":[
// Werte des letzten Aufrufs abspeichern
["Latch","$O_Dimmwert","$DimmwertLast","$KonstTrue",0],
["Latch","$Takt","$TaktLast","$KonstTrue",0],
// Auswerten, ob Eingang Rel. Dimmen getriggert wurde
["Triggered", "$I_DimmbefehlRelativ", "$DimmRelTouched" ],
// Nur wenn Wert >0 und Dimmen noch nicht aktiv, StatusDimmmen auf True setzen
["And" , ["$DimmRelTouched","$I_DimmbefehlRelativ","-$StatusDimmen"], "$DimmenRelativStart"],
["Latch","$KonstTrue","$StatusDimmen","$DimmenRelativStart",1],
["Latch","$I_RueckmeldungDimmen","$DimmwertLast","$DimmenRelativStart",1],
// Stopp Telegramm auswerten und Dimmen stoppen
["And" , ["$DimmRelTouched","-$I_DimmbefehlRelativ","$StatusDimmen"], "$DimmenRelativStopp"],
["Latch","$KonstFalse","$StatusDimmen","$DimmenRelativStopp",1],
// Bei negativer Flanke auch Takt zurücksetzen, damit nächster Dimmvorgang korrekt erkannt wird
["Latch","$KonstFalse","$TaktLast","$StatusDimmen",2],
// Dimmrichtung aus DPT3 ermitteln
["BinaryDemultiplexer","$I_DimmbefehlRelativ",["$Bit0b","$Bit1b","$Bit2b","$Bit3b"]],
// Dimmrichtung auf -1/+1 setzen und neuen Dimmwert berechnen
["Multiplexer",["-$Konst1","$Konst1"],"$DimmRichtung","$Bit3b"],
["Polynomial", "$DimmRichtung", "$DimmwertNeu",["$DimmwertLast", "$I_Schrittweite"]],
// Taktgeber starten
["Clocksignal","$StatusDimmen","$Takt","$I_DauerDimmen"],
// Taktsignal mit letztem Wert vergleichen: wenn ungleich => Taktgeber hat getriggert => Wert auf Ausgang übernehmen
["Limiter","$Takt",0,"-$ClockTriggered",["$TaktLast", "$TaktLast"]],
["Latch","$DimmwertNeu","$O_Dimmwert","$ClockTriggered",0]
// VORLAGE
//["Polynomial", "$Var_x", "$OutputFloat",["$A0", "$A1"]],
//["Ratio","$Zaehler","$OutputFloat","$Nenner"],
//["Limiter","$Input1","$OutputFloat","$InputInnerhalb",["$Untergrenze", "$Obergrenze"]],
//["Comparator", "$Input1", "$OutputBool", "$Vergleichswert"],
//["Multiplexer",["$Input1","$Input2"],"$OutputFloat","$SelectInput"],
//["Or" , ["$Input1","$Input2"], "$OutputBool"],
//["And" , ["$Input1","$Input2"], "$OutputBool"],
//["Monoflop","$Trigger","$Reset","$TimerStatus","$Dauer",1],
//["Latch","$Input1","$Output","$Trigger",0], // Übernimmt den Wert von $Input1 auf $Output, wenn Trigger = 0, Option 0/1/2/3 = wenn true/pos. Flanke/neg. Flanke/jede Flanke
//["Clocksignal","$Enable","$Takt","$Periode"], // Zyklischer Trigger, $Takt wechselt jeweils nach Ablauf von $Periode zwischen TRUE/FALSE
//["HobbsMeter","$Status","$Time","$Reset"], // Zaehlt bei $Status = TRUE die Zeit in [h]
//["Stopwatch","$Status", "$Time"], // Stoppt die Zeit in [s] ab $Status = TRUE, bei $Status = FALSE wird auf 0 zurückgesetzt
//["CalcFormula",["$Day1Case","$Day2Case","$Day3Case","$Day4Case","$DayEquals"], "$Case", "$Formula3"],
//["Cron","$KonstTrue","$Reset",0,"$CronString"],
//["Wakeup","$Utime_start","$Status"],
//["BinaryMultiplexer",["$In_D","$In_E","$In_F"],"$Output"],
//["Triggered", "$InputVar", "$Touched" ], // Touched = TRUE, wenn der Eingang $InputVar die Logik getriggert hat
//["SendExplicit","$Send","$OutputVar",0], // Sendet Ausgang $OutputVar, abhängig von $Send 0/1/2/3 (Paramter analog Latch), ACHTUNG "x" am Output setzen!
//["Interpolation","$In", "$Out", [ [x1,y1] , [x2,y2] , ... , [xn,yn ] ] ] **/
],
"Input":[
["Relativer Dimmwert","Eingang Dimmbefehlt DPT3","$I_DimmbefehlRelativ","c"],
["Absoluter Dimmwert","Eingang Dimmbefehlt 0-100%","$I_DimmbefehlAbsolut","c"],
["Rückmeldung Dimmwert","Eingang Rückmeldeobjekt Dimmen","$I_RueckmeldungDimmen","c"],
["Schrittweite","Schrittweite","$I_Schrittweite","c"],
["Dauer Dimmvorgang","Dauer Dimmvorgang 0-100%","$I_DauerDimmen","c"],
["max. Dimmwert","max. Dimmwert","$I_DimmwertMax","c"],
["min. Dimmwert","min. Dimmwert","$I_DimmwertMin","c"]
],
"Output":[
["Absolut Dimmwert","Output absoluter Dimmwert 0-100%","$O_Dimmwert","c"],
["Schaltstatus","Status Schalten","$O_StatusSchalten","c"],
["Debug_Out Bit4","Dimmrichtung","$Bit3b","c"],
["Debug_Out DimmwertLast","Startwert","$DimmwertLast","c"],
["Debug_Out DimmwertNeu","Startwert","$DimmwertNeu","c"],
["Debug_Out StatusDimmen","aktiver Dimmvorgang?","$StatusDimmen","c"]
]
}