0)
Beckhoff TwinCAT
The Windows Control and Automation Technology
IV – FUNÇÕES “STANDARD”
V – EXEMPLOS PRÁTICOS
1 – IDENTIFICADORES (“Identifiers”)
2– PREFIXOS (“Prefix”)
4 – OPERANDOS (“Operands”)
5 – VARIAVEIS E ENDEREÇOS
1 – IDENTIFICADORES (“Identifiers”)
Cada identificador de variáveis , funções , etc é assinalado com um tipo de dados que dita o
espaço de memoria que será reservado na CPU .
Um identificador é um nome que designa uma variável , função ou outro tipo de dados e
que deverá cumprir os seguintes requisitos :
2– PREFIXOS (“Prefix”)
by BYTE byNomevariavelbyte
w WORD wNomevariavelbool
dw DWORD dwNomevariavelbool
si SINT syNomevariavelsinteiro
i INTEGER byNomevariavelinteiro
di DINT dyNomevariaveldinteiro
r REAL wNomevariavelreal
s STRING dwNomevariavelstring
t TIME tNomevariaveltempo
tod TIME_OF_DAY todNomevariaveltempodia
dt DATE_AND_TIME dtNomevariaveldatatempo
d DATE dNomevariaveldata
pt POINTER ptNomevariavelponteiro
Conforme o que foi dito inicialmente todos os identificadores sejam variáveis ou não terão
de ser assinalados com um tipo de dados que definirá o tamanho de memoria a ser reservado na
CPU .
Podemos dividir em dois grupos os tipos de dados :
Tipo Configuração
ARRAY <identificação>:ARRAY
[<Linf1>..<Lsup1>,<Linf2>..<Lsup2>] OF <tipo dado> ;
4 – OPERANDOS (“Operands”)
Neste paragrafo iremos apresentar num pequeno resumo , as diversas maneiras de representar dentro
do programa , constantes para cada um dos tipos (“Types”) de dados existentes no TwinCAT PLC .
Exemplos em ST :
(* Representação em decimal inteiro e real *)
byConstante:= -255
iConstante:=-INT#3565 (*nº inteiro negativo)
diConstante:=DINT#199978
rConstante:=-REAL#123.89 (*nº real negativo)
rConstante:= 1895.567
rConstantee:= 1.5e+010
(* Representação em binario *)
byConstante1:= 2# 1001_1111
wConstante1:= 2# 1001_1111_0000_10101
(* Representação em octal *)
byConstante2:= 8# 77
(* Representação em hexadecimal *)
byConstante3:= 16# FF
wConstante2:= 16# FF_FF
dwConstante1:= 16# FF_FF_FF_FF
Exemplos em ST :
(* Valores correctos *)
tTempo1:= T#14ms
tTempo2:= TIME#100s12ms
tTempo3:= t#23d12h45m3s
(* Valores incorrectos *)
tTempo4:= TIME#100m69s (*Limite excedido em seg.*)
tTempo5:= T#100ms12d (*Ordem incorrecta*)
<douDouDATEoudate># ano-mes-dia
Exemplos em ST :
(* Valores correctos *)
dData1:= d#2005-12-01
dData2:= DATE#2000-06-02
<todouTODouTIME_OF_DAY># hora:minuto:segundo
Exemplos em ST :
(* Valores correctos *)
todTod1:= tod#15:12:10.250 (* Podemos ter fracção de seg.*)
todTod2:= TIME_OF_DAY#23:59:59
<dtouDTouDATE_AND_TIME>#ano-mes-dia-hora:minuto:segundo
Exemplos em ST :
(* Valores correctos *)
dtDT1:= dt#1972-03-29-00:00:00
dtDT2:= DATE_AND_TIME#1999-06-19-23:00:15
Exemplos em ST :
(* Valores correctos *)
stTexto1:= ‘BRESIMAR(ASA)’
5 – VARIAVEIS E ENDEREÇOS
Neste paragrafo iremos apresentar num pequeno resumo as diversas maneiras de representar dentro do
programa tais como as variáveis e os endereços absolutos na memoria do “hardware” no TwinCAT .
5.1 – Variáveis
As variáveis podem ser declaradas tanto localmente , dentro do grupo de declaração dos
POU´s ou na lista das variáveis globais . O identificadores das variáveis não deverão conter espaços em
branco ou caracteres especiais como já anteriormente tínhamos dito .
Letras maiúsculas não serão reconhecidas o que significa que VAR1 , Var1 e var1 são todas a
mesma variável .
O sinal de “underscore” é reconhecido nos identificadores ( por exemplo : A_BCD e AB_CD
são duas variáveis diferentes ) .Um identificador de uma variável pode ter mais que um carácter
“underscore” numa linha .
Podemos identificar uma variável com o máximo de 32 caracteres .
Dentro do editor de programa TwinCAT , tempos acesso as variáveis através do “Input
Assistant” – “Local Variables” ou “Global Variables” ( pressionar a tecla função F2) e se desejarmos
declarar novas variáveis utilizamos o “Auto Declare” (pressionar shift+F2).
Variaveis em STRUCT
5.2 – Endereços
A indicação directa de uma posição individual de memoria ou das entradas ou saídas do
“hardware” utilizado é feito através de uma sequencia de caracteres especiais.. Esta sequencia tem a
seguinte configuração :
%<prefixodotipo><prefixodotamanho>
Tipo Descrição
% I Entrada (“Input”)
% O Saida (“Output”)
% M Memoria (“Memory”)
Tamanho Descrição
X bit
B Byte (8 bit)
W Word (16 bit)
D Dupla word (32 bit)
Exemplos :
%QX75.1 (* Bit 1 do byte de saída 75 *)
%IW215 (* Word de entrada 125 *)
%QB7 (* Byte de saida 7 *)
%MD48 (* Dupla Word da posição de memoria 48 *)
Para acedermos a uma dada localização de memoria podemos utilizar qualquer tamanho ( bit ,
byte , Word ou duplo Word ) . Por exemplo o endereço %MD48 são os seguintes endereços no formato
byte :
Exemplo :
(* Campo da declaração das variaveis *)
(* Não deve ser assinalada no campo VAR_IN_OUT *)
a: INT;
b:INT;
Se o índex é maior que o tamanho do tipo da variável escolhido surgirá a seguinte mensagem
de erro :
“ Index <n> outside the valid range for variable <var> “
Se o tipo da variável não permitir este modo de programação surgirá a seguinte mensagem de
err :
“ Invalid data type <type> for direct indexing “
IV – LISTA DE INSTRUÇÕES
1 - INSTRUÇÕES NUMÉRICAS
2 - INSTRUÇÕES ARITMÉTICAS
3 - INSTRUÇÕES LÓGICAS
5 - INSTRUÇÕES de SELECÇÃO
6 - INSTRUÇÕES de COMPARAÇÃO
7 - INSTRUÇÕES de CONVERSÃO
8 - INSTRUÇÕES VÁRIAS
1 - INSTRUÇÕES NUMÉRICAS
ABS
Calcula o valor absoluto do numero .
IN e OUT poderão ter as seguintes combinações :
IN OUT
INT INT, REAL, WORD, DWORD, DINT
REAL REAL
BYTE INT, REAL, BYTE, WORD, DWORD, DINT
WORD INT, REAL, WORD, DWORD, DINT
DWORD REAL, DWORD, DINT
SINT REAL
USINT REAL
UINT INT, REAL, WORD, DWORD, DINT, UDINT, UINT
DINT REAL, DWORD, DINT
UDINT REAL, DWORD, DINT, UDINT
Exemplo em ST:
Var1:INT;
Var1:= ABS(-2); (*Resultado é 2)
Exemplo em IL:
LD -10
ABS
ST Var1 (* Resultado é 10*)
ACOS
Calcula o arco de co-seno (inverso de co-seno ) do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
ASIN
Calcula o arco de seno (inverso de seno ) do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
ATAN
Calcula o arco de tangente (inverso de tangente ) do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT , e OUT
deve ser do tipo REAL .
COS
Calcula o co-seno do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
EXP
Calcula o exponencial do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
EXPT
Calcula o exponencial de numero levantado a outro numero .
IN1 e IN2 pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e
OUT deve ser do tipo REAL .
Exemplo em ST:
Var1:REAL;
Var1:= EXPT(7,2); (*Resultado é 2)
Exemplo em IL:
LD 7
EXPT 2
ST Var1 (* Resultado é 49.0*)
LN
Calcula o logaritmo natural do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
LOG
Calcula o logaritmo de base 10 do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
SIN
Calcula o seno do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
SQRT
Calcula a raiz quadrada do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
TAN
Calcula a tangente do numero .
IN pode ser do tipo BYTE WORD DWORD INT DINT REAL SINT USINT UINT UDINT e OUT
deve ser do tipo REAL .
Notas :
2 - INSTRUÇÕES ARITMÉTICAS
ADD
Calcula a soma aritmética de variáveis de diversos tipos : BYTE WORD DWORD SINT USINT INT
UINT DINT UDINT REAL e LREAL. Duas variáveis TIME podem ser somadas resultando um outro
TEMPO (ex. T#45s + T#50s = T#1m35s) .
Exemplo em ST:
Var1:= 7+2+4+7; (*Resultado é 20)
Exemplo em IL:
LD 7
ADD 2,4,7
ST Var1 (* Resultado é 20*)
Exemplo em FBD:
MUL
Calcula o produto aritmético de variáveis de diversos tipos : BYTE WORD DWORD SINT USINT
INT UINT DINT UDINT REAL e LREAL
Exemplo em ST:
Var1:= 7*2*4*7;
Exemplo em IL:
LD 7
MUL 2,4,7
ST Var1
Exemplo em FBD:
SUB
Calcula a subtracção aritmética de variáveis de diversos tipos : BYTE WORD DWORD SINT
USINT INT UINT DINT UDINT REAL e LREAL. Duas variáveis TIME podem ser subtraídas
resultando um outro TEMPO . Um valor TIME negativo é um valor indefinido.
Exemplo em ST:
Var1:= 7-2;
Exemplo em IL:
LD 7
SUB 2
ST Var1
Exemplo em FBD:
DIV
Calcula a divisão aritmética de variáveis de diversos tipos :BYTE WORD DWORD SINT USINT
INT UINT DINT UDINT REAL e LREAL .
Exemplo em ST:
Var1:= 7/2;
Exemplo em FBD:
Exemplo em ST:
Var1:= 9 MOD 2;
Exemplo em IL:
LD 9
MOD 2
ST Var1 (*Resultado é 1*)
Exemplo em FBD:
Notas :
3 - INSTRUÇÕES LOGICAS
AND
Calcula o produto lógico ( “E”) de variáveis de diversos tipos : BOOL BYTE WORD DWORD .
Exemplo em ST:
Var1:= 2#1001_0011 AND 2#1000_1010;
Exemplo em IL:
Var1:BYTE;
LD 2#1001_0011
AND 2#1000_1010
ST Var1 (* Resultado é 2#1000_0010*)
Exemplo em FBD:
OR
Calcula a soma lógica ( “OU”) de variáveis de diversos tipos : BOOL BYTE WORD DWORD .
Exemplo em ST:
Var1:= 2#1001_0011 OR 2#1000_1010;
Exemplo em IL:
Var1:BYTE;
LD 2#1001_0011
OR 2#1000_1010
ST Var1 (* Resultado é 2#1001_1011*)
Exemplo em FBD:
XOR
Calcula a soma lógica exclusiva ( “OU-Exclusivo”) de variáveis de diversos tipos : BOOL BYTE
WORD DWORD .
Exemplo em ST:
Var1:= 2#1001_0011 XOR 2#1000_1010;
Exemplo em IL:
Var1:BYTE;
LD 2#1001_0011
XOR 2#1000_1010
ST Var1 (* Resultado é 2#0001_1001*)
Exemplo em FBD:
NOT
Calcula a negação lógica (“NÃO”) de variáveis de diversos tipos: BOOL BYTE WORD DWORD .
Exemplo em ST:
Var1:= NOT 2#1000_1010;
Exemplo em IL:
Var1:BYTE;
LD 2#1001_0011
NOT
ST Var1 (* Resultado é 2#0110_1100*)
Exemplo em FBD:
Notas :
SHL
Deslocação de IN em “n” bits á esquerda e preenchendo de zeros os bits á direita . A:= SHL(IN, N) .
IN e OUT serão do tipo BYTE WORLD ou DWORLD .
Exemplo em ST:
Exemplo em IL:
LD 1
SHL 1
ST Var1 (* Resultado é 2 *)
SHR
Deslocação de IN em “n” bits á direita e preenchendo de zeros os bits á esquerda . A:= SHR(IN, N) .
IN e OUT serão do tipo BYTE WORLD ou DWORLD .
Exemplo em ST:
Exemplo em IL:
LD 32
SHR 2
ST Var1 (* Resultado é 8 *)
ROL
Deslocação de IN em “n” bits á esquerda e com realimentação á direita . A:= ROL(IN, N) .
IN e OUT serão do tipo BYTE WORLD ou DWORLD .
Exemplo em ST:
Exemplo em IL:
Var1: BYTE;
LD 2#1001_0011
ROL 3
ST Var1 (* Resultado é 2#1001_1100 *)
ROR
Deslocação de IN em “n” bits á direita e com realimentação á esquerda . A:= ROR(IN, N) .
IN e OUT serão do tipo BYTE WORLD ou DWORLD .
Exemplo em ST:
Exemplo em IL:
Var1: BYTE;
LD 2#1001_0011
ROR 3
ST Var1 (* Resultado é 2#0111_0010 *)
5 - INSTRUÇÕES de SELECÇÃO
SEL
Selector binario . OUT := SEL(G, IN0, IN1) .
Significa que OUT := IN0 se G=FALSE; OUT := IN1 se G=TRUE.
IN0, IN1 e OUT pode ser de qualquer tipo de dados , G deve ser BOOL . O resultado da selecção é IN0
se G for FALSE e IN1 se G for TRUE .
Exemplo em IL:
LD TRUE
SEL 3,4
ST Var1 (* Resultado é 4 *)
ou
LD FALSE
SEL 3,4
ST Var1 (* Resultado é 3 *)
Exemplo em FBD:
MAX
Selecção do maior dado . OUT := MAX(IN0, IN1) .
IN0, IN1 e OUT pode ter qualquer tipo de dados .
Exemplo em IL:
LD 90
MAX 30
MAX 40
MAX 77
ST Var1 (* Resultado é 90 *)
Exemplo em FBD:
MIN
Selecção do menor dado . OUT := MIN(IN0, IN1) .
IN0, IN1 e OUT pode ter qualquer tipo de dados .
Exemplo em IL:
LD 90
MIN 30
MIN 40
MIN 77
ST Var1 (* Resultado é 30 *)
Exemplo em FBD:
LIMIT
Selecção de limites . OUT := LIMIT(Min, IN , Max).
Significa que MAX é o limite superior e MIN o limite inferior . Se o valor em IN ultrapassar o MAX o
valor na saída OUT será o MAX . Se o valor inferior a MIN o valor na saída OUT será MIN.
MIN, MAX, IN e OUT pode ser de qualquer tipo de dados .
Exemplo em IL:
LD 90
LIMIT 30,80
ST Var1 (* Resultado é 80 *)
MUX
Multiplexador . OUT := MUX(K, IN0,...,INn) .
Significa que o numero colocado em K indicará que o valor da entrada correspondente IN(K) será
colocada na saida OUT .
IN0, IN1, INn, OUT pode ser de qualquer tipo de dados . K deve ser BYTE, WORD, DWORD, SINT,
USINT, INT, UINT, DINT ou UDINT.
Exemplo em IL:
LD 0
MUX 30,40,50,60,70,80
ST Var1 (* Resultado é 30 *)
Notas :
6 - INSTRUÇÕES de COMPARAÇÃO
GT
Comparação maior que (“>”) . OUT:= IN1 GT IN2 . O valor do resultado OUT será TRUE quando o
1º operando for maior que o 2º operando . Os operandos podem ser do tipo BOOL, BYTE, WORD,
DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, TIME_OF_DAY,
DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 20 > 30 > 40;
Exemplo em IL:
LD 20
GT 30
ST Var1 (* Resultado é FALSE *)
Exemplo em FBD:
LT
Comparação menor que (“<”) . OUT:= IN1 LT IN2 . O valor do resultado OUT será TRUE quando o
1º operando for menor que o 2º operando . Os operandos podem ser do tipo BOOL, BYTE, WORD,
DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, TIME_OF_DAY,
DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 20 < 30 < 40;
Exemplo em IL:
LD 20
LT 30
ST Var1 (* Resultado é TRUE *)
Exemplo em FBD:
GE
Comparação maior ou igual a (“>=”) . OUT:= IN1 GE IN2 . O valor do resultado OUT será TRUE
quando o 1º operando for maior ou igual ao 2º operando . Os operandos podem ser do tipo BOOL,
BYTE, WORD, DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL,
TIME, TIME_OF_DAY, DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 20 > =20;
Exemplo em IL:
LD 20
GE 20
ST Var1 (* Resultado é TRUE *)
Exemplo em FBD:
LE
Comparação menor ou igual a (“<=”) . OUT:= IN1 LE IN2 . O valor do resultado OUT será TRUE
quando o 1º operando for menor ou igual ao 2º operando . Os operandos podem se r do tipo BOOL,
BYTE, WORD, DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL,
TIME, TIME_OF_DAY, DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 20 > 30 > 40;
Exemplo em IL:
LD 20
LE 30
ST Var1 (* Resultado é TRUE *)
EQ
Comparação igual (“=”) . OUT:= IN1 EQ IN2 . O valor do resultado OUT será TRUE quando o 1º
operando for igual ao 2º operando . Os operandos podem ser do tipo BOOL, BYTE, WORD,
DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, TIME_OF_DAY,
DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 20 ;
Exemplo em IL:
LD 20
EQ 20
ST Var1 (* Resultado é TRUE *)
Exemplo em FBD:
NE
Comparação não igual (“<>”) . OUT:= IN1 <> IN2 . O valor do resultado OUT será TRUE quando o
1º operando for diferente do 2º operando . Os operandos podem ser do tipo BOOL, BYTE, WORD,
DWORLD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, TIME_OF_DAY,
DATE_AND_TIME e STRING.
Exemplo em ST:
Var1:= 40 <> 40 ;
Exemplo em IL:
LD 40
NE 40
ST Var1 (* Resultado é FALSE *)
Exemplo em FBD:
7 - INSTRUÇÕES de CONVERSÃO
BOOL_TO conversão
Converte uma variável BOOL para qualquer outro tipo . Para variáveis numéricas o resultado é 1
quando o operando é TRUE e 0 quando o operando é FALSE. O resultado é “TRUE” ou “FALSE”
respectivamente para variáveis STRING.
Exemplo em ST:
i:=BOOL_TO_INT(TRUE); (* Resultado é 1 *)
str:=BOOL_TO_STRING(TRUE); (* Resultado é 'TRUE' *)
t:=BOOL_TO_TIME(TRUE); (* Resultado é T#1ms *)
tof:=BOOL_TO_TOD(TRUE); (* Resultado é TOD#00:00:00.001 *)
dat:=BOOL_TO_DATE(FALSE); (* Resultado é D#1970-01-01 *)
dandt:=BOOL_TO_DT(TRUE); (* Resultado é DT#1970-01-01-00:00:01 *)
Conversão TO BOOL
Converte qualquer tipo de variável para o tipo BOOL . O resultado é TRUE quando o operando não é
0 . O resultado é FALSE quando o operando é igual a 0 . O resultado é TRUE no tipo de variável
STRING quando o operando é “TRUE” , caso contrário o resultado é FALSE .
Exemplo em ST:
b := BYTE_TO_BOOL(2#11010101); (* Resultado é TRUE *)
b := INT_TO_BOOL(0); (* Resultado é FALSE *)
b := TIME_TO_BOOL(T#5ms); (* Resultado é TRUE *)
b := STRING_TO_BOOL('TRUE'); (* Resultado é TRUE *)
STRING_TO conversão
Converte uma variável STRING para qualquer outro tipo . O operando da variável do tipo STRING
deve conter um valor que seja valido no tipo de variável que se deseja converter , caso contrário o
resultado é 0 .
Exemplo em ST:
b :=STRING_TO_BOOL('TRUE'); (* Resultado é TRUE *)
w :=STRING_TO_WORD('abc34'); (* Resultado é 0 *)
t :=STRING_TO_TIME('T#127ms'); (* Resultado é T#127ms *)
Conversão TO STRING
Converte qualquer tipo de variável para o tipo STRING .
Exemplo em ST:
str :=TIME_TO_STRING(T#12ms); (* Resultado é 'T#12ms' *)
str :=DATE_TO_STRING(D#2002-08-18); (* Resultado é 'D#2002-08-18' *)
str:=TOD_TO_STRING(TOD#14:01:05.123); (* Resultado é 'TOD#14:01:05.123' *)
str:=BOOL_TO_STRING(TRUE); (* Resultado é 'TRUE' *)
str:=DT_TO_STRING(DT#1998-02-13-14:20); (* Resultado é 'DT#1998-02-13-14:20' *)
k := LREAL_TO_STRING(1.4); (* Resultado is '1.4' *)
TIME_TO conversão
Converte uma variável do tipo TIME para qualquer outro tipo . Os dados serão armazenados
internamente numa DWORD em milissegundos . Só depois é que este valor será convertido . Quando
ocorre uma conversão de um valor de um tipo maior para um menor corremos o risco de perda de
informação . Para o tipo de STRING o resultado é uma constante que corresponde a um tempo.
Exemplo em ST:
dw:=TIME_TO_DWORD(T#5m); (* Resultado é 300000 *)
str :=TIME_TO_STRING(T#12ms); (* Resultado é 'T#12ms' *)
DATE_TO conversão
Converte uma variável do tipo DATE para qualquer outro tipo . Os dados serão armazenados
internamente numa DWORD em segundos a contar a partir do dia 1 de Janeiro de 1970. Só depois é
que este valor será convertido . Quando ocorre uma conversão de um valor de um tipo maior para um
menor corremos o risco de perda de informação . Para o tipo de STRING o resultado é uma constante
que corresponde a uma data.
Exemplo em ST:
b :=DATE_TO_BOOL(D#1970-01-01); (* Resultado é FALSE *)
i :=DATE_TO_INT(D#1970-01-15); (* Resultado é 29952 *)
str :=DATE_TO_STRING(D#2002-08-18); (* Resultado é 'D#2002-08-18' *)
vdt:=DATE_TO_DT(D#2002-08-18); (* Resultado é DT#2002-08-18-00:00 *)
udw:=DATE_TO_DWORD(D#2002-08-18); (* Resultado é 16#3D5EE380 *)
TOD_TO conversão
Converte uma variável do tipo TIME_OF_DATE para qualquer outro tipo . Os dados serão
armazenados internamente numa DWORD em milissegundos a contar a partir das 12:00 AM. Só
depois é que este valor será convertido . Quando ocorre uma conversão de um valor de um tipo maior
para um menor corremos o risco de perda de informação . Para o tipo de STRING o resultado é uma
constante que corresponde a uma constante de tempo.
Exemplo em ST:
si:=TOD_TO_SINT(TOD#00:00:00.012); (* Resultado é 12 *)
str:=TOD_TO_STRING(TOD#14:01:05.123); (* Resultado é 'TOD#14:01:05.123' *)
tm:= TOD_TO_TIME(TOD#14:01:05.123); (* Resultado é T#841m5s123ms *)
udi:= TOD_TO_UDINT(TOD#14:01:05.123); (* Resultado é 16#03020963 *)
DT_TO conversão
Converte uma variável do tipo DATE_AND_TIME para qualquer outro tipo . Os dados serão
armazenados internamente numa DWORD em segundos a contar a partir do dia 1 de Janeiro de 1970.
Só depois é que este valor será convertido . Quando ocorre uma conversão de um valor de um tipo
maior para um menor corremos o risco de perda de informação . Para o tipo de STRING o resultado é
uma constante que corresponde a uma data e tempo.
Exemplo em ST:
byt :=DT_TO_BYTE(DT#1970-01-15-05:05:05); (* Resultado é 129 *)
str:=DT_TO_STRING(DT#1998-02-13-14:20); (* Resultado é 'DT#1998-02-13-14:20' *)
vtod:=DT_TO_TOD(DT#1998-02-13-14:20); (* Resultado é TOD#14:20 *)
vdate:=DT_TO_DATE(DT#1998-02-13-14:20); (* Resultado é D#1998-02-13 *)
vdw:=DT_TO_DWORD(DT#1998-02-13-14:20); (* Resultado é 16#34E45690 *)
Exemplo em ST:
i := REAL_TO_INT(1.5); (* Resultado é 2 *)
j := REAL_TO_INT(1.4); (* Resultado é 1 *)
k := LREAL_TO_STRING(1.4); (* Resultado é '1.4' *)
Exemplo em ST:
si := INT_TO_SINT (4223); (* Resultado é 127 . Como o numero inteiro 4223 em Hex é 16#107F em
SINT ( 1 “byte”) só será representado o “byte menos significativo 16#7F que representa 127 *)
Exemplo em IL:
LD 5
INT_TO_REAL
MUL 3.5
ST Var1 (* Resultado é REAL , 17.5*)
TRUNC
Converte uma variável de tipo REAL para INT . Quando ocorre uma conversão de um valor de um
tipo maior para um menor corremos o risco de perda de informação . Se o numero convertido excede
o limite máximo, o primeiro “ byte” será ignorado .
Exemplo em ST:
i:=TRUNC(1.9); (* Result is 1 *)
i:=TRUNC(-1.4); (* Result is -1 *)
Exemplo em IL:
LD 5.5
TRUNC
MUL 3.5
ST Var1 (* Resultado é REAL , 17.5*)
Notas :
8 - INSTRUÇÕES VÁRIAS
INDEXOF
Calcula o índex (posição de memória) interno do POU (“Program Organization Unit”) .
Exemplo em ST:
Var1:= TRUNC (POU2);
Exemplo em IL:
Var1:DINT;
LD POU2 (* Nome da programa , função ou bloco funcional *)
INDEXOF
ST Var1
SIZEOF
Calcula o numero de “bytes” requerido para um dado tipo de dados .
Exemplo em ST:
arr1:ARRAY [0..5] OF INT;
Var1:INT;
Var1:= TRUNC (arr1); (* O resultado é 12 *)
Exemplo em IL:
arr1:ARRAY [0..6] OF INT;
Var1:INT;
LD arr1
SIZEOF
ST Var1 (* O resultado é 14 *)
ADR
Calcula o endereço absoluto de uma variável em DWORLD . Esta função é utilizada para ser tratada
pelos PONTEIROS .
Exemplo em IL:
LD var1
ADR
ST var2
^
Esta identificação referência um PONTEIRO .
Exemplo em ST:
pt:POINTER TO INT
var_int1:INT;
var_int2:INT;
pt:=ADR(var_int1);
var_int2:=pt^;
BITADR
Retorna com o endereço do bit d a variável indicada .
Exemplo em IL:
var1: AT %IX1.0 : BOOL
out : BYTE
LD var1
BITADR
ST out (*Retorna com 08)
Exemplo em ST
bOFF AT %QX10.1 : BOOL
iBitAdr : BYTE
iBit := BITADR (bOFF) ; (*Retorna com 81)
CAL
Chama em IL uma função bloco . As variáveis que servem como entradas estão colocadas entre
parênteses á direita depois do nome da função bloco .
Exemplo em IL:
CAL INST (par1: 0 , par2:= TRUE)
Notas :
FUNCTION_BLOCK RS
Biestavel com RESET prioritário Q1 = RS (SET, RESET1) .
Equação lógica implementada internamente no FB , Q1 = NOT RESET1 AND (Q1 OR SET) .
Nome das livrarias : Standard.lb (*Para PC*) e Standard.lb (*Para PC*)
VAR_INPUT
VAR_INPUT
SET : BOOL;
RESET1 : BOOL;
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q1 : BOOL;
END_VAR
FUNCTION_BLOCK SR
Biestavel com SET prioritário Q1 = SR (SET1, RESET) .
Equação lógica implementada internamente no FB , Q1 := (NOT RESET AND Q1) OR SET1 .
VAR_INPUT
VAR_INPUT
SET1 : BOOL;
RESET : BOOL;
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q1 : BOOL;
END_VAR
FUNCTION_BLOCK SEMA
Função semáforo .Equação lógica implementada internamente no FB ,é a seguinte :
BUSY := X;
IF CLAIM THEN X:=TRUE;
ELSIF RELEASE THEN BUSY := FALSE;
X:= FALSE;
END_IF
VAR_INPUT
VAR_INPUT
CLAIM : BOOL;
REALEASE : BOOL;
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q1 : BOOL;
END_VAR
FUNCTION_BLOCK F_TRIG
Accionamento pelo flanco descendente . A saída Q e a variável interna M manter-se-á FALSE
enquanto a entrada CLK é TRUE . Logo que ocorra a transição de TRUE para FALSE em CLK a saída
Q ficará TRUE e M será posto a TRUE (set) . Isto significa que cada vez que esta função bloco seja
chamada a saída Q mantém-se FALSE até que ocorra uma transição do CLK de TRUE para FALSE .
Nome das livrarias : Standard.lb (*Para PC*) e Standard.lb6 (*Para BC*)
VAR_INPUT
VAR_INPUT
CLK : BOOL; (* Sinal a detector*)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (* Transição detectada *)
END_VAR
VAR
M : BOOL;
END_VAR
FUNCTION_BLOCK R_TRIG
Accionamento pelo flanco ascendente . A saída Q e a variável interna M manter-se-á FALSE enquanto
a entrada CLK é FALSE . Logo que ocorra a transição de FALSE para TRUE em CLK a saída Q
ficará TRUE e M será posto a TRUE (set) . Isto significa que cada vez que esta função bloco seja
chamada a saída Q mantém-se FALSE até que ocorra uma transição do CLK de FALSE para TRUE .
VAR_INPUT
VAR_INPUT
CLK : BOOL; (* Sinal a detector*)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (* Transição detectada *)
END_VAR
VAR
M : BOOL;
END_VAR
FUNCTION_BLOCK TOF
Temporizador ao atraso .
VAR_INPUT
VAR_INPUT
IN : BOOL;(* Iniciar temporização quando FALSE*)
PT : TIME; (* Temporização *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (*FALSE passado PT seg depois de PT ter passado T RUE=>FALSE *)
PT: TIME; (* Tempo já decorrido *)
END_VAR
FUNCTION_BLOCK TON
Temporizador ao trabalho .
VAR_INPUT
VAR_INPUT
IN : BOOL;(* Iniciar temporização quando TRUE *)
PT : TIME; (* Temporização *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (*TRUE passado PT seg depois de PT ter passado FALSE=>TRUE *)
PT: TIME; (* Tempo já decorrido *)
END_VAR
FUNCTION_BLOCK TP
Temporizador ao trabalho por impulso .
VAR_INPUT
VAR_INPUT
IN : BOOL;(* Iniciar temporização na transição de TRUE para FALSE*)
PT : TIME; (* Temporização *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (*TRUE durante PT tempo, impulso *)
PT: TIME; (* Tempo já decorrido *)
END_VAR
FUNCTION_BLOCK CTD
Contador decrescente . Quando LOAD é TRUE a variável CV será inicializada com o valor que se
encontra na variável PV . Se CD transitar de FALSE para TRUE , CV decrementa 1. Quando CV for
menor ou igual a zero Q irá a TRUE .
VAR_INPUT
VAR_INPUT
IN : BOOL;(* Contar com a transição positiva (FALSE=>TRUE) *)
LOAD : BOOL; (* Ordem de carregar valor inicial PV *)
PV : WORD; (* Valor inicial *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (* Finalização de contagem *)
CV: WORD; (* Contagem corrente *)
END_VAR
FUNCTION_BLOCK CTU
Contador crescente . A variável CV será inicializada com o RESET a TRUE . Quando ocorre uma
transição de FALSE para TRUE o contador incrementa 1 . Quando CV for maior ou igual a PV
Q irá a TRUE .
VAR_INPUT
VAR_INPUT
CU : BOOL;(* Contar com a transição positiva (FALSE=>TRUE) *)
RESET : BOOL; (* Ordem de por a zero o contador *)
PV : WORD; (* Valor final *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
Q : BOOL; (* Finalização de contagem *)
CV: WORD; (* Contagem corrente *)
FUNCTION_BLOCK CTUD
Contador crescente e decrescente . Combinação das mesmas características dos blocos funcionais de
contagem anteriores .( CTU e CTD ) .
VAR_INPUT
VAR_INPUT
CU : BOOL;(* Contagem crescente *)
CU : BOOL;(* Contagem crescente *)
RESET : BOOL; (* Ordem de por a zero o contador *)
LOAD : BOOL; (* Ordem de carregar valor inicial PV *)
PV : WORD; (* Valor final *)
END_VAR
VAR_OUTPUT
VAR_OUTPUT
QU : BOOL; (* Finalização de contagem *)
QD : BOOL; (* Finalização de contagem a zero *)
CV: WORD; (* Contagem corrente *)
Notas :
IV – FUNÇÕES “STANDARD”
CONCAT
Combina 2 “strings” .
Nome das livrarias : Standard.lb (*Para PC*) e Standard.lb (*Para PC*)
Exemplo em ST:
Var1: CONCAT (‘SUSI’ , ‘WILLI’) ;
Exemplo em IL:
LD ‘SUSI’
CONCAT ‘WILLI’
ST Var1 (* Resultado é ‘SUSIWILLI’ *)
DELETE
Apaga uma parte de um STRING a partir de uma dada posição .
DELETE (STR, L, P) significa o seguinte :
Apaga L caracteres do “string” STR a partir do carácter nº P .
Exemplo em ST:
Var1: = DELETE (‘SUXYSI’ , 2 , 2 ) ;
Exemplo em IL:
LD ‘SUXYSI’
DELETE 2,2
ST Var1 (* Resultado é ‘SYSI’ *)
FIND
Função de procura de uma parte (frase) dentro de um STRING .
FIND (STR1, STR2) significa o seguinte :
Encontra a posição , desde o 1º carácter , da frase STR1 dentro da STR2 .
Exemplo em ST:
Var1: = FIND (‘SUXYSI’ , ‘XY’ ) ;
Exemplo em IL:
LD ‘SUXYSI’
FIND ‘XY’
ST Var1 (* Resultado é 3 *)
INSERT
Função de inserção de uma parte (frase) dentro de um STRING .
INSERT (STR1, STR2, POS) significa o seguinte :
Insere STR2 depois da posição POS na frase STR1 .
Exemplo em ST:
Var1: = INSERT (‘SUSI’ , ‘XY’ , 2) ;
Exemplo em IL:
LD ‘SUSI’
INSERT ‘XY’ , 2
ST Var1 (* Resultado é ‘SUXYSI’ *)
LEFT
Selecciona um nº caracteres de um STRING a começar pela esquerda .
LEFT (STR, SIZE) significa o seguinte :
Selecciona na frase STR , SIZE caracteres a começar pela esquerda .
Exemplo em ST:
Var1: = LEFT (‘BRESIMAR’ , 2) ;
Exemplo em IL:
LD ‘BRESIMAR’
LEFT 2
ST Var1 (* Resultado é ‘BR’ *)
LEN
Calcula o tamanho de um STRING (nº de caracteres) .
Exemplo em ST:
Var1: = LEN (‘BRESIMAR’ ) ;
Exemplo em IL:
LD ‘BRESIMAR’
LEN
ST Var1 (* Resultado é 8 *)
MID
Selecciona um nº caracteres de um STRING a partir de uma dada posição .
MID (STR, LEN, POS) significa o seguinte :
Selecciona na frase STR , LEN caracteres a começar da posição POS (a contar da
esquerda).
Exemplo em ST:
Var1: = MID (‘BRESIMAR’ , 2 , 3) ;
Exemplo em IL:
LD ‘BRESIMAR’
MID 2 , 3
ST Var1 (* Resultado é ‘ES’ *)
REPLACE
Cola um STRING a partir de uma dada posição de um dado STRING e eliminando um nº de caracteres
definidos .
REPLACE (STR1, STR2, L, P) significa o seguinte :
Cola a frase STR2 a partir da posição P da frase STR1 e eliminando em STR1 L
caracteres .
Exemplo em ST:
Var1: = REPLACE (‘BRESIMAR’ , ‘ASA’ , 2 , 3) ;
Exemplo em IL:
LD ‘BRESIMAR’
REPLACE ‘ASA’ , 2, 3
ST Var1 (* Resultado é ‘BASAIMAR’ *)
RIGTH
Selecciona um nº caracteres de um STRING a começar pela direita .
RIGTH (STR, SIZE) significa o seguinte :
Selecciona na frase STR , SIZE caracteres a começar pela direita .
Exemplo em ST:
Var1: = RIGTH (‘BRESIMAR’ , 3) ;
Exemplo em IL:
LD ‘BRESIMAR’
RIGTH 3
ST Var1 (* Resultado é ‘MAR’ *)
V – EXEMPLOS PRÁTICOS
Para quem utilizar o método de diagrama funcional GRAFCET , teremos para o circuito
anterior a seguinte estrutura :
Para quem utilizar o método de diagrama funcional de GRAFCET , teremos para o circuito anterior a
seguinte estrutura :
Para quem utilizar o método de diagrama funcional de GRAFCET , teremos a seguinte estrutura :
ARITMETICAS IL ST LD
ADD - Soma LD in1 out:= in1+in2;
ADD in2
ST out
LOGICAS IL ST LD
AND - “E” (produto LD in1 out:= in1 AND in2;
lógico) AND in2
( BOOL , BYTE , WORD , ST out
DWORD )
OR - “OU” (soma LD in out:= in1 OR in2;
lógica) OR in2
( BOOL , BYTE , WORD , ST out
DWORD )
XOR - “OU EX” ( LD in out:= in1 XOR in2;
“OU” exclusivo) XOR in2
( BOOL , BYTE , WORD , ST out
DWORD )
NOT - “NÃO” LD in out:= NOT in;
(negação lógica) NOT
( BOOL , BYTE , WORD , ST out
DWORD )
DESLOCAÇÃO IL ST LD
SHL - Deslocação de in LD in out:= SHL (in,n);
em n bits a direita com SHL n
preenchimento á ST out
esquerda
( BYTE , WORD , DWORD )
SHR - Deslocação de in LD in out:= SHR (in,n);
em n bits á esquerda SHR n
com preenchimento á ST out
direita
( BYTE , WORD , DWORD )
ROL - Deslocação de in LD in out:= ROL (in,n);
em n bits á direita com ROL n
entrada á esquerda ST out
( BYTE , WORD , DWORD )
SELECÇÃO IL ST LD
SEL - Selector binário LD TRUE out:=SEL(g,in1,in2);
SEL in1,in2
ST out
COMPARAÇÃO IL ST LD
GT – “>” (maior que) LD in1 out:= in1 > in2;
GT in2
ST out
LT – “<” (menor que) LD in1 out:= in1 < in2;
LT in2
ST out
GE – “>=” (maior ou LD in1 out:= in1 >= in2;
igual a) GE in2
ST out
LE – “<=” (menor ou LD in1 out:= in1 <= in2;
igual a) LE in2
ST out
EQ – “=” (igual a) LD in1 out:= in1 = in2;
EQ in2
ST out
NE – “<>” (não igual LD in1 out:= in1 <> in2;
a) NE in2
ST out
CONVERSÃO IL ST LD
BOOL_TO_tipo LD in out:=BOOL_TO_INT(in);
(16 conversões) BOOL_TO_INT
ST out
BYTE_TO_tipo LD in out:=BYTE_TO_WORD(in);
(16 conversões) BYTE_TO_WORD
LD
ST out
WORD_TO_tipo LD in out:=WORD_TO_INT(in);
(16 conversões) WORD_TO_INT
ST out
DWORD_TO_tipo LD in out:=DWORD_TO_BOOL(in);
(16 conversões) DWORD_TO_BOOL
ST out
USINT_TO_tipo LD in out:=USINT_TO_INT(in);
(16 conversões) USINT_ TO_DINT
ST out
UINT_TO_tipo LD in out:=UINT_TO_USINT(in);
(16 conversões) UINT_ TO_USINT
ST out
UDINT_TO_tipo LD in out:=UDINT_TO_USINT(in);
(16 conversões) UDINT_ TO_USINT
ST out
SINT_TO_tipo LD in out:=SINT_TO_USINT(in);
(16 conversões) SINT_ TO_USINT
ST out
INT_TO_tipo LD in out:=INT_TO_USINT(in);
(16 conversões) INT_ TO_USINT
ST out
DINT_TO_tipo LD in out:=DINT_TO_USINT(in);
(16 conversões) DINT_ TO_USINT
ST out
REAL_TO_tipo LD in out:=REAL_TO_USINT(in);
(16 conversões) REAL_ TO_USINT
ST out
LREAL_TO_tipo LD in out:=LREAL_TO_USINT(in);
(16 conversões) LREAL_ TO_USINT
ST out
STRING_TO_tipo LD in out:=STRING_TO_USINT(in);
(16 conversões) STRING_TO_USINT
ST out
TIME_TO_tipo LD in out:=TIME_TO_USINT(in);
(16 conversões) TIME_ TO_USINT
ST out
TOD_TO_tipo LD in out:=TOD_TO_UINT(in);
(16 conversões) TOD_ TO_UINT
“TIME_OF_DAY” ST out
DATE_TO_tipo LD in out:=DATE_TO_UINT(in);
(16 conversões) DATE_TO_UINT
ST out
DT_TO_tipo LD in out:=DT_TO_UINT(in);
(16 conversões) DT_TO_UINT
“DATE_AND_TIME” ST out
VÁRIAS IL ST LD
INDEXOF – index LD in out:=INDEXOF(in);
interno do POU INDEXOF
ST out
SIZEOF – nº de LD in out:=SIZEOF(in);
“bytes” da variável SIZEOF
ST out
ADR – endereço pt:POINTER TO INT
absoluto da variável var_int1:INT;
^ – indicação de var_int2:INT;
ponteiro
pt:=ADR(var_int1);
var_int2:=pt^;
BITADR – endereço do LD in out:=BITADR(in);
bit na variável BITADR
ST out
TEMPORIZADORES IL ST LD
TOF – Temporizado ao CAL tof1 tof1(IN:=in1 , PT:=T#2s ,
repouso (IN := in1 , Q=>out1 , ET=>tempor );
PT := T#2s ,
Q=>out1 ,
ET=>tempor)
LD tof1.Q
ST out1
LD tof1.ET
ST tempor
CONTADORES IL ST LD
CTD – Contador CAL tof1 tof1(IN:=in1 , PT:=T#2s ,
decrescente (IN := in1 , Q=>out1 , ET=>tempor );
PT := T#2s ,
Q=>out1 ,
ET=>tempor)
LD tof1.Q
ST out1
LD tof1.ET
ST tempor
1 – ERROS DE COMPILAÇÃO
1 – ERROS DE COMPILAÇÃO
Neste capitulo encontrará as mensagens de erro ( em “italics” ) e as suas possíveis causas . Para
uma melhor interpretação e como o software TwinCAT é o usado a versão inglesa , optamos em deixar a
tabela na mesma língua .
3410 No successional step In the .exp file a step is missing which requires the transition
for transition '<name>' <name> as preceeding condition.
3411 Step '<name>' not In the .exp file the connection between step <name> and the
reachable from initial step initial step is missing.