Vai al contenuto

Conversione array di byte in una stringa

Home Forum Programmazione IEC 61131 (LogicLab) Conversione array di byte in una stringa

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #62117
    Anonimo
    Inattivo

    Devo convertire un Array di byte che contiene i codici ascii per formare una stringa, ho usato la funzione ArrayToFString nel modo.

    VAR
        BArray : ARRAY[0..7] OF BYTE; (* Array of Tag ASCII characters *)
        Tag : STRING[ 32 ]; (* Tag value *)
        i : UDINT; (* Auxiliary variable *)
    END_VAR
    
        BArray[0]:=16#31; //'1';
        BArray[1]:=16#32; //'2';
        BArray[2]:=16#33; //'3';
        BArray[3]:=0;
    
        // Con questa formattazione in Tag mi aspetterei "123", in realtà è vuota.
    
        i:=ArrayToFString(ADR(BArray), SIZEOF(BArray), BYTE_TYPE,  ADR(Tag), SIZEOF(Tag), ADR('%c'), ADR(''));
    
        // Con questa formattazione in Tag mi ritrovo "495051".
    
        i:=ArrayToFString(ADR(BArray), SIZEOF(BArray), BYTE_TYPE,  ADR(Tag), SIZEOF(Tag), ADR('%d'), ADR(''));

    Suggerimenti ?

    #62119
    Sergio Bertana
    Amministratore del forum

    Se ho ben capito nell’array sono inseriti già dei caratteri ascii, quindi se li vuoi trasferire su di una stringa non occorre fare nulla, basta essere certi di avere il codice tappo 16#00 al termine dei caratteri ed eseguire un semplice Sysmemmove. Ecco un esempio con diverse possibilità.

    VAR
        Tag1 : STRING[ 32 ]; (* Tag value *)
        Tag2 : STRING[ 32 ]; (* Tag value *)
        Tag3 : STRING[ 32 ]; (* Tag value *)
        i : UDINT; (* Auxiliary variable *)
        BArray : ARRAY[0..7] OF BYTE; (* Array of Tag ASCII characters *)
    END_VAR
    
        BArray[0]:=16#31; //'1';
        BArray[1]:=16#32; //'2';
        BArray[2]:=16#33; //'3';
        BArray[3]:=0;
    
        // Tutti gli esempi sotto riportati danno come risultato la stringa "123".
        // Da notare che nella funzione "Sysmemmove" occorre copiare un byte in più
        // della lungheza stringa per copiare anche il codice tappo 16#00.
    
        i:=ArrayToFString(ADR(BArray), SIZEOF(BArray), BYTE_TYPE,  ADR(Tag1), SIZEOF(Tag1), ADR('%c'), ADR(''));
        i:=SysVsscanf(ADR(BArray), ADR('%s'), STRING_TYPE, ADR(Tag2));
        i:=Sysmemmove(ADR(Tag3), ADR(BArray), Sysstrlen(ADR(BArray))+1);

    Non capisco come mai nel tuo esempio:

       i:=ArrayToFString(ADR(BArray), SIZEOF(BArray), BYTE_TYPE,  ADR(Tag), SIZEOF(Tag), ADR('%c'), ADR(''));
    

    Mi dici che non funziona, nel mio esempio funziona.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.