Seite 1 von 1

Monoflop Ablauf und Restart in einem Aufruf möglich?

Verfasst: Fr Apr 10, 2020 9:44 am
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

Re: Monoflop Ablauf und Restart in einem Aufruf möglich?

Verfasst: Fr Apr 10, 2020 3:32 pm
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!

Re: Monoflop Ablauf und Restart in einem Aufruf möglich?

Verfasst: Fr Apr 10, 2020 9:08 pm
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

Re: Monoflop Ablauf und Restart in einem Aufruf möglich?

Verfasst: Sa Apr 11, 2020 12:47 pm
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.