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??
Programm laden beim ABB Roboter
- markus007ABB
- Erledigt
-
-
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 -
Hallo Hermann !
Kannst du mir erklären bzw. schreiben wo folgender beschrieben steht:
--> %"Prog"+NumToStr(ii,0)%;
Was bedeuten zb.: die %-Zeichen ????
Vielen Dank !!!! -
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.
-
Sauber, das könnte ab und zu helfen.
-
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ärem.f.g.
bugatti
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ß.
-
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:
Code
Alles anzeigenPROC Lib_ChangeModule(string stLoadModule\switch MOVEMENT|switch LANGUAGE) VAR string stPath; VAR bool bDirOK; IF Present(MOVEMENT) THEN !-------------------------------------------------------------------------- ! Aktuell geladenes Module auslesen (Beschrieben in Movement_XXX) ! Read currently loaded module (described in Movement_XXX) !-------------------------------------------------------------------------- stCurrentModule:=st_MovementModule; !-------------------------------------------------------------------------- ! Verzeichnispfad angeben ! Specify directory path !-------------------------------------------------------------------------- stPath:="HOME:/MOVEMENTROUTINES/"; ELSEIF Present(LANGUAGE) THEN stCurrentModule:=st_LanguageModule; !-------------------------------------------------------------------------- ! Verzeichnispfad angeben ! Specify directory path !-------------------------------------------------------------------------- stPath:="HOME:/LANGUAGES/"; ELSE ! Fataler Fehler -> Argument MOVEMENT/LANGUAGE fehlt ! Fatal Error -> Missing argument MOVEMENT/LANGUAGE RAISE erChangeModule; ENDIF !-------------------------------------------------------------------------- ! Ueberpruefen, ob Verzeichnis bereits existiert oder angelegt werden muss ! Check whether directory already exist or have to be created !-------------------------------------------------------------------------- WHILE NOT bDirOK DO Lib_CheckDirectory stPath,bDirOK; ENDWHILE !-------------------------------------------------------------------------- ! Aktuell geladenes Modul speichern ! Save currently loaded module !-------------------------------------------------------------------------- Save stCurrentModule\FilePath:=stPath+stCurrentModule+".mod"; !-------------------------------------------------------------------------- ! Loesche aktuell geladenes Modul aus RAM ! Delete currently loaded module from RAM !-------------------------------------------------------------------------- EraseModule stCurrentModule; !-------------------------------------------------------------------------- ! Lade neues Modul in RAM ! Load new module into RAM !-------------------------------------------------------------------------- Load stPath+stLoadModule+".mod"; !-------------------------------------------------------------------------- ! Ueberpruefe Programmreferenzen ! Check Program References !-------------------------------------------------------------------------- CheckProgRef; ERROR IF ERRNO=erChangeModule THEN ! Argument MOVEMENT/LANGUAGE fehlt ! Missing argument MOVEMENT/LANGUAGE MT_ShowText\Fault,st_ArgumentError_MOVE_LANGUAGE; MT_ExitCycle; ENDIF ENDPROC
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é
-
sonst keine weiteren Fehlereinträge außer den Referenzfehlern?
nichts vom EraseModule und vom Load??
-
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