Programm laden beim ABB Roboter

  • Mein Problem ist folgendes:
    Ich Programmiere einen ABB Roboter bei dem ich 54 Verschiedene Teile handhaben muss. Damit das ganze Funktioniert muss ich dafür 54 verschiedene Programme anlegen. Wenn man nun aber in die Auswahlliste der verschiedenen Prozeduren hineingeht sind das dann natürlich unzählig viele. Um das zu unterbinden möchte ich je nach Programmtype automatisch nur das Programm das ich benötige in den Arbeitsspeicher laden. Und das ganze wenn geht in Automatik. Das heisst: Die SPS gibt dem Roboter die Programmnummer vor, und der Roboter lädt sich dann das Benötigte in den Speicher. Hat von euch vielleicht schon mal jemand so eine Anwendung gehabt?? :danke:

  • ANZEIGE
  • Hallo,
    sieh mal im Handbuch unter den Befehlen 'Load' und 'Unload' nach.

    Sollte sich so ähnlich wie im folgenden geschildert machen lassen (nur mal so aus dem Gedächtnis hingeschrieben, also ohne Gewähr auf absolute Richtigkeit)

    Var string NewModname;
    Var num ii;
    ii:=2; ! Hier Einlesen der Nummer von der SPS anstelle der 2
    NewModname:="Modul"+NumToStr(ii,0);
    Load "HOME:"\File:=NewModname+".MOD";
    ! Aufruf des Programms ueber Variable, damit ohne geladenes
    ! Modul kein Fehler auftritt
    %"Prog"+NumToStr(ii,0)%;
    ! Nach Programmende das Modul wieder rausschmeissen
    UnLoad "HOME:"\File:=NewModname+".MOD";

    Es müsste dann ein Modul Modul2.MOD im Home-Verzeichnis geben und in diesem Modul müsste eine Routine Prog2 existieren.

    Gruss Hermann

  • Habs jetzt so gelöst - müsste Funktionieren.

    !=========================================================
    !====== Programmmodul in Arbeitsspeicher laden =======
    !=========================================================
    PROC Programm_laden()
    ! String "Modulname" beschreiben
    ! Die Module heißen: "Programm_1 bis Programm_22"
    Modulname:="Programm_"+NumToStr(ProgNr,0);
    ! Wenn ein Programm angewählt ist dann zuerst speichern
    ! und dann abwählen
    IF Prog_Nr>=1 THEN
    Save "HOME:"\File:=Modulname+".MOD";
    UnLoad "HOME:"\File:=Modulname+".MOD";
    ENDIF
    Prog_Nr:=Prog_von_SPS;
    Load "HOME:"\File:=Modulname+".MOD";
    ENDPROC

    Einmal editiert, zuletzt von ()

  • Hallo,
    ich hab es damals in dem Beispielprogramm im Modul base_mt.sys gefunden. In der Doku habe ich nur bei der Beschreibung des Befehls 'StartLoad' in der Datei 'System_Datentypen_Routinen.pdf' etwas darüber gefunden.

    PROC CallByVar(string Name,
    num Number)
    IF (Number-Trunc(Number) <> 0) OR (Number<0) THEN
    ErrWrite "CallByVar fault", "Argument Number is not an integer or"
    \RL2:= "is negative.";
    Stop;
    EXIT;
    ENDIF
    %Name+NumToStr(Number,0)%;
    ENDPROC


    Sinn der Sache ist, das man einen Unterprogrammaufruf programmieren kann, obwohl das aufgerufene Unterprogramm noch gar nicht im Speicher vorhanden ist.
    Normalerweise wird ja schon beim Laden des Programms überprüft, ob alle augerufenen Unterprogramme vorhanden sind. Über die % kann man ein sogenanntes 'late binding' erreichen, dann wird der Unterprogrammname erst bei der Abarbeitung der Zeile zusammengebaut und ausgewertet.

    Lange Rede kurzer Sinn:

    Wenn das Programm so aussieht, dann kann man es laden ohne Fehler, erst beim Ablauf ergibt es einen Fehler.

    Module testprog


    Proc main()
    %"programm_1"%;
    %"programm_2"%;
    endproc

    Proc programm_1 ()
    waittime 1;
    endproc
    endmodule

    Sieht die Sache folgendermassen aus, dann gibt es schon beim Laden des Programms einen Fehler, weil die Routine programm_2 fehlt:

    Module testprog

    Proc main()
    programm_1;
    programm_2;
    endproc

    Proc programm_1 ()
    waittime 1;
    endproc
    endmodule

    Hoffe das hilft über die Schwierigkeiten hinweg.

    Gruss aus dem Schwabenland
    Hermann

  • Sauber, das könnte ab und zu helfen.

    Menschen brauchen Roboter, aber auch Roboter brauchen Menschen.

    Roboter sichern die Arbeitsplätze und den Fortschritt der Industrieländer, da sie kostengünstig und qualitativ hochwertig produzieren.

    Ohne Automatisierung mit Robotern werden unsere Produkte in Billiglohnländern hergestellt.

    >> Abonniere meinen YouTube Roboterkanal <<

    Einmal editiert, zuletzt von Werner Hampel ()

  • Sauber, das könnte ab und zu helfen.

    Menschen brauchen Roboter, aber auch Roboter brauchen Menschen.

    Roboter sichern die Arbeitsplätze und den Fortschritt der Industrieländer, da sie kostengünstig und qualitativ hochwertig produzieren.

    Ohne Automatisierung mit Robotern werden unsere Produkte in Billiglohnländern hergestellt.

    >> Abonniere meinen YouTube Roboterkanal <<

    Einmal editiert, zuletzt von Werner Hampel ()

  • Hallo Markus


    Das abarbeiten von 54 verschiedenen RoboterProgrammen kann man
    auch lösen in dem man ein Hauptprogramm(Modul) schreibt und anschliessend die 54 einzelnen ProgrammModule über die SPS Programmnummer über den Modulnamen (Stringfunktion) aufruft . das heisst ohne den Befehl Load / Unload
    Nachteil bei der Load/Unload sache wenn man im einzelnen ProgrammModul Variablen programmiert hat und einen
    Unload macht das man einen Bindereferenzfehler bekommt bzw. man kann die Bindereferenz komplett deaktivieren aber man bekommt dann überhaupt keine Meldung mehr auch wenn sie richtig wäre


    m.f.g.


    bugatti


    bij@bugattis.at


    p.s.
    Programm beispiel kann ich dir schicken.
    Wenn ich euch weiter helfen kann meldet euch hab mich die letzten 5 Jahre bei ABB mit den Orangernen herumgeschlagen .

  • Hallo Markus


    Interessant wäre ob die 54 verschiedenen Programme nur verschiedene Positionen besitzen oder ein komplett anderer Ablauf. Wenn die Positionen getauscht werden müssen dann
    ist es möglich in mehrere Module die gleichen Variablen zu benützen. Wie schon mein Freund
    bugatti dir einige Tips gegeben hat mußt du wenn du die Positiionen wechselst des Binde referenz ausschalten. Da nach dem unload die Steuerung die Variable nicht mehr besitzt und
    somit auf "Referenzfehler"anspricht. Nach dem Ausschalten der Binde Referenz wird die
    Steuerung bis zur Programmzeile laufen in der eine Variable benützt wird die nicht geladen ist.
    PS Wenn du Module lädst immer mit Befehl Load vom Programm da wenn das Modul unter Menüpunkt Laden Module nicht mit unload zu entfernen ist.

  • Hallo Markus,
    beim Verwenden von verschiedenen Typen ist es wie schon angedeutet auch möglich über gleiche Variablen vorher die benötigten richtigen Daten auch zuzuweisen. Hilfreich sind hierbei auch immer die Datenfelder. Sollten sich die Typen gleichen würde die Sorgen mit Load und Unload Geschichte sein. Denn das Problem hierbei ist das von Hand geladene bzw. gelöschete Module Schwierigkeiten machen.
    Das heißt Module welche von Hand geladen wurden können nicht automatisch wieder vom Programm gelöscht werden. Daher bin ich immer bestrebt diesem Problem aus dem Wege zu gehen.


    Viel Spaß.

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Wenn man sich auf das automatische Laden von Modulen mit Load beschränkt gibt es auch keine Probleme. Wenn Du nach Start von Haupt alle "Typenmodule" löscht (Unload) und nach Typenabfrage dann das richtige Typenmodul mit Load lädst werden die Positionen im Programm automatisch korrigiert. Vorteil wenn du nach Positionskorrektur die Änderung speichern möchtest brauchst du nur das Modul manuell speichern mit Ansicht-- Module--
    Modul Auswählen-- Datei -- Modul speichern. Willst du die Korrektur nur temporär dann wird nach dem nächsten Typenwechsel das Modul neu geladen und die Korrektur ist wieder weg.
    mfG Burlibua

  • Hallo zusammen,


    ich möchte das Thema nochmal kurz aufwärmen. Und zwar habe ich bei einem Kunden häufig Probleme, dass der Modulwechsel sporadisch nicht richtig funktioniert. Sprich: Aktuelles Modul wird rausgeschmissen, aber kein Neues aus dem angegebenen Verzeichnis geladen. Der Roboter geht dann logischerweise in einen Referenzfehler über, da es die im Programm angesprochenen Variablen nicht gibt.


    Hier mal der Code dazu:



    Zwischen UnLoad und EraseModule besteht, meiner Inerpretation nach, nur der Unterschied, dass bei UnLoad das Module vorher auch geladen werden musste.


    Vielleicht kann mir jemand von euch weiterhelfen.


    Vielen Dank im Voraus!


    Gruß André

  • Leider nicht. Erste Meldung ist der Referenzfehler.


    Komischerweise sind das 3 Roboter (2x IRC5, 1x IRC5C) und es tritt immer nur an der IRC5C auf. Programmcode ist identisch, RW 6.09.00.01.


    Da wir zwei weitere Anlagen geliefert haben mit insgesamt 10 IRC5C, diese mit RW 6.10.02 laufen und hier der Fehler (bis jetzt) nicht auftritt, habe ich nun beim Problemkind auch die RW auf 6.10.02 hochgezogen und werde es weiter beobachten. Wäre ja nicht das erste Mal, dass bei sowas die RW mit reinspielen würde.


    Ich finde zumindest im Code keine Fehler, auf den die Dokumentation hinweisen würde.

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