Übergabe eines Cameradev in andere Routinen

  • Mahlzeit,


    leider ein Thema über das ich nun schon einmal gestolpert bin. . .


    Folgende Situation:

    Ich möchte mir eine saubere Fehlerbehandlung bauen, welche auch diverse Kameras (Cognex) beinhaltet.

    Soll heißen, ich möchte beispielsweise im Fehlerfall "ERR_CAM_NO_RUNMODE" (Kamera befindet sich nicht im Runmodus) in der Fehlerbehandlung eine Routine aufrufen, welche mir den Runmode setzt und das ganze prüft. Hierzu sollte idealerweise die Kamera mit übergeben werden sodass ich das nicht für jede Kamera tun muss.


    Sähe dann in meiner Vorstellung aus wie

    Code
    PERS cameradev Camera:=is7200;
    
    IF ERRNO=ERR_CAM_NO_RUNMODE THEN
        Cam_SetRunmode(Camera)
    ENDIF

    Jetzt werden sicher einige bemerkt haben, dass sich der datentyp "cameradev" nicht übergeben oder in eine Variable stecken lässt.

    So kommt bei ValToStr(is7200) zum beispiel die Meldung es handle sich nicht um ein Value.


    Kennt jemand die korrekte Vorgehensweise oder einen Workaround dafür?

  • ANZEIGE
  • Hallo,


    wenn Du bei bein Deiner Routine "Cam_SetRunMode" die Camera mit dem Schlüssel "VAR" definierst, kannst Du auch Non-Value Datentypen an eine andere Routine übergeben (z.B. Signale, Interrupt, etc.).


    Code
    PROC Cam_SetRunMode(VAR cameradev camera)


    Mfg

    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Hallo Micky,


    danke für den Tipp!

    Allerdings löst das mein Problem nur bedingt.

    Ich möchte vermeiden dass ich für jede Fehlerbehandlungroutine im Fehleraufruf die Kamera von Hand eingeben muss (das wären in Summe einige stellen).


    Vielmehr möchte ich sowas machen wie:

    Code
    (PERS VAR oder Ähnliches) cameradev CameraType:=is7801;

    So könnte ich die Fehlerbehandlungen mit dem Namen "CameraType" programmieren. Für den Fall dass die Kamera mal getauscht wird (oder aus irgendwelchen Gründen geändert) brauche ich damit nur an einer stelle eine Änderung vornehmen statt die ganze Fehlerbehandlung (und sicher auch andere Stellen im Code) durchzuackern.


    Das lässt RAPID aber leider nicht zu.


    Sicher ließe sich das mit "Suchen und ersetzen" auch ändern, aber diese Variante würde mir weitaus besser gefallen.


    Ich hoffe ich konnte mich verständlich ausdrücken.


    //EDIT

    Ich hatte es auch schon mit AliasCamera versucht. So kann ich an einer Stelle einen String angeben und meinen eigenen Kameranamen verwenden.

    Allerdings löst es das Problem mit der Übergabe nicht. Zwar habe ich die vorhergehende Meldung durch einfügen des 'VAR' wegbekommen, dafür taucht nun der bei mir so beliebte Argumentenfehler 124 (Argument for 'VAR' parameter <platzhalter> is not variable reference or is read only.) auf.


    Im Grunde also eine Wahl zwischen Regen und Traufe.

    Einmal editiert, zuletzt von yuminist () aus folgendem Grund: Weiterer Fortschritt angefügt

  • Hallo yuminist,


    gemäß Handbuch wird der Datentyp cameradev nur als Übergabeparameter an Routinen oder für den Befehl "AliasCamera" gebraucht, da die Kamera bereits in den Systemparametern definiert wird.

    cameradev (camera device) is used to define the different camera devices which can be controlled and accessed from the RAPID

    program. The data type cameradev is used for instructions and functions communicating with a camera. The names of the camera

    devices are defined in the system parameters and, consequently, must not be defined in the program


    Die zu verwendete Kamera (is7801) kann in der Datendeklarion nicht direkt zuwiwsen werden, da es sich bei "cameradev" um einen Non-Value-Datentyp handelt. Die Zuweisung der zu verwendenden Kamera erfolgt über die Instruktion "AliasKamera".


    Da die Kamera-Instruktionen explizit die Datendeklaration "VAR" und nicht "PERS" erwarten, solltest Du die Kamera-Deklaration wie folgt ändern:

    Code
    VAR cameradev Camera;


    Falls der Kameratyp sich bei einem Tausch ändert, muss dies in den Systemparametern der Kameradefintion eingestellt werden.

    Wenn der Name Kamera so gewählt wird, dass er dessen Funktion (z.B. CAMERA_L) und nicht den Kameratyp (z.B. is7200) beschreibt, muss der Programmcode danach nicht geändert werden.


    Der Befehl "AliasCamera", wird wie im Handbuch beschrieben, verwendet wenn allgemeingültige Module die unverändert und unabhängig von der Kamera in verschiedenen Tasks eingesetzt werden sollen (Ähnlich wie bei AliasIO).


    Du könntest Deine Kameraoperationen ggf. auch in separaten Routinen kapseln, so dass die zu verwendende "CameraDev" übergeben wird. In diesem Fall, kann in der gesamten Routine und der Fehlerbehandlung die übergebene Kamera-Device verwendet werden, ohne das der Name angepasst werden müsste.


    z.B.



    Gruß

    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Hallo Micky,


    zunächst vielen Dank für deine Mühe aber

    ich denke genau das habe ich getan.

    In meinen Datendeklarationen habe ich ein

    Code
    VAR cameradev Camera;

    auf das ich ganz zu Anfang mit

    Code
    AliasCamera "Kameraname",Camera;

    zeige. Für mein Verständnis suche ich also in der Konfiguration nach "Kameraname" und verweise das gefundene Gerät auf das Cameradev "Camera" sodass ich Camera anderweitig verwenden kann.


    In meinen Routinen benutze ich das dann wie folgt:

    Code
    PROC Cam_Busy (VAR cameradev Cameraname)
    ...
    Waittime 5;
    ...
    ENDPROC

    Beim Aufruf dann entsprechend

    Code
    Cam_Busy(Camera);

    Dort bekomme ich dann den Argument error(124) welcher besagt VAR parameter is not variable reference or is read only.


    Entweder habe ich in dieser Konstruktion etwas grundlegend nicht verstanden, oder es will tatsächlich nicht.

  • Hallo yuminist,


    soweit ich Dein Programm nachvollziehen kann , sollte es bis zum Aufruf von "Cam-Busy" korrekt sein, so dass ich vermute, dass der Fehler innerhalb dieser Routine auftritt.


    Innerhalb der Routine Cam_Busy musst du die Befehle von "Intergrated Vision" mit dem übergebenen Parameter "CameraName" verwenden um darauf zugreifen zu können.

    Code
    Tpwrite "Camera Name"+CamGetName(cam);

    Ein direkter Zugriff auf "CameraName" mit "ValtoStr" oder ähnlichen Befehlen ist nicht möglich.


    Bei welcher Instruktion innerhalb der Routine "Cam_Busy" trat der Fehler auf ?


    Probiere bitte auch einmal aus was passiert, wenn Du Deine Kamera-Definition aus den Systemparametern direkt an die Instruktion "Cam_Busy" übergibst.


    Gruß

    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Hallo Micky,


    rufe ich die Kamera direkt mit dem Namen aus den Systemparametern auf, bekomme ich den selben Fehler. In der Cam_Busy stehen aktuell nur TPWrite aufrufe und keinerlei Funktionen die in irgendeiner Art und weise auf die Kamerazeiger zugreifen wollen.


    Ich habe eine ähnliche Funktion mit AliasIO gebaut, und dort funktioniert es einwandfrei (Ich zeige am Anfang in einem Event einen Ausgang auf einen anderen allgemeingültigen Namen der verwendet und teils auch übergeben wird)


    //EDIT

    Ich habe es gefunden...es funktionierte nicht weil ich ein Trottel bin :D


    beim Aufruf habe ich stets Cam_Busy(Camera); genutzt....


    bei dem AliasIO jedoch ohne Klammern. Nehme ich die Klammern weg, ist alles in Ordnung.

    Oft sieht man den Wald vor lauter Bäumen nicht....


    Vielen Dank für die Mühen und Hilfestellungen

    Einmal editiert, zuletzt von yuminist ()

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