Interrupt zeitverzögert auslösen

  • Hallo zusammen,

    ich habe aktuell eine Aufgabenstellung für die ich eine unkomplizierte Lösung suche, mir aber nicht sicher bin, wie ich es am zuverlässigsten hinbekomme.


    Folgende Aufgabe:

    Ich bekomme von zwei externen Geräten jeweils ein "Bereit"-Signal. Sobald von beiden Geräten dieses Signal ansteht, möchte ich eine Bewegung starten jedoch eine variable Zeit (z.B. 2 Sekunden) nichts unternehmen, wenn eines der beiden oder beide Signale wieder verschwinden. Nach Ablauf der variablen Zeit möchte ich dann allerdings einen Interrupt auslösen, sobald nur eines der beiden Signale verschwindet. Soweit ist die Lösung vmtl. noch relativ einfach. Nun möchte ich aber das Ganze etwas "unempfindlicher" machen und erst den Interrupt auslösen, wenn ein oder beide Signal(e) länger als z.b. 200 ms verschwinden.

    Ich denke aktuell über eine Lösung mit $TIMER in der SPS.SUB nach. Vielleicht habt ihr passende Ideen?


    Ich danke euch im Voraus und bleibt gesund!


    VG
    Andreas

    Einmal editiert, zuletzt von BauAnd01 ()

  • Schritt für Schritt zum Roboterprofi!
  • Soweit ist die Lösung vmtl. noch relativ einfach.

    Also das heißt bis dahin hast du schon etwas?


    Mit der Unempfindlichkeit kannst du das ganze mit einem cycflag und Timer flag machen.


    $CYCFLAG erfasst deine beiden Geräte am besten mit einer UND Verknüpfung.


    Wenn CYCFLAG anspricht startest du den Timer. Nach Ablauf der eingestellten Zeit wertest du den $TIMER_FLAG aus per interrupt.


    Grüsse

  • Bei solchen Fummeleien und wenn die zeitliche Vorgabe eben nicht so genau sein muss lasse ich Hintergrundtasks gerne im Takt arbeiten. Die ungebremste SPS.SUB kommt ja nicht beliebig oft durch, sondern recht zuverlässig in 12ms. Oder man bremst sie halt aus mit einer definierten Wartezeit.... jedenfalls hat man dann einen Taktgeber, den man in jedem Durchlauf einen Step hochzählen lassen kann, situationsabhängig, und zurücksetzen. Man kann Zähler ja auch kaskadieren, damit man nicht so schnell überläuft...

    Beim Abfragen der Zählvariablen natürlich nie auf Gleichheit prüfen, ist klar.


    Natürlich ist das zeitlich ungenauer als die Verwendung der Timer, aber in vielen Fällen bequemer und durchschaubarer. Allerdings: man wird öfter in Verlegenheit kommen, Flanken von Signalen abfragen zu müssen, d. h., dass man nicht das eigentliche Signal verwendet, sondern den Vergleich mit seinem Zustand im letzten Zyklus. Das kann man aber in zwei Funktionen schön auslagern. Bei kritischen Überschneidungen muss man auch die Signale, die man verwerten will, vorher in einem Rutsch in Variablen abbilden, sonst kann es während der Abarbeitung innerhalb eines Zyklus' zu Problemen kommen...


    Naja, das klingt jetzt doch komplizierter als eigentlich gedacht, aber kommt halt drauf an, wie oft man das machen muss. Zwei, drei $Timer sind easy, da braucht man das Konzept eher nicht, aber bei mehr ist diese Taktlösung gar nicht so schlecht.


    Grüße,

    Michael

  • Hallo Andreas,


    Idee in sps.sub über $Timer die Signale so aufzubereiten, dass Du sie "ganz normal" verwenden kannst im Programm, ist sicher eine gute Idee.

    So als Ideenfindung mal ein paar Zeilen Code. Ist absolut ungetestet.

    Digitale Signale hab ich aber gleich zusammengefasst und übergebe sie verzögert über boolesche Variablen.

    Vielleicht nützt es Dir was als Ideenspender.


    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Hallo zusammen,

    zuerst mal bedanke ich mich für die Beiträge.

    Mein erster, allerdings nicht ausgearbeiteter Ansatz entspricht dem Konzept von woodys.


    Die Idee von Programmiersklave finde ich gut, aber ist mir an der Stelle gefühlsmäßig tatsächlich zu ungenau (ist ein reines Bauchgefühl).


    Die Lösung von SJX finde ich super. Genau so werde ich vom Grundprinzip umsetzen.


    Ich danke euch für die Unterstützung.


    Viele Grüße

    Andreas

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden