Seite 1 von 1

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

Verfasst: Mi Jan 22, 2020 7:08 pm
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"]
  ]
}

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

Verfasst: Mi Feb 26, 2020 11:09 pm
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

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

Verfasst: Fr Feb 28, 2020 5:00 pm
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:

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

Verfasst: Fr Feb 28, 2020 6:24 pm
von Robert_Mini
OMG!!!
Du bist ein Genie. Ich muss das noch durchdenken, aber damit kann ich das Modul Leistungsberechnung fertigstellen.

Robert