Frame über Variable verändern ?!

  • Hallo,


    ich muss kommende Woche nach Shanghai reisen um dort mit unserem Fanuc M710 eine Testzelle aufzubauen und zu Programmieren. Es soll eine Karosse mittels 3D Kamerasystem erfasst werden. Anschließend Unterbodenschutz auftragen. Meine Frage bezieht sich jetzt auf das Kamerasystem.
    Das System wird mittels SPS verbunden und die SPS rechnet die erfassten Daten aus und leitet Sie mir über die DI's weiter. einmal Werte für +X / +Y etc. und das ganze für Minus. Dafür werde ich am Besten Gruppenein/ausgänge erstellen. Ich habe auch schon ein Karel Programm bekommen, indem zwei User Frames miteinander verrechnet werden. Sprich das Originalframe der Karosse und das verschobene Frame (Karosse wurde versetzt/verdreht) dessen Daten ja von der SPS dann kommen.
    Nun weiß ich aber nicht, wie ich die einzelnen Werte des Frames für X und Y etc. via Variable ändern kann :(
    ich kenne die Variable $MNUFRAME[1,1] also Gruppe 1 und Frame 1 aber wie kann ich ganze Werte hinenschreiben? Kann mir da eventuell jemand helfen?

  • KUKA Handwerk
    Anzeige
  • Hallo Viper,
    also wenn ich eine Anwendung mit Korrekturwert, bzw Offset hatte, hab ich das nicht über eine Frame-Manipulation gemacht, sondern die Offset-Werte in ein Positionsregister geschoben und den punkt dann mit diesem PR als Offset angefahren.
    Ich weiß zwar nicht was in deinem Karel-Programm drin steht oder ob das in deinem fall überhaupt möglich ist. Aber wenn du nur Offset-Werte von der SPS bekommst, dann halte ich meine Lösung für sinnvoll, bzw am leichtesten!


    Ansonsten lässt sich natürlich auch ein Frame manipulieren!
    Könnte so ausschauen:


    1: PR[33]=UFRAME[1] ;
    2: PR[34,1]=PR[33]+GI[1] ;
    3: PR[34,2]=PR[33]+GI[2] ;
    4: PR[34,3]=PR[33]+GI[3] ;
    5: PR[34,4]=PR[33]+GI[4] ;
    6: PR[34,5]=PR[33]+GI[5] ;
    7: PR[34,6]=PR[33]+GI[6] ;
    8: UFRAME[2]=PR[34] ;
    9: UFRAME_NUM=2 ;


    Dabei ist Frame 1 dein "Basisframe" und Frame 2 dann dein Basisframe pluf Offsets. Ich bin mirr nicht sicher, ob man die PR direkt mit einem GI beschreiben kann, hab grad leider kein Fanuc zur Hand, ansonsten muss man halt die GI zuerst auf R schreiben und dann die R auf die PR schreiben.


    Ich hoffe ich konnte dir damit ein wenig weiter helfen!


    Grüße
    Heinz

  • Hallo Heinz!


    :danke: Damit konnte ich doch schon mal etwas anfangen. Ich habe das mal im Roboguide getestet.
    Dann ist mir noch auf bzw. eingefallen, dass die Werte der Gruppeneingänge ja nur positiv sind. Laut der Schnittstellenbeschreibung des Kamerasystems gibt es deswegen extra separate Bereiche. Z.B Byte 8 / Bit 0-7 für +X und Byte 9 / Bit 0-7 für -X. So werde ich dann entsprechend die Gruppeneingänge configurieren. In meinem Testprogramm ist der Bereich +X auf GI[1] gelegt und -X auf GI[7]. Sobald ein Wert auf GI[7] dann angekommen ist muss ich ihn nochmal *(-1) nehmen. Das ganze würde dann natürlich noch bis GI[12] weitergehen...
    Anschließend habe ich mein Karelprogramm zum verrechnen der Frames genutzt. CALL MULTFRAME(2,1,3) wobei die 2 für mein Basisframe steht. Die 1 für die Daten von der SPS bzw. die Gruppeneingänge und die 3 dann das fertige Frame. So funktioniert's wie ich mir das gedacht habe! :ylsuper:



    1: PR[1,1]=(GI[1]) ;
    2: PR[1,2]=(GI[2]) ;
    3: PR[1,3]=(GI[3]) ;
    4: PR[1,4]=(GI[4]) ;
    5: PR[1,5]=(GI[5]) ;
    6: PR[1,6]=(GI[6]) ;
    7: ;
    8: PR[1,1]=(GI[7]) ;
    9: ;
    10: IF (GI[7]>0),JMP LBL[1] ;
    11: ;
    12: JMP LBL[99] ;
    13: ;
    14: LBL[1] ;
    15: PR[1,1]=GI[7]*(-1) ;
    16: ;
    17: LBL[99] ;
    18: ;
    19: UFRAME[1]=PR[1] ;
    20: CALL MULTFRAME(2,1,3) ;
    21: ;
    22: UFRAME_NUM=3 ;
    /POS
    /END



    hier nochmal das Karelprogramm, falls es mal jemand gebrauchen kann:


    VAR
    datatype, intparam, STATUS : INTEGER
    realparam: REAL
    stringparam : STRING[50]
    SourceFrame: INTEGER
    Correction: INTEGER
    TargetFrame: INTEGER



    ROUTINE TP_CLS
    BEGIN
    WRITE (CHR(128),CHR(137)) -- By default this will clear TPDISPLAY
    WRITE TPERROR (CHR(128),CHR(137))
    WRITE TPSTATUS(CHR(128),CHR(137))
    WRITE TPPROMPT(CHR(128),CHR(137))
    WRITE TPFUNC (CHR(128),CHR(137))
    FORCE_SPMENU(TP_PANEL,SPI_TPUSER,1) -- Force the USER menu screen
    -- to be visible last.
    -- This will avoid the screen from
    -- flashing since the screen will
    -- be clean when you see it.
    END TP_CLS


    ------------------------------------------------------------
    ---the entry point------------------------------------------
    ------------------------------------------------------------
    ------------------------------------------------------------
    BEGIN
    $TP_USESTAT=TRUE


    GET_TPE_PRM(1, datatype, SourceFrame, realparam, stringparam, STATUS)
    IF (STATUS = 0) THEN
    IF (datatype = 1) THEN
    GET_TPE_PRM(2, datatype, Correction, realparam, stringparam, STATUS)
    IF (STATUS = 0) THEN
    IF (datatype = 1) THEN
    GET_TPE_PRM(3, datatype, TargetFrame, realparam, stringparam, STATUS)
    IF (STATUS = 0) THEN
    IF (datatype = 1) THEN
    $MNUFRAME[1, TargetFrame] = $MNUFRAME[1, SourceFrame] : $MNUFRAME[1, Correction]
    RETURN
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ENDIF


    TP_CLS
    WRITE('Usage:',CR)
    WRITE(' MULTFRAME (SourceFrameNb, MultFrameNb, TargetFrameNb)',CR)
    POST_ERR(STATUS, '', 0, 0)
    END MULTFRAME

  • Hallo Viper,
    ja das ist mir dann auch noch eingefallen, dass man ja separate GIs für positive und negative Werte braucht, da ein GI nicht negativ sein kann. Da muss man dann halt ein bisschen rum tricksen ;)


    In einem früheren Projekt habe ich das mal so realisiert:


    9: LBL[1] ;
    10: ;
    11: R[130:RROffsetPlus]=(GI[14:RROffsetPlus]/1000) ;
    12: R[131:RROffsetMinus]=(GI[15:RROffsetMinus]/1000) ;
    13: ;
    14: IF (R[130:RROffsetPlus]*R[131:RROffsetMinus]<>0),JMP LBL[10] ;
    15: ;
    16: PR[57,1:Plac Offset]=0 ;
    17: PR[57,2:Plac Offset]=0 ;
    18: PR[57,3:Plac Offset]=(R[130:RROffsetPlus]-R[131:RROffsetMinus]) ;
    19: PR[57,4:Plac Offset]=0 ;
    20: PR[57,5:Plac Offset]=0 ;
    21: PR[57,6:Plac Offset]=0 ;
    22: ;
    23: END ;
    24: ;
    25: LBL[10] ;
    26: !One of the values is not 0 ;
    27: PAUSE ;
    28: JMP LBL[1] ;
    29: ;


    Das hat eigentlich auch gut funktioniert!


    Aber wenn es so nun klappt, ist ja alles in Ordnung :D


    Viele Grüße
    Heinz

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now