EcoStruxure Machine Expert supporta tutti i tipi di dati descritti dallo standard IEC61131-3.
In questo capitolo sono descritti i seguenti tipi di dati:
Sono inoltre supportati alcuni tipi di dati di estensione dei dati standard ed è possibile definire i tipi di dati definiti dall'utente.
Le variabili di tipo BOOL possono avere i valori TRUE (1) e FALSE (0). Sono riservati 8 bit di spazio di memoria.
Per ulteriori informazioni, vedere il capitolo Costanti BOOL.
Nella tabella sono elencati i tipi di dati interi disponibili. Ogni tipo copre un campo di valori diverso. Per i campi valgono le seguenti limitazioni.
Tipo di dati |
Limite inferiore |
Limite superiore |
Spazio di memoria |
---|---|---|---|
BYTE |
0 |
255 |
8 bit |
WORD |
0 |
65.535 |
16 bit |
DWORD |
0 |
4.294.967.295 |
32 bit |
LWORD |
0 |
264-1 |
64 bit |
SINT |
-128 |
127 |
8 bit |
USINT |
0 |
255 |
8 bit |
INT |
-32.768 |
32.767 |
16 bit |
UINT |
0 |
65.535 |
16 bit |
DINT |
-2.147.483.648 |
2.147.483.647 |
32 bit |
UDINT |
0 |
4.294.967.295 |
32 bit |
LINT |
–263 |
263-1 |
64 bit |
ULINT |
0 |
264-1 |
64 bit |
Per maggiori informazioni, vedere la descrizione relativa alle costanti numeriche.
Per creare codice IEC idoneo per i diversi sistemi di destinazione, utilizzare i tipi di dati interi indipendenti dalla destinazione __UXINT, __XINT, e __XWORD. Il compilatore converte questi tipi di dati nei tipi di dati standard appropriati supportati dal sistema di destinazione. Sono supportati i sistemi con registri di indirizzi a 32 bit e 64 bit.
Sono disponibili i seguenti operatori di conversione del tipo:
Tipi di dati indipendenti dalla destinazione |
Su piattaforme a 64 bit |
Su piattaforme a 32 bit |
---|---|---|
__UXINT |
ULINT |
UDINT |
__XINT |
LINT |
DINT |
__XWORD |
LWORD |
DWORD |
I tipi di dati REAL e LREAL sono tipi a virgola mobile. Rappresentano i numeri razionali.
Caratteristiche dei tipi di dati REAL e LREAL:
Tipo di dati |
Limite inferiore |
Limite superiore |
Spazio di memoria |
---|---|---|---|
REAL |
-3.402823e+38 |
3.402823e+38 |
32 bit |
LREAL |
-1.7976931348623158e+308 |
1.7976931348623158e+308 |
64 bit |
Esempio:
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
Durante l'assegnazione di i1 := r1;
è stato rilevato un errore. Pertanto, la nota precedente vale quando si usano operatori di conversione come i seguenti:
i1 := REAL_TO_INT(r1);
Per maggiori informazioni, vedere la sezione Costanti (operandi) REAL/LREAL.
Con EcoStruxure Machine Expert V2.2 e versioni successive, il tipo di dati STRING è codificabile in formato Latin 1 o UTF-8. Per l'interpretazione a livello di progetto come UTF-8, attivare il parametro nella finestra di dialogo . Per ulteriori informazioni, vedere Codifica UTF-8 a livello di progetto.
{attribute 'monitoring_encoding' := 'UTF-8'}
alla dichiarazione di una variabile, che consente di monitorare il contenuto della variabile in codifica UTF-8.
Una variabile del tipo di dati STRING può contenere qualsiasi stringa di caratteri. L'elemento dimensione nella dichiarazione determina lo spazio di memoria da riservare per la variabile. Si riferisce al numero di byte nella stringa e può essere collocato tra parentesi o parentesi quadre. Se non viene specificata alcuna dimensione, verrà utilizzata la dimensione predefinita di 80 byte. Se una variabile è inizializzata con una stringa troppo lunga per il tipo di dati variabile, la stringa verrà troncata in modo adeguato da destra verso sinistra.
Lunghezza stringa:
Per la codifica Latin 1, lo spazio di memoria necessario per una variabile di tipo STRING è 1 byte per carattere + 1 byte aggiuntivo. Ciò significa che la dichiarazione "STRING[80]"
richiede 81 byte.
Con la codifica UTF-8, un carattere può avere una lunghezza massima di quattro byte. La lunghezza della stringa indica il numero di byte riservati per STRING. Pertanto, non vi è più una relazione 1:1 tra il numero di caratteri e la lunghezza della stringa in byte.
Esempio di dichiarazione di stringa con 35 byte:
str:STRING(35):='This is a String';
In generale, la lunghezza di una stringa non è limitata. Quando si eseguono manipolazioni di stringhe con le funzioni della libreria Standard, sono consentite stringhe fino a una lunghezza di 255. Quando si eseguono manipolazioni di stringhe con le funzioni della libreria StringUtils, sono consentite stringhe più lunghe (>255 caratteri).
Quando una variabile del tipo di dati STRING viene reinizializzata reimpostando l'applicazione; il contenuto della vecchia stringa, esistente dopo il carattere null di terminazione del valore iniziale, non viene sovrascritto. Questo vale sia per l'inizializzazione con il valore di inizializzazione sia per l'inizializzazione con il valore di inizializzazione predefinito 0.
Per ulteriori informazioni, vedere WSTRING e Costanti STRING (operandi).
Il tipo di dati WSTRING differisce dal tipo STRING (ASCII) per interpretazione nel formato Unicode e richiede due byte per ogni carattere e due byte di spazio di memoria extra per la terminazione della stringa (ciascuno solo in caso di STRING).
I tipi di dati WSTRING sono codificati come Unicode in formato UTF-16.
La libreria standard64.lib fornisce funzioni per stringhe WSTRING.
Il numero di caratteri per WSTRING dipende dai caratteri contenuti. Una dimensione di 10 per WSTRING significa che la lunghezza di WSTRING può richiedere un massimo di 10 WORDS. Per alcuni caratteri in Unicode, sono necessari più WORDS per codificare un carattere in modo che il numero di caratteri non debba corrispondere alla lunghezza di WSTRING (10 in questo caso). Il tipo di dati richiede una WORD di memoria aggiuntiva poiché termina con 0
.
Se una dimensione non è definita, vengono allocate 80 WORDS più una per il carattere finale 0
.
Esempi:
wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";
Per maggiori informazioni, vedere le descrizioni seguenti:
Costanti STRING (operandi)
I tipi di dati TIME, TIME_OF_DAY (abbreviato TOD), DATE, e DATE_AND_TIME (abbreviato DT) sono gestiti internamente come DWORD. I tipi di dati LDATE, LDATE_AND_TIME (LDT) e LTIME_OF_DAY (LTOD) sono gestiti internamente come LWORD. L'ora è indicata in millisecondi in TIME e TOD. Il tempo in TOD inizia alle 00:00. Il tempo viene espresso in secondi in DATE e DT a partire dal 1º gennaio 1970 alle 00:00.
LTIME è supportato come base tempo per i timer ad alta risoluzione. LTIME ha la dimensione di 64 bit e risoluzione in nanosecondi.
Sintassi di LTIME:
LTIME#<dichiarazione temporale>
La dichiarazione temporale può includere le unità di tempo utilizzate con la costante TIME e:
us: microsecondi
ns: nanosecondi
Esempio di LTIME:
LTIME1 := LTIME#1000d15h23m12s34ms2us44ns
Per maggiori informazioni, vedere le descrizioni seguenti:
Quando si implementa una funzione e uno degli ingressi della funzione (VAR_INPUT) possiede un tipo di dati generico IEC (ANY o ANY_<type>)), il tipo di dati del parametro di chiamata non è definito come univoco. È possibile passare variabili di tipi di dati diversi a questa funzione. Il valore passato e il relativo tipo possono essere richiesti nella funzione tramite una struttura predefinita.
Tipi di dati generici IEC che consentono l'uso di tipi di dati elementari per gli ingressi delle funzioni:
Gerarchia dei tipi di dati generici |
Tipi di dati elementari |
||
---|---|---|---|
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 |
Esempio:
FUNCTION ANYBIT_TO_BCD : DWORD
VAR_INPUT
value : ANY_BIT;
END_VAR
Se si chiama la funzione ANYBIT_TO_BCD, è possibile passare una variabile di tipo dati BYTE, WORD, DWORD o LWORD alla funzione come parametro.
Struttura predefinita:
Quando si compila il codice, un tipo di dati ANY viene sostituito internamente con la seguente struttura:
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
Il parametro di chiamata effettivo assegna gli elementi della struttura in runtime.
Esempio:
Questo esempio di codice consente di vedere se le due variabili passate hanno lo stesso tipo e valore.
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
Consultare inoltre la descrizione dell’operatore __VARINFO.