Probleme mit Profibus

  • Hallo,
    ich habe erst seit kurzem mit Robotern von ABB (IRC5) zu tun, und habe nun den Auftrag bekommen über Profibus den Roboter und eine SPS von Beckhoff miteinander kommunizieren zu lassen. Da ich mit Profibus auch noch nichts zu tun hatte, musste ich mich in der Richtung auch schlau machen, und die Funktionsweise und alles habe ich auch soweit verstanden. Das Problem ist, dass ich nicht wirklich weiß, wie sich das Senden und Empfangen über Profibus in RAPID realisieren lässt. Durch einen Anruf bei ABB habe ich auch erfahren, dass das im Grunde mit SET und RESET läuft, und um was anderes als 0 und 1 zu übertragen, man mehrere Ein- bzw. Ausgänge, die bei der Profibus-Konfiguration erzeugt werden, zu einem Gruppen-Ein- bzw. Ausgang zusammengefasst werden müssen. Jetzt ist die Frage wie das dann mit SET und RESET funktionieren soll.
    Ich kann ja nicht einfach


    SET Ausgang, 8;


    machen, wenn ich eine Acht über Profibus übertragen will, oder?


    Und beim empfangen wird das ja wohl auch nicht in der Art laufen, wenn ich z. B. zehn Zeichen empfangen will:


    FOR i FROM 1 TO 10 DO
    character[i]:=Eingang;
    ENDFOR


    Ich hoffe, ihr könnt mir weiterhelfen.

  • ANZEIGE
  • Hallo,
    für die Ausgänge geht das z. Bsp so:
    SetGO go_ausgang,8;


    und für die Eingänge genau so einfach wie Du das schon vermutet hast:


    variable:=gi_eingang;


    gi_eingang und go_ausgang müssen in den Systemparameter als Gruppe deklariert sein.


    Gruss Hermann

  • Hallo,


    einen Gruppenausgang konfigurierst du so (in eio.cfg)


    -Name "goRobMeldung" -SignalType "GO" -Unit "BOARD11" -UnitMap "104-111"\
    -Access "ALL"


    auch entsprechendes BOARD anlegen,


    und im Anwenderprogramm kannst du ihn dann so beschreiben


    SetGO goRobMeldung,15;


    einzelne Ausgänge so


    -Name "doGreifer" -SignalType "DO" -Unit "BOARD11" -UnitMap "120"\
    -Access "ALL"


    Eingänge


    -Name "giProduktNr" -SignalType "GI" -Unit "BOARD11" -UnitMap "112-119"\
    -Access "ALL"


    nProduktNr:=0;
    WHILE ((nProduktNr<1) OR (nProduktNr>4)) DO
    nProduktNr:=GInput(giProduktNr);
    !
    SetGO goProduktNr,nProduktNr;
    !
    ENDWHILE


    SetDO doGreifer,0;
    SetDO doGreifer,1;
    oder
    Reset doGreifer;
    Set doGreifer;

  • Und um mehrere Daten hintereinander zu empfangen, bzw. senden, könnte ich das mit einer FOR Schleife machen, wie im ersten Beitrag beschrieben?

  • Hallo,
    ja genau, den Bereich am Bus festlegen, mehrere Bytes, und dann mit einer for endfor Schleife in der du dann mit zwei Bits einen Handshake zur übergeordneten Steuerung aufbaust wie diDatenliegenAn und doDatenUebernommen!

  • Ist das mit dem Handshake nötig? Ich hatte mir das eher so gedacht, dass ich einen Interrupt erstelle, der eine entsprechende TRAP Routine aufruft, sobald Daten auf dem Bus ankommen, und in der ich dann die Daten, die an den Roboter gesendet werden, in einer FOR Schleife in ein array einlese.

  • Hallo,
    nicht unbedingt nötig, kommt auf die Anwendung an, solltest du entscheiden wenn die Anforderung genau definiert ist. Die Daten die dann in einem Array stehen wirst du ja auf Variablen umschaufeln um sie im Rapid zu benutzen. Ich hätte jetzt je nach Datenmenge ein paar Gruppeneingänge deklariert um dann mit dem Handshake wie oben beschrieben ein paar durchläufe zu haben um nicht soviele Bytes für die Daten zu benutzen, soll bedeuten ein und den selben Bereich mehrmals einlesen und in Folge auf immer neue Variablen zu schreiben. Bei dir hört sich das so an als wenn du unbedingt einen Sendepuffer und einen Empfangspuffer anlegen willst, kommt halt darauf an was genau das für Daten sind und wann sie wie auch immer übernommen werden sollen!

  • Die SPS soll über Profibus die Positionsdaten und die Orientierung eines Werkstücks an den Roboter senden, damit dieser das dann greifen kann. Da die SPS die Daten aber nur dann sendet, wenn neue Daten verfügbar sind, dachte ich, es wäre besser das mit einem Interrupt zu machen, damit nicht immer geschaut werden muss, ob gerade Daten gesendet werden. Vielleicht bin ich in der Hinsicht auch zu Microcontroller-geschädigt, wo ich immer soviel wie möglich mit Interrups auf Ereignisse reagiere. Ich hatte mir das irgendwie in der Art:
    SPS hat neue Daten -> SPS sendet Daten über Profibus -> Interrupt wird ausgelöst -> Interrupt Routine wird aufgerufen -> Daten werden empfangen -> Empfangsbestätigung wird gesendet,
    vorgestellt.
    Deshalb wollte ich auch vier Eingänge zu einem Gruppenausgang zusammenfassen weil sich damit ja alle Zahlen von 0-9 abdecken lassen.
    Dabei fällt mir auch ein, wenn ich eine Zahl so schicke, z.B. 4, dann käme die ja binär als 0100 an, wenn ich vier Eingänge als Gruppeneingang habe, weiß RAPID dann, dass das eine 4 ist, oder muss ich ihm das erst noch sagen?

  • Ein Gruppeneingang als Byte deklariert kann 1-255 direkt auf eine integer Variable umlegen 'integer:=Gruppeneingang', wenn du also in der SPS auf das Ausgangsbyte eine 8 schreibst kannst du diese direkt so in Rapid benutzen. Der Roboter wird ja ohne Positionsdaten nicht loslegen und deshalb also auf die Daten warten, also warte bis Daten liegen an (direkt im Anwenderprogramm), dann Daten übernehmen und an SPS Daten übernommen, den Bewegungsablauf fahren und wieder auf Daten liegen an warten. Kannst die Daten natürlich auch im Hintergrund übernehmen (TRAP ROUTINE), habe aber noch nie zeitliche Probleme bei dieser Art und Weise bekommen... .

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