Types de données standard

Présentation

EcoStruxure Machine Expert prend en charge tous les types de données conformes à la norme IEC61131-3.

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

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

BOOL

Les variables de type BOOL prennent la valeur TRUE (1) ou FALSE (0). 8 bits sont réservés dans la mémoire.

Pour plus d'informations, reportez-vous au chapitre 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 (consultez le chapitre POU pour vérifications implicites).

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 LREAL 64 bits est converti en REAL à la compilation (éventuellement avec perte d'informations) ou persiste.
NOTE : Prenons le cas d'une conversion d'une valeur de type REAL ou LREAL en SINT, USINT, INT, UINT, DINT, UDINT, LINT ou ULINT. Si le nombre réel converti est situé hors 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 appartient à la plage de valeurs de l'entier, la conversion fonctionnera à l'identique sur tous les systèmes.

L'attribution de i1 := r1; renvoie une erreur. 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 (consultez le chapitre POU pour vérifications implicites).

STRING

Une variable de type 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 de caractères constituant la chaîne. Cette indication figure soit entre parenthèses, soit entre crochets. En l'absence de cette information, la taille par défaut de 80 caractères est utilisée.

Généralement, la longueur de la chaîne n'est pas limitée. Cependant, les fonctions de chaîne ne peuvent traiter que les chaînes comprises entre 1 et 255 caractères. Lorsque la chaîne d'initialisation dépasse la taille indiquée pour le type de variable, elle est tronquée (de droite à gauche).

NOTE : Une variable de type STRING nécessite un espace mémoire de 1 octet par caractère + 1 octet supplémentaire. Ainsi, la déclaration "STRING[80]" nécessite 81 octets.

Exemple de déclaration d'une chaîne de 35 caractères :

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

Pour plus d'informations, reportez-vous au chapitre WSTRINGConstantes STRING et (opérandes).

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

WSTRING

Disponible au format WSTRING, contrairement au type STRING (ASCII), le type de données Unicode nécessite 2 octets par caractère + 2 octets d'espace mémoire supplémentaires (contre 1 octet à chaque fois pour le type STRING).

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

Le nombre de caractères acceptés pour la chaîne WSTRING dépend de la longueur de caractères. Par exemple, une taille de 10 pour WSTRING signifie que la chaîne WSTRING accepte jusqu'à 10 mots (WORDS). Plusieurs mots WORDS peuvent être nécessaires pour coder certains caractères Unicode. Dans ce cas, le nombre de caractères ne correspond pas à la longueur de WSTRING (10 en l'occurrence). Ce type de données requiert 1 WORD de mémoire supplémentaire, car il se termine par un 0.

Lorsque la taille n'est pas définie, la chaîne se voit affecter 80 WORDS plus 1 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 (TOD sous forme abrégée), DATE et DATE_AND_TIME (DT sous forme abrégée) sont traités en interne comme des valeurs DWORD. Les types de données LDATE, LDATE_AND_TIME (LDT) et LTIME_OF_DAY (LTOD) sont traités en interne comme des valeurs LWORD. L'heure est indiquée en millisecondes dans TIME et TOD. Minuit (00:00) est utilisé comme heure de départ pour TOD. Avec les types DATE et DT, l'heure est exprimée en secondes à compter du 1er janvier 1970 minuit (00:00).

L'extension de la norme LTIME est prise en charge comme base temporelle pour les temporisateurs haute résolution. Le type de données LTIME (64 bits) affiche une résolution en nanosecondes.

Syntaxe de LTIME :

LTIME#<déclaration de l'heure>

La déclaration de l'heure peut inclure l'unité (comme pour la constante TIME) :

  • us : microsecondes

  • ns : nanosecondes

Exemple d'instruction 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>

Si vous implémentez une fonction dont l'une des entrées (VAR_INPUT) est associée à 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 acceptant les 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

Lorsque la fonction ANYBIT_TO_BCD est appelée, une variable de type 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, une valeur de type ANY est remplacée 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.