Hallo,
ich arbeite seit einigen Tagen mit KRL XML. Die Prinzipielle Funktionsweise habe ich im Grossen und Ganzen verstanden. Die ersten kleine Programme funktionieren auch (eigenen Sensor definiert, steuern des Roboters über c# Applikation etc.). Dennoch habe ich ein paar grundsätzliche Fragen zurThematik....
Als Beispiel verwende ich z.B. folgenden Sensor: "MySimpleSensor.xml"
<Elements>
<Element Tag="Sensor2Robot" Type="STRUCTTAG" Stacksize="100" />
<Element Tag="Sensor2Robot.XPos" Type="REAL" Stacksize="100" />
</Elements>
Das öffnen des Kommunikationskanals würde dann so aussehen (KRL Prog wartet auf das "accept" vom Server-Socket)
errint = -100
sensorname[]="MySimpleSensor"
WHILE errint == -100
errint = EKX_open(sensorname[])
;EKX_handleerror(errint)
ENDWHILE
Der Aufbau der Datensätze folgt entsprechend:
; send structure
sendtext[1].s[] = "<Robot2Sensor>"
sendtext[2].s[] = " <XPos>1</XPos>"
sendtext[3].s[] = "</Robot2Sensor>"
; receive structure
rectext[1].s[] = "MySimpleSensor.Sensor2Robot.XPos"
rectext[2].s[] = "MySimpleSensor.Sensor2Robot"
So - nun zu den eigentlichen Fragen...
--------------------------------------
Das warten auf neue Sensordaten erfolgt beispielsweise über
errbl = EKX_WaitForSensorData(1, rectext[2].s[], 1000)
Gibt es eine möglichkeit permanent ankommende Daten mitzuloggen/in den Puffer zu speichern? Also beispielsweise der Roboter macht eine PTP bewegung und währenddessen empfängt er weiterhin daten vom Server? (multithreading)
--------------------------------------
So wie ich das Handbuch verstanden werden ankommende xml strings sofort geparst und die werte in die einzelnen Puffer verteilt. In meinem Fall habe ich hier nur einen Puffer der so heissen müsste: "MySimpleSensor.Sensor2Robot.XPos". Kann ich mir den Inhalt des Puffers irgendwie anzeigen lassen? Z.B. über <Anzeige><Variable><Einzeln> und dann den Namen eintippen?
Bisher bekomme ich das nur über den Umweg über die Zugriffsfunktionen hin - also z.B. so:
ii = 1
isNew = TRUE
LOOP
;get Real Values
errbl = EKX_GetRealElement(1, rectext[1].s[], myRealValue, isNew);
IF isNew == FALSE THEN
ii = ii - 1
EXIT
ENDIF
myRealValues[ii] = myRealValue
ii = ii + 1
ENDLOOP
Alles anzeigen
Alle Werte des Puffers stehen jetzt in dem Array "myRealValues"...
-------------------------------------
Kann man den Pufferinhalt löschen?
Beispielsweise sende emfpängt der Roboter nacheinander 2 xml strings: (pseudo code)
EKX_WaitForSensorData(1, rectext[2].s[], 100)
SERVER-> "<Data2Robot><XPos>1</XPos></Data2Robot>"
EKX_WaitForSensorData(1, rectext[2].s[], 100)
Server-> "<Data2Robot><XPos>2</XPos></Data2Robot>"
Im Puffer stehen jetzt:
"1"
"2"
Daten werden ausgewertet z.B suche ich das aktuellste Element:
errbl = EKX_GetRealElement(1, rectext[1].s[], myRealValue, isNew)
Liefert: myRealValue = 2
An der stelle würde ich den Pufferinhalt irgendwie löschen wollen. Weil wenn der Server jetzt nochmals 2 xml strings schickt (z.B. ..XPos>3</XPos.. und ..XPos>4</XPos...) und ich jetzt beispielsweise nach dem "nächsten" Element suche:
errbl = EKX_GetRealElement(1, rectext[1].s[], myRealValue, isNew)
Liefert das eine "1" und nicht die "3"
----------------------------------
Bei meinem ganzen Rumprobieren mit der Funktion "EKX_WaitForSensorData(INT, CHAR[], INT)" konnte ich keine Auswirkungen des ersten Parameters feststellen. Ob ich den Wert des Parameters auf "0" oder "1" setzte zeigt keine Wirkung.
Anders bei den Zugriffsfunktionen (getRealElement etc. - da passt das)
Hat der Parameter von WaitForSensorData eine Funktion?
Soo - ne ganze menge Text - vllt hat ja jemand ne freie Minute...
Gruss