Beiträge von Michael J (FRAIMTEC)

    Also die Werkobjektberechnung ist die gleiche wie schon vorher beschrieben.


    hier mal für den Userpart.


    WobjCar.uframe:=DefFrame(p_X1,p_X2,p_Y\Origin:=1);


    das gleiche geht dann natürlich auch wie schon von Stromer gesagt für den Objectpart. (OFrame)


    WobjCar.oframe:=DefFrame(p_X1,p_X2,p_Y\Origin:=1);


    Normalerweise hat man dann aber auch immer ein Masterwerkobjekt. Was durch Kameras,Taster etc ermittelt wurde und das andere wird dann nur noch draufgeschoben.


    Gibt noch so eine nette Funktion "PoseMult" für das Multiplizieren von Koordinatenverschiebungen.
    Kannst Du dir ja auch mal in der Doku anschauen.


    Grüße...

    Hallo Alex666.


    Klar kannst Du dir das Wobj mittels 3 Punkten ermitteln. Geht manuell über das Bewegungsmenü oder über das Datentypmenü. Man kann sich aber auch ein kleines Prog für schreiben was das erledigt. Muß halt einmal geteacht werden. Vorteil hierbei ist es ist später auch noch nachvollziehbar.


    Ist ganz easy also hier mal ein Bsp.


    PROC MessWobjTisch()
    !
    MoveJ RelTool(pTisch_X1,0,0,-100\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    MoveL RelTool(pTisch_X1,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveL pTisch_X1,v50,fine,R1_tLance;
    Stop;
    MoveL RelTool(pTisch_X1,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveJ RelTool(pTisch_X1,0,0,-200\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    MoveJ RelTool(pTisch_X2,0,0,-200\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    MoveL RelTool(pTisch_X2,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveL pTisch_X2,v50,fine,R1_tLance;
    Stop;
    MoveL RelTool(pTisch_X2,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveL RelTool(pTisch_X2,0,0,-200\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    MoveJ RelTool(pTisch_Y,0,0,-200\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    MoveJ RelTool(pTisch_Y,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveL pTisch_Y,v50,fine,R1_tLance;
    Stop;
    MoveL RelTool(pTisch_Y,0,0,-50\Rx:=0\Ry:=0\Rz:=0),v400,z1,R1_tLance;
    MoveJ RelTool(pTisch_Y,0,0,-300\Rx:=0\Ry:=0\Rz:=0),v500,z1,R1_tLance;
    WobjTisch.uframe:=DefFrame(pTisch_X1,pTisch_X2,pTisch_Y\Origin:=1);
    WobjTisch.oframe:=[[0,0,0],[1,0,0,0]];
    !
    Return;
    ENDPROC


    Dann bräuchtest Du nur noch deine Moves auf das Werkobjekt WobjTisch beziehen.


    Hoffe Du meintest das auch, wenn nicht gib einfach nochmal bescheid.


    Gruß...


    Ach, da war es wieder, mein Lieblingsthema beim Programmieren! Es fasziniert mich immer wieder, mit welcher Verbissenheit an Dogmen festgehalten wird, ohne den Sinn zu hinterfragen! :wallbash: :mrgreen: :zwink:
    Es zeugt immer von guter Programmierung, einen Code so einfach und überschaubar wie möglich zu halten! Wenn dabei ein GOTO Sinn macht, macht er halt Sinn! :genau:


    Na ja jedem das seine und manche Sachen muß man ja auch nicht kommentieren!!

    Hallo $CYCFLAG,


    also ich kenne niemanden und wer an seinem Job hängt der lässt das bestimmt auch sein!


    Dieses Programm fällt wohl eher unter die Rubrik "Spass". Meiner Meinung nach.


    In diesem Sinne...


    Gruß...

    Würde ich auch mit CrossConnection lösen.


    Hier mal ein paar Bsp. für die S4 Klasse.


    Mit UND Operator:
    -Lact "E201 & E203 & E205" -Lres "viGr1Open"


    Mit ODER Operator:
    -Lact "E202 ! E204 ! E206" -Lres "viGr1Close"


    Achso invertieren kannst Du auch in der Config.
    Musst nur * vor deine Operanten stellen.


    zB. so.
    -Lact "*E210 & *E212" -Lres "viGr2Open"


    Gruss...

    Hallo thotrix,


    hier erst einmal der genaue Auszug aus der Doku.


    33506:Achscomputer cmd Fehler
    Timeout beim Senden oder Empfangen von Bewegungsbefehlen zum Achscomputer
    an Anschlußkarte %d
    Kontrolle:
    Neustart der Steuerung.
    System neu installieren.
    Achscomputer austauschen.


    würde aber auch mal die Servokabel und Stecker zu den einzelnen Achsmotoren kontrollieren.
    Hatte vor geraumer Zeit mal ein ähnliches Problem was dann auch auf die Servokabel zurück zuführen war.


    Gruss...

    Vesuch es mal so.


    PROC rMenü()
    IF freigabe=High nAntwort:=UIListView(\Header:=stHeader,lDialog\Buttons:=btnOK\Icon:=iconInfo);
    TEST nAntwort
    CASE 1: BL100;
    CASE 2: !Menü Werkzeug 2
    CASE 3: !Menü Werkzeug 3
    CASE 4: !Menü Werkzeug 4
    CASE 5: !Menü Werkzeug 5
    CASE 6: !Menü Werkzeug 6
    CASE 7: Return;
    DEFAULT:
    ENDTEST
    ENDPROC


    Jetzt macht er es nur einmal bis dein Siognal wieder kommt. Den Rest solltest Du alleine hinbekommen.


    Gruss...

    Sicher macht er das kontinurierlich wolltest Du ja auch so. Er machz es so lange bis Du freigabe=high bekommst und dann die Menüabfrage kommt. Es ist auch machbar, aber ,mal ehrlich ein wenig solltest Du dir auch den Kopf zerbrechen und nicht hier alles machen lassen. Dafür sind wir hier nicht da. Also erstmal selber Gedanken machen und wenn dann Fragen aufkommen, dann Fragen.


    Gruss...

    Das ist wirklich ärgerlich. Wie gesagt man könnte sich den Fahrbefehl selber schreiben, aber das ist doch schon etwas mehr aufwand.


    Den Encrypter wirst Du wohl nicht so einfach bzw. gar nicht bekommen. Den rückt ABB nicht raus!!!!


    Gruss...

    Hä?!?


    Sicher das es diese Zeile ist?


    Versuch nur mal Testweise.


    IF Di_Menü=high THEN
    nAntwort:=UIListView(Header:=stHeader,lDialogButtons:=btnOKIcon:=iconInfo);
    ENDIF


    Obwohl das eigentlich nicht anders ist!!


    Hab ich schon mitbekommen das Du noch lernst! :mrgreen:

    Dann ungefähr so.


    PROC rMenü()
    VAR BOOL bExit:=FALSE;
    IF Di_Menü=low Return; ! beenden wenn dein Signal DI nicht vorhanden

    WHILE (NOT bExit) DO
    IF Di_Menü=high nAntwort:=UIListView(Header:=stHeader,lDialogButtons:=btnOKIcon:=iconInfo);
    TEST nAntwort
    CASE 1: BL100;
    CASE 2: !Menü Werkzeug 2
    CASE 3: !Menü Werkzeug 3
    CASE 4: !Menü Werkzeug 4
    CASE 5: !Menü Werkzeug 5
    CASE 6: !Menü Werkzeug 6
    CASE 7: bExit:=TRUE;
    DEFAULT:
    ENDTEST
    ENDWHILE
    ENDPROC


    Gruss...

    Meinst Du das aktive Tool für das verfahren?


    Dann zB. so.


    PERS tooldata akttool:=[trUE,[[0,0,300],[1,0,0,0]],[50,[0,0,250],[1,0,0,0],7.622,6.872,0]];


    akttool:=CTool(); ! Einlesen des aktuellen Tools das gerade aktiv ist


    akttool könntest Du dann in deinem Menü immer mit deinem neuen Tool zuweisen zb. tool2,tool3 etc. Du müsstest dann deine Fahrbefehle aber immer mit akttoll fahren.


    zB. MoveJ pHome,v3000,z200,akttool;


    Schau aber nochmals in der Doku nach ob es das richtige für dich ist oder sag falls Du etwas anderes meinst.

    MODULE Main_Module


    CONST robtarget Home:=[[428.28,-219.61,627.60...
    CONST robtarget vor_1:=[[537.38,-455.82,556.42...
    CONST robtarget zurueck_1:=[[-73.79,681.75,539...
    CONST robtarget vor_2:=[[529.25,-339.72,326.17...
    CONST robtarget vor_3:=[[505.94,-200.12,38.82...

    VAR num nAntwort;
    LOCAL CONST string stHeader:="Wähle das Werkzeug aus";
    LOCAL CONST listitem lDialog{7}:=[["","BL 100"],["","2:Hier 2.te Auswahl rein"],["","3:Hier 3.te Auswahl rein"],["","4:Hier 4.te Auswahl rein"],["","5:Hier 5.te Auswahl rein"],["","6:Hier 6.te Auswahl rein"],["","7:Menü beenden"]];


    proc main()!
    rMenü;
    ENDPROC



    PROC rMenü()


    IF Di_Menü=low Return; ! beenden wenn dein Signal DI nicht vorhanden


    nAntwort:=UIListView(\Header:=stHeader,lDialog\Buttons:=btnOK\Icon:=iconInfo);


    TEST nAntwort
    CASE 1: BL100;
    CASE 2: !Menü Werkzeug 2
    CASE 3: !Menü Werkzeug 3
    CASE 4: !Menü Werkzeug 4
    CASE 5: !Menü Werkzeug 5
    CASE 6: !Menü Werkzeug 6
    CASE 7: Return;
    DEFAULT:
    ENDTEST


    ENDPROC

    PROC BL100()
    !Hier stehen Fahrdaten für das BL100

    MoveJ Home, v1000, fine, tool0;
    MoveJ vor_1, v1000, fine, tool0;
    MoveJ zurueck_1, v1000, fine, tool0;
    MoveJ vor_2, v1000, fine, tool0;
    MoveJ zurueck_1, v1000, fine, tool0;
    MoveJ vor_3, v1000, fine, tool0;
    MoveJ zurueck_1, v1000, fine, tool0;
    MoveJ Home, v1000, fine, tool0;
    ENDPROC
    ENDMODULE


    Dann erhalte ich folgende Fehlermeldungen:


    150 13:46:07 Programm wurde geändert.
    151 13:46:08 BL_Vakuum/T_ROB1/Main_Module (76) : Fehler 40137 : Syntaxfehler : Erwartet: 'trap', aber gefunden: 'var'
    152 13:46:08 BL_Vakuum/T_ROB1/Main_Module (77) : Fehler 40135 : Syntaxfehler : Erwartet: 'endtrap'


    Diese Fehler wie man sieht deuten auf Interrupts hin die falsch deklariert wurden. Fängt wie man ja auch sieht in der Zeile 76 an. Also mal in diese Zeilen schauen. Hat also normalerweise nix mit dem Menü zu tun. Solltest aber auch das main unter deine Deklaritionen hängen wie oben zu sehen.


    Gruss...

    VAR num nAntwort;
    LOCAL CONST string stHeader:="Wählen Sie ein Menü aus.";
    LOCAL CONST listitem lDialog{7}:=[["","1:Hier 1.te Auswahl rein"],["","2:Hier 2.te Auswahl rein"],["","3:Hier 3.te Auswahl rein"],["","4:Hier 4.te Auswahl rein"],["","5:Hier 5.te Auswahl rein"],["","6:Hier 6.te Auswahl rein"],["","7:Menü beenden"]];



    PROC rMenü()


    IF Di_Menü=low Return; ! beenden wenn dein Signal DI nicht vorhanden


    nAntwort:=UIListView(\Header:=stHeader,lDialog\Buttons:=btnOK\Icon:=iconInfo);


    TEST nAntwort
    CASE 1: !Menü Werkzeug 1
    CASE 2: !Menü Werkzeug 2
    CASE 3: !Menü Werkzeug 3
    CASE 4: !Menü Werkzeug 4
    CASE 5: !Menü Werkzeug 5
    CASE 6: !Menü Werkzeug 6
    CASE 7: Return;
    DEFAULT:
    ENDTEST


    ENDPROC


    Nur mal so als Ansatz. Möglichkeiten gibt es noch etliche. Den Rest solltest Du ja alleine hinbekommen.


    Gruss...