Tipos de dados

A norma IEC61131-3 define um conjunto de tipos de dados a serem utilizados pelos programas dos controladores. A tabela a seguir apresenta todos os tipos de dados nativos definidos pelo padrão.

Nome

Descrição

Nro de bits

BOOL

Booleano

1

SINT

Inteiro simples (Short integer)

8 [8]

INT

Inteiro

16 [8]

DINT

Inteiro duplo (Double integer)

32 [8]

LINT

Inteiro longo (Long integer)

64 [8]

USINT

Inteiro simples sem sinal (Unsigned short integer)

8 [9]

UINT

Inteiro duplo sem sinal (Unsigned integer)

16 [9]

UDINT

Inteiro duplo sem sinal (Unsigned double integer)

32 [9]

ULINT

Inteiro longo sem sinal (Unsigned long integer)

64 [9]

REAL

Real (Real numbers)

32 [10]

LREAL

Real longo (Long real numbers)

64 [11]

TIME, T

Duraçao de tempo (Time Duration)

[1]

DATE, D

Data

[1]

TIME_OF_DAY, TOD

Hora do dia Time of day (only)

[1]

DATE_AND_TIME, DT

Data e hora do dia (Date and time of day)

[1]

STRING

Texto simples (Variable-length character string)

[7]

WSTRING

Texto UNICODE (Variable-length UNICODE string)

[7]

BYTE

Flag de 8 bits (Bit string of length 8)

8

WORD

Flag de 16 bits (Bit string of length 16)

16

DWORD

Flag de 32 bits (Bit string of length 32)

32

LWORD

Flag de 64 bits (Bit string of length 64)

64

Grupos de tipos de dados

A norma IEC 61131-3 organiza os Tipos de dados em grupos. Existem funções e blocos de funções que aceitam como parâmetro de entrada ou saída um dos grupos de tipos definidos a seguir:

ANY
 : ANY_DERIVED (Tipos definidos pelo usuário)
 :
 : ANY_ELEMENTARY
 :  :
 :  :  ANY_MAGNITUDE
 :  :   :
 :  :   : ANY_NUM
 :  :   :  :
 :  :   :  : ANY_REAL
 :  :   :  :   REAL, LREAL
 :  :   :  :
 :  :   :  : ANY_INT
 :  :   :      LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT
 :  :   :
 :  :   : TIME
 :  :
 :  :  ANY_BIT
 :  :   : LWORD, DWORD, WORD, BYTE, BOOL
 :  :
 :  :  ANY_STRING
 :  :   : STRING, WSTRING
 :  :
 :  :  ANY_DATE
 :  :   : DATE_AND_TIME, DATE, TIME_OF_DAY

Nota

Os tipos de dados suportados podem variar dependendo da família de equipamentos. Para mais informações consulte o manual do equipamento utilizado.

Importante

O suporte a todos os tipos de dados não é obrigatório no padrão. O equipamento pode suportar um sub-conjunto de tipos. Neste caso os tipos suportados devem estar listados na documentação do mesmo. Veja Tipos de dados suportados para mais informações sobre os tipos de dados suportados pelos equipamentos com firmware G5.

Variáveis do tipo DATE e DATE_TIME representam valores válidos á partir de 1/1/2000.

Portanto, valores anteriores a 1/1/2000 são tratados como inválidos no HIstudio

Valores default para os tipos de dados

Todas as variáveis criadas pelo programa de aplicação possuem um valor de inicialização default associado ao tipo de dados da variável que é utilizado quando necessária a inicialização da mesma e o usuário não especificou nenhum valor no campo de inicialização.

A tabela a seguir apresenta, para cada tipo de dado nativo a valor default de inicialização para uma variável alocada.

Tipo de dado

Valor inicial

BOOL

FALSE

SINT, INT, DINT, LINT

0

USINT, UINT, UDINT, ULINT

0

BYTE, WORD, DWORD, LWORD

0

REAL, LREAL

0.0

TIME

T#0S

DATE

D#2000-01-01 [12]

TIME_OF_DAY

TOD#00:00:00.0

DATE_AND_TIME

DT#2000-01-01-00:00:00.0 [12]

STRING ‘’

(the empty string)

Tipo de dados STRING

A norma IEC 61131-3 define apenas que o tipo de dado STRING deve ser uma sequência de caracteres de 8 bits (tipo CHAR) de tamanho variável.

O tipo string no HIstudio e no firmware G5 foi definido e implementado da seguinte forma:

Considere o texto ‘Equipamento conectado’. A representação deste texto no firmware G5 consiste de um vetor de bytes (8bits) com o seguinte formato:

