KNX Data Secure Unterstützung
für KNX Logger und KNX Busmonitor

KNX Diagnose Monitor, Import des ETS Projektes deutlich beschleunigt, Suche in der Navigation
Mehr Informationen dazu hier im Forum

Insider Version 6 zur 4.5 jetzt für alle Mitglieder des Insider Clubs installierbar
Alle Infos zum Update im Timberwolf Wiki

[Gelöst] [1.5.3] Logik nach letztem Aufruf verzögert nochmal triggern

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
Antworten

Ersteller
Robert_Mini
Reactions:
Beiträge: 3903
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1264 Mal
Danksagung erhalten: 2213 Mal

[1.5.3] Logik nach letztem Aufruf verzögert nochmal triggern

#1

Beitrag von Robert_Mini »

Hallo zusammen!

Ich fürchte das ist wieder eine Spezialfrage für @S. Kolbinger, vielleicht fällt aber auch jemand anderem eine Idee zu meinem Problem ein.
Hintergrund: Impulszähler, der eine Leistung ausgibt. Nach dem letzten Impuls (Gerät aus), bleibt aber eine Leistungswert <> 0 stehen. Damit wollte ich ein Timeout ergänzen, nach dem der Ausgang auf 0 gesetzt wird.
Das Monoflop wird mit jedem neuen Wert re-getriggert. Kommt kein Impuls mehr, läuft der Timer dann x sec. ab und triggert auch die Logik nochmal.
Entgegen meinen Erwartungen wird aber beim letzten Aufruf der Ausgang des Timers nicht auf 0 gesetzt (was zeitgleich die Ausgänge Leistung 1/2 auf 0 setzen würde).

Irgendwo hab ich da einen Knopf im Hirn....

Danke für eure Hilfe
Robert

Code: Alles auswählen

