Posts by Micky

    Hallo,
    du könntest virtuelle Ausgänge erstelllen und diese mit den erforderlichen Systemeingängen verbinden. Diese Ausgänge setzt Du dann im RAPID-Programm in Abhängigkeit von deinen empfangen Daten.

    In RobotStudio kann man Ausgänge leider nicht bei den Systemeingängen auswählen, aber Du kannst dies direkt in der EIO.cfg konfigurieren.

    Hallo RobiMan,
    du erstellst eine eigene Routine für Deine Suchinstruktion z.B. "SearchLGI" mit den erforderlichen Parametern (ahnlich SearchL) am besten in einem separatem Modul, so dass die die Instruktion später in anderen Projekten weiterverwenden kannst.

    Diese Routine ist dafür zuständig, das Dein LongJump immer in diese Routine zurückkehrt und nicht sonstwo im Aufrufstapel landet.

    In dieser Routine machst Du folgendes:
    ----------------------------------------------------------
    1. Fehlernummer "ERR_SEARCH_GI", "ERR_WHLSEARCH_GI" und "ERR_SIGSUPSEARCH_GI" mit "BookErrNo" buchen, falls dieses noch nicht erfolgt ist.

    2. Prüfen ob der Gruppeneingang bereits den gewünschten Wert hat.

    3. Falls dies der Fall ist, brichst Du die Suche ab. (z.B. über Fehlerbehandlung mit eigener Fehlernummer ERR_SIGSUPSEARCH_GI)

    4. Interrupt mit dem Gruppensignal verbinden.

    5. Falls der Gruppeneingang einen bestimmten Wert haben muss, kannst Du diesen einer globalen Variablen zuweisen, die in der TRAP Routine abgefragt werden muss.

    6. Bewegung mit FINE-Punkt ausführen .

    7. Interrupt löschen.

    8. Wenn die Bewegung bis zum Ende ausgeführt wurde, wurde der Punkt nicht gefunden und du muss dies als Fehler auswerten (z.B: mit "RAISE ERR_WHLSEARCH_GI)

    9. In der Fehlerbehandlung wertest Du die Fehlernummer "ERR_SEARCH_GI" aus, indem Du
    "Storepath" ausführst und die aktuelle Position der Rückgabeposition "SEARCHPOINT" zuweist.

    10. Danach führst Du "RestoPath", "ClearPath" und "StartMove" aus um dann mit "RETURN" zurück in die aufrufende Routine zu springen.

    11. In der TRAP Routine prüfst Du den Wert des Gruppeneingangs.

    12. Wenn dieser Deinen Zielwert erreicht hat, löschst Du den Interrupt, rufst "STOPMOVE" und dann die Fehlerbehandlung mit "RAISE ERR_SEARCH_GI" auf.

    Hallo,
    man kann über die Variable "intno" die Nummer des aktiven Interrupts in der Trap-Routine abfragen.

    Wenn Du die Interruptnummer mit den Interruptdeklarationen vergleichst, kannst Du herausfinden, welcher Interrupt ausgelöst wurde. Den Signalnamen findest Du aber hiermit nicht heraus.

    Beispiel:

    TRAP T_SuchSensor
       var num nIndex;

       TEST INTNO
       CASE intScanAnalog:
         nIndex:=1;
       CASE intScanGI:
         nIndex:=2;
       DEFAULT:
         nIndex:=3;
       ENDTEST
      !Auswertung von nIndex
    ENDTRAP
       
    Eventuell könnte man den Signalnamen bei der Interruptdeklaration in ein Array schreiben und diesen in der Traproutine mit nIndex aus dem Array auslesen und mit AliasIo oder GetDataVal den Wert des Signals auslesen

    Hallo,
    man kann den Zustand der AliasIO-Signale am FlexPendant im IO-Fenster anzeigen

    Bei der OmniCore Steuerung muss man den Filter auf "Alias Signal" einstellen und erhält dann folgendene Anzeige:

    Bei der IRC5-Steuerung muss man im IO-Fenster über den Button "View" das Menü "Alias i/O" auswählen.

    Hallo RobiMan,

    warum verwendest Du nicht einfach das Start-Event, so wie es in der Doku beschrieben ist.

    Falls Du z.B. nach dem PowerOn-Event noch Änderungen durchführst, musst Du jedesmal die Steuerung neustarten um die Signale zu verbinden.

    Außerdem könnten irgenwelche Nebeneffekte auftreten, aufgrund Du dann wieder irgendwelche Workarounds programmieren musst.

    Hallo RobiMan,

    laut Handbuch sollte man die Alias-Signale im Event "Start" verbinden bzw. vor der ersten Verwendung der Signale.



    Das heißt sie sind so lange gültig, bis der Programmzeiger versetzt wird bzw. von "main" gestartet wird (Nur in diesem Fall wird das Start Event ausgeführt).

    AliasIO muss damit nicht bei den folgenden Events verwendet werden:
    "Restart", "PowerOn" oder "StepEvent", etc. ausgeführt werden.

    Falls die Signalverbindung explizit mit "AliasIOReset" gelöscht wurde, muss es vor der nächsten Verwendung neu verbunden werden

    Hallo,

    mit AliasIO verbindest ein reales Signal mit einem im Programm verwendeten Signalvariable und kannst damit den Zustand des verbundenen Signals abfragen bzw. setzen.

    Die realen Signale behalten ihren Zustand bei auch wenn Du die Verbindung mit dem Alias-Signal trennst oder mit einem anderen Signal neu verbindest.

    Beim Verbinden mit AliasIO erhälst Du immer den aktuellen Wert des realen Signals.

    Wenn das reale Signal den Zustand bei einem Neustart beibehalten soll, kannst Du dies über die EIO-Konfiguration über den "Signal Safe Level" konfigurieren.



    image.png

    In dem Step-Event musst m.E. die Alias-Verbindung nicht neu ausführen, da Variablen nur beim Versetzen des Programmzeigers in eine andere Routine zurückgesetzt würden.

    Hallo AtoK09,

    beim Pfadnamen ("Argument 3") musst du "SYSTEM:" weglassen, einfach "Data/CustomOrdner" verwenden.

    Das "Argument 1" in den Systemparametern enthält "System:", um das Backup in einem Verzeichnis oder TAR-File mit dem Systemnamen anzulegen.

    Laut der "Bedienungsanleitung OmniCore" Dokument-Nr: 3HAC065036-003 sieht die Verzeichnisstruktur der OmniCore Steuerung wie folgt aus:



    Der Root-Pfad "\hd0a" gibt es in der OmniCore-Steuerung nicht mehr und man kann auch keine Ordner im Root mehr anlegen.

    Wenn Du das Backup-Verzeichnis nicht verwenden willst, kannst Du das Data-Verzeichnis verwenden und dort einen Unterordner anlegen.

    Verwende einfach den folgenden Pfad "BACKUP" oder "DATA/MeinOrdner"

    Um den Puffer zu leeren, könnte man in einer Schleife solange Daten empfangen, bis der Befehl über den Timeout abgebrochen wird.

    Code
     PROC ClearSocket(VAR socketdev socket)
           VAR string stData;
           WHILE TRUE DO
               SocketReceive socket\str:=stData\Time:=1;
           ENDWHILE
       ERROR
           SkipWarn;
           RETURN ;
       ENDPROC

    Hallo,
    du kannst den Interrupt als "\SingleSafe" deklarieren,

    Das Ereignis des sicheren Interrupts wird bei einem Programmstopp und der schrittweisen Abarbeitung in die Warteschlange gestellt. Wenn die kontinuierliche Abarbeitung fortgesetzt wird, wird der Interrupt ausgeführt.

    In der Trap-Routine musst Du den Interrupt immer neu verbinden, da er sonst nicht mehr ausgelöst wird


    Z.B. ISignalDI\SingleSafe, di1,1,sig1int;

    Hallo,
    es besteht auch die Möglichkeit eine neue UAS-Konfiguration über einen RESTORE in die Steuerung zu laden.

    Hierzu muss Du wie folgt vorgehen:

    1. Erstelle ein Backup von der Steuerung [1] die das UAS-Problem hat
    2. Konfiguriere an einem anderen Roboter [2] die UAS-Daten, so wie Du sie an in der Steuerung [1] benötigst.
    3. Erstelle ein Backup von dieser Steuerung [2].
    4. Kopiere die Dateien "uas_groups.xml" und "uas_users.xml" aus dem Verzeichnis "CS" des Backup der Steuerung [2] in das Verzeichnis "CS" des Backup der Steuerung [1].
    5. Führe einen RESTORE mit dem modifizierten Backup der Steuerung [1] aus, wobei Du die Checkbox "Include Controller Settings" anwählen musst, so dass die UAS-Daten installiert werden.

    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.