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

[Frage] Monoflop Ablauf und Restart in einem Aufruf möglich?

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

Monoflop Ablauf und Restart in einem Aufruf möglich?

#1

Beitrag von Robert_Mini »

Hallo @S. Kolbinger!

Ich stecke seit einigen Tage an einer Sache mit den Timern fest.

Ich möchte das Senden eines Wertes verzögern, bis der Timer abgelaufen ist.
D.h. die Logik wird durch den ablaufenden Timer getriggert. Der Status des Timers ist dann "False" und ich löse damit das Senden aus. Beim gleichen Aufruf muss aber der Timer neu gestartet werden, da der nächste Wert frühestens wieder nach Ablauf des Timers gesendet werden soll.

Daher 2 Fragen:
1) Gibt es beim Monoflop die gleiche Einschränkung wie bei der Stoppuhr, dass diese in einer Custom-Logik nur einmal aufgerufen werden kann?
2) Wenn ja, wie löse ich dann die Fragestellung oben? Mit 2 Monoflops :oops: ?

An der Stelle muss ich etwas kritisch anmerken, dass die Lösung der Timer noch einschränkt. Beim Trigger-Eingang kann man mittels Optionen das Re-Triggern festlegen, was sehr gut ist.
Bei Reset-Eingang ist leider ein doppelter Flankenwechsel ein-aus-ein notwendig, damit der Timer wieder weiterläuft. Dies ist leider in Custom-Logiken oft nicht oder nur schwer realisierbar. Hier würde man ebenfalls die Auswahl Flanke vs. Pegel benötigen, damit im Falle Pegel der Timer sofort neu anläuft ohne dass ein erneuter Aufruf mit Reset=false notwendig ist.

Sehe ich das richtig, oder hab ich was falsch verstanden?

Danke und lg
Robert
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

#2

Beitrag von S. Kolbinger »

Hallo Robert,
Robert_Mini hat geschrieben: Fr Apr 10, 2020 9:44 am Ich möchte das Senden eines Wertes verzögern, bis der Timer abgelaufen ist.
D.h. die Logik wird durch den ablaufenden Timer getriggert. Der Status des Timers ist dann "False" und ich löse damit das Senden aus. Beim gleichen Aufruf muss aber der Timer neu gestartet werden, da der nächste Wert frühestens wieder nach Ablauf des Timers gesendet werden soll.
Ich bin mir nicht sicher, ob ich die Aufgabenstellung richtig verstanden habe.
Es hört sich für mich so an, als ob das mittels eines einzigen nicht retriggerbaren Timers ermöglicht werden kann.
  1. Wert kommt rein und startet Timer
  2. Timer läuft ab, und sendet Wert
  3. Wartet wieder auf Wert -> 1.
Oder habe ich hier weitere Randbedingungen übersehen?

Robert_Mini hat geschrieben: Fr Apr 10, 2020 9:44 am Daher 2 Fragen:
1) Gibt es beim Monoflop die gleiche Einschränkung wie bei der Stoppuhr, dass diese in einer Custom-Logik nur einmal aufgerufen werden kann?
2) Wenn ja, wie löse ich dann die Fragestellung oben? Mit 2 Monoflops :oops: ?
Antworten:
  1. Ja die Einschränkung ist allgemein: Ein Modul kann nicht mehrmals referenziert werden. Es sind dann jeweils unterschiedliche Monoflops
  2. Je nach Zielsetzung mit 2 Monoflops oder ein Clocksignal (Taktsignal)

Robert_Mini hat geschrieben: Fr Apr 10, 2020 9:44 am An der Stelle muss ich etwas kritisch anmerken, dass die Lösung der Timer noch einschränkt. Beim Trigger-Eingang kann man mittels Optionen das Re-Triggern festlegen, was sehr gut ist.
Bei Reset-Eingang ist leider ein doppelter Flankenwechsel ein-aus-ein notwendig, damit der Timer wieder weiterläuft. Dies ist leider in Custom-Logiken oft nicht oder nur schwer realisierbar. Hier würde man ebenfalls die Auswahl Flanke vs. Pegel benötigen, damit im Falle Pegel der Timer sofort neu anläuft ohne dass ein erneuter Aufruf mit Reset=false notwendig ist.
Wie wäre es, wenn du das Flanken-Signal nicht als Reset sondern als Trigger für ein retriggerbaren+flankengesteuerten Timer nutzt? Dann startet die Zeit nach der Flanke neu!
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

#3

Beitrag von Robert_Mini »

