Beiträge von yuminist

    Hallo zusammen,


    ich suche eine Möglichkeit ein Not-Aus-Event abzuspeichern.

    Der Gedanke ist zu erfassen, ob in die Lichtschranke gegriffen wurde (oder Halt ein Not-Aus anlag)


    Im ersten Impuls habe ich versucht in einem statischen Task über eine Trap eine bool zu beschreiben. DIes war jedoch nicht von Erfolg gekrönt da offenbar auch die statischen Tasks angehalten werden.


    Kennt jemand einen Kniff mit dem ich das abfragen kann?

    Hm aus dem Stehgreif nicht.


    Hast es mit den normalen Python-Befehlen mal versucht? Ich bin mir nicht sicher in wieweit die im URscript integriert sind...


    ansonsten mal

    Code
     "%.3f" % get_actual_tcp_pose()

    versuchen. Ist ein string Workaround (ebenfalls für Python) - gerne eine Rückmeldung ob das klappt

    Kann mich beiden Vorrednern nur anschließen.


    Auf deinen Code bezogen kannst du höchstens bis auf die erste Nachkommastelle kürzen. Würde in vielen Fällen vermutlich funktionieren, hat aber mit "sicher" nicht viel zu tun. :)

    Hallo und willkommen :)


    Ich hatte noch nicht viel mit der 5er SW zu tun, weiß aber dass


    testsignal


    ein ziemlich alter befehl ist.

    Vielleicht hilft der dir?

    Auszug aus der Doku im RS:


    Bin gespannt :)

    das problem was du vermutlich hast ist, dass in der ersten routine


    Code
    VAR rawbytes raw_send;
    VAR rawbytes raw_receive;

    definiert wurde. diese variablen gelten nur für diese routine und sind lokal.


    wenn du sie global haben willst, musst du sie auch so im modul deklarieren, oder halt nochmal in der routine in der du sie benutzen willst.


    oder habe ich da nun was missverstanden?

    Hallo,


    im Zweifel machst du das ganze über Socket-Verbindungen - ist zwar aufwändiger, funktioniert aber auch.

    Wenn eh einer von Cognex dabei ist, sollte das kein Problem darstellen. Haben wir auch schon mehrfach so umgesetzt.

    Ja das ganze findest du in dem Application Manual 'Integrated Vision'

    Die Kamera muss einmal im Robotstudio konfiguriert werden (wird als MAC erkannt)

    Danach kann diese über ihren Namen angesprochen werden.


    Im Grunde läuft es so:

    Die Kamera liefert ein Ergebnis (in deinem Fall also die Offsets)


    Nun kannst du mit 'CamGetResult' (zu finden n der Doku) das Ergebnis auslesen und entsprechend wegspeichern (oder halt direkt in dem Offs-Befehl nutzen => das hängt von der Struktur des Ergebnisses ab). Hierzu muss der Kamerajob allerdings auch explizit das Ergebnis als Ergebnis ausgeben, da RAPID sonst nicht in der Lage ist, dies als solches zu erkennen.


    Oder aber (und das bevorzuge ich persönlich) man arbeitet mit Symboltags die in dem Kamerajob vergeben werden.

    Diese kannst du dann mit 'CamGetParameter' oder 'CamSetParameter' manipulieren. Das bedarf etwas Absprache mti dem Kameraprogrammierer, ist aber kein Hexenwerk (im In-Sight-Explorer in der Tabellarischen Ansicht einfach via Kontextmenü den Symboltag für diese Zelle festlegen).


    So kannst du sehr Flexibel die Daten aus der Kamera gezielt zusammentragen und für deine Zwecke nutzen.


    Die Befehle findest du in der Hilfe (Instructions, Functionsand Data types) wenn du einfach mal 'camera' in die Suche tippst.


    Wenn du weitergehende Fragen dazu hast, helfe ich dir gern.


    Im Anhang das Application Manual für Integrated Vision

    Ja bei uns ist das eben auch so das sowas die SPS Kollegen machen bzw. einrichten. Bin nur auch immer gern etwas informiert bevor es losgeht. Will ordentlich vorbereitet sein.


    Dankeschön & schönen Gruß :thumbup:

    wenn es sich um smartkameras von cognex handelt, hat abb eine interne schnittstelle dazu und du kannst die kamera direkt ansprechen.


    sogar variablen abfragen und ändern => somit direkt in die daten des kamerajobs greifen


    das läuft dann soweit über symboltags

    Zitat von Langebua

    ! ## Wobj beschreiben ## !

    Wobj_verschoben:=wobj_OP140;


    Wieso geht der gleiche Befehl für Robtargets nicht? Habe es versucht quasi einen Schraube_10_verschoben punkt zu erstellen. Funktion nur für Wobj kommt als Syntax.

    Was meinst du damit?


    wobj_verschoben := wobj_OP140 => hier scheint die struktur zu passen

    robt_verschoben:= wobj_OP140 => wenn du das so meinst, dann versuchst du vielleicht ein werkobjekt in ein robtarget zu schreiben?

    wenn ja ginge das nur über


    robt_verschoben.trans := wobj_OP140.oframe.trans


    du musst halt darauf achten, dass die datentypen (strukturen) zueinander passen


    wenn du von der kamera offsets bekommst, die passen ist das einfach.


    für die kamera-referenzierung kannst du zum beispiel zwei marken nehmen:

    marke1: auf ide fährst du mit deinem TCP

    marke2: diese erkennt die kamera als koordinate


    die beiden marken haben einen definierten abstand zueinander


    entweder teilst du der kamera nun mit, dass ihr koordinatenursprung an marke1 ist (den abstand zu marke2 kennst du ja)

    oder aber du verrechnest diesen abstand der beiden marken dann im roboter



    angenommen die kamera macht das mit dem ursprung, hast du saubere offsets (auf die ausrichtung des koordinatensystems achten!)


    und kannst simpel mit


    Code
    PERS robtarget pTemp;
    PERS wojbdata wTemp;
    var num nOffsets{2};
    
    nOffsets := [KameraOffs_x,KameraOffs_y];
    pTemp := Schraube_10;
    wTemp := wDeinWerkobj;
    
    MoveL Offs(pTemp,nOffsets{1},nOffsets{2},0),v1000,fine,toolx\wobj:=wobj0;


    und sofern die Ausrichtung aller Koordinatensysteme passt, solltest du den Punkt direkt anfahren können.


    Tipp:

    um nicht auf koordinatensystemausrichtungen achten zu müssen, benutze ich kerne den oframe des werkobjektes (verschiebe ich mit posemult) da die des Punktes und/oder des TCP meist um x 180 oder y 180 gedreht sein müssen. da wird es manchmal ätzend mit den vorzeichen.


    Da würdest du dann entsprechend statt dem offs zusatz, den PoseMult Befehl nutzen.

    Wenn du das werkobjekt verschieben willst, kann ich nur empfehlen nicht den uframe, sondern den oframe zu verschieben


    punkte beziehen sich auf den oframe => TCP bezieht sich auf den punkt


    wie oben geschrieben benutze ich dafür gern temporäre dateien - dann kann dein werkobjekt, tcp und punkt gern eine konstante sein, ohne dass du gefahr läufst die originaldaten zu zerschießen.


    bei cognex kann ich evtl noch etwas unterstützen - bei omron bin ich raus


    deine kamera ist am roboter montiert - du solltest ihr also beibringen wo der tcp des roboters liegt (alternativ gern der oframe oder aber das robtarget) damit beide die selbe referenz benutzen.

    so kann dir die kamera direkt koordinaten senden.

    wenn du mit offsets arbeiten möchtest, braucht die kamera ein nullbild


    bei offsets wird der code für den roboter simpel da du mit der Offs Funktion arbeiten kannst.

    Da du dich nur im zweidimensionalen Raum bewegst, funktioniert das so


    Code
    !geht als einzeiler => hier aber darauf achten dass es nur einmalig ausgeführt wird
    Schraube_10.trans := [Schraube10_trans.x+KameraX,Schraube_trans.y+KameraY,0];

    Woher weiß deine Kamera dass Roboter (TCP) und die Kamera über den selben Ursprung sprechen damit die Offsets passen?


    Damit wird dein Robtarget 'Schraube_10" natürlich verändert. Ich würde da eine Zwischenvariable bevorzugen.


    Code
    PERS robtarget pTemp := Schraube_10;
    PERS num kTemp{2} := [KameraX,KameraY];
    
    pTemp.trans.x := pTemp.trans.x+kTemp{1};
    pTemp.trans.y := pTemp.trans.y+kTemp{2};
    
    MoveL pTemp ......

    Nicht wundern - ich mache das gern so, weil man dann bequem die Ausgangsdaten verändern kann (Kameradaten oder das Robtarget) ohne an 1000 Stellen anfassen zu müssen und gefahr läuft die Daten zu versauen.

    Ich hatte vor einiger Zeit ein ähnliches Problem und mich dann dazu entschlossen das ganze über RawBytes zu machen um diese Beschränkung zu umgehen und etwas zu haben was möglichst vielseitig einsetzbar ist. Inwieweit mir das gelang, bleibt abzuwarten :D


    Hier mal ein Beispielcode. Ich habe hier einen Record für meinen speziellen Fall benutzt aber das kann man ja beliebig umstricken.


    Vielleicht hilft es ja schon alleine als Denkanstoß

    ah die passage habe ich wohl übersehen - ich dachte ich hätte alles durchgeackert. so täuscht man sich -.-


    die nummer mit den parametern habe ich jetzt als "notlösung" implementiert. das eigentliche ziel jedoch war, dass ich auch mit eigenen records arbeiten kann (haben da aktuell einen ziemlich tief strukturierten datencontainer)


    aber vielen dank :)

    Hallo miteinander,


    Die Funktion ValToStr() kennt vermutlich jeder der schonmal Debugging betrieben hat.


    Das schöne daran ist, dass man diese mit nahezu jedem Datentyp (#ANYTYPE) füttern kann.



    Jetzt würde ich genau dieses #ANYTYPE für eine eigene Funktion umsetzen.

    Hintergrund ist der, dass ich eine RMQ-Schnittstelle bauen möchte, die ich variablenunabhängig füttern will.

    Soll heißen, es muss der Funktion (Prozedur) egal sein dürften, ob nun eine num,string,wobjdata oder sonstetwas kommt was sie versenden soll. solange am anderen Ende der selbe Datentyp abgefragt wird, sollte die Kommunikation klappen.


    Leider habe ich bisher in der Doku nichts weiter finden können was einen Hinweis darauf gibt, ob und vor allem wie man dies für seine persönlichen Schweinereien nutzen kann.



    Hat das schonmal jemand benutzt oder zumindest einen Ansatz?=O

    Hatte einen ähnlichen Fall (allerdings mit weit mehr Tasks)


    Ich habe keine statischen Tasks und ebenfalls auf NoSafety. Passend dazu habe ich dann eine Trap in jedem zu stoppenden Task erstellt (Inhalt Stop;) und die Traps dann alle an das selbe Signal geknüpft.


    So hat man bei dem Signal (man könnte ja auch Variablen (bool) nutzen) mit dem man beliebig viele (und/oder ausgewählte) Tasks anhalten kann.


    Dann über ein Systemsignal PP auf main und fertig ist die Suppe

    Moin,


    bei Weitem keine bevorzugte Lösung, aber derzeit die Einzige die mir einfällt wäre, über das Webinterface zu gehen respektive eine json zu schicken oder ähnliche Wege einzuschlagen.


    Der Nachteil hier ist eindeutig, dass man ohne Mehraufwand nicht mal eben ein Statusupdate bekommt. Manche Funktionen sendet man einfach, und hofft dass diese ankommen und auch umgesetzt werden.