Frame Array in Ethernet KRL

  • Hallo Leute,


    ich tausche zwischen Leitrechner und Roboter via EthernetKRL Daten aus. Das funktioniert auch hervorragend. Zwecks Optimierung (Dauer der Übertragung aller Datensätze) möchte ich nun mehrere Frames als Array übergeben, um es mit EKI_GetFrameArray() auslesen zu können.

    Ich weiß nicht, wie ich das Frame-Array in der XML-Datei deklarieren muss und kann es auch noch nicht per Try and Error ausprobieren.


    Meine Struktur eines Datensatzes vom Leitrechner soll also so aussehen:

    TransmissionID INTEGER - Nur zur verifizierung

    StepCount INTEGER - Anzahl der einzelnen Schritte in diesem Job

    StepType INTEGER - Ein Parameter fuer die Bearbeitung

    POSITIONS Frame Array - Die Frames, welche ich als Array übertragen möchte


    in der XML-Datei habe ich bisher folgendes unter RECIEVE eingetragen:


    Code
        <RECEIVE>
            <XML>
                <ELEMENT Tag="JOBSTEP/TransmissionID" Type="INT"/>
                <ELEMENT Tag="JOBSTEP/StepCount" Type="INT"/>
                <ELEMENT Tag="JOBSTEP/StepType" Type="INT"/>
                !!! Hier fehlt noch das Frame-Array !!!
                <ELEMENT Tag="JOBSTEP" Set_Flag="998"/>
            </XML>
        </RECEIVE> 

    Wäre das dann so richtig?

    Code
    <ELEMENT Tag="JOBSTEP/POSITIONS" Type="FRAME[]"/>

    Die Doku sagt da leider nix...oder ich find's einfach nicht.

    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.

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


    Ich vermute dass das gar nicht geht. Zumindest sind in VisionTech, welches auch Ethernet-KRL benutzt die Zusatzattribute auch auf mehrere Variablen aufgeteilt, also:

    XML
    <ELEMENT Tag="VTResponse/TaskResult/Attributes/Attribute1/Key" Type="String" />
    <ELEMENT Tag="VTResponse/TaskResult/Attributes/Attribute1/Value" Type="String" />
    <ELEMENT Tag="VTResponse/TaskResult/Attributes/Attribute2/Key" Type="String" />
    <ELEMENT Tag="VTResponse/TaskResult/Attributes/Attribute2/Value" Type="String" />
    ...


    Hier ist auch zu sehen, dass es sich bei dem Type nicht um einen ARRAY[CHAR] oder ähnliches handelt, sondern um einen eigentlich in der KRL unbekannten Typen String


    Es wäre aber natürlich möglich die Struktur so auf zu bauen, dass man mehrere Variable noch durchnummeriert, also:

    XML
    <ELEMENT Tag="JOBSTEP/POSITIONS/Val1" Type="FRAME"/>
    <ELEMENT Tag="JOBSTEP/POSITIONS/Val2" Type="FRAME"/>
    <ELEMENT Tag="JOBSTEP/POSITIONS/Val3" Type="FRAME"/>
    ...
    <ELEMENT Tag="JOBSTEP/POSITIONS" Type="FRAME"/>

    Oder in der Recive-Datei:

    XML
    <JOBSTEP>
        <POSITIONS>
            <Val1 X="0.0" Y="0.0" Z="0.0" A="0.0" B="0.0" C="0.0" />
            <Val2 X="0.0" Y="0.0" Z="0.0" A="0.0" B="0.0" C="0.0" />
            <Val3 X="0.0" Y="0.0" Z="0.0" A="0.0" B="0.0" C="0.0" />
        </POSITIONS>
    </JOBSTEP>



    Die Daten kann man dann ja sehr einfach in KRL in ein Array schreiben:

    Code
    DECL FRAME Positions[3]
    RET=EKI_GetReal(configFileName[],"JOBSTEP/POSITIONS/Val1", Positions[1])
    RET=EKI_GetReal(configFileName[],"JOBSTEP/POSITIONS/Val2", Positions[2])
    RET=EKI_GetReal(configFileName[],"JOBSTEP/POSITIONS/Val3", Positions[3])


    Oder, falls es sich um ein sehr großes Array handelt, den String auch mit C_WRITE direkt erstellen lassen.


    Anzumerken wäre noch, dass XML-Tag-Namen nicht mit einer Nummer Anfangen dürfen, deshalb in dem Beispiel "Valn"


    Ein wirkliches Array hat ja in XML auch keine Nummerierung, weshalb ich mir die durchnummerierung auch schwierig vorstelle, das müsste dann ja bei der Deserialisierung geschehen, und in verschiedene Speicheradressen abgelegt werden.

  • Danke für deine Antwort,


    aber in der Doku steht, dass die Funktion EKI_GetFrameArray() eine Array von Frames lesen kann.


    Unter 6.2 Funktionen für den Datenaustausch

    EKI_STATUS = EKI_GetFrameArray(CHAR[], CHAR[], FRAME[])


    Sowie auch Arrays von Integer, Bool, etc. möglich sein sollen.


    Zitat

    Ein wirkliches Array hat ja in XML auch keine Nummerierung, weshalb ich mir die durchnummerierung auch schwierig vorstelle, das müsste dann ja bei der Deserialisierung geschehen, und in verschiedene Speicheradressen abgelegt werden.


    Korrekt. Aber wenn ich z.B. in C oder VB o.ä. deserialisiere, habe ich ja auch anschließend en durchnummeriertes Array. Aber was wieß ich, wie das bei Ethernet KRL so funktioniert... :)

    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.

  • Hey,


    Tatsächlich, die Funktionen sind mit noch gar nicht aufgefallen.


    Habe es gerade mal getestet, man muss die Daten wiefolgt anlegen:

    XML
    <ELEMENT Tag="JOBSTEP/POSITIONS" Type="FRAME"/>

    Also, die Tatsache das es ein Array ist einfach Ignorieren.


    Danach kann man die Werte in KRL einfach in ein Array lesen, mit:

    Code
    RET=EKI_GetFrameArray(configFileName[],"JOBSTEP/POSITIONS",FRAMEARRAY[])

    Wichtig ist hier scheinbar, dass das KRL-Seitige Array (hier FRAMEARRAY) nicht größer sein darf, als die Daten, welche gesendet werden, da der Roboterinterpreter ansonsten in der Funktion EKI_GetFrameArray() hängen bleibt.


    Und wieder einmal haben wir was gelernt :)

  • Also wenn das funktioniert -werde ich morgen testen- dann bekommst du einen Platz in meinem Buch der schlauen Leute. 😄

    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.

  • Da isser wieder... :)


    RESULT: Funktioniert leider gar nicht...:rolleyes:


    Wie sieht denn die von dir zusammengestellte Zeichenkkette aus, die du an den Roboter sendest?

    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.

    • Hilfreich

    In KRL:


    Die Config:


    Die Antwort vom Server:

    XML
    <JOBSTEP>
        <POSITIONS X="210.3" Y="825.3" Z="234.3" A="84.2" B="12.3" C="43.5" />
        <POSITIONS X="310.3" Y="825.3" Z="234.3" A="84.2" B="12.3" C="43.5" />
        <POSITIONS X="410.3" Y="825.3" Z="234.3" A="84.2" B="12.3" C="43.5" />
    </JOBSTEP>


    Wie gesagt, das Array FRAMEARRAY darf wie gesagt max. 3 Felder groß sein.

  • Ja - saugeil! :dance:

    Das hat hervorragend geklappt. Nachdem ich Trottel eben nochmal mit deinem XML-String verglichen habe , ist mir aufgefallen, dass ich nur einen simplen Copy/Paste-Fehler hatte.


    Auf die simple Deklaration in der XML...

    Also, die Tatsache das es ein Array ist einfach Ignorieren.

    ...wäre ich glaube ich niemals gekommen.


    Vielen Dank für deine kompetente Hilfe! :supi:

    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.

  • Kleine Nachtrag:


    Habe hier gerade zu Testwecken ein Frame-Array mit 256 Frames übetragen.

    Man darf nicht vergessen, in der XML-Date die Größe des Puffers zu Parametrieren:


    Code
            <INTERNAL>
                ...
                <BUFFERING Mode="FIFO" Limit="256"/> ;oder noch mehr...max 512
                <BUFFSIZE Limit="65534"/>
                 ...
            </INTERNAL>

    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.

  • Hallo


    Vilen Dank für die Info, es ist sehr hilfreich.

    aber ich kriege noch nicht hin.

    erinnert ihr wo die variabel FRAMEARRAY[] von

    RET=EKI_GetFrameARRAY("XmlArray","JOBSTEP/POSITIONS",FRAMEARRAY[])


    deklariert werden muss?

  • So genau weiß ich das nicht mehr, da ich es später anders gelöst hatte.

    Das Array kannst du IMO einfach in dem gleichen UP deklarieren, in dem du es auch liest. Ich meine mich zu erinnern, es dann initialisiert zu haben.

    Zum Beispiel:

    Code
    FRAME fPos[8]
    INT Counter
    FOR Counter=1 to 8
    fPos[Counter]=$NULLFRAME
    
    ENDFOR

    Aber ganz sicher bin ich mir leider nicht. Wie gesagt, habe es später anders gelöst. Sorry.

    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.

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