KRLXML PufferIssues

  • 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"

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

    Code
    errint = -100
      sensorname[]="MySimpleSensor"  
      WHILE errint == -100
        errint = EKX_open(sensorname[])
        ;EKX_handleerror(errint)
      ENDWHILE


    Der Aufbau der Datensätze folgt entsprechend:

    Code
    ; 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

    Code
    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:


    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)

    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:

    Code
    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:

    Code
    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

  • Schritt für Schritt zum Roboterprofi!
  • Hallo,


    ist zwar schon ein weilchen her, aber vielleicht gib es ja neue Erkenntnisse ob sowas mit KRL XML möglich ist.


    ZU:


    --------------------------------------


    Das warten auf neue Sensordaten erfolgt beispielsweise über
    Code: [Auswählen]


    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)

    --------------------------------------


    Gruß Chili1886

  • Mach das doch so (hab jetzt die Ganze Email nicht durchgelesen)


    XML Daten:

    Code
    <Sensor2Robot>
      <PosX>234.45</PosX>
    </Sensor2Robot>


    in der XML Datei zur Konfiguration:

    Code
    <Element Tag="Sensor2Robot" Type="STRUCTTAG" Stacksize="100" OnTagSetPort="123"/>


    Mit dem Bezeichner OnTagSetPort kannst Du sagen, wenn die Struktur "Sensor2Robot" vollständig empfangen wurde, soll er einen Ausgang setzen. Auf diesen Ausgang kannst Du dann einen Interrupt definieren und die Daten während der Bewegung auslesen.

  • Naja Du könntest mit einem zeitgesteuerten Interrupt immer wieder ein EKX_SEND mit $POS_ACT machen. Würde aber stark davon abraten das alle 21ms zu machen, sondern evtl alle 60 oder 120ms, denn ansonsten kann es sein dass es Performanceprobleme gibt und der höherpriore Bewegungstask Deine Tast unterbricht.


    Wenn du es fix alle 12ms haben willst, dann entweder über ANOUT ON auf Analogausgang, oder per RSI

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