Beiträge von Micky

    Die RAPID-Module wurden wie folgt geändert

    • Das „.prg“-Dateiformat wurde entfernt.
    • Das RAPID-Modul "user.sys", das in allen RAPID Tasks geladen und im HOME-Ordner abgelegt wurde, wurde entfernt. Der Inhalt wird in einem Systemmodul abgelegt, das beim Start geladen wird.
    • Neue Dateiformate für Module, „.modx“ und „.sysx“, da jetzt die UTF-8-Kodierung verwendet wird.
    • „.mod“- und „.sys“-Dateien können noch geladen werden, werden aber in das neue UTF-8 Format konvertiert und können nur als ".sysx" bzw. ".modx" gespeichert werden.
    • Die Dateieendungen ".mod" und ".sys" dürfen nicht in ".modx" bzw. ".sysx" umbenannt werden, da anhand der Dateiendung die Kodierung der Module bestimmt wird und somit falsche Zeichen dargestellt werden. D.h. alte Module laden und mit der neuen Dateiendung speichern.
    • RAPID-Zeichenfolgen in einem Backup können möglicherweise, beim Konvertieren von ASCII nach Unicode, zu lang sein.


    Änderung am String-Format

    • Alle RAPID-Anweisungen, die Zeichenketten verwenden, können UTF-8 verarbeiten. Dies führt zu einigen Unterschieden im Verhalten.
    • Ein String kann 80 Byte groß sein, wobei ein Zeichen aus mehreren Bytes bestehen kann (z.B. ä,ö,ü sind 2-byte groß). Das heißt, enthält ein String ein „ä“, so reduziert sich die maximale String-Länge auf 79 Zeichen.
    • Es gibt neue Instruktionen für die Stringverarbeitung (z.B. Concat, StrSize) sowie die Möglichkeit das Verhalten im Fehlerfall (String ist zu lang) über die Systemparameter einzustellen (Controller -> General Rapid -> TruncateLongRapidStrings) oder den Fehler über die Fehlerbehandlung (ERR_STRTOOLNG).
    • Der beste Weg um zwei Strings zusammen zu bauen, ist aber die Verwendung der Funktion "CONCAT", den die kümmert sich um die Bytegröße jedes Zeichens und gibt den Text der nicht mehr in einen String reingepasst, als Variable zurück.

    Hallo,
    wenn Du mehrere User im UAS anlegst, könntest Du mit der Funktion "GetUASUserName" den gerade am Roboter angemeldeten User abfragen (z.B. "Default User") und in Deinem Menü den Menüpunkt "Geschwindigkeit" ausblenden, wenn nicht der richtige User angemeldet ist.

    Hallo,
    verwendest Du den Systemausgang "Motoren Off" oder "Motor Off State".
    Der Systemausgang "Motor Off" blinkt und "Motor Off State" steht statisch an.

    Wenn die SPS basierend auf dem Systemausgang "Motoren aus" den Systemeingang pulst, solltest Du als Systemausgang "Motor Off State" verwenden.

    Hallo Robiman,

    den Befehl StartMove solltest Du vor der Instruktion "MoveL pAktPos" einfügen, den sonst bewegt sich der Roboter nicht.

    Die Instruktion "Clearpath" wird benötigt, da der Roboter bei "StartMove" die noch nicht beendete Bahn fortsetzen würde.

    Hallo RobiMan,
    wie bereits erwähnt, solltest Du einen Single Interrupt verwenden, da du durch den Dialog in der TRAP-Routine verweilst und alle weiteren Interrupts in die Queue eingereiht werden. Diese werden erst nach dem verlassen Deiner TRAP Routine ausgeführt. Das heißt, wenn Dein Interrupt weiterhin Werte liefert läuft Dir zwangsläufig die Queue über.

    Du solltest auf jeden Fall sicherstellen das deine Endposition mit einem Fine-Punkt angefahren wird, da ansonsten Dein Programm durch den Programmzeigervorlauf an einer falschen Stelle fortgesetzt wird.

    Du solltest einen ClearPath ausführen, falls Du nicht bis zum Endpunkt weiterfahren willst

    Hallo Robiman,
    CyclicBool funktioniert nicht mit Gruppeneingängen.

    Die Interrupt Queue sollte nicht überlaufen, wenn die Interruptroutine sofort wieder verlassen wird.
    Du könntest außerdem einen Single Interrupt verwenden, den Du am Ende der TRAP Routine wieder neu verbindest, so treten zumindest keine weiteren Interrupts auf.

    Du musst die TRAP Routine mit einem Long-Jump verlassen, sobald deine Bedingung erfüllt ist,
    Das heißt. du verwendest den RAISE Befehl in der TRAP-Routine z.B. RAISE ERR_SEARCHL_GI
    und in Deiner SEARCHL_GI-Instruktion verwendet Du in der Fehlerbehandlung

    Code
    ERROR (ERR_SEARCHL_GI)
      IF ERRNO = ERR_SEARCHL_GI THEN
    
      ENDIF
    ENDPROC

    Hallo MrTimmey,

    leider gibt es keine Instruktion mit der man von eine Schleife vorzeitig abbrechen kann.
    Du könntest aber die Schleife in eine separate Routine auslagern und mit RETURN die Routine verlassen, sobald Deine Bedingung erfüllt ist.

    Wenn Du einen Fehler auslösen willst kannst Du die Instruktion RAISE verwenden, und das Programm wird in der Fehlerbehandlung fortgesetzt. Den Fehler musst Du in einer der aufrufenden Routinen auswerten.

    Wenn Du Dein Programm vom Anfang der Main Routine fortsetzen willst, kannst Du die Instruktion EXITCYCLE verwenden.

    Wenn Du aus der TRAP Routine in die Fehlerbehandlung einer der aufrufenden Routinen (Callstack) springen willst, funktioniert das über den RAISE Befehl und der Angabe der Fehlernummer in Klammern hinter ERROR im Errorhandler der jeweiligen Zielroutine (Long-Jump).


    Das Thema Long-Jump ist hier im Forum schon mehrfach behandelt worden und ist zusätzlich im Handbuch "RAPID Kernel" beschrieben

    Hallo Stingray,
    die von Dir beschrieben "Error-Strings" dienen bei der Instruktion "Errlog" und ErrRaise" um festzulegen, mit welchen Daten die 5 möglichen Platzhalter-Argumente in der Errorlog-XML-Datei gefüllt werden sollen.


    Code
    <Message number="7055" eDefine="SYS_ERR_ARL_INPAR_RDONLY">
    <Title>Parameter error</Title>
    <Description>Task:<arg format="%s" ordinal="1" />
    <p />Symbol <arg format="%s" ordinal="2" />is read-only
    <p />Context:<arg format="%s" ordinal="3" /><p /></Description>
    </Message>


    Das heißt, wird an die Instruktion "Errlog" an das "Argument1" der Wert "ERRSTR_TASK" übergeben, so wird innerhalb der Instruktion der aktuelle Taskname in die Meldung eingetragen.

    Leider geht das ganze nur bei den beiden zuvor genannten Funktionen.

    Wenn man den "Context" (Callstack) direkt in einen String auslesen könnte, ergäbe sich durch die Begrenzung der maximalen Stringlänge von 80 Zeichen, das Problem, dass bei Ausnutzung der maximalen Routinennamenlänge von 32 Zeichen der Callstack nur zwei Ebenen anzeigen würde.

    Mfg
    Micky

    Hallo,
    die Systemeingänge MotorenAus und Stop wirken auch im Handbetrieb der Robotersteuerung.
    Eventuell reicht es aus, dass der Systemeingang Stop im Handbtrieb erst zurückgesetzt wird, wenn der EKS gesteckt ist.
    Im Handbetrieb sollte sowieso nur die Programmiertür offen sein, da ansonsten die Motoren nicht eingeschaltet werden können.

    Hallo Vlad,

    • über den Ribbon "Addins" bekommst die verfügbaren RobotWaren angezeigt.
    • Wähle "RobotWare for IRC5" aus und auf der rechten Seite wird eine Combobox angezeigt.
      Scrolle bis ganz nach unten und wähle RobotWare 5.16 aus.
    • Drücke auf Download File
    • Nach dem Download entpackst Du die Zip Datei
    • Führe das Setup im Verzeichnis RobotWare aus

    Du kannst innerhalb Deines Bearbeitungsprogramms die Interrupts mit ISleep, IWatch oder mit IDelete bei Bedarf aktivieren bzw. deaktivieren.

    Andere Softwarepakete bieten die Möglichkeit, das man Programmevents buchen kann, d.h. man kann Routinen definieren, die an bestimmten Stellen im Programmablauf aufgerufen werden (z.B. Vor oder Nach der Bearbeitung eines Bauteils).

    Eventuell bietet die PaintSoftware auch so eine Möglichkeit.

    Meines Erachtens sollte es die Möglichkeit geben, die Routine "InitCustMain" in Deinem Programm für die Initialisierung Deiner eigenen Daten zu verwenden.

    Die "main"-Routine sollte die Routine "InitCustMain" automatisch aufrufen.

    Eventuell ist dies auch in der Dokumentation beschrieben.

    Sollte es die Routine in Deinem Programm noch nicht geben, dann erstelle sie innerhalb Deines Programms als globale Routine (also nicht LOCAL).

    In dieser Routine kannst Du dann Deine Interrupts definieren.

    Code
    PROC InitCustMain()
    
      !Instruktionen zum Initialisieren des Programms
    
    ENDPROC

    "RELEASE:" verweist auf das "RobotWare"- oder ein "Add-In"-Verzeichnis im "Products"-Verzeichnis.
    Diese Verzeichnisse sind schreibgeschützt und können nicht verändert werden.

    Änderungen in diesen Verzeichnissen wären sowieso nicht sehr sinnvoll, da diese verlorengehen, wenn Du eine neue Version der RobotWare oder eines Add-In installierst.

    In Deinem Fall verweist das Release auf die Option "Paint" in der RobotWare.

    Du solltest Deine Interrupts nicht in einem Modul einfügen, das von der RobotWare bereitgestellt wird und bei einem Upgrade überschrieben werden könnte, d.h. das von Stingray vorgeschlagene Modul "Base.sys" solltest nicht verwenden,

    Füge die erforderlichen Interrupts in ein von Dir erstelltes Modul ein, so dass dessen Inhalt in Deinem Programm bzw. Backup enthalten ist und nicht von außen verändert werden kann.

    Denn bei einem Upgrade der Robotware oder einem I-Start werden diese Module überschrieben.

    Hallo Enrico,

    die in einer Routinen deklarierten Variablen sind nur während der Ausführung der jeweiligen RAPID Funktion bzw. Routine verfügbar. Wird die Routine verlassen, so existieren diese Variablen nicht mehr.

    Das bedeutet, du musst wissen wann die Routine ausgeführt wird.

    Auf eine lokale Routinenvariable kann mit C# und dem FP-SDK zugegriffen werden, indem man den Tasknamen, den Modulname, den Routinennamen und den Variablennamen als Parameter an GetRapidData übergibt.

    Dies funktioniert aber nur, wenn der Programmzeiger gerade in der Routine steht ansonsten erhält man eine Exception, wenn man auf den Wert zugreifen will.


    Code
    // Create RapidData object for reg1        
    rdReg1 = _controller.Rapid.GetRapidData("T_ROB1","MyModule","MyRoutine","MyVariable");

    FP-SDK: GetRapidData