Types de données standard

Présentation

EcoStruxure Machine Expert prend en charge tous les types de données décrits par la norme IEC61131-3.

Ce chapitre décrit les types de données suivants :

En outre, plusieurs types de données d'extension de la norme sont pris en charge et vous pouvez également ajouter vos propres types de données définis par l'utilisateur.

BOOL

Les variables de type BOOL peuvent prendre les valeurs TRUE (1) et FALSE (0). 8 bits d'espace mémoire sont réservés.

Pour plus d'informations, reportez-vous au chapitre concernant les constantes BOOL.

NOTE : Des vérifications implicites permettent de valider la conversion des types de variable (reportez-vous au chapitre POU pour vérifications implicites).

Entier

Le tableau répertorie les types de données entier disponibles. Chaque type couvre une plage de valeurs spécifique soumise aux restrictions suivantes.

Type de données

Limite inférieure

Limite supérieure

Espace mémoire

BYTE

0

255

8 bits

WORD

0

65 535

16 bits

DWORD

0

4 294 967 295

32 bits

LWORD

0

264-1

64 bits

SINT

-128

127

8 bits

USINT

0

255

8 bits

INT

-32 768

32 767

16 bits

UINT

0

65 535

16 bits

DINT

-2 147 483 648

2 147 483 647

32 bits

UDINT

0

4 294 967 295

32 bits

LINT

–263

263-1

64 bits

ULINT

0

264-1

64 bits

NOTE : la conversion d'un type de taille élevée vers un type de taille inférieure risque d'entraîner une perte d'informations.

Pour plus d'informations, reportez-vous à la description des constantes numériques.

NOTE : Des vérifications implicites permettent de valider la conversion des types de variable (reportez-vous au chapitre POU pour vérifications implicites).

Types de données entiers indépendants de la cible __UXINT, __XINT, __XWORD

Pour créer un code IEC adapté aux différents systèmes cibles, utilisez les types de données entiers indépendants de la cible __UXINT, __XINT et __XWORD. Le compilateur convertit ces types de données en types de données standard pris en charge par le système cible. Les systèmes avec registres d'adresse de 32 bits et 64 bits sont pris en charge.

Les opérateurs de conversion de type suivants sont fournis :

Types de données indépendants de la cible

Sur les plates-formes 64 bits

Sur les plates-formes 32 bits

__UXINT

ULINT

UDINT

__XINT

LINT

DINT

__XWORD

LWORD

DWORD

REAL / LREAL

Les types de données REAL et LREAL sont des types à virgule flottante. Ils représentent des nombres rationnels.

Caractéristiques des types de données REAL et LREAL :

Type de données

Limite inférieure

Limite supérieure

Espace mémoire

REAL

-3,402823e+38

3,402823e+38

32 bits

LREAL

-1,7976931348623158e+308

1,7976931348623158e+308

64 bits

Exemple :

PROGRAM PLC_PRG
VAR
    rMax: REAL := 3.402823E+38; // Largest number
    rPosMin : REAL := 1.0E-44; // Smallest positive number
    rNegMax: REAL := -1.0E-44; // Largest negative number
    rMin: REAL := -3.402823E+38; // Smallest number
    lrMax: LREAL := 1.7976931348623158E+308; // Largest number
    lrPosMin : LREAL := 4.94065645841247E-324; // Smallest positve number
    lNegMax: LREAL := -4.94065645841247E-324; // Largest negative number
    lrMin: LREAL := -1.7976931348623158E+308; // Smallest number
END_VAR
NOTE : La prise en charge du type de données LREAL dépend de l'équipement cible. Consultez la documentation correspondante pour savoir si le type 64 bits LREAL est converti en REAL lors de la compilation (éventuellement avec perte d'informations) ou persiste.
NOTE : Si un type REAL ou LREAL est converti en SINT, USINT, INT, UINT, DINT, UDINT, LINT ou ULINT et que la valeur du nombre réel est en dehors de la plage de valeurs de l'entier, le résultat sera indéfini et dépendra du système cible. Il existe cependant une exception. Pour éviter que le code dépende de la cible, vous pouvez gérer les valeurs hors plage via l'application. Si le nombre REAL/LREAL est compris dans la plage de valeurs de l'entier, la conversion fonctionnera sur tous les systèmes de la même manière.

