Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
07. Februar 2012, 14:37:32
Übersicht Hilfe Suche Kalender Einloggen Registrieren
News: English and international Robotsupport now on Robot Forum. Also Supported by the Moderators of the roboterforum.de

Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  KUKA Roboter (Moderatoren: Werner Hampel, stefanM, IrrerPolterer)  |  Thema: VARSTATE setzen 0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: VARSTATE setzen  (Gelesen 764 mal)
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« am: 30. Juli 2010, 09:47:34 »

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
Gespeichert
drudge
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 281



« Antworten #1 am: 30. Juli 2010, 11:07:43 »

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}
...
Gespeichert
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #2 am: 30. Juli 2010, 11:13:24 »

Ich mich bestimmt viel zu undeutlich ausgedrückt (oder ich habe deine Antwort nicht ganz verstanden  Denken).

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.

Gespeichert
Roland56
Junior Member
****
Offline Offline

Geschlecht: Männlich
Beiträge: 183


« Antworten #3 am: 30. Juli 2010, 12:14:59 »

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

Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Albert Einstein
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #4 am: 30. Juli 2010, 12:17:02 »

dann ist die Variable doch im #INITIALIZED Zustand, oder?
$NULLFRAME bezeichnet doch {X0, Y 0, Z 0, A 0, B 0, C 0}.
Gespeichert
drudge
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 281



« Antworten #5 am: 30. Juli 2010, 13:19:26 »

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...
Gespeichert
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #6 am: 30. Juli 2010, 13:46:59 »

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 Wink ). 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 Wink )
sk
Gespeichert
drudge
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 281



« Antworten #7 am: 30. Juli 2010, 13:53:19 »

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.
Gespeichert
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #8 am: 30. Juli 2010, 14:05:33 »

 Denken Schlechtes Beispiel...  Denken

...Ersetze LIN_REL durch LIN
Gespeichert
drudge
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 281



« Antworten #9 am: 30. Juli 2010, 14:15:00 »

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)
Gespeichert
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #10 am: 30. Juli 2010, 14:49:06 »

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 Wink )

--
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.  Neutral
Gespeichert
Loipe
Special Member
*****
Online Online

Geschlecht: Männlich
Beiträge: 240



« Antworten #11 am: 31. Juli 2010, 03:03:59 »

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
Gespeichert

wer das hier liest hat zuviel zeit oder einen viel zu großen bildschirm
spamkiller
Neuling
*
Offline Offline

Beiträge: 17


« Antworten #12 am: 31. Juli 2010, 10:40:12 »

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  Wink
Gespeichert
IrrerPolterer
Administrator
Forenjunkie
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1501


Nur ein Irrer erkennt einen Irren!


WWW
« Antworten #13 am: 02. August 2010, 12:13:28 »

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.
Gespeichert

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.
SpeedFreak
Junior Member
****
Offline Offline

Geschlecht: Männlich
Beiträge: 199

überbrücke mal den NOT-Aus! ... aber langsam ...


« Antworten #14 am: 02. August 2010, 14:07:35 »

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
Gespeichert

200% Override ... irgendwas klingt hier komisch ... und irgendwie riecht es auch ...

Abkühlzeit Bremsen Achse 2: 57 Sekunden Very Happy
Seiten: [1] Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  KUKA Roboter (Moderatoren: Werner Hampel, stefanM, IrrerPolterer)  |  Thema: VARSTATE setzen « vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS