[solved] EthernetKRLXML: Strings länger 5 empfangen?

  • Hab nochmal ein Problem mit dem XML-TechPack: Alle KUKA-seitig empfangenen Strings werden auf eine Länge von 5 Zeichen gekürzt oder auch verlängert, falls sie kürzer sind. Kann man das irgendwo einstellen?


    Die Strings, welche ich der EKX_GetStringElement( ... , hier , ... ) übergebe sind mit 81 Zeichen deklariert (wie im mitgelieferten Beispiel):


    Code: myekxdemo.dat
    STRUC str char s[81]
    DECL str result[8,32]


    Die Stacksizes der Empfangsstruktur habe ich auf 1024 vergrössert, was natürlich keinen Einfluss darauf hat. Auch hier ist der Empfangsstring, dem Beispiel folgend, mit einer Länge von 80 deklariert:


    Code: mySampleSensor.xml
    <Elements>
      <Element Tag="SQL" Type="STRUCTTAG" Stacksize="1024" />
       <Element Tag="SQL.CR" Type="INTEGER" Stacksize="1024" />	
       <Element Tag="SQL.CC" Type="INTEGER" Stacksize="1024" />	
       <Element Tag="SQL.MR" Type="INTEGER" Stacksize="1024" />	
       <Element Tag="SQL.MC" Type="INTEGER" Stacksize="1024" />	
       <Element Tag="SQL.SD" Type="STRING" Size="80" Stacksize="1024" />
    </Elements>


    Schicke ich nun "12" so empfange ich "12 " mit 3 Leerzeichen. "123456" wird gekürzt auf "12345".


    Hat jemand eine Idee was ich falsch mache?


    Und noch eine kleine Frage: Gibt es neben dem KRLXML eine einfachere Möglichkeit, über Ports zu kommunizieren? Ich kann mich mit diesem Paket nicht so recht anfreunden.

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

    Einmal editiert, zuletzt von rob ()

  • Schritt für Schritt zum Roboterprofi!
  • Ich würde versuchen eine einfache Zeichenkette anzulegen:


    konfig:
    <Elements>
    <Element Tag="ExternalData" Type="STRUCTTAG" Stacksize="5" />
    <Element Tag="ExternalData.TString" Type="STRING" Size="80" Stacksize="5" />
    ...


    KRL:
    STRUC str char s[81]
    DECL str rectext[2]
    DECL char dummy[81]
    BOOL bNew
    ...
    rectext[1].s[] = "SampleSensor.ExternalData.TString"
    ...


    ; get string
    bNew=STRCOPY(dummy[],rectext[1].s[])
    errbl = EKX_GetStringElement(0, dummy[], bNew)
    IF errbl == FALSE THEN
    HALT
    ENDIF

  • :applaus:


    Im ersten Wurf hab ich's so probiert:


    Code
    bNew = STRCOPY( dummy[], rectext[5].s[] )
             errbl = EKX_GetStringElement(0, dummy[], bNew)
             IF errbl == FALSE THEN
                HALT
             ENDIF


    Der Effekt war, dass dummy[] mindestens 21 Zeichen lang war, was der Länge von rectext[5].s[] entspricht. Kürzere Strings wurden auf 21 Zeichen verlängert, längere blieben länger. Beim Zurückkopieren in mein Feld, wurden dann die trailing spaces abgeschnitten, so wäre die Funktion schon zu gebrauchen gewesen:


    Code
    bNew = STRCOPY( dummy[], rectext[5].s[] )
             errbl = EKX_GetStringElement(0, dummy[], bNew)
             IF errbl == FALSE THEN
                HALT
             ENDIF
             bNew = STRCOPY( result[i,j].s[], dummy[] )


    ...es geht allerdings auch ohne dummy[] mit dem Feld direkt. Dazu muss es lediglich nach dem Empfang in sich selbst kopiert werden. Denke mal dass STRCOPY() einfach alles hinter \n abschneidet:


    Code: siehe Post unten
    bNew = STRCOPY( result[i,j].s[], rectext[5].s[] )
             errbl = EKX_GetStringElement(0, result[i,j].s[], bNew)
             IF errbl == FALSE THEN
                HALT
             ENDIF
             bNew = STRCOPY( result[i,j].s[], result[i,j].s[] )


    :danke:

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

    Einmal editiert, zuletzt von rob ()

  • Achtung!


    Kleiner Nachtrag: Die dritte Version oben ohne dummy[] kürzt den empfangenen String auf 64 Zeichen. Mit der Zweiten Version klappt's auch mit 80 ...naaaja. seltsam. :denk:

    &quot;When using vi the screen of your terminal acts as a window into the file which you are editing. Changes which you make to the file are reflected in what you see.&quot;<br />Bill Joy 1978

    Einmal editiert, zuletzt von rob ()

  • Wir haben ein Programm geschrieben, dass über eine virtuelle serielle Schnittstelle mit der Ethernetschnittstelle kommuniziert. So umgehen wir die unnötig komplizierte XML-Kommunikation. Zudem gibts auch nen SQL Treiber der SQL Abfragen von Kuka, Stäubli und Bosch Robotern und CoDeSys SPSn unterstütz. Targets für Siemens und Abb sind in Planung. www.sql4automation.com

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