Seite 1 von 1

[V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: Fr Mai 24, 2024 9:00 pm
von sfrit
Hallo allerseits,

ich versuche mich gerade daran eine benutzerdefinierte Logik zu erstellen die meine 3 verschachtelten alten Logiken ersetzen soll. Allerdings will das nicht so recht und ich finde den Fehler nicht.

Bisher sieht das ganze folgendermaßen aus:
Ein Schwellenwertschalter erfasst eine Änderung eins Dimmwertstatus(KNX) >=1 (Einschalten Ausschalten)
Eine zweite Logik löst nur bei Einschalten aus. (And Logik mit Inhibit)
Eine dritte Logik sendet den Dimmwertstatus nochmals nach 0,5 s und 1 s. (Custom Logik hier aus dem Forum, danke dafür)


Nun habe ich versucht die Codes zusammenzuführen in einer einzelnen Logik und es passiert nix.

Code:
[*]

Code: Alles auswählen

{
    "Level":[
        // Inputs
		["$Input_L1","float",0],
		["$Threshold_L1","float",0],
		["$Input_L2","bool",false],
        ["$I_Verzoegerung1","float",100.0],
		["$I_Verzoegerung2","float",100.0],
		
		// Outputs
		["$O_Wert1","float",100.0],
        
        // Interne Variablen
		["$Output_L1","bool",false],
		["$Output_L2","bool",false],
		["$Inhibit>","bool",false], 
		["$Trigger","bool",false],
		["$Timer1","bool",false],
		["$Timer1_Last","bool",false],
		["$Timer1_Ende","bool",false],
		["$Timer1_CResult","bool",false],
		["$Timer2","bool",false],
		["$Timer2_Last","bool",false],
		["$Timer2_Ende","bool",false],
		["$Timer2_CResult","bool",false],
		// Konstanten
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$KonstTrue","bool",true],
		["$KonstFalse","bool",false]
		
    ],
	"Module":[
		
		["Comparator","$Input_L1","$Output_L1","$Threshold_L1"],
		
		["Break",["$Output_L1"]],
		["And",["$Input_L2"],"$Output_L2"],
				
	    // Eingang getriggert?
	    ["Triggered", "$Output_L2", "$Trigger" ],
	    
	    // Timer-Status merken
	    ["Latch","$Timer1","$Timer1_Last","$KonstTrue",0],
	    ["Latch","$Timer2","$Timer2_Last","$KonstTrue",0],
	    
	    // Wenn getriggert, Verzögerungstimer starten
	    ["Monoflop","$Trigger",0,"$Timer1","$I_Verzoegerung1",0],
	    ["Monoflop","$Trigger",0,"$Timer2","$I_Verzoegerung2",0],
	    
	    // Wenn Verzoegerung 0, dann direkt beim Trigger reagieren => 
	    // TimerLast auf True setzen, damit abgelaufener Timer simuliert wird
	    ["Comparator", "$I_Verzoegerung1", "$Timer1_CResult", "$Konst0"],
	    ["Comparator", "$I_Verzoegerung2", "$Timer2_CResult", "$Konst0"],
	    ["Latch","$Trigger","$Timer1_Last","-$Timer1_CResult",0],
	    ["Latch","$Trigger","$Timer2_Last","-$Timer2_CResult",0],
	    
	    // Timer abgelaufen?, Timer1_Ende wird nur true, wenn in diesem Aufruf der Timer ausgelaufen ist
	    ["And" , ["-$Timer1","$Timer1_Last"],"$Timer1_Ende"],
	    ["And" , ["-$Timer2","$Timer2_Last"],"$Timer2_Ende"],
	    
	    // Eingangswert auf Ausgang übernehmen
	    ["Latch","$Input_L1","$O_Wert1","$Timer1_Ende",0],
	    ["Latch","$Input_L1","$O_Wert1","$Timer2_Ende",0],
	    
	    // Senden
	    ["SendExplicit","$Timer1_Ende","$O_Wert1",0],
	    ["SendExplicit","$Timer2_Ende","$O_Wert1",0]
	    
    ],
      "Input":[
		["Eingangswert","Dimmwert der mehrfach gesendet wird","$Input_L1","u"],
		["Schwellwert","Vergleichswert","$Threshold_L1","u"],
		["Input_L2","auf false setzen","$Input_L2","u"],
		["Verzögerung 1","erstes senden nach n Sekunden","$I_Verzoegerung1","u"],
		["Verzögerung 2","zweites senden nach n Sekunden","$I_Verzoegerung2","u"]
    ],    
    "Output":[
		
		["Ausgang1","Ausgang sendet nach Verzögerungen 1 und 2","$O_Wert1","x"]
	  
    ]
}
Wo liegt mein Denkfehler?

LG Steffen

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: Fr Mai 24, 2024 10:59 pm
von Robosoc
Hey Steffen,

ich habe jetzt nur auf dem Handy versucht die Logik zu interpretieren. Die zweite Zeile im Abschnitt Module ist ein Break, der die Logikausführung immer dann abbricht, wenn der Comperator davor true ergibt... Ist das gewollt??? Ich glaube Du würdest es genau anders herum wollen, ( break wenn Comperator =false), oder?

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: Sa Mai 25, 2024 12:41 pm
von Robert_Mini
Hallo!

Sven hat das Break schon richtig gesehen.
Die Kombination Inhibit / UND-Logik zum nur True Senden wir in den Custom Logiken durch das SendExplicit gelöst => hast du grundsätzlich ja richtig gemacht.

Tipp: du baust dir kompliziert eine Erkennung, ob der jeweilige Timer gerade abgelaufen ist. Das kannst du sparen, indem du das Latch (wo du den Ausgang beschreibst) bzw. das SendExplizit mit fallender Flanke auf den Timer-Status triggerst.

Damit kürzt sich deine Logik auf die Hälfte…
Schönes Beispiel für Custom Logik - weiter so!

Lg
Robert

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: Sa Mai 25, 2024 5:02 pm
von Thimo
Hallo Steffen,

ich habe dein Problem zum Anlass genommen mich etwas mit der Logik zu beschäftigen. Für Nicht-Experten wie mich sind passende Links gesetzt. Gemessen an dem Logikcode könnte die ursprüngliche Schaltung so aussehen:
Bild
Dient dies dazu den Schaltwert für Geräte zu wiederholen, welche initial noch nicht empfangsbereit waren, z.B. ausgeschaltete Steuergeräte?

Der Vergleich im Code war Input_L1 > Threshold_L1, nicht das im Text gewünschte Input_L1 >= Threshold_L1 (siehe Besonderheiten Comparator).

In der ursprünglichen Schaltung hat die Kombination aus Comparator und And, zusammen mit dem Triggered im DelayTrigger (Quelle), das Einschaltereignis gefiltert (Bool Eventfilter). Mit der Break-Lösung im Code wird im eingeschalteten Zustand jedoch wiederholt getriggert, da der Change-Trigger beim Inhibit-Eingang von And im Code nicht abgebildet wurde.

Dies lässt sich über eine Flanke lösen, da der Monoflop ebenfalls auf eine steigende Flanke reagieren kann (SetOption 2), also nur wenn der Comparator auf true wechselt. In Folge ist ein Break nicht mehr notwendig, und zusammen mit Roberts Anmerkungen zum Latch und SendExplicit ergibt sich dies:

Code: Alles auswählen

{
	"Level":[
		// Inputs
		["$Input_L1","float",100],
		["$Threshold_L1","float",0],
		["$I_Verzoegerung1","float",100.0],
		["$I_Verzoegerung2","float",100.0],
		
		// Outputs
		["$O_Wert1","float",100.0],
        
		// Interne Variablen
		["$Active","bool",false],
		["$LastActive","bool",false],
		["$Trigger","bool",false],
		["$Timer1","bool",false],
		["$Timer2","bool",false]
	],
	"Module":[
		// Active := Input >= Threshold
		["Comparator","-$Input_L1","-$Active","-$Threshold_L1"],

		// steigende Flanke von Active startet Verzögerungstimer
		["Monoflop","$Active",0,"$Timer1","$I_Verzoegerung1",2],
		["Monoflop","$Active",0,"$Timer2","$I_Verzoegerung2",2],

		// Bei fallender Timer Flanke den Eingangswert auf Ausgang übernehmen und senden
		["Latch","$Input_L1","$O_Wert1","$Timer1",2],
		["Latch","$Input_L1","$O_Wert1","$Timer2",2],
		["SendExplicit","$Timer1","$O_Wert1",2],
		["SendExplicit","$Timer2","$O_Wert1",2]
	],
	"Input":[
		["Eingangswert","Dimmwert der mehrfach gesendet wird","$Input_L1","c"],
		["Schwellwert","Vergleichswert","$Threshold_L1","u"],
		["Verzögerung 1","erstes senden nach n Sekunden","$I_Verzoegerung1","u"],
		["Verzögerung 2","zweites senden nach n Sekunden","$I_Verzoegerung2","u"]
	],    
	"Output":[
		["Ausgang1","Ausgang sendet nach Verzögerungen 1 und 2","$O_Wert1","x"]
	]
}
Cheers,

Thimo

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: Sa Mai 25, 2024 11:06 pm
von sfrit
Hallo Thimo,

nachdem ich

Code: Alles auswählen

["Comparator","-$Input_L1","-$Active","-$Threshold_L1"],
zu

Code: Alles auswählen

["Comparator","$Input_L1","$Active","$Threshold_L1"],
geändert habe funktionert es. Vielen Dank dafür. Natürlich auch an Robert.
Dient dies dazu den Schaltwert für Geräte zu wiederholen, welche initial noch nicht empfangsbereit waren, z.B. ausgeschaltete Steuergeräte?
Genau dafür. Ich hab ein Lunatone KNX zu Dali GW was da echt zicken macht. Irgendwie nicht so schön das die 24V Dimmer von denen ihren Strom nicht über den DALI Bus mitbekommen.

Schönen Abend euch

Steffen

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: So Mai 26, 2024 12:01 am
von Thimo
Guten Abend Steffen,
Ich habe gerade noch einen kleinen Test mit dem Comparator gemacht, der verhält sich bzgl. >= wie im Wiki beschrieben.
Bild

Also müsste bei Input_L1 = 1 der Aus Zustand sein, und in Folge Ein erst bei Input_L1 > 1?
Cheers,

Thimo

Re: [V4.0 IP12] Einschaltwert 3 mal senden

Verfasst: So Mai 26, 2024 12:22 am
von sfrit
Kann dir nur sagen das es nicht funktionierte. Ich hab aber einfach als Schwellwert 0 genommen.

Was mir aber aufgefallen ist, es wird nur ein Wert ( egal wie von der Zeit eingestellt, immer der als letztes verarbeitete) auf den Bus gesendet obwohl in der Logik angezeigt wird das 2 mal gesendet wird. Das lässt sich nur beheben wenn man 2 Ausgänge anlegt die beides mal auf das gleiche Objekt gelegt werden.

LG Steffen