Skip to main content

Informations pour les experts

Note

Dans CODESYS versions antérieures à 3.5.18.0, vous n'avez pas la possibilité d'utiliser des variables codées en UTF-8 de type STRING et le Generic String Base bibliothèque. Cela n'est possible qu'à partir de la version 3.5.19.50. Vous pouvez toujours utiliser les autres bibliothèques du CODESYS String Libraries colis. Cependant, la gestion des zones de mémoire codées en UTF-8 (par exemple, ARRAY OF BYTE) y est un peu plus complexe.

Exemple 7. AVANT SP18
VAR
    abyValue : ARRAY[0..33] OF BYTE := [ // UTF-8 CØD€šŸŠ ïß värÿ çôõl
        16#43, 16#C3, 16#98, 16#44, 16#E2, 16#82, 16#AC, 16#C5, 16#A1, 16#C5, 16#B8,
        16#C5, 16#A0, 16#20, 16#C3, 16#AF, 16#C3, 16#9F, 16#20, 16#76, 16#C3, 16#A4,
        16#72, 16#C3, 16#BF, 16#20, 16#C3, 16#A7, 16#C3, 16#B4, 16#C3, 16#B5, 16#6C, 0
    ];
    myString : STR.UTF8Literal := (psValue:=ADR(abyValue));
END_VAR

Dès que les variables codées en UTF-8 sont de type STRING sont disponibles, l'exemple ci-dessus est encore simplifié :

VAR
    myString : STR.UTF8Literal := (psValue:=ADR(UTF8#'CØD€šŸŠ ïß värÿ çôõl'));
END_VAR


Conversion depuis STRING à IString

La structure de données permettant de gérer les propriétés d'un segment de chaîne est mise en œuvre au moyen du STR._UTF8String bloc fonctionnel. Pour ce faire, vous devez allouer de la mémoire pour une instance de ce bloc fonctionnel et pour le segment de chaîne lui-même.

Une instance de bloc fonctionnel doit être située dans une zone de mémoire alignée sur __XWORD address.

Exemple 8. Conversion de String à IString
VAR CONSTANT
    c_udiLength : UDINT := MAX(4, 512); // String segment capacity including terminal NULL
    c_udiXWORD : UDINT := SIZEOF(__XWORD);
    c_udiMaxIndex : UDINT := (SIZEOF(STR._UTF8String) + c_udiLength +  c_udiXWORD  - 1) / c_udiXWORD;
END_VAR
 
VAR
    abyValue : ARRAY[0..33] OF BYTE := [ // UTF-8 CØD€šŸŠ ïß värÿ çôõl
        16#43, 16#C3, 16#98, 16#44, 16#E2, 16#82, 16#AC, 16#C5, 16#A1, 16#C5, 16#B8,
        16#C5, 16#A0, 16#20, 16#C3, 16#AF, 16#C3, 16#9F, 16#20, 16#76, 16#C3, 16#A4,
    16#72, 16#C3, 16#BF, 16#20, 16#C3, 16#A7, 16#C3, 16#B4, 16#C3, 16#B5, 16#6C, 0
	];
    axwMemory : ARRAY[0..c_udiMaxIndex] OF __XWORD;
    udiSize : UDINT;
    itfString : STR.IString := STR.CreateString(
        ADR(axwMemory), SIZEOF(axwMemory),
        ADR(abyValue),
        udiStrSize=>udiSize
    );
    xOk : BOOL;
END_VAR
 
xOk := (
    udiSize >= 512 AND
    itfString.Len() = 33 AND
    STR.RuneCount(itfString) = 20 AND
    itfString.IsValid() AND
    NOT itfString.IsASCII()
);

Avec l'aide du Generic String Base bibliothèque, bon nombre de ces exigences sont prises en compte par les blocs de fonctions correspondants, libérant ainsi l'utilisateur de nombreuses tâches. Surtout, la réservation et l'alignement corrects de la mémoire sont encapsulés dans les blocs fonctionnels correspondants