Lors de l'affectation de i1 := r1;, une erreur est détectée. Par conséquent, la remarque précédente s'applique avec les opérateurs de conversion, comme dans l'exemple suivant :

i1 := REAL_TO_INT(r1);

Pour plus d'informations, reportez-vous au chapitre Constantes REAL/LREAL (opérandes).

NOTE : Des vérifications implicites permettent de valider la conversion des types de variable (reportez-vous au chapitre POU pour vérifications implicites).

STRING

Avec EcoStruxure Machine Expert V2.2 et les versions ultérieures, le type de données STRING peut être codé dans le format Latin 1 ou UTF-8. Pour une interprétation comme UTF-8 à l'échelle du projet, activez le paramètre Codage UTF8 pour STRING dans la boîte de dialogue Paramètres du projet > Options de compilation. Pour plus d'informations, voir Codage UTF-8 à l'échelle du projet.

NOTE : Avant de définir le format de codage UTF-8, exécutez la règle d'analyse statique SA0175 sur votre code pour détecter les structures susceptibles de poser des problèmes avec le codage UTF-8.
NOTE : Si vous utilisez le codage UTF-8, ajoutez le pragma {attribute 'monitoring_encoding' := 'UTF-8'} à la déclaration d'une variable. Ce la vous permet de surveiller le contenu de la variable dans le codage UTF-8.

Une variable de type de données STRING peut contenir n'importe quelle chaîne de caractères. La taille indiquée dans la déclaration détermine l'espace mémoire à réserver pour la variable et correspond au nombre d'octets de la chaîne. Cette indication peut être placée entre parenthèses ou entre crochets. Si aucune taille n'est spécifiée, la taille par défaut de 80 octets est utilisée. Lorsque la chaîne d'initialisation dépasse la taille indiquée pour le type de variable, elle est tronquée (de droite à gauche).

Longueur de chaîne :

  • Pour le codage Latin 1, l'espace mémoire nécessaire pour une variable de type STRING est de 1 octet par caractère + 1 octet supplémentaire. Ainsi, la déclaration "STRING[80]" nécessite 81 octets.

  • Avec le codage UTF-8, un caractère peut avoir une longueur maximale de quatre octets. La longueur de la chaîne indique le nombre d'octets réservés pour le type STRING. Il n'existe donc plus de relation 1:1 entre le nombre de caractères et la longueur de chaîne en octets.

Exemple de déclaration de chaîne de 35 octets :

str:STRING(35):='This is a String';

Généralement, la longueur d'une chaîne n'est pas limitée. Lorsque vous exécutez des manipulations de chaînes avec les fonctions de la bibliothèque Standard, la longueur des chaîne est limitée à 255. Lorsque vous exécutez des manipulations de chaînes avec les fonctions de la bibliothèque StringUtils, les chaînes de plus de 255 caractères sont également autorisées.

Lorsqu'une variable de type de données STRING est réinitialisée via une réinitialisation de l'application, le contenu de l'ancienne chaîne qui existe après le caractère NULL de fin de la valeur initiale n'est pas écrasé. Cela s'applique à la fois à l'initialisation avec la valeur d'initialisation et à l'initialisation avec la valeur d'initialisation par défaut 0.

Pour plus d'informations, reportez-vous à la section Constantes WSTRING et STRING (opérandes).

NOTE : Des vérifications implicites permettent de valider la conversion des types de variable (reportez-vous au chapitre POU pour vérifications implicites).

WSTRING

Le type de données WSTRING diffère du type STRING (ASCII) par son interprétation dans le format Unicode et le fait qu'il nécessite deux octets pour chaque caractère et deux octets supplémentaires d'espace mémoire pour la terminaison de chaîne (contre 1 octet à chaque fois pour le type STRING).

Les types de données WSTRING sont codés comme Unicode dans le format UTF-16.

La bibliothèque standard64.lib fournit des fonctions pour les chaînes WSTRING.

