VARSTATE setzen

  • Hallo,


    VARSTATE() liefert ja den Zustand einer Variablen. Gibt es eigentlich auch eine Funktion zum Setzen eines VARSTATEs?


    In meinem speziellen Fall habe ich eine Funktion, die einen OUT Parameter hat. Dieser OUT Parameter ist eine Struct die einen Integer und einen Frame enthält. Die Funktion liest externe Daten ein und speichert sie in dem OUT Parameter.


    Es kommt vor, dass Teile des Frames fehlen (also X, Y, Z, A, B oder C). Das ist soweit kein Problem, ich deklariere einfach eine lokale Variable FRAME tmpFrame, beschreibe nur die vorhandenen Teile und weise dem OUT Parameter tmpFrame zu.


    Wenn jetzt aber alle Teile fehlen, dann weise ich nach meiner Methode niemals einen Wert (X, Y, Z, A, B und C niemals zugewiesen) tmpFrame zu und bei der Zuweisung zum OUT Parameter bekomme ich den Fehler, dass die Variable ungültig sei (also nicht initialisiert).


    Die OUT Variable in diesen Fällen gar nicht zuweisen geht auch nicht, da dann einfach der alte Wert des OUT Parameters erhalten bleibt.Wie komm ich denn da wieder raus? :bawling:


    Also wenn ich den OUT Parameter auf "nicht initialisiert" setzen könnte...


    Grüße in Forum
    sk

  • Schritt für Schritt zum Roboterprofi!
  • also um den VARSTATE #DECLARED zu kriegen muss an einem gültigen Ort folgende Zeile stehen:

    Code
    DECL myVar_Typ myVar_Name


    um dann noch den VARSTATE #INITIALIZED zu kriegen, musst du irgendwo einen Wert zu weisen:

    Code
    z.B.
    myInteger_Var = 0
    myReal_Var = 0.0
    myFrame_Var = $NULLFRAME
    myE6POS_Var = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0, S 0, T 0, E1 0.0, E2 0.0, E3 0.0, E4 0.0, E5 0.0, E6 0.0}
    ...
  • Ich mich bestimmt viel zu undeutlich ausgedrückt (oder ich habe deine Antwort nicht ganz verstanden :denk:).


    Abgekürzt wollte ich wissen:
    Wenn ich eine Variable habe, die im Zustand #INITIALIZED ist, wie kann ich diese Variable auf #DECLARED zurücksetzen?
    Bei einzelnen Komponenten eines FRAMEs geht das, es sei denn man will alle Komponenten zurücksetzen.

  • Wie simeonw schon geschrieben hat.
    Einfach vor der Wertezuweisung tmpframe = $Nullframe.

    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.<br />Albert Einstein

  • soweit ich weiss kann eine Variable nicht von "initialisiert" auf "deklariert" zurückgesetzt werden. Das macht aus meiner Sicht Programmiertechnisch auch keinen Sinn. Ausser man wählt das Programm ab und startet es dann wieder.


    Was ich schon gemacht habe, ist eine CHAR Array das ich brauchte um ein Daten Array mit Varstate abzufragen und dann die Resultate darin zu speichern ("U" = undefined, "I" = initialized und "D" = deklariert) Später arbeitete ich dann mit diesem CHar array, um nur wo wirklich nötig nochmals eine VARSTATE Abfrage zu machen. Denn die VARSTATE Funktion braucht ziemlich viel Rechenzeit. (Was besonders im Submit lästig ist.)


    Vielleicht könnte dir dieser Workaround auch helfen...

  • Programmiertechnisch mach das sehr wohl Sinn. Sagen wir, es gibt eine Liste von Frames die du anfahren möchtest, allerdings ohne die Orientierung des Tools zu verändern. Die Lösung ist die ABC Werte der Frames auf #DECLARED zu setzen. Da das direkt nicht geht, deklarierst du wahrscheinlich einen tmpFrame und weist dem nur die Werte XYZ zu und fährst dann tmpFrame an.


    Ich verstehe nur nicht, warum es möglich ist, eine relative Bewegung in {X 10, Y 10} zu machen (Z, A, B, C sind dabei #DECLARED und werden von LIN_REL ignoriert), aber nicht LIN_REL {} (was meines Erachtens einfach zu keiner Bewegung führen sollte). Sicher kann man behaupten, dass es wenig Sinn macht, den Roboter anzuweisen, keine Bewegung zu machen (und das sagen wir... 3 mal oder so ;) ). Tatsächlich kann es aber dazu kommen, was dann allerdings einen STOP verursacht (also nicht "keine Bewegung").


    Aber das alles ist eigentlich nicht ganz genau mein Problem und ich denke, ich kann mit der "Markierung" leben.


    Vielen Dank nochmal, ich hoffe ich kann mich irgendwann mal revanchieren (bin ja noch Neuling ;) )
    sk

  • hmm ich sehe dein Problem nicht ganz.

    Code
    LIN_REL {X 10, Y 10}


    ist das selbe wie

    Code
    LIN_REL { X 10, Y 10, Z 0, A 0, B 0, C 0}


    wieso setzt du dann die nichtbenötigten Werte nich auf 0?


    Wenn das aber nicht geht, dann arbeite mit dem Geometrischen Operator. Das funktioniert bestimmt.

  • dann ersetzte

    Code
    LIN_REL { X 10, Y 10, Z 0, A 0, B 0, C 0}


    durch

    Code
    DECL FRAME fTemp
    fTemp = $NULLFRAME
    fTemp = {X 10, Y 10}
    
    
    LIN P1
    
    
    LIN fTemp:P1


    oder ähnlich (Vorsicht mit dem Vorlaufzeiger und $POS_ACT)

  • Verstehe ich das richtig? Ist

    Code
    LIN fTemp:P1


    gleichbedeutend mit


    Code
    LIN_REL fTemp


    wenn der Roboter auf P1 steht? (dann habe ich wieder was gelernt ;) )


    --
    Wozu machst du

    Code
    fTemp = $NULLFRAME


    , wird doch wieder überschrieben durch

    Code
    fTemp = {X 10, Y 10}


    Letztlich sind Z, A, B und C (von fTemp) wieder #DECLARED


    --


    Das LIN {X 10, Y 10} funktioniert, war mir ja klar. Das was ich eigentlich nicht verstehe war, dass LIN {} nicht funktioniert. Man kann beliebige Komponenten eines Frames "löschen" und immer ist die Bewegung noch möglich, bis auf einen einzigen Fall: wenn alle Komponenten gelöscht worden sind.


    Ist halt so in der KRL definiert, ich weiss nur nicht warum. :-|

  • Hallo zusammen


    schöne grüße aus China.


    LIN fTemp:P1 ist net gleichbedeutend mit LIN_REL fTemp weil wenn du eine satzanwahl auf
    LIN fTemp:P1 machst eine absolute Position anfährst was auch beim fünften mal abfahren die selbe ist.
    wobei du wenn du das auf LIN_REL fTemp machst der roboter jedesmal relativ zu seiner aktuellen Position sich um das Frame fTmp verfährt.
    wenn dann kannst du sagen.
    das LIN_REL fTMP
    gleich ist mit
    LIN $POS_ACT:fTmp (aktuelle Position um fTmp im Toolkoordinatensystem verschoben)
    LIN fTmp:$POS_ACT (aktuelle Position um fTmp im Basekoordinatensystem verschoben)
    ist



    Frames sind übrigens die einzigen Variablen (meines Wissens) die net deklariert werden müssen.
    einfach einen Namen wie fTmp nen $NULLFRAME zuweisen und losgehts.


    wenn du ein Frame in LIN oder LIN_REL benutzt wo net alle Komponenten Initialisiert bekommst du einen fehler, da er nicht initialsierte werte halt keinen wert haben, deswegen empfehle ich vor beschreiben eines Frames das zur Bewegung dient immer ein $NULLFRAME drüber zu schreiben.



    Gruß Loipe

  • Jetzt bin ich verwirrt :huh:

    Zitat von Loipe

    wenn du ein Frame in LIN oder LIN_REL benutzt wo net alle Komponenten Initialisiert bekommst du einen fehler, da er nicht initialsierte werte halt keinen wert haben, deswegen empfehle ich vor beschreiben eines Frames das zur Bewegung dient immer ein $NULLFRAME drüber zu schreiben.


    Ist es denn nicht möglich, z.B. LIN {X 10} zu benutzen, damit er 10 mm in X fährt?


    Und selbst wenn nach nach

    Code
    fTemp = $NULLFRAME
    fTemp = {X 10, Y 10}


    fTemp's Z, A, B und C Komponente aus $NULLFRAME erhalten bliebe (im Variablen Fenster sieht das nicht so aus), dann würde

    Code
    LIN fTemp


    doch dazu führen, dass er auch Z, A, B und C (wären dann alle 0) bei der Bewegung berücksichtigt.


    EDIT:
    Viele Grüße nach China ;)


  • Ist es denn nicht möglich, z.B. LIN {X 10} zu benutzen, damit er 10 mm in X fährt?


    Nein, die Bewegung geht zur Koordinate X=10mm und nicht 10mm in X-Richtung.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Zitat von: spamkiller am 31. Juli 2010, 10:40:12
    Ist es denn nicht möglich, z.B. LIN {X 10} zu benutzen, damit er 10 mm in X fährt?



    hier wäre dann wie oben beschrieben wieder lin_rel der richtige befehl

    200% Override ... irgendwas klingt hier komisch ... und irgendwie riecht es auch ...<br /><br />Abkühlzeit Bremsen Achse 2: 57 Sekunden :D

    Einmal editiert, zuletzt von SpeedFreak ()

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