Fragen zu Interupts

  • Guten Morgen zusammen,
    ich bastel gerade an einer Interupt-Geschichte rum, allerdings stellen sich hier ein paar Fragen:


    Die Interuptverbindung soll beim Hochstarten des Roboters (IRC5) hergestellt werden.
    Im Anschluss soll die Steuerung einen bestimmten Eingang auf Low überwachen. Sobald dies geschieht, soll der Roboter stehen bleiben und eine Meldung ausgeben.
    Ich hab das folgendermaßen gelöst:


    Interuptverbindung wird im Init_START() wie folgt hergestellt:

    Code
    !** Interuptverbindung beliebigerName
        IDelete int_IntVar;
        CONNECT int_IntVar with ir_IntRoutine;
        ISignalDI di_Dummy,0,int_IntVar;


    Die Interuptroutine sieht folgendermaßen aus:



    Nun stellt sich mir die Frage, ob die While-Schleife zur Überwachung des Eingangs in der Traproutine unbedingt notwendig ist. Läuft die Interuptroutine zyklisch durch solang der Interupt ausgelöst ist?
    Können Interuptverbindungen auf auf mehrere Eingänge überwacht werden oder muss das über Gruppeneingänge realisiert werden? Beispiel:


    Code
    ISignalDI (di_Dummy1,0) AND (di_Dummy2,0),int_IntVar;


    Vielen Dank schonmal für eure Antworten :)

  • ANZEIGE
  • Hi,


    der Programmzeiger verbleibt solange in der TRAP-Routine bis Du diese wieder velässt.


    Für das Warten der Signaländerung solltest Du besser eine Waituntil bzw. ein WaitDI-Instruktion verwenden, da Du ansonsten jede Sekunde eine Meldung ausgibst.


    Du kannst mehrere Interrupts definieren, die die gleiche TRAP-Routine aufrufen. Innerhalb einer Interruptdefinition kann nur ein einziges Signal verwendet werden.


    z.B.


    Code
    Idelete intno1;
    Connect intno1 with T_ProgStop;
    iSignalDi di1,0,intno1;
    
    
    Idelete intno2;
    Connect intno2 with T_ProgStop;
    iSignalDi di2,0,intno2;



    Falls Du in der Trap-Routinen unterscheiden musst, welcher Interrrupt ausgelöst hat, kannst Du die interne Variable INTNO verwenden.


    z.B.


    Code
    TRAP T_PROGSTOP;
       TESR INTNO
       CASE intno1:
             TPwrite "Interrupt 1 ausgelöst";
      CASE intno2:
           TPwrite "Interrupt 2 ausgelöst";
      ENDTEST
    ENDTRAP


    Gruß
    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Servus,


    löse das mit dem mehrfach Auslösen in dem ich am Anfang der Interrupt-Routine den Interrupt mit ISleep deaktiviere und ganz am Ende
    in der Routine wenn wieder alle Bedingungen OK sind dann mit IWatch wieder aktiviere.


    Mehrere Signale kannst du in der EIO Config per Crossconecction zu einem Simulierten Eingang verbinden und diesen dann
    in der Interruptverknüpfung verwenden.


    Grüße


    Martl

  • solang der Interupt ausgelöst ist?


    Der Interrupt ist nicht "solang" ausgelöst. Er wird bei der Signaländerung ausgelöst, also in Deinem Fall bei der fallenden Flanke. Kommt die Änderung mehrfach, werden die Interrupts in eine Warteschlange gestellt und nacheinander abgearbeitet. Deshalb ist es wichtig, den Interrupt sofort in der TRAP-Routine schlafen zu legen. Und deshalb musst Du auch vor dem Programmstart und vor dem Nachstart prüfen, ob der Eingang nicht vielleicht schon 0 ist. Wenn das der Fall ist, gibt es nämlich keine Flanke.


    Wenn Deine Routine als Ereignisroutine Init_Start() mit dem Systemereignis "PowerOn" verbunden ist, kannst Du Dir das Löschen sparen.


    Grüße,
    Michael

  • Vielen Dank euch erstmal für die hilfreichen Antworten. :)


    Zitat


    Er wird bei der Signaländerung ausgelöst, also in Deinem Fall bei der fallenden Flanke. [...] Und deshalb musst Du auch vor dem Programmstart und vor dem Nachstart prüfen, ob der Eingang nicht vielleicht schon 0 ist. Wenn das der Fall ist, gibt es nämlich keine Flanke.


    Grüße,
    Michael


    Das habe ich leider auch gerade festgestellt - wenn der Interupt scharf geschalten wird und der Eingang bereits auf 0 ist, löt dieser nicht aus - erst bei Flankenänderung von 1 auf 0. Denkst du bei "Prüfung, ob der Eingang schon 0 ist" an ein Waituntil, waitdi oder dergleichen?


    Wenn ich z.B. die Zuschaltung einer Schweissrauchabsaugung überwachen möchte kann ich nur prüfen, ob die Rückmeldung zum Betrieb von 1 auf 0 fällt und nicht, ob diese vielleicht ausgeschalten ist? :/

  • Jo, klar. Bei Programmstart oder in einer Warteposition gucken, was mit dem Eingang ist, und den Bediener einmal freundlich drauf hinweisen, wenn was nicht stimmt. Dann entweder warten oder Exit. Sobald der Eingang dann einmal 1 ist, klappts ja ab da mit dem Interrupt.


    Grüße,
    Michael

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

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