Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Byte in String

Anonymous
2006-03-03
2006-04-26
  • Anonymous - 2006-03-03

    Originally created by: S-12

    Hallo,

    aufgrund der wirklich sehr mangelhaften Hilfe in der Moeller XSoft/CoDeSys muss ich diese Frage hier stellen.

    Wie kann ich ein Feld aus Bytes in einen String wandeln? Ich nutze ST in meinem derzeitigen FB, aber auch eine AWL Lösung würde mich interessieren.

    Bspw. gibt es in der Moeller Sucosoft die FUnktion comtostr, welche ein Array OF BYTE in einen String angegebener Länge wandelt...

    MfG

     
  • e-pappy - 2006-03-03

    Wenn ich Dich richtig verstanden habe, dann wäre das meine Lösung:

    IF Byte_Var = 1 THEN String_Var = 'Text1'; END_IF

    IF Byte_Var = 2 THEN String_Var = 'Text2'; END_IF

    u.s.w.

     
  • Anonymous - 2006-03-03

    Originally created by: S-12

    Hallo,

    nein so einfach ist es nicht.

    Ich habe ein Byte, welches wie folgt aussieht:

    dataArray : ARRAY [0..10] OF BYTE;
    LD XYZ1
    BYTE_TO_INT
    ADD 48
    INT_TO_BYTE
    ST dataArray[0]
    LD XYZ2
    BYTE_TO_INT
    ADD 59
    INT_TO.... usw.
    

    Das Array enthält also ASCii-formatierte BYTEs.
    dieses Byte sollen nun mit den Stringfunktionen als Ganzes bearbeitet werden. Sicher ist das Array genau genommen schon ein Array aus Chars und somit eine Zeichenkette.
    Wie gesagt, ich kenne die Funktion comtostr bei Moeller, welche Arrays in Strings kopiert/transformiert.

    MfG M

    [/code]

     
  • Jan Homann - 2006-03-04

    Hi,

    gibt es bei der Moeller XSoft/CoDeSys eigentlich auch die Bibliothek standard.lib?

    Dann würde ich daraus die ASCIIBYTE_TO_STRING() und die CONCAT() Funktionen nehmen.

    myString : STRING := '';

    FOR i := 0 TO 10 DO

    myString := CONCAT(myString, ASCIIBYTE_TO_STRING(dataArray[i]));

    END_FOR

    Gruss Jan

     
  • Anonymous - 2006-03-04

    Originally created by: S-12

    Hallo,

    ja die Standard.lib (Version 7.6.02) gibt es in der XSoft.

    Sie ethält allerdings keine ASCIIBYTE_TO_STRING() Funktion

    U.U. müsste ich mal aus der CoDeSy Demo diese Lib kopieren..., wenn das denn läuft.

    MfG M

     
  • Anonymous - 2006-03-06

    Originally created by: Joohrte

    Es Könnte auch über Pointer gelöst werden.

    Beisiel:

    VAR

    ByteFeld : ARRAY [1..10] OF BYTE ;

    pByteFeld : POINTER TO STRING[10] ;

    ZielString : STRING [10] ;

    END_VAR

    ( Addresse vom ByteFeld ermitteln )

    pByteFeld := ADR(ByteFeld) ;

    ZielString := pByteFeld^ ; ( Inhalt Kopieren )

     
  • S Hinck - 2006-04-21

    Hi,

    vielleicht etwas spät, aber es mag dem einem oder anderen noch helfen.

    Also, ich hatte ein ähnliches Problem beim auslesen eines Textfiles.

    Etwas umständlich, aber zuverlässig, kann man dieses Problem mit einem Array of String lösen.

    ascii:ARRAY[0..255] OF STRING(1):=33(' '), '!', '"','#','$$' ,'%' ,'&' ,'´','(' ,')' ,'*' ,'+' ,',' ,'-' ,'.' ,'/' ,'0' ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,':' ,';' ,'<' ,'=' ,'>' ,'?' , '@','A' ,'B' ,'C' ,'D' ,'E' ,'F' ,'G' ,'H' ,'I' ,'J' ,'K' ,'L' ,'M' ,'N' ,'O' ,'P' ,'Q' ,'R' ,'S' ,'T' ,'U' ,'V' ,'W' ,'X' ,'Y' ,'Z' ,'[','\' ,']' ,'^' ,'_' ,'`' ,'a' ,'b' ,'c' ,'d' ,'e' ,'f' ,'g' ,'h' ,'i' ,'j' ,'k' ,'l' ,'m' ,'n' ,'o' ,'p' ,'q' ,'r' ,'s' ,'t' ,'u' ,'v' ,'w' ,'x' ,'y' ,'z' ,'{' ,'|' ,'}' ,'~' ;
    

    ggf mit dem Zusatz: ascii[13]:='$n';

    im Falle eines File Readers kann man sich dann eine schöne While Schleife aufbauen, die den String zusammensetzt.

    dataInfo:=SysFileOpen (fileName,mode);
    konfig:=SysFileRead(dataInfo,ADR(readBuffer),SIZEOF(readBuffer));
    SysFileClose (dataInfo) ;
    WHILE pos<konfig DO
       eingangsString:=CONCAT(eingangsString,ascii[readBuffer[pos]]);
       pos:=pos+1;
    END_WHILE
    

    Sowas klappt sehr gut, solange man nicht die Maximallängen von String Operationen überschreitet. (80 Zeichen? Bin mir da nicht ganz sicher, es steht aber in der "Hilfe" drin)

    Bei längeren Strings muss man sich noch ein kleines Konstrukt ("klein" ist hier wohl eher etwas größer) da herum aufbauen, um die Längenbegrenzung zu umgehen. Aber das Prinzip wurde hoffentlich verständlich.

    mfG

    Steffen

     
  • S Hinck - 2006-04-21

    Hehe,

    tja, und wenn mein Internet Explorer so gut gewesen wäre mir die ganze Seite zu zeigen, hätte ich wohl auch gesehen, dass es schon entsprechende Antworten auf dieses Problem gab.

    Bis dann

    Steffen

     
  • Anonymous - 2006-04-21

    Originally created by: S-12

    Hallo, danke für Deine Hilfe.

    Joohrte's Antwort hat übrigends nicht funktioniert. Ich erhielt ständig einen Stringüberlauf.

    Leider funktionierte auch eine FOR-Schleife zum zusammensetzen der String, vergleichbar mit Deiner While-Schleife, nicht - Stringüberlauf

    Inzwischen habe ich mir eine lookup table geschrieben (in ST als CASE Anweisung). Die Strings setze ich dann schön einzeln zusammen. Nicht schön aber es funktioniert.

    MFG M

     
  • Anonymous - 2006-04-24

    Originally created by: -AB-

    Die Umwandlung über einen Pointer funktioniert wunderbar, das mach ich schon ewig so. Hab mir die Antwort von Joohrte nicht genau angesehn, ob es da vielleicht einen kleinen Fehler gibt, aber vom Prinzip her funktioniert es so am schnellsten (und saubersten).

    Stringüberlauf kann auch daher kommen, weil wenn du eine Variable als String deklarierst, wird dieser standardmäßig auf 80 Zeichen begrenzt (also String(80)).

    Du kannst die Variable aber auch einfach als String(255) deklarieren und schon sind 255 Zeichen möglich.

    Das Beispiel von Joohrte war z.B. auf 10 Zeichen ausgelegt, das hast du hoffentlich bedacht.

     
  • J Schohaus - 2006-04-25

    Der Text für ein String kann unterschiedlich lag sein. Um das Ende vom text Kenzuzeichnen wird der String mit einem Byte welches den Wert 0 hat abgeschlossen. ( Null Terminiert )

    Z.B. Für den String Inhalt „Test“ währe die Bytefolge 84;69;83;84;0

    Wird das ende des String nicht mit 0 Abgeschlossen würde die Steuerung kein ende erkennen.

    Was ein Stringüberlauf zur Folge hat.

    Um Sicherzustellen das es nicht zum Überlauf kommt sollte das Bytefeld ein Byte größer sein als dein String. Von Feld sollte das letzte Byte immer Null bleiben.

     
  • Anonymous - 2006-04-26

    Originally created by: S-12

    Hallo,

    danke für die Infos. ich werd's dann nochmal probieren.

    @AB: Die Stringvariable hatte bei mir einen definierte Länge von 5 Zeichen.

    MfG M

     

Log in to post a comment.