Danke Stefan!
S. Kolbinger hat geschrieben: Fr Apr 10, 2020 3:32 pm Ich bin mir nicht sicher, ob ich die Aufgabenstellung richtig verstanden habe.
Es hört sich für mich so an, als ob das mittels eines einzigen nicht retriggerbaren Timers ermöglicht werden kann.
  1. Wert kommt rein und startet Timer
  2. Timer läuft ab, und sendet Wert
  3. Wartet wieder auf Wert -> 1.
Oder habe ich hier weitere Randbedingungen übersehen?
Nicht ganz. Der Timer soll unmittelbar wieder gestartet werden und nicht erst bei der nächsten 1.
S. Kolbinger hat geschrieben: Fr Apr 10, 2020 3:32 pm Wie wäre es, wenn du das Flanken-Signal nicht als Reset sondern als Trigger für ein retriggerbaren+flankengesteuerten Timer nutzt? Dann startet die Zeit nach der Flanke neu!
Ich brauche en Ausgang des Timers ja zum erkennen, dass dieser abgelaufen ist. Beim re-trigger wird der Ausgang nicht 0, so kann ich nicht erkennen, dass der Timer abgefallen ist, was ich in einer AND-Logik brauche (=> Wert auf Ausgang übernehmen).

Zur Aufgabenstellung (vereinfacht):
- Berechne die Differenz zum letzten aktualisierten Wert
- Ist die Differenz >= 20, dann sofort per Multiplexer übernehmen und Timer starten
- Ist die Differenz <20, dann nur auf den Ausgang per Multiplexer übernehmen, wenn zusätzlich der Timer abgelaufen ist, sonst warten, bis der Timer abgelaufen ist.

Bis dahin funktioniert das auch mit dem Monoflop. Nur wird dann der nächste Wert auch bei <20 sofort gesendet, da der Timer noch nicht neu gestartet wurde...

Ich fürchte ich komme um die 2 Monoflops + Toggle nicht herum, macht das ganze aber doch sehr kompliziert...

Ähnlich wie bei der Stoppuhr (Ausgang "Time before Reset"), wäre hier ein "last_val" hilfreich, an dem man erkennen kann, wie der Ausgangsstatus vor dem Aufruf war.

Was ich auch nicht ganz verstehe, ist der rote Bereich im Bild im Anhang. Dort sieht es so aus, als ob die Logik sehr wohl bei einem Aufruf den Ablauf des Timers + Neustart richtig aufzeichnet, ich kann es nur innerhalb der Logik nicht ansprechen.

lg
Robert
Timer.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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

#4

Beitrag von S. Kolbinger »

Hallo Robert,
Robert_Mini hat geschrieben: Fr Apr 10, 2020 9:08 pm Zur Aufgabenstellung (vereinfacht):
- Berechne die Differenz zum letzten aktualisierten Wert
- Ist die Differenz >= 20, dann sofort per Multiplexer übernehmen und Timer starten
- Ist die Differenz <20, dann nur auf den Ausgang per Multiplexer übernehmen, wenn zusätzlich der Timer abgelaufen ist, sonst warten, bis der Timer abgelaufen ist.
Könnte das eine Lösung sein:
  • Der Wert wird zyklisch gesendet
  • Bei größeren Wertänderungen wird zusätzlich sofort gesendet
  • Der Zyklus startet nach ertmaligem Erhalt eines Wertes

Code: Alles auswählen

{
  "Level": [
    ["$In","float",0],
    ["$Out","float",0],
    ["$Stepped","bool",false],
    ["$AbsStep","float",20],
    ["$ConstTrue","bool",true],
    ["$ClockStart","bool",false],
    ["$ClockOut","bool",false],
    ["$Period","float",10.0]
  ],
  "Module": [
    ["Latch","$ConstTrue","$ClockStart","$ConstTrue",0],
    ["Clocksignal","$ClockStart","$ClockOut","$Period"],
    ["Step","$In","$Out","$Stepped","$AbsStep",0],
    ["Latch","$In","$Out","$ClockOut",3]
  ],
  "Input": [
    ["Eingang","Eingangswert","$In","a"]
  ],
  "Output": [
    ["Ausgang","Ausgangswert in Schritten","$Out","ct"]
  ]
}
Der Ausgang kann "ct" oder "c", je nachdem ob gleiche Werte wiederholt gesendet werden sollen, oder nur Änderungen.
Gruß,
Stefan K.
Antworten

Zurück zu „Logikengine & Logik-Editor“