/**=====================================================================
Umrechnung von Impulsen in Leistung.               - update 22.1.2020
Ausgang 1 wird mit jedem Impuls aktualisiert
Ausgang 2: wird nur nach Überschreitung von Min. Intervall neu 
berechnet, kürzere Impulse werden gemessen/gezählt und gemittelt.
======================================================================*/
{
  "Level": [
    ["$In","bool",false],
	["$In_Last","bool",false],
	["$Delta","bool",false],
    ["$Output","bool",false],
    ["$TimeHigh","float",0.0],
    ["$TimeLow","float",0.0],
    ["$Time","float",0.0],
	["$TimeLast","float",0.0],
    ["$Umrechnung","float",3600.0],	
    ["$dt_min","float",5.0],	
    ["$Leistung1","float",0.0],
	["$Leistung2","float",0.0],
	["$Leistung2A","float",0.0],
	["$Zaehler","integer",0.0],
	["$Konst1","float",1.0],
    ["$Konst0","float",0.0],
	["$KonstTrue","bool",true],
	["$Timeout","float",30.0],
	["$Timeout_Wait","bool",true]
  ],
  "Module": [   
    ["Stopwatch","$In","$TimeHigh"],
	["Stopwatch","-$In","$TimeLow"],
	// Impuls mit altem Wert vergleichen (anderer Trigger? zB intern)
	["Polynomial","-$Konst1","$Delta",["$In", "$In_Last"]],
	// Letztes dt übernehmen
	["Multiplexer",["$TimeHigh","$TimeLow"],"$Time","$In"],
	// Leistung1 berechnen
	["Ratio", "$Umrechnung", "$Leistung1", "$Time"],
	// Anzahl Impuls erhöhen und Impulsdauer zum gespeicherten Wert addieren
	["Polynomial","$Konst1","$Zaehler",["$Zaehler", "$Konst1"]],
    ["Polynomial","$Konst1","$TimeLast",["$Time", "$TimeLast"]],
	// Prüfen, ob dt > dt_min
	["Comparator","$TimeLast" ,"$Output" , "$dt_min"],	
	// Leistung2 berechnen
	["Ratio", "$Umrechnung", "$Leistung2A", "$TimeLast"],
	["Polynomial","$Zaehler","$Leistung2A",["$Konst0", "$Leistung2A"]],
	// Leistung 2 nur übernehmen, wenn dt > dt_min
	["Multiplexer",["$Leistung2","$Leistung2A"],"$Leistung2","$Output"],
	// Zaehler = 0; Summe Impulsdauer = 0
    ["Multiplexer",["$Zaehler","$Konst0"],"$Zaehler","$Output"],
    ["Multiplexer",["$TimeLast","$Konst0"],"$TimeLast","$Output"],
	//
	// Timeout für Leistung 0, re-trigger mit letztem neuen Impuls
	["Monoflop","$Delta","-$KonstTrue","$Timeout_Wait","$Timeout",1],
	["Multiplexer",["$Konst0","$Leistung1"],"$Leistung1","$Timeout_Wait"],
	["Multiplexer",["$Konst0","$Leistung2"],"$Leistung2","$Timeout_Wait"],
	// (In_Last = In)
  	["Polynomial","$Konst1","$In_Last",["$In"]]
  ],
  "Output": [
    ["Leistung1","Leistung","$Leistung1","c"],
    ["Leistung2","Leistung","$Leistung2","c"],
    ["TimeHigh","Zeit Zustand EIN","$TimeHigh","c"],
    ["TimeLow","Zeit Zustand AUS","$TimeLow","c"],
	["Time","Time","$Time","c"],
	["TimeLast","Time","$TimeLast","c"],
	["Zaehler","Zaehler","$Zaehler","c"],
	["Zaehler","Zaehler","$Zaehler","c"]
  ],
  "Input": [
    ["Impulssignal","Eingang Impulssignal alternierend 1-0-1-0","$In","c"],
    ["Min. Interval","Minimaler Impulsabstand für Leistungsauswertung und Senden","$dt_min","c"],
    ["Umrechnungs- Faktor","tbd","$Umrechnung","c"],
	["Timeout","Timeout für Leistung 0","$Timeout","c"]
  ]
}
Zuletzt geändert von Robert_Mini am So Mai 03, 2020 11:12 am, insgesamt 2-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
Robert_Mini
Reactions:
Beiträge: 3903
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1264 Mal
Danksagung erhalten: 2213 Mal

#2

Beitrag von Robert_Mini »

Hallo @S. Kolbinger!

Das ist der Fall, der mich seit Wochen (jedes mal wenn ich wieder dran gehe) auf die Palme treibt.

Code abgespeckt - funktioniert.
Input Timeout auf 20sec setzen, dann Input Impulseingang true - false setzen => Output Zaehler zeigt einen Wert an. Nach Ablauf Timout von 20sec wird die Logik vom Timer getriggert und der Zaehler auf 0 gesetzt.

Code: Alles auswählen