Le nombre de caractères des WSTRING dépend des caractères qui les composent. Une taille de 10 pour un WSTRING signifie que la longueur de la chaîne WSTRING peut prendre jusqu'à 10 WORDS. Dans le cas de certains caractères en Unicode, plusieurs WORDS sont nécessaires pour coder un caractère, de sorte que le nombre de caractères ne correspond pas forcément à la longueur du WSTRING (10 dans ce cas). Ce type de données requiert un WORD de mémoire supplémentaire car il se termine par un 0.

Lorsque la taille n'est pas définie, 80 WORDS sont affectés plus un pour le caractère de fin 0.

Exemples :

wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";

Pour plus d'informations, reportez-vous aux descriptions suivantes :

Types de données d'horodatage

Les types de données TIME, TIME_OF_DAY (raccourci TOD), DATE et DATE_AND_TIME (raccourci DT) sont traités en interne comme DWORD. Les types de données LDATE, LDATE_AND_TIME (LDT) et LTIME_OF_DAY (LTOD) sont traités en interne comme LWORD. L'heure est indiquée en millisecondes dans TIME et TOD. L'heure dans un TOD commence à minuit. L'heure est donnée en secondes dans DATE et DT à compter du 1er janvier 1970 à minuit.

LTIME est pris en charge comme base de temps pour les temporisateurs haute résolution. LTIME a une taille de 64 bits et une résolution en nanosecondes.

Syntaxe de LTIME :

LTIME#<déclaration d'heure>

La déclaration de l'heure peut inclure les unités utilisées comme avec la constante TIME :

  • us : microsecondes

  • ns : nanosecondes

Exemple LTIME :

LTIME1 := LTIME#1000d15h23m12s34ms2us44ns

Pour plus d'informations, consultez les descriptions suivantes :

NOTE : Des vérifications implicites permettent de valider la conversion des types de variable (consultez le chapitre POU pour vérifications implicites).

ANY / ANY_<type>

Lorsque vous implémentez une fonction dont l'une des entrées (VAR_INPUT) présente un type de données IEC générique (ANY ou ANY_<type>), le type de données du paramètre d'appel n'est pas défini comme unique. Des variables de types différents peuvent alors être transmises à la fonction. Il est possible d'appeler la valeur transmise et son type via une structure prédéfinie.

Types de données IEC génériques permettant d'utiliser des types de données élémentaires pour les entrées de fonction :

Hiérarchie des types de données génériques

Types de données élémentaires

ANY

ANY_BIT

BYTE, WORD, DWORD, LWORD

ANY_DATE

DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE_AND_TIME, LDATE, LTIME_OF_DAY,

ANY_NUM

ANY_REAL

REAL, LREAL

ANY_INT

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

ANY_STRING

STRING, WSTRING

Exemple :

FUNCTION ANYBIT_TO_BCD : DWORD
   VAR_INPUT
      value : ANY_BIT;
   END_VAR

Si la fonction ANYBIT_TO_BCD est appelée, une variable de type de données BYTE, WORD, DWORD ou LWORD peut être transmise à la fonction en tant que paramètre.

Structure prédéfinie :

Lors de la compilation du code, un type de données ANY est remplacé en interne par la structure suivante :

TYPE AnyType :
STRUCT
        // the type of the actual parameter
    typeclass : __SYSTEM.TYPE_CLASS ;
        // the pointer to the actual parameter
    pvalue : POINTER TO BYTE;
        // the size of the data, to which the pointer points
    diSize : DINT;
END_STRUCT
END_TYPE

Le paramètre d'appel actuel affecte les éléments de la structure lors de l'exécution.

Exemple :

Cet exemple de code vérifie si les deux variables transmises correspondent au même type et ont la même valeur.

FUNCTION Generic_Compare : BOOL
VAR_INPUT
    any1 : ANY;
    any2 : ANY;
END_VAR
VAR
    icount: DINT;
END_VAR

Generic_Compare := FALSE;
IF any1.typeclass <> any2.typeclass THEN
    RETURN;
END_IF
IF any1.diSize <> any2.diSize THEN
    RETURN;
END_IF
// Byte comparison
FOR icount := 0 TO any1.diSize-1 DO
    IF any1.pvalue[iCount] <> any2.pvalue[iCount] THEN
        RETURN;
    END_IF
END_FOR
Generic_Compare := TRUE;
RETURN;
// END_FUNCTION

Consultez également la description de l'opérateur __VARINFO.