Beiträge von Micky

    Hallo,


    bei Deinem Programm solltest Du beachten, dass wenn Du dich in einer Trap Routine befindest, kein weiterer Interrupt ausgeführt wird, bis Du die Trap-Routine wieder verläßt. Aus diesem Grunde funktioniert auch Der Interrupt in Deiner move_2 Routine nicht.


    Du musst also Deine Trap-Routine verlassen und wieder zurück in Dein Hauptporogramm springen und von dort die nächste Bewegung starten.


    Dies kannst Du am einfachsten über einen Long-Jump mit Hilfe der Fehlerbehandlung erreichen.




    Probier mal den oben beschrieben Ansatz.
    Anhand der numerischen Variablen kannst Du überprüfen ob Deine Bewegung aufgrund der Kraft gestoppt wurde



    Gruß
    Micky

    Hi,


    probiere mal das folgende:


    Code
    PROC ...
      VAR num nList:=0;
      ...
      WHILE nList <> END_OF_LIST DO
         WriteCfgData "/EIO/SYSSIG_IN/Signal/di_SimBackup","Arg1","Beladezelle_3_Backup-"+strDatNeu,\ListNo:=nList;
      ENDWHILE
      ...
    ENDPROC



    Bei Argumenten ohne Verweis auf einen Namen in der Parameterzeile muss die Listno verwendet werden, dies ist erforderlich da es mehrere Einträge für das Signal "di_SimBackup" geben könnte. Über die WHILE Schleife werden jetzt alle Systemparametereinträge umbenannt.


    Solltest Du das Signal mehrmals verwendet haben, so musst Du zuerst mit ReadCfgData überprüfen, für welche "Action" der Eintrag verwendet wurde und erst bei der Action "Backup" den neuen Namen in das Argument 1 eintragen.


    Ich hoffe es funktioniert jetzt. :lol:


    Gruß
    Micky

    Hallo,


    eventuell könntest Du vor dem Starten des Backups, den Backup-Namen in den Systemparametern mit der Intruktion WriteCfgData wie folgt ändern:


    Code
    WriteCfgData "/EIO/SYSSIG_IN/Signal/di_SimBackup","Arg1","Beladezelle_3_Backup-2010-11-10";


    Falls die Steuerung keinen Neustart benötigt könnte es funktionieren.


    Gruß
    Micky

    Hallo mischwarz,


    prinzipiell wird für jede Station in der Anlage ein Nummerkreis festgelegt, anhand dessen man erkennen kann um welche Station es sich handelt, z.B. Maschine 1 (=10) , Maschine 2 (=20), Machine 3 (=30), etc.


    Die Homeposition erhält standardmäßig die Position 99 oder die Nummer 999, wenn die Stationsnummern dreistellig sind.


    Jede Station hat weitere Positionen, die während des Programmablaufs angefahren werden können und ebenfalls eine Positionsnummer erhalten, z.B.


    Vorposition: 10
    Greifposition: 11
    Ablageposiiton: 12


    Diese Nummerierung ist aber abhängig von der Funktion der Station und muss jeweils an die Anlage angepasst werden.


    Anhand dieser Positionsnummer kann Du jetzt Dein Verwaltungprogramm aufbauen und die erforderlichen Bewegungen mit Hilfe der Instruktion MoveTo aufrufen, ohne Dich um die erforderlichen Bewegungsinstruktionen kümmern zu müssen.




    Damit die Instruktion MoveTo funktioniert, sollte die augerufene Bewegungsroutine die Bewegung vom angegebenen Startpunkt zum Zielpunkt enthalten, d.h. bei der Routine mv10_20 würde sich der Roboter von der Anlagenposition 10 (z.B. Vorposition Maschine 1) zur Anlagenposition 20 (z.B. Vorposition Maschine 2) bewegen.


    In der Regel befinden sich in der Bewegungroutine mindestens zwei Bewegungsinstruktionen, z.B. p10 für den Startpunkt und p20 für den Zielpunkt. Werden weitere Positionen für die kollisionsfreie Bewegung von der VP der Maschine 1 zur VP der Maschine 2 benötigt, befinden sich zwischen diesen beiden Position weitere Positionen, entweder als Sternpunkt oder mit Positionsnamen.


    Code
    PROC mv10_20()
      MoveJ p10,
      MoveJ *,
      MoveJ *,
      MoveL p20,
    ENDPROC


    Um eine eindeutige Programmstruktur zur erhalten sollten in diesen Bewegungsroutinen keine Instruktion enthalten, die den Programmablauf verändern, dass einzige Ziel dieser Bewegungsroutine ist den Roboter in die erforderliche Zielposition der Anlage zu bewegen.


    Ist es aber erforderlich, dass während dieser Bewegung eine Position gesucht bzw. berechnet wird oder anhand von Bedingungen die Zielposition anders angefahren werden soll, so kann man auch Programmlogik wie z.B. eine IF .. THEN -Konstruktion einfügen die z.B. andere robtargets nutzt.


    Ein Vorteil der Trennung von Verwaltungs- und Bewegungsroutinen ist, dass Du die Bewegungsroutinen z.B. in einer Testroutine zum Optimieren der Bewegung während der Inbetriebnahme abfahren kannst ohne das der Signalhandshake mit den Maschinen bereits Inbetriebgenommen ist.




    Gruß
    Micky

    Hallo,


    Roboterpositionen werden bei MultiMove-Anlagen synchronisiert, wenn die beiden Roboter während einer Bewegung gemeinsam an einem Teil arbeiten und die Bewegung der beiden Roboter voneinader abhängig sind.


    Hilfreich wäre ein Codebeispiel um die Frage beantworten zu können.


    Gruß
    Micky

    Hallo Dust,


    ich habe mal in einer meiner EIO.CFG 's nachgeschaut und festgetellt, dass der Pre-Warn-Ausgang "PSC1CSPREWARN" heißt.


    Du kannst das aber auch selber mal nachprüfen, indem Du Dir im E/A-Fenster unter Ansicht -> Sicherheitssignale alle internen Sicherheitssignale anzeigen läßt.



    Gruß
    Micky

    Hallo Dust,


    die Signale von EPS, z.B. PSC1PREWARN, sind bereits in der Robotersteuerung vordeklariert und müssen nicht nochmal deklariert werden.


    Damit Du auf dieses Signal zugreifen kannst, musst Du ein Signal auf einem virtuellem Board erzeugen, z.B. "diPSC1PREWARN" und dieses über eine Crossconnection mit dem EPS Signal "PSC1PREWARN" verknüpfen.


    Gruß
    Micky

    Hallo,


    ab der Robotware 5.13 gibt es einen Systemeingang mit dem man ein Backup erstellen.


    Auszug aus den Release notes:


    Je nachdem wie du Dein Programm gestaltest, könntest Du entweder das Backup durch Setzen eines Ausgangs oder durch eine externe Steuerung anstoßen lassen.


    Gruß
    Micky

    Hallo,


    um eine Flexpendant Applikation (ScreenMaker oder FP-SDK) am Roboter ausführen zu können, benötigst Du die Option "Flexpendant Interface".


    Um ScreenMaker nutzen zu können benötigst Du die Vollversion von RobotStudio.


    Mit ScreenMaker kannst Du Variablen und Signale ändern. Was nicht geht, sind logische Abfragen in den Ereignisroutinen.


    Wird sowas benötigt, kann man diese Funktionen mit Multitasking kombinieren, so dass ScreenMaker die Funktion anstößt und Multitasking den Rest erledigt.


    Gruß
    Micky

    Hi,


    meines Erachtens musst Du das in der MMC.CFG parametrieren.


    Lade mal den folgenden Inhalt zu den Systemparametern hinzu.



    Zum einen wird hier angeben, das der erste Parameter der Greifer-Routine erforderlich ist und dass in der MMC-Instruktionsliste die Instruktionen zum Greifer öffnen bzw. schließen direkt angezeigt werden.


    Alternativ kannst Du die instruktion noch als hidden deklarieren, so dass diese in Deiner Instruktionsliste nicht mehr auftaucht


    z.B.

    Code
    name Greifer  -default_struct 1 - hidden


    Trotzdem solltest Du innerhalb der Routine mit der Funktion "Present" überprüfen ob mindestens einer der erforderlichen Parameter vorhanden ist.


    Gruß
    Micky

    Hi,


    wenn Du die Positionen innerhalb der Robotersteuerung auswerten willst kann Du die Instruktion CRobT() in Verbindung mit Multitasking verwenden.


    Wenn Du die Daten außerhalb der Robotersteuerung verarbeiten möchtest, bietet sich das Robot Reference Interface an.


    Ich habe Dir mal die Beschreibung aus der Produktspezifikation angefügt.


    Gruß
    Micky


    Hallo mischwarz,


    das "?" wird bei optionalen Übergabeparametern bei Routinen verwendet, die an einen weiteren Routinenaufruf weitergegeben werden müssen.


    Die MoveL Instruktion hat einige optionale Parameter, die man z.B. in einer eigenen Move Instruktion ebenfalls optional verwenden möchte


    Beispiel:


    PROC MyMoveL(robtraget ToPoint,...\num T|numV,zone\Z,...)


    Um die verschiedenen optionalen Parameter an die Movel Instruktion weitergeben zu können, müsste man mit IF Present(..) alle optionalen Parameter abfragen und dann alle möglichen Kombinationen ausprogrammieren.


    Da dies ziemlich aufwendig ist, gibt es dass "?" um den Routinenaufruf auf eine Programmzeile zu reduzieren, d.h. der Aufruf der MoveL-Instruktion sieht wie folgt aus:


    MoveL ..\ID?ID,.\T?T\V?T, zone\Z?Z,...;


    Dies bedeutet, wurde ein optionaler Parameter übergeben, so wird er mit dem Fragezeichen an die MoveL-Instruktion weitergegeben, wird ein ein optionaler Parameter nicht definiert, so wird der Parameter ignoriert und dadurch ein fehlemeldung verhindert.


    In Deinem Fall wurde der Programmcode


    IF Present(Info) then
    ErrorLog stTitel,tmMessage\Info:=Info;
    ELSE
    ErrorLog stTitel,tmMessage;
    ENDIF


    auf die folgende Programmzeile reduziert:


    ErrorLog stTitel,tmMessage\Info?Info;


    Gruß
    Micky

    Hallo iceberg,


    die Funktion TestDI liefert TRUE bzw. FALSE zurück, so dass Deine Abfrage so nicht funktioniert. :meld:


    Einen digitalen, analogen oder einen Gruppeneingang kann man direkt ohne Verwendung einer Funktion abfragen, lediglich bei Ausgängen müssen die Funktionen Doutput, AOutput oder GOutput verwendet werden.


    Die Abfrage muss wie folgt aussehen:


    Code
    IF di_xy=1 AND DOutput (do_xy)=1 THEN
      !Anweisung
    ENDIF


    Gruß
    Micky

    Hallo mights,


    die Funktion die Du suchst heißt "DefAccFrame".


    Mit dieser kann man ein Koordinatensystem aus drei bis zehn Originalpositionen und derselben Anzahl an verschobenen Positionen definieren, d.h. CAD-Positionen und reale Positionen.


    Nähere Informationen kannst Du dem Handbuch entnehmen.


    Gruß


    Micky

    Hallo Lars,


    anscheinend konnte Dir ABB die Bootdisketten liefern.


    Warum nimmst Du nicht den technischen Support von ABB in Anspruch und stellst deine Frage direkt an ABB.


    Die können Dir zum einen direkt helfen und Du musst nicht tagelang warten, bis Dir vielleicht jemand eine qualifizierte Antwort geben kann.
    Zumal zum Thema Bootdisketten Dir hier im Forum wahrscheinlich doch niemand weiterhelfen kann.


    :uglyhammer_2:


    Gruß
    Micky

    Hallo Iceberg,


    zuerst musst Du die Deklaration deiner robtarget von CONST in PERS ändern, denn Konstanten können nicht überschrieben werden.


    Code
    CONST robtarget pTemp:=[....];


    wird zu


    Code
    PERS robtarget pTemp:=[....];



    Die Zuweisung sieht wie folgt aus:


    Zuweisung des Wertes Z:

    Code
    pTemp.trans.z:=pHilfspos.trans.z;


    Zuweisung der Variablen X,Y und Z

    Code
    pTemp.trans:=pHilfspos.trans;


    Gruß
    Micky

    Hallo mkilber,


    Du musst VAR vor die Deklaration von triggdata schreiben, dann sollte es funktionieren.


    Code
    PROC STrMoveL(
        num ActPos,
        robtarget ToPoint,
        speeddata speed,
        VAR triggdata gunon, ...


    Gruß
    Micky