/**=====================================================================*/
{
  "Level": [
    ["$In","bool",false],
	["$In_Last","bool",false],
	["$Delta","bool",false],
    ["$Output","bool",false],
    ["$TimeHigh","float",0.0],
    ["$TimeLow","float",0.0],
    ["$Time","float",0.0],
	["$TimeLast","float",0.0],
    ["$Umrechnung","float",3600.0],	
    ["$dt_min","float",5.0],	
    ["$Leistung1","float",0.0],
	["$Leistung2","float",0.0],
	["$Leistung2A","float",0.0],
	["$Zaehler","integer",0.0],
	["$Konst1","float",1.0],
    ["$Konst0","float",0.0],
	["$KonstTrue","bool",true],
	["$Timeout","float",60.0],
	["$Timeout2","float",61.0],
	["$Timeout_Wait","bool",true],
	["$Timeout_Wait2","bool",true]
  ],
  "Module": [   
    // Impuls mit altem Wert vergleichen (anderer Trigger? zB intern)
	["Polynomial","-$Konst1","$Delta",["$In", "$In_Last"]],
	["Polynomial","$Konst1","$Zaehler",["$Zaehler", "$Konst1"]],
	// Timeout für Leistung 0, re-trigger mit letztem neuen Impuls
	["Monoflop","$Delta","$Konst0","$Timeout_Wait","$Timeout",1],
//
	["Multiplexer",["$Konst0","$Zaehler"],"$Zaehler","$Timeout_Wait"],
	// (In_Last = In)
  	["Polynomial","$Konst1","$In_Last",["$In"]]
  ],
  "Output": [
	["TimeOut_Wait","Verzögerung vor 0 setzen","$Timeout_Wait","c"],
	["Zaehler","Verzögerung vor 0 setzen","$Zaehler","c"],
	["New Trigger","Zaehler","$Delta","c"]
  ],
  "Input": [
    ["Impulssignal","Eingang Impulssignal alternierend 1-0-1-0","$In","a"],
	["Timeout","Timeout für Leistung 0","$Timeout","c"]
  ]
}
Code Original - funktioniert NICHT.
Parameter siehe Screenshot unten.
Input Impulseingang true - false setzen => Output Leistung1 zeigt zB 500 an, nach Ablauf Timout von 20sec wird die Logik vom Timer getriggert, aber sämtliche Ausgänge NICHT aktualisiert!!! D.h. Ausgänge Leistung1 + 2 werden nicht auf 0 gesetzt (Hintergrund: kommt länger als x sec. kein Impuls => Leistung 0 anzeigen!).

Ich habe die Zeile (immer vor dem Modul) mit zusätzlichen "//" in Spalte 1 markiert, die die gleiche Logik, wie in der abgespeckten Form oben darstellen. Dazwischen gibt es weitere Module, aber das Prinzip wird dadurch nicht beeinflusst!!

Code: Alles auswählen

/**=====================================================================
Umrechnung von Impulsen in Leistung.               - update 22.1.2020
Ausgang 1 wird mit jedem Impuls aktualisiert
Ausgang 2: wird nur nach Überschreitung von Min. Intervall neu 
berechnet, kürzere Impulse werden gemessen/gezählt und gemittelt.
======================================================================*/
{
  "Level": [
    ["$In","bool",false],
	["$In_Last","bool",false],
	["$Delta","bool",false],
    ["$Output","bool",false],
    ["$TimeHigh","float",0.0],
    ["$TimeLow","float",0.0],
    ["$Time","float",0.0],
	["$TimeLast","float",0.0],
    ["$Umrechnung","float",3600.0],	
    ["$dt_min","float",5.0],	
    ["$Leistung1","float",0.0],
	["$Leistung2","float",0.0],
	["$Leistung2A","float",0.0],
	["$Zaehler","integer",0.0],
	["$Konst1","float",1.0],
    ["$Konst0","float",0.0],
	["$KonstTrue","bool",true],
	["$Timeout","float",60.0],
	["$Timeout2","float",61.0],
	["$Timeout_Wait","bool",true],
	["$Timeout_Wait2","bool",true]
  ],
  "Module": [   
    ["Stopwatch","$In","$TimeHigh"],
	["Stopwatch","-$In","$TimeLow"],
//	// Impuls mit altem Wert vergleichen (anderer Trigger? zB intern)
	["Polynomial","-$Konst1","$Delta",["$In", "$In_Last"]],
	// Letztes dt übernehmen
	["Multiplexer",["$TimeHigh","$TimeLow"],"$Time","$In"],
	// Leistung1 berechnen
	["Ratio", "$Umrechnung", "$Leistung1", "$Time"],
	// Anzahl Impuls erhöhen und Impulsdauer zum gespeicherten Wert addieren
	["Polynomial","$Konst1","$Zaehler",["$Zaehler", "$Konst1"]],
    ["Polynomial","$Konst1","$TimeLast",["$Time", "$TimeLast"]],
	// Prüfen, ob dt > dt_min
	["Comparator","$TimeLast" ,"$Output" , "$dt_min"],	
	// Leistung2 berechnen
	["Ratio", "$Umrechnung", "$Leistung2A", "$TimeLast"],
	["Polynomial","$Zaehler","$Leistung2A",["$Konst0", "$Leistung2A"]],
	// Leistung 2 nur übernehmen, wenn dt > dt_min
	["Multiplexer",["$Leistung2","$Leistung2A"],"$Leistung2","$Output"],
	// Zaehler = 0; Summe Impulsdauer = 0
    ["Multiplexer",["$Zaehler","$Konst0"],"$Zaehler","$Output"],
    ["Multiplexer",["$TimeLast","$Konst0"],"$TimeLast","$Output"],
	//
//	// Timeout für Leistung 0, re-trigger mit letztem neuen Impuls
	["Monoflop","$Delta","$Konst0","$Timeout_Wait","$Timeout",1],
//	//
	["Multiplexer",["$Konst0","$Leistung1"],"$Leistung1","$Timeout_Wait"],
	["Multiplexer",["$Konst0","$Leistung2"],"$Leistung2","$Timeout_Wait"],
//	// (In_Last = In)
  	["Polynomial","$Konst1","$In_Last",["$In"]]
  ],
  "Output": [
    ["Leistung1","Leistung","$Leistung1","c"],
    ["Leistung2","Leistung","$Leistung2","c"],
    ["TimeHigh","Zeit Zustand EIN","$TimeHigh","c"],
    ["TimeLow","Zeit Zustand AUS","$TimeLow","c"],
	["Time","Time","$Time","c"],
	["TimeLast","Time","$TimeLast","c"],
	["Zaehler","Zaehler","$Zaehler","c"],
	["TimeOut_Wait","Verzögerung vor 0 setzen","$Timeout_Wait","c"],
	["TimeOut_Wait2","Verzögerung vor 0 setzen","$Timeout_Wait2","c"],
	["New Trigger","Zaehler","$Delta","c"]
  ],
  "Input": [
    ["Impulssignal","Eingang Impulssignal alternierend 1-0-1-0","$In","c"],
    ["Min. Interval","Minimaler Impulsabstand für Leistungsauswertung und Senden","$dt_min","c"],
    ["Umrechnungs- Faktor","tbd","$Umrechnung","c"],
    ["Timeout","Timeout für Leistung 0","$Timeout","c"]
  ]
}
Bild
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

S. Kolbinger
Elaborated Networks
Elaborated Networks
Reactions:
Beiträge: 588
Registriert: Mi Aug 15, 2018 11:34 am
Hat sich bedankt: 82 Mal
Danksagung erhalten: 560 Mal

#3

Beitrag von S. Kolbinger »

Hi Robert,

ich habe das mal auf meinem System nachgestellt.

Hier sieht man, dass beim letzten triggern (nach Ablauf des Timeouts), der Wert für $Time gleich 0 ist:
Bild

Jetzt verwendest du diesen Wert als Divisor in deiner Logik:

Code: Alles auswählen

["Ratio", "$Umrechnung", "$Leistung1", "$Time"],
Bei einem Fehler (wie hier: "Division durch 0") bricht die Ausführung der Logik an dieser Stelle ab!

Eine Überarbeitung der Fehlerbehandlung und -meldung seteht noch auf der Liste :whistle:
Zuletzt geändert von S. Kolbinger am Fr Feb 28, 2020 5:01 pm, insgesamt 1-mal geändert.
Gruß,
Stefan K.

Ersteller
Robert_Mini
Reactions:
Beiträge: 3903
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1264 Mal
Danksagung erhalten: 2213 Mal

#4

Beitrag von Robert_Mini »

OMG!!!
Du bist ein Genie. Ich muss das noch durchdenken, aber damit kann ich das Modul Leistungsberechnung fertigstellen.

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

Zurück zu „Logikengine & Logik-Editor“