Ankündigung

Einklappen
Keine Ankündigung bisher.

after() abgelaufen und im gleichen Zyklus EIN?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    after() abgelaufen und im gleichen Zyklus EIN?

    [EibStudio V2.311, Firmwareversion des EibPCs: v2.304, Patches: 2.309.ptc]

    Hallo!
    Wenn "bedingung" erfüllt ist, soll etwas schalten und eine Sperre aktiv werden, die nach 20 Sekunden wieder ausgeschaltet wird.

    [highlight=epc] sperre=AUS

    if (bedingung and sperre==AUS) then {
    write("EtwasEinschalten",EIN);
    sperre=EIN
    } endif

    if after(sperre,20000u64) then sperre=AUS endif [/highlight]

    Wenn "bedingung" kürzer als 20 Sekunden erfüllt ist, funktioniert es wie gewollt.

    Wenn aber "bedingung" länger (z.B. 22 Sekunden) erfüllt ist, wird der Timer nicht erneut gestartet und somit geht "sperre" niemals aus.

    Vermutung: "sperre" geht nach 20 Sekunden AUS und wird wohl im gleichen Zyklus wieder EIN geschaltet, da "bedingung" noch erfüllt und "sperre" ja jetzt AUS ist. Der Timer wird aber nicht wieder gestartet weil "kein Wechsel von AUS auf EIN".

    Ist meine Vermutung richtig? Wer hat eine Idee wie ich das umschreiben kann?

    #2
    Das kannst du am besten so lösen:

    if (change(bedingung) and bedingung and sperre==AUS) then {
    ...

    Kommentar


      #3
      Danke klaus für den Tipp, leider löst deine Änderung nicht das Problem, sondern senkt nur die Wahrscheinlichkeit, dass das Problem auftritt.

      Wenn (zugegebenermaßen unwahrscheinlich) im gleichen Zyklus der after-Timer abläuft und die Bedingung wahr wird ist das Problem wieder da:
      "sperre" wird vom Timer AUS geschaltet, die if Bedingung wird neu validiert, und "sperre wird wider EIN geschaltet.

      Meiner Vermutung nach bekommt von diesem AUS und EIN das after() aber nichts mit, da es im gleichen Zyklus abläuft.

      Ist dem so? Gibt es eine Lösung?

      Kommentar


        #4
        Zitat von HoT Beitrag anzeigen
        Danke klaus für den Tipp, leider löst deine Änderung nicht das Problem, sondern senkt nur die Wahrscheinlichkeit, dass das Problem auftritt.
        Hast du es getestet oder vermutest du, dass diese Codeändeurng das Problem nicht löst? Meiner Meinung nach müsste die Änderung genau das machen was du damit erreichen willst.

        Zitat von HoT Beitrag anzeigen
        Wenn (zugegebenermaßen unwahrscheinlich) im gleichen Zyklus der after-Timer abläuft und die Bedingung wahr wird ist das Problem wieder da:
        "sperre" wird vom Timer AUS geschaltet, die if Bedingung wird neu validiert, und "sperre wird wider EIN geschaltet.
        Wenn im gleichen Zyklus das after() abläuft und auch die Bedingung wahr wird, dann sind ja die 20 Sekunden bereits um, und es ist gewollt, dass wieder ein EIN-Signal auf den Bus geschrieben wird und das ganze Spiel von vorne beginnt. Ich kann hier also keinen Fehler an der Logik erkennen. Aus meiner Sicht macht es also keinen Unterschied, ob die Bedingung im selben Zyklus wie der after-Timer wahr wird oder irgendwann später.

        Kommentar


          #5
          Zitat von HoT Beitrag anzeigen
          Meiner Vermutung nach bekommt von diesem AUS und EIN das after() aber nichts mit, da es im gleichen Zyklus abläuft.
          Meines Wissens nach sollte das kein Problem sein. Wenn du ganz sicher gehen willst, dann packe in die If-Abfrage ebenfalls noch eine kleine Verzögerung. Damit verhinderst du die Gleichzeitigkeit von sperre EIN/AUS:

          if after(change(bedingung) and bedingung and sperre==AUS, 10u64)) then {
          ...

          Kommentar


            #6
            Hallo,

            hier mal ein ähnliches Beispiel, meine Alarmanlage (Voralarm/Hauptalarm) mit einer Verzögerung von 20 sec.

            Code:
            ..
            if Scharf and (change("Eingangstür-3/0/0")) and ("Eingangstür-3/0/0"==AUS) then AlarmGelb=EIN endif
            ..
            ..
            if after(AlarmGelb,20000u64) and AlarmGelb==EIN then AlarmRot=EIN endif
            ..
            ..
            if !Scharf then AlarmGelb=AUS;AlarmRot=AUS endif
            Gruß René

            Kommentar

            Lädt...
            X