Formato do tipo STRING

        : -- - - tamanho total alocado para a string  - - - - - - - - - :
        :                                                               :

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|01 |02 |03 |04 |05 |06 |07 |08 |09 |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 | Indice do vetor
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|16 |13 |80 |76 |67 |32 |99 |111|110|101|99 |116|97 |100|111| 0 | 0 | 0 | 0 | Valores numéricos
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|MAX|LEN| P | L | C |   | c | o | n | e | c | t | a | d | o | 0 |   |   |   | Texto
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  :   : :                                                   : :
  :   : :                                                   : :
  :   : : - - - - tamanho do texto  (13 caracteres) - - - - : :
  :   :                                                       :
  :   +-> tamanho do texto                                    :
  :                                                           Delimitador de fim de string
  +-----> tamanho total alocado para a string

O valor do primeiro byte do vetor (MAX) especifica o tamanho do máximo texto suportado por esta string (16 caracteres no exemplo anterior).

O valor do segundo byte do vetor (LEN) especifica o tamanho do texto que está salvo na string (13 caracteres no exemplo anterior).

O valor zero é utilizado para delimitar o final da string e não é incluído no calculo do tamanho da mesma.

Conversão de tipos de dados

O compilador ST é bastante restritivo nos processos de atribuição de variáveis, exigindo que os tipos de dados sejam compatíveis entre si, caso contrário é gerado erro no processo de compilação.

Considere três variáveis, V_R do tipo REAL, V_I1 e V_I2 do tipo inteiro.

A atribuição:

V_I1 := V_I2;

gera código corretamente sem nenhum erro.

Se, por outro lado, o usuário codificar:

V_I1 := V_R;

será gerado erro “Não é possível realizar a atribuição de REAL para INT”. Para permitir que esta atribuição seja realizada é necessário primeiramente converter o tipo fonte (REAL) para o tipo destino (INT). Este processo é realizado através de uma função de conversão, neste caso chamada de REAL_TO_INT(). Desta forma a chamada seguinte compila corretamente:

V_I1 := REAL_TO_INT(V_R);

Existem algumas atribuições de tipos que são permitidas e implicitamente realizadas pelo compilador. Nestes casos o usuário pode realizar a atribuição diretamente e, as possíveis atribuições implícitas estão indicadas na sessão seguinte.

Para os casos onde a atribuição implicita não é permitida o usuário deverá obrigatoriamente chamar a função de conversão de tipos (TIPO1_TO_TIPO2) para que o compilador permita esta atribuição.

Note que, ao chamar a função de conversão de tipos o usuário se responsabiliza pelo sucesso da operação. Por exemplo, considere uma variável do tipo SINT (V_S) e uma variável do tipo INT (V_I) que possui o valor 1000. O código a seguir:

V_S := INT_TO_SINT(V_I);

não irá gerar erro de compilação, entretanto o valor de V_S resultante da operação será -24 o que naturalmente não é o resultado esperado. Isto ocorre porque o tipo SINT possuindo tamanho de 8 bits pode representar no máximo o valor 127 não sendo possível a atribuição correta do valor 1000 para uma variável deste tipo.

Sendo assim, é importante que, sempre que for necessário realizar uma conversão de tipo explícita através das funções (TIPO1_TO_TIPO2) o usuário esteja ciente que o resultado do processo pode ser inválido dependendo do valor da variável no momento da conversão.

Existem na biblioteca IEC_STD funções de conversão definidas para todas as combinações de tipos de dados disponíveis no HIstudio.

Conversão implícita

O gráfico a seguir apresenta as condições de atribuições que são realizadas implicitamente pelo compilador do HIstudio, não necessitando de chamada uma função de conversão de tipos.

Digraph inplict_types {
fontname="Helvetica,Arial,sans-serif"
node [fontname="Helvetica,Arial,sans-serif"]
edge [fontname="Helvetica,Arial,sans-serif"]
node [shape=box];
rankdir="LR"

 "BOOL" -> "BYTE" -> "WORD"-> "DWORD" -> "LWORD";
 "INT" -> "REAL";
 "UINT" -> "REAL";
 "DINT" -> "LREAL";
 "SINT" -> "INT" -> "DINT"-> "LINT";
 "REAL" -> "LREAL";
 "USINT" -> "INT";
 "UINT" -> "DINT";
 "UDINT" -> "LINT";
 "UDINT" -> "LREAL";
 "USINT" -> "UINT" -> "UDINT"-> "ULINT";
}