NEU! UPGRADE IP 10 verfügbar!
Optimierte Darstellung von VISU Editor und VISU Client - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/8HzePCm3

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur IP 10
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

[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: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1167 Mal
Danksagung erhalten: 2076 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: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1167 Mal
Danksagung erhalten: 2076 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
Reactions:
Beiträge: 588
Registriert: Mi Aug 15, 2018 11:34 am
Hat sich bedankt: 82 Mal
Danksagung erhalten: 559 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: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1167 Mal
Danksagung erhalten: 2076 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“