Escolar Documentos
Profissional Documentos
Cultura Documentos
mpro_twcplc.pdf (v1.0)
Beckhoff TwinCAT
The Windows Control and Automation Technology
NDICE
I TIPO DE DADOS E VARIVEIS I.1 Identificadores (Identifiers) I.2 Prefixos (Prefix) I.3 Tipo de dados (Data type) I.4 Operandos (Operands) I.5 Variveis e endereos II LISTA DE INSTRUES STANDARD II.1 Instrues numricas II.2 Instrues aritmticas II.3 Instrues lgicas II.4 Instrues de deslocao de bit II.5 Instrues de seleco II.6 Instrues de comparao II.7 Instrues de converso II.8 Instrues vrias III FUNES BLOCO STANDARD III.1 Funes bloco Standard - Biestavel III.2 Funes bloco Standard Trigger III.3 Funes bloco Standard - Temporizadores III.4 Funes bloco Standard Contadores IV FUNES STANDARD IV.1 Funes Standard String V EXEMPLOS PRTICOS V.1 Arranque directo de motor trifsico V.2 Inverso de rotao de motor trifsico V.3 Arranque estrela-triangulo de motor trifsico A RESUMO DE INSTRUES E FUNES STANDARD A.1 Resumo de instrues do TwinCAT PLC A.2 Resumo das funes bloco standard A.3 Resumo das funes standard B LISTA DE ERROS DE COMPILAO DE PROGRAMA B.1 Erros de compilao
I TIPO DE DADOS E VARIAVEIS 1 IDENTIFICADORES (Identifiers) 2 PREFIXOS (Prefix) 3 TIPO DE DADOS (Data type) 4 OPERANDOS (Operands) 5 VARIAVEIS E ENDEREOS
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 1 de 9
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 2 de 9
1 IDENTIFICADORES (Identifiers)
Cada identificador de variveis , funes , etc assinalado com um tipo de dados que dita o espao de memoria que ser reservado na CPU . Um identificador um nome que designa uma varivel , funo ou outro tipo de dados e que dever cumprir os seguintes requisitos : y y y Comear por uma letra ou underscore Seguido por nmeros , letras e underscore No existe diferenas entre letras maisculas e minsculas
e no sero permitidos os seguintes caracteres y y y Caracteres especiais (!, ,*,&,$,#, etc) Caracteres em branco Underscore seguidos
2 PREFIXOS (Prefix)
Para uma melhor identificao do tipo de identificador de boa prtica colocar um prefixo no inicio de cada nome , para uma melhor organizao e clarificao do programa , tal como usado nas linguagens de alto nvel ( Visual Basic ,etc. ) . Todavia no obrigatrio para o bom funcionamento do programa . As primeiras letras devero ser o prefixo ( letras minscula ) do identificador seguido do nome da varivel que dever comear por uma letra maisculas . Aqui vo as nossas sugestes para alguns tipos de dados : PREFIXO b by w dw si i di r s t tod dt d pt str TIPO de DADOS BOOL BYTE WORD DWORD SINT INTEGER DINT REAL STRING TIME TIME_OF_DAY DATE_AND_TIME DATE POINTER STRUCT EXEMPLO bNomevariavelbool byNomevariavelbyte wNomevariavelbool dwNomevariavelbool syNomevariavelsinteiro byNomevariavelinteiro dyNomevariaveldinteiro wNomevariavelreal dwNomevariavelstring tNomevariaveltempo todNomevariaveltempodia dtNomevariaveldatatempo dNomevariaveldata ptNomevariavelponteiro strNomevariavelestrutura
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 3 de 9
3.1 - DADOS ELEMENTARES Tipo BOOL BYTE WORD DWORD USINT UINT UDINT SINT INT DINT REAL LREAL DATE TOD DT Tamanho 1 bit 8 bit 16 bit 32 bit 8 bit 16 bit 32 bit 8 bit 16 bit 32 bit 32 bit 64 bit 32 bit 32 bit 32 bit Limites TRUE .. FALSE 16#00 .. FF 16#0000 .. FFFF 16#0000_0000 .. FFFF_FFFF 0 .. 255 0 .. 65 535 0 .. 4 294 967 295 -128 .. 127 -32 768 .. 32 767 -2 147 483 648 .. 2 147 483 647
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 4 de 9
3.2 - DADOS COMPLEXOS ou ESTRUTURADOS Tipo ARRAY POINTER SUBRANGE Configurao <identificao>:ARRAY [<Linf1>..<Lsup1>,<Linf2>..<Lsup2>] OF <tipo dado> ; <identificao>: POINTER TO <tipo dado / funo bloco>; TYPE <nome subrange> : <tipo dado> (<limite inf>..<limite sup>); END_TYPE; TYPE <identificao>: <term assinalado>; END_TYPE TYPE <identificao>: (<num0> ,<num1>, ..,<num_n>); END_TYPE TYPE <nome estrutura>: STRUCT <Declarao da varivel 1> ; . <Declarao da varivel n> ; END_STRUCT END_TYPE
ALIAS
ENUM
STRUCT
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 5 de 9
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 . 4.1 - Constantes em BOOL As constantes em BOOL so representadas por FALSE e TRUE . 4.2 - Constantes em BYTE , WORD , DWORD , INT , REAL etc As constantes em BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, podero ser representadas em binrio , octal , decimal ou hexadecimal . Na representao de um numero real a parte decimal separada da parte inteira por um ponto (formato americano) e no uma virgula. As constantes tero a seguinte configuraes : Exemplos em ST : (* Representao 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 (* Representao em binario *) byConstante1:= 2# 1001_1111 wConstante1:= 2# 1001_1111_0000_10101 (* Representao em octal *) byConstante2:= 8# 77 (* Representao em hexadecimal *) byConstante3:= 16# FF wConstante2:= 16# FF_FF dwConstante1:= 16# FF_FF_FF_FF 4.3 - Constantes em TIME No TwinCAT podemos declarar constantes temporais. Geralmente so usadas na definio do tempo nos temporizadores (Funo bloco standard TON , TOF , TP) . A constante ter a seguinte configurao : <touTouTIMEoutime ># diadhorahminutosmsegundossmilisegms 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*) 4.4 - Constantes em DATE Geralmente so usadas na definio de datas . A constante ter a seguinte configurao : <douDouDATEoudate># ano-mes-dia Exemplos em ST : (* Valores correctos *) dData1:= d#2005-12-01 dData2:= DATE#2000-06-02
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 6 de 9
4.5 - Constantes em TIME OF DAY Geralmente so usadas na definio do tempo (hora) do dia . A constante ter a seguinte configurao : <todouTODouTIME_OF_DAY># hora:minuto:segundo Exemplos em ST : (* Valores correctos *) todTod1:= tod#15:12:10.250 (* Podemos ter fraco de seg.*) todTod2:= TIME_OF_DAY#23:59:59 4.6 - Constantes em DATE AND TIME Geralmente so usadas na definio da data/hora . A constante ter a seguinte configurao: <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 4.7 - Constantes em STRING Um STRING uma sequncia de caracteres . As constantes em STRING so precedidas e finalizadas com aspas . Podemos por espaos e caracteres especiais e sero tratados como qualquer outro carcter . A combinao do smbolo $ seguido de um numero hexadecimal representa o cdigo de 8 bits da tabela de caracteres standard. Comandos especiais podero ser representados por um $ seguido de outro carcter como podemos ver a seguir . Caracteres comando $$ $ $L ou $l $N ou $n $P ou $p $R ou $r $T ou $t Exemplos em ST : (* Valores correctos *) stTexto1:= BRESIMAR(ASA) Descrio Representar o sinal de dolar($) Representar o sinal de aspas() Line feed New Line Page feed Line break Tab
5 VARIAVEIS E ENDEREOS
Neste paragrafo iremos apresentar num pequeno resumo as diversas maneiras de representar dentro do programa tais como as variveis e os endereos absolutos na memoria do hardware no TwinCAT . 5.1 Variveis As variveis podem ser declaradas tanto localmente , dentro do grupo de declarao dos POUs ou na lista das variveis globais . O identificadores das variveis no devero conter espaos em branco ou caracteres especiais como j anteriormente tnhamos dito . Letras maisculas no sero reconhecidas o que significa que VAR1 , Var1 e var1 so todas a mesma varivel . O sinal de underscore reconhecido nos identificadores ( por exemplo : A_BCD e AB_CD so duas variveis diferentes ) .Um identificador de uma varivel pode ter mais que um carcter underscore numa linha . Podemos identificar uma varivel com o mximo de 32 caracteres . Dentro do editor de programa TwinCAT , tempos acesso as variveis atravs do Input Assistant Local Variables ou Global Variables ( pressionar a tecla funo F2) e se desejarmos declarar novas variveis utilizamos o Auto Declare (pressionar shift+F2). BRESIMAR
<j.andril@bresimar.pt>
Cap. I 7 de 9
Podemos aceder a variveis em ARRAYS , STRUCTURES e POUs utilizando as seguintes configuraes : Varveis em ARRAY ( ex. 2 dimenses) <nome do array>[index1 , index2] Variaveis em STRUCT <nome da structure> . <nome da varivel> Variveis em FUNES BLOCO ou PROGRAMAS <nome da funo bloco> . <nome da varivel>
5.2 Endereos A indicao directa de uma posio individual de memoria ou das entradas ou sadas do hardware utilizado feito atravs de uma sequencia de caracteres especiais.. Esta sequencia tem a seguinte configurao : %<prefixodotipo><prefixodotamanho> Prefixos do tipo de endereo Tipo % % % I O M Descrio Entrada (Input) Saida (Output) Memoria (Memory)
Prefixos do tamanho de endereo Tamanho X B W D Descrio bit Byte (8 bit) Word (16 bit) Dupla word (32 bit)
(* Bit 1 do byte de sada 75 *) (* Word de entrada 125 *) (* Byte de saida 7 *) (* Dupla Word da posio de memoria 48 *)
Para acedermos a uma dada localizao de memoria podemos utilizar qualquer tamanho ( bit , byte , Word ou duplo Word ) . Por exemplo o endereo %MD48 so os seguintes endereos no formato byte : %MD48 ======= > ( 48 x 4 ) %MB192 %MB193 %MB194 %MB195
Cap. I 8 de 9
Podemos no TwinCAT dentro de variveis do tipo SINT, INT, DINT, USINT, UINT, UDINT, BYTE, WORD, DWORD , se desejarmos , aceder a bits individualmente . Para fazermos isto , o ndex do bit a ser endereado colocado como um apndice na varivel e separado por um ponto . O ndex base o 0 ( zero) . Exemplo : (* Campo da declarao das variaveis *) (* No deve ser assinalada no campo VAR_IN_OUT *) a: INT; b:INT; (* Campo no POU - Main *) a.2 := b; (* O 3 bit da varivel a igual ao valor lgico de b *) Se o ndex maior que o tamanho do tipo da varivel escolhido surgir a seguinte mensagem de erro : Index <n> outside the valid range for variable <var> Se o tipo da varivel no permitir este modo de programao surgir a seguinte mensagem de err : Invalid data type <type> for direct indexing
BRESIMAR
<j.andril@bresimar.pt>
Cap. I 9 de 9
IV LISTA DE INSTRUES 1 - INSTRUES NUMRICAS 2 - INSTRUES ARITMTICAS 3 - INSTRUES LGICAS 4 - INSTRUES de DESLOCAO de BIT 5 - INSTRUES de SELECO 6 - INSTRUES de COMPARAO 7 - INSTRUES de CONVERSO 8 - INSTRUES VRIAS
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 1 de 20
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 2 de 20
1 - INSTRUES NUMRICAS
ABS Calcula o valor absoluto do numero . IN e OUT podero ter as seguintes combinaes : 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 .
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 3 de 20
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 :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 4 de 20
MUL
Calcula o produto aritmtico de variveis 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 subtraco aritmtica de variveis de diversos tipos : BYTE WORD DWORD SINT USINT INT UINT DINT UDINT REAL e LREAL. Duas variveis TIME podem ser subtradas 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:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 5 de 20
DIV
Calcula a diviso aritmtica de variveis de diversos tipos :BYTE WORD DWORD SINT USINT INT UINT DINT UDINT REAL e LREAL . Exemplo em ST: Var1:= 7/2; Exemplo em FBD:
Nota : Usando CheckDivByte ; CheckDivWord ; CheckDivDWord e CheckDivReal podemos verificar o valor do divisor de maneira a evitar a diviso por zero .
MOD
Calcula o modulo de diviso (resto da diviso) de variveis de diversos tipos : BYTE WORD DWORD SINT USINT INT UINT DINT UDINT . Duas variveis TIME podem ser subtradas resultando um outro TEMPO . Um valor TIME negativo um valor indefinido. Exemplo em ST: Var1:= 9 MOD 2; Exemplo em IL: LD 9 MOD 2 ST Var1 (*Resultado 1*) Exemplo em FBD:
Notas :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 6 de 20
OR
Calcula a soma lgica ( OU) de variveis 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 lgica exclusiva ( OU-Exclusivo) de variveis 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:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 7 de 20
NOT
Calcula a negao lgica (NO) de variveis 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 :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 8 de 20
SHL
Deslocao de IN em n bits esquerda e preenchendo de zeros os bits direita . A:= SHL(IN, N) . IN e OUT sero do tipo BYTE WORLD ou DWORLD . Exemplo em ST:
SHR
Deslocao de IN em n bits direita e preenchendo de zeros os bits esquerda . A:= SHR(IN, N) . IN e OUT sero do tipo BYTE WORLD ou DWORLD . Exemplo em ST:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 9 de 20
ROL
Deslocao de IN em n bits esquerda e com realimentao direita . A:= ROL(IN, N) . IN e OUT sero do tipo BYTE WORLD ou DWORLD . Exemplo em ST:
ROR
Deslocao de IN em n bits direita e com realimentao esquerda . A:= ROR(IN, N) . IN e OUT sero do tipo BYTE WORLD ou DWORLD . Exemplo em ST:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 10 de 20
MAX
Seleco 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
Seleco 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:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 11 de 20
LIMIT
Seleco 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 sada OUT ser o MAX . Se o valor inferior a MIN o valor na sada 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 :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 12 de 20
6 - INSTRUES de COMPARAO GT
Comparao 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
Comparao 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
Comparao 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:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 13 de 20
LE
Comparao 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
Comparao 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
Comparao no 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:
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 14 de 20
Converso TO BOOL
Converte qualquer tipo de varivel para o tipo BOOL . O resultado TRUE quando o operando no 0 . O resultado FALSE quando o operando igual a 0 . O resultado TRUE no tipo de varivel STRING quando o operando TRUE , caso contrrio 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 converso
Converte uma varivel STRING para qualquer outro tipo . O operando da varivel do tipo STRING deve conter um valor que seja valido no tipo de varivel que se deseja converter , caso contrrio 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 *)
Converso TO STRING
Converte qualquer tipo de varivel 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 converso
Converte uma varivel do tipo TIME para qualquer outro tipo . Os dados sero armazenados internamente numa DWORD em milissegundos . S depois que este valor ser convertido . Quando ocorre uma converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . 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' *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 15 de 20
DATE_TO converso
Converte uma varivel do tipo DATE para qualquer outro tipo . Os dados sero 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 converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . 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 converso
Converte uma varivel do tipo TIME_OF_DATE para qualquer outro tipo . Os dados sero armazenados internamente numa DWORD em milissegundos a contar a partir das 12:00 AM. S depois que este valor ser convertido . Quando ocorre uma converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . 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 converso
Converte uma varivel do tipo DATE_AND_TIME para qualquer outro tipo . Os dados sero 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 converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . 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 *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 16 de 20
Quando ocorre uma converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . Se o numero convertido excede o limite mximo, o primeiro byte ser ignorado . 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 varivel de tipo REAL para INT . Quando ocorre uma converso de um valor de um tipo maior para um menor corremos o risco de perda de informao . Se o numero convertido excede o limite mximo, 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 :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 17 de 20
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 18 de 20
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 endereo absoluto de uma varivel em DWORLD . Esta funo utilizada para ser tratada pelos PONTEIROS . Exemplo em IL: LD var1 ADR ST var2
^
Esta identificao referncia 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 endereo do bit d a varivel 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)
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 19 de 20
CAL
Chama em IL uma funo bloco . As variveis que servem como entradas esto colocadas entre parnteses direita depois do nome da funo bloco . Exemplo em IL: CAL INST (par1: 0 , par2:= TRUE) Notas :
BRESIMAR
<j.andril@bresimar.pt>
Cap. II 20 de 20
III FUNES BLOCO STANDARD 1 FUNES BLOCO STANDARD BIESTAVEL 2 FUNES BLOCO STANDARD TRIGGER 3 FUNES BLOCO STANDARD TEMPORIZADORES 4 FUNES BLOCO STANDARD CONTADORES
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 1 de 8
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 2 de 8
FUNCTION_BLOCK RS Biestavel com RESET prioritrio Q1 = RS (SET, RESET1) . Equao lgica 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 prioritrio Q1 = SR (SET1, RESET) . Equao lgica 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 Funo semforo .Equao lgica 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
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 3 de 8
FUNCTION_BLOCK F_TRIG Accionamento pelo flanco descendente . A sada Q e a varivel interna M manter-se- FALSE enquanto a entrada CLK TRUE . Logo que ocorra a transio de TRUE para FALSE em CLK a sada Q ficar TRUE e M ser posto a TRUE (set) . Isto significa que cada vez que esta funo bloco seja chamada a sada Q mantm-se FALSE at que ocorra uma transio 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; END_VAR VAR M : BOOL; END_VAR
(* Transio detectada *)
FUNCTION_BLOCK R_TRIG Accionamento pelo flanco ascendente . A sada Q e a varivel interna M manter-se- FALSE enquanto a entrada CLK FALSE . Logo que ocorra a transio de FALSE para TRUE em CLK a sada Q ficar TRUE e M ser posto a TRUE (set) . Isto significa que cada vez que esta funo bloco seja chamada a sada Q mantm-se FALSE at que ocorra uma transio do CLK de FALSE para TRUE . VAR_INPUT VAR_INPUT CLK : BOOL; (* Sinal a detector*) END_VAR VAR_OUTPUT VAR_OUTPUT Q : BOOL; END_VAR VAR M : BOOL; END_VAR
(* Transio detectada *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 4 de 8
FUNCTION_BLOCK TOF Temporizador ao atraso . VAR_INPUT VAR_INPUT IN : BOOL;(* Iniciar temporizao quando FALSE*) PT : TIME; (* Temporizao *) 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 temporizao quando TRUE *) PT : TIME; (* Temporizao *) 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
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 5 de 8
FUNCTION_BLOCK TP Temporizador ao trabalho por impulso . VAR_INPUT VAR_INPUT IN : BOOL;(* Iniciar temporizao na transio de TRUE para FALSE*) PT : TIME; (* Temporizao *) END_VAR VAR_OUTPUT VAR_OUTPUT Q : BOOL; (*TRUE durante PT tempo, impulso *) PT: TIME; (* Tempo j decorrido *) END_VAR
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 6 de 8
FUNCTION_BLOCK CTD Contador decrescente . Quando LOAD TRUE a varivel CV ser inicializada com o valor que se encontra na varivel 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 transio positiva (FALSE=>TRUE) *) LOAD : BOOL; (* Ordem de carregar valor inicial PV *) PV : WORD; (* Valor inicial *) END_VAR VAR_OUTPUT VAR_OUTPUT Q : BOOL; (* Finalizao de contagem *) CV: WORD; (* Contagem corrente *) END_VAR
FUNCTION_BLOCK CTU Contador crescente . A varivel CV ser inicializada com o RESET a TRUE . Quando ocorre uma transio 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 transio positiva (FALSE=>TRUE) *) RESET : BOOL; (* Ordem de por a zero o contador *) PV : WORD; (* Valor final *) END_VAR VAR_OUTPUT VAR_OUTPUT Q : BOOL; (* Finalizao de contagem *) CV: WORD; (* Contagem corrente *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 7 de 8
FUNCTION_BLOCK CTUD Contador crescente e decrescente . Combinao das mesmas caractersticas 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; (* Finalizao de contagem *) QD : BOOL; (* Finalizao de contagem a zero *) CV: WORD; (* Contagem corrente *) Notas :
BRESIMAR
<j.andril@bresimar.pt>
Cap. III 8 de 8
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 1 de 7
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 2 de 7
CONCAT Combina 2 strings . Nome das livrarias : Standard.lb (*Para PC*) e Standard.lb (*Para PC*) FUNCTION CONCAT : STRING(255) VAR_INPUT VAR_INPUT STR1 : STRING(255); STR2 : STRING(255); END_VAR 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 posio . DELETE (STR, L, P) significa o seguinte : Apaga L caracteres do string STR a partir do carcter n P . FUNCTION DELETE : STRING(255) VAR_INPUT VAR_INPUT STR : STRING(255); LEN : INT; POS : INT; END_VAR Exemplo em ST: Var1: = DELETE (SUXYSI , 2 , 2 ) ; Exemplo em IL: LD SUXYSI DELETE 2,2 ST Var1 (* Resultado SYSI *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 3 de 7
FIND Funo de procura de uma parte (frase) dentro de um STRING . FIND (STR1, STR2) significa o seguinte : Encontra a posio , desde o 1 carcter , da frase STR1 dentro da STR2 . FUNCTION FIND : INT VAR_INPUT VAR_INPUT STR1 : STRING(255); STR2 : STRING(255); END_VAR Exemplo em ST: Var1: = FIND (SUXYSI , XY ) ; Exemplo em IL: LD SUXYSI FIND XY ST Var1 (* Resultado 3 *)
INSERT Funo de insero de uma parte (frase) dentro de um STRING . INSERT (STR1, STR2, POS) significa o seguinte : Insere STR2 depois da posio POS na frase STR1 . FUNCTION INSERT : STRING(255) VAR_INPUT VAR_INPUT STR1 : STRING(255); STR2 : STRING(255); POS : INT; END_VAR Exemplo em ST: Var1: = INSERT (SUSI , XY , 2) ; Exemplo em IL: LD SUSI INSERT XY , 2 ST Var1 (* Resultado SUXYSI *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 4 de 7
LEFT Selecciona um n caracteres de um STRING a comear pela esquerda . LEFT (STR, SIZE) significa o seguinte : Selecciona na frase STR , SIZE caracteres a comear pela esquerda . FUNCTION LEFT : STRING(255) VAR_INPUT VAR_INPUT STR : STRING(255); SIZE : INT; END_VAR 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) . FUNCTION LEN : INT VAR_INPUT VAR_INPUT STR : STRING(255); SIZE : INT; END_VAR Exemplo em ST: Var1: = LEN (BRESIMAR ) ; Exemplo em IL: LD BRESIMAR LEN ST Var1 (* Resultado 8 *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 5 de 7
MID Selecciona um n caracteres de um STRING a partir de uma dada posio . MID (STR, LEN, POS) significa o seguinte : Selecciona na frase STR , LEN caracteres a comear da posio POS (a contar da esquerda). FUNCTION MID : STRING(255) VAR_INPUT VAR_INPUT STR : STRING(255); LEN : INT; POS : INT; END_VAR 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 posio 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 posio P da frase STR1 e eliminando em STR1 L caracteres . FUNCTION REPLACE : STRING(255) VAR_INPUT VAR_INPUT STR1 : STRING(255); STR1 : STRING(255); L : INT; P : INT; END_VAR Exemplo em ST: Var1: = REPLACE (BRESIMAR , ASA , 2 , 3) ; Exemplo em IL: LD BRESIMAR REPLACE ASA , 2, 3 ST Var1 (* Resultado BASAIMAR *) BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 6 de 7
RIGTH Selecciona um n caracteres de um STRING a comear pela direita . RIGTH (STR, SIZE) significa o seguinte : Selecciona na frase STR , SIZE caracteres a comear pela direita . FUNCTION RIGTH : STRING(255) VAR_INPUT VAR_INPUT STR : STRING(255); SIZE : INT; END_VAR Exemplo em ST: Var1: = RIGTH (BRESIMAR , 3) ; Exemplo em IL: LD BRESIMAR RIGTH 3 ST Var1 (* Resultado MAR *)
BRESIMAR
<j.andril@bresimar.pt>
Cap. IV 7 de 7
V EXEMPLOS PRTICOS 1 ARRANQUE DIRECTO DE MOTOR TRIFSICO 2 INVERSO DE ROTAO DE MOTOR TRIFSICO 3 ARRANQUE ESTRELA-TRIANGULO DE MOTOR TRIFSICO
Neste capitulo vo ser apresentados exemplos de automatismos e respectivas solues utilizando instrues pertencentes a PLCs Beckhoff . As aplicaes abordam circuitos elctricos simples e comuns nos automatismos electromecnicos industriais . O estudo destes exemplos tem por finalidade aprofundar os conhecimentos adquiridos nos captulos anteriores e , ao mesmo tempo , possibilitar a prtica das instrues base do TwinCAT-PLC . Compreendidos os exemplos propostos , adquirem-se os conhecimentos necessrios para se abordar situaes mais complexas , ou seja , o caminho fica aberto para que se torne possvel enfrentar a concepo , realizao e manuteno de automatismos usando o TwinCAT . Chamo ateno , que os exemplos de programao apresentados foram escritos a titulo didctico . Por isso , podem no estar previstas todas as situaes de funcionamento real . Deste modo , o seu uso em programas de aplicao industrial pode necessitar de adaptaes que assegurem todas as possibilidades de utilizao e o respeito pelas normas de segurana em vigor no sector de actividade onde vo ser utilizadas .
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 1 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 2 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 3 de 35
TWINCAT PLC Exemplos prticos 1.1 - Edio a texto 1.1.1 - ST - Structured Text
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 4 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 5 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 6 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 7 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 8 de 35
Para quem utilizar o mtodo de diagrama funcional GRAFCET , teremos para o circuito anterior a seguinte estrutura : GRAFCET NVEL 1 (Especificaes funcionais)
GRAFCET NVEL 2 (Especificaes tecnolgicas) Na etapa inicial (etapa 0) o automatismo no executa qualquer aco , estando o sistema em repouso (motor parado) . Para que o motor trabalhe necessrio que o GRAFCET evolua para a etapa 1. A etapa 1 activada se a transio for vlida , ou seja , se a etapa 0 estiver activa e a condio lgica de transio ( F2 . /S1 . S2 ) for verdadeira ( o boto de presso S2 foi pressionado , no est pressionado o boto S1 e nem o rel trmico F2 foi actuado ). Nesta situao o GRAFCET evolui para a etapa 1 e a aco associada a esta etapa realizada (bobina do contactor alimentada e o motor M1 accionado). Estando o motor em funcionamento (etapa 1) se desejarmos desligar o motor teremos de passar , no GRAFCET , para a etapa 0 . Isso acontece quando a condio lgica ( /F2 + S1 ) for verdadeira ( o boto de presso S1 foi pressionado ou o rel trmico F2 disparou ) .
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 9 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 10 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 11 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 12 de 35
TWINCAT PLC Exemplos prticos 2.1 - Edio a texto 2.1.1 - ST - Structured Text
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 13 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 14 de 35
TWINCAT PLC Exemplos prticos 2.2 - Edio grfica 2.2.1 - LD - Ladder Diagram
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 15 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 16 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 17 de 35
Para quem utilizar o mtodo de diagrama funcional de GRAFCET , teremos para o circuito anterior a seguinte estrutura : GRAFCET NVEL 1 (Especificaes funcionais)
GRAFCET NVEL 2 (Especificaes tecnolgicas) Na etapa inicial (etapa 0) o automatismo no executa qualquer aco , o motor est parado . Para que o motor trabalhe necessrio que o GRAFCET evolua para a etapa 1 ou 2. A etapa 1 activada se a transio for vlida , ou seja , se a etapa 0 estiver activa e a condio lgica de transio ( F2 . /S6 . /S8 . S7 ) for verdadeira ( o boto de presso S7 foi pressionado e no est pressionado o boto S6 nem o S8 e nem o rel trmico F2 foi actuado ). Nesta situao o GRAFCET evolui para a etapa 1 e o motor ir rodar para a direita . Para o motor rodar para a esquerda , a etapa 2 ter de ser activada , em alternativa etapa 1 , sendo necessrio que o motor esteja parado ( etapa 0) e a condio de transio ( F2 . /S6 . /S7 . S8 ) seja verdadeira . Estando o motor em funcionamento (etapa 1 ou 2) se desejarmos desligar o motor teremos de passar , no GRAFCET , para a etapa 0 . Isso acontece quando a condio lgica ( /F2 + S6 ) for verdadeira ( o boto de presso S6 foi pressionado ou o rel trmico F2 disparou ) .
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 18 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 19 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 20 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 21 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 22 de 35
TWINCAT PLC Exemplos prticos 3.1 - Edio a texto 3.1.1 - ST - Structured Text
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 23 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 24 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 25 de 35
TWINCAT PLC Exemplos prticos 3.2 - Edio grfica 3.2.1 - LD - Ladder Diagram
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 26 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 27 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 28 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 29 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 30 de 35
Para quem utilizar o mtodo de diagrama funcional de GRAFCET , teremos a seguinte estrutura : GRAFCET NVEL 1 (Especificaes funcionais)
GRAFCET NVEL 2 (Especificaes tecnolgicas) Na etapa inicial (etapa 0) o automatismo no executa qualquer aco , o motor esta parado . A etapa 1 activada se a transio for vlida , ou seja , se a etapa 0 estiver activa e a condio lgica de transio ( F2 . /S9 . S10 ) for verdadeira ( o boto de presso S10 foi pressionado e no est pressionado o boto S9 e nem o rel trmico F2 foi actuado ). Nesta situao o GRAFCET evolui para a etapa 1 e o motor ir arrancar em modo estrela durante o tempo t1 (seg.) . Nesta etapa est accionado o contactor KM1 e KM2 .Passado esse tempo t1 o sistema passar para a etapa 2 , que corresponde ao modo triangulo . Nesta etapa o contactor KM1 est desligado , o contactor KM2 mantm-se ligado e ligado o contactor KM3 . Estando o motor em funcionamento (etapa 1 ou 2) se desejarmos desligar o motor teremos de passar , no GRAFCET , para a etapa 0 . Isso acontece quando a condio lgica ( /F2 + S9) for verdadeira ( o boto de presso S9 foi pressionado ou o rel trmico F2 disparou ) .
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 31 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 32 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 33 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 34 de 35
BRESIMAR
<j.andril@bresimar.pt>
Cap. V 35 de 35
Anexo A RESUMO DE INSTRUES E FUNES STANDARD 1 RESUMO DE INSTRUES DO TwinCAT PLC 2 RESUMO DAS FUNES BLOCO STANDARD 3 RESUMO DAS FUNES STANDARD
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 1 de 9
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 2 de 9
out:=COS(in);
out:=ASIN(in);
out:=ATAN(in);
out:=COS(in);
EXP - Exponencial
out:=EXP(in);
out:=LOG(in);
out:=SIN(in);
out:=SQRT(in);
TAN - Tangente
out:=TAN(in);
ST out:= in1+in2;
LD
MUL - Multiplicao
out:= in1*in2*in3;
SUB - Subtraco
out:= in1-in2;
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 3 de 9
TWINCAT PLC Resumo de Instrues DIV - Diviso LD in DIV in2 ST out LD in MOD in2 ST out IL LD in1 AND in2 ST out LD in OR in2 ST out LD in XOR in2 ST out LD in NOT ST out IL LD in SHL n ST out LD in SHR n ST out LD in ROL n ST out LD in ROR n ST out IL LD TRUE SEL in1,in2 ST out LD in1 MAX in2 MAX in3 ST out LD in1 MIN in2,in3 ST out
LD
OR - OU (soma lgica)
( BOOL , BYTE , WORD , DWORD )
XOR - OU EX ( OU exclusivo)
( BOOL , BYTE , WORD , DWORD )
LD
ST out:=SEL(g,in1,in2);
LD
out:=MAX (in1,in2,in3);
out:=MIN(in1,in2,in3);
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 4 de 9
TWINCAT PLC Resumo de Instrues LIMIT - Seleco de limites LD min LIMIT in , max ST out LD k MUX in0,in1,in2, In3,in4 ST out IL LD in1 GT in2 ST out LD in1 LT in2 ST out LD in1 GE in2 ST out LD in1 LE in2 ST out LD in1 EQ in2 ST out LD in1 NE in2 ST out IL LD in
BOOL_TO_INT
MUX - Multiplexador
out:=MUX(K,in0,in1,in2,in3,in4) ;
LD
NE <> (no igual a) CONVERSO BOOL_TO_tipo (16 converses) BYTE_TO_tipo (16 converses) WORD_TO_tipo (16 converses) DWORD_TO_tipo (16 converses) USINT_TO_tipo (16 converses) UINT_TO_tipo (16 converses) UDINT_TO_tipo (16 converses)
ST out:=BOOL_TO_INT(in);
LD
ST out LD in
BYTE_TO_WORD
out:=BYTE_TO_WORD(in);
LD
ST out LD in
WORD_TO_INT
out:=WORD_TO_INT(in);
ST out LD in
DWORD_TO_BOOL
out:=DWORD_TO_BOOL(in);
ST out LD in
USINT_ TO_DINT
out:=USINT_TO_INT(in);
ST out LD in
UINT_ TO_USINT
out:=UINT_TO_USINT(in);
ST out LD in
UDINT_ TO_USINT
out:=UDINT_TO_USINT(in);
ST out
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 5 de 9
TWINCAT PLC Resumo de Instrues SINT_TO_tipo (16 converses) INT_TO_tipo (16 converses) DINT_TO_tipo (16 converses) REAL_TO_tipo (16 converses) LREAL_TO_tipo (16 converses) STRING_TO_tipo (16 converses) TIME_TO_tipo (16 converses) TOD_TO_tipo (16 converses) TIME_OF_DAY DATE_TO_tipo (16 converses) DT_TO_tipo (16 converses) DATE_AND_TIME TRUNC Truncar varivel VRIAS INDEXOF index interno do POU SIZEOF n de bytes da varivel ADR endereo absoluto da varivel ^ indicao de ponteiro BITADR endereo do bit na varivel LD in
BITADR
LD in
SINT_ TO_USINT
ST out LD in
INT_ TO_USINT
out:=INT_TO_USINT(in);
ST out LD in
DINT_ TO_USINT
out:=DINT_TO_USINT(in);
ST out LD in
REAL_ TO_USINT
out:=REAL_TO_USINT(in);
ST out LD in
LREAL_ TO_USINT
out:=LREAL_TO_USINT(in);
ST out LD in
STRING_TO_USINT
out:=STRING_TO_USINT(in);
ST out LD in
TIME_ TO_USINT
out:=TIME_TO_USINT(in);
ST out LD in
TOD_ TO_UINT
out:=TOD_TO_UINT(in);
ST out LD in
DATE_TO_UINT
out:=DATE_TO_UINT(in);
ST out LD in
DT_TO_UINT
out:=DT_TO_UINT(in);
ST out:=INDEXOF(in);
LD
out:=SIZEOF(in);
ST out
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 6 de 9
sema1(CLAIM:=in1,RESET:=in 2,BUSY=>out1);
TRIGGER F_TRIG Accionamento pelo flanco descendente R_TRIG Accionamento pelo flanco ascendente
ST ftrig1(CLK:=in1 , Q=>out1 );
LD
rtrig1(CLK:=in1 , Q=>out1 );
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 7 de 9
TWINCAT PLC Resumo de Instrues TP Temporizado ao trabalho por impulso CAL tp1 (IN := in1, PT:=T#6000ms ) LD tp1.Q ST out1 LD tp1.ET ST tempor CONTADORES CTD Contador decrescente IL CAL tof1 (IN := in1 , PT := T#2s , Q=>out1 , ET=>tempor) LD tof1.Q ST out1 LD tof1.ET ST tempor CTU Contador crescente CAL ton1 (IN := in1 , PT := T#4s , Q=>out1 , ET=>tempor) CAL tp1 (IN := in1, PT:=T#6000ms ) LD tp1.Q ST out1 LD tp1.ET ST tempor
LD
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 8 de 9
TWINCAT PLC Resumo de Instrues LEFT Selecciona um n caracteres de um STRING a comear pela esquerda . LEN Calcula o tamanho de um STRING (n de caracteres) . MID Selecciona um n caracteres de um STRING a partir de uma dada posio . REPLACE Cola um STRING a partir de uma dada posio de um dado STRING e eliminando um n de caracteres definidos . RIGTH Selecciona um n caracteres de um STRING a comear pela direita . LD BRESIMAR LEFT 2 ST Var1 LD BRESIMAR LEN ST Var1 LD BRESIMAR MID 2 , 3 ST Var1 LD BRESIMAR REPLACE ASA , 2, 3 ST Var1
BECKHOFF New Automation Technology (* Resultado BR *) Var1: = LEFT (BRESIMAR , 2) ; (* Resultado 8 *) Var1: = LEN (BRESIMAR ) ;
BRESIMAR
<j.andril@bresimar.pt>
Anexo A 9 de 9
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 1 de 18
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 2 de 18
1 ERROS DE COMPILAO
Neste capitulo encontrar as mensagens de erro ( em italics ) e as suas possveis causas . Para uma melhor interpretao e como o software TwinCAT o usado a verso inglesa , optamos em deixar a tabela na mesma lngua . 1.1 - CHAMADAS DE ATENO (Warnings) N men.
1100 1101 1102 1103
Mensagem de ateno
Unknown function '<name>' in library. Unresolved symbol '<Symbol>'. Invalid interface for symbol '<Symbol>'. The constant '<name>' at code address '<address>' overwrites a 16K page boundary! Task '%s', call of '% Access variables in the parameter list are not updated File not found '<name>' Analyze-Library not found! Code for analyzation will not be generated. New externally referenced functions inserted. Online Change is therefore no longer possible! Unknown Pragma '<name>' is ignored! The struct '<name>' does not contain any elements. Expression contains no assignment. No code was generated. String constant passed as 'VAR_IN_OUT': '<name>' must not be overwritten! Variable '<name>' has the same name as a POU. The POU will not be called!
Possvel causa
An external library is used. Please check, whether all functions, which are defined in the .hex file, are also defined in the .lib file. The code generator expects a POU with the name <Symbol>. It is not defined in the project. Define a function/program with this name. The code generator expects a function with the name <Symbol> and exactly one scalar input, or a program with the name <Symbol> and no input or output. A string constant exceeds the 16K page boundary. The system cannot handle this. It depends on the runtime system whether the problem could be avoided by an entry in the target file. Please contact the PLC manufacturer. Variables, which are only used at a function block call in the task configuration, will not be listed in the cross reference list. The file, to which the global variable object is pointing, does not exist. Please check the path. The analyze function is used, but the library analyzation.lib is missing. Add the in the library manager. Since the last download you have linked a library containing functions which are not yet referenced in the runtime system. For this reason you have to download the complete project. This pragma is not supported by the compiler. See keyword pragma for supported directives. The structure with name <name> does not contain any elements. But Variables of this type will use 1 Byte of memory. The result of this expression is not used. For this reason there is no code generated for the whole expression. The constant may not be written within the POU, because there no size check is possible. A variable is used, which has the same name Example: PROGRAM a ... VAR_GLOBAL a: INT; END_VAR ... a; (* Not POU a is called but variable a is loaded.. *)
1200
1300 1301
1302
1502
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 3 de 18
1505 1506
The original Siemens program does not tell, which POU is openend. An input box is used in CFC which has no assignment. For this no code will be generated. The visualization element contains an expression which cannot be monitored. Check variable name and placeholder replacements. In the configuration of the visualization object at field input a composed expression is used. Replace this by a single variable. The Start-POU (z.B. PLC_PRG) will not be available, when the project is used as library. Access variables and variable configuration are not stored in the library. The .obj file of the lib was generated for another device. The file does not have the format requested for the actual target.
1902 1903
Mensagem de erro
Code too large. Maximum size: '<number>' Byte (<number>K) Total data too large. Maximum size: '<number>' Byte (<number>K) Error in library file '<name>'. Library '<name>' is too large. Maximum size: 64K Nonrelocatable instruction in library. Library code overwrites function tables. Library uses more than one segment. Unable to assign constant to VAR_IN_OUT. Incompatible data types .
Possvel causa
The maximum program size is exceeded. Reduce project size. Memory is exceeded. Reduce data usage of the application.
3101
The .hex file is not in INTEL Hex format. The .hex file exceeds the set maximum size. The .hex file contains a nonrelocatable instruction. The library code cannot be linked. The ranges for code and function tables are overlapping. The tables and the code in the .hex file use more than one segment. The internal pointer format for string constants cannot get converted to the internal pointer format of VAR_IN_OUT, because the data are set "near" but the string constants are set " huge" or "far". If possible change these target settings.
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 4 de 18
3131
3132
3150
Use a intermediate variable, to which the result of the IEC function is assigned.
A library <name> is included in the library manager for this project, but the library file does not exist at the given path. A .obj file of a library at least must contain one C function. Insert a dummy function in the .obj file, which is not defined in the .lib file. The .obj file contains a not resolvable reference to another symbol. Please check the settings of the C-Compiler.
3163
The .obj file contains a reference type, which is not resolvable by the code generator. Please check -the settings of the C-Compiler.
3200
3201
The temporary memory of the target system is insufficient for the size of the expression. Divide up the expression into several partial expressions thereby using assignments to intermediate variables. Internal jumps can not be resolved. Activate option "Use 16 bit Sprungoffsets" in the 68k target settings. A nested function call CONCAT(x, f(i)) is used. This can lead to data loss. Divide up the call into two expressions. Divide up the assignment in several expressions. Jump distances may not be bigger than 32767 bytes. In a POU there at the most 3000 string constants may be used.
3202
3206 3207
A function block may produce maximum 32767 Bytes of code. The optimization of the array accesses failed because during
BRESIMAR
Anexo B 5 de 18
BRESIMAR
Anexo B 6 de 18
3456 3457 3500 3501 3502 3503 3504 3505 3506 3507
In the global variables list which contains the Variable_Configuration the variable is declared with a different data type than in the POU. In the global variables list which contains the Wrong data type for '<name>' in 'VAR_CONFIG' Variable_Configuration the variable is declared with a different address than in the POU. A variable of the Variable_Configuration is declared with Initial values are not address and initial value. But an initial value can only be supported for defined for input variables without address assignment. 'VAR_CONFIG The Variable_Configuration contains a nonexisting variable. '<name>is no valid instance path In the global variable list for Access Variables the access Access path expected path for a variable is not correct. Correct: <Identifier>:'<Access path>':<Type> <Access mode> The global variable list for Access Variables contains an No address address assignment for a variable. This is not allowed. Valid specification for variable definition: <Identifier>:'<Access path>':<Type> 'VAR_ACCESS'<Access mode> variables There are two tasks are defined with an identic same name. Duplicate definition of Rename one of them. identifier '<name>' Insert a program call or delete task. The task '<name>' must contain at least one program call There is an event variable set in the Single field of the task Event variable properties dialog which is not declared globally in the project. '<name>' in task '%s' Use another variable or define the variable globally. not defined Use a variable of type BOOL as event variable in the Single "Event variable field of the task properties dialog. '<name>' in task '%s' must be of type 'BOOL' In the field Program call a function or a not defined POU is Task entry '<name>' entered. Enter a valid program name. must be a program or global function block instance In the field Append program call there are parameters used The task entry which do not comply with the declaration of the program '<name>' contains POU. invalid parameters Use command Rebuild all. If nevertheless you get the error Implicit variables not message again please contact the PLC manufacturer. found! The given variable is declared in the project, although it is <name> is a reserved reserved for the codegenerator. Rename the variable. variable name The given feature is not supported by the current version of '<name>' not supported the programming system. There is an invalid directory given in the Project Options The given compile Directories for the Compile files. directory '<name>' is invalid Too many POUs and data types are used in the project. Maximum number of Modify the maximum number of POUs in the Target POUs (<number>) Settings / Memory Layout. exceeded! Compile is aborted.
<j.andril@bresimar.pt>
BRESIMAR
Anexo B 7 de 18
Subranges are only allowed on Integers! Subrange '<name>' is not compatible with Type '<name>' unknown string length: '<name>' More than three dimensions are not allowed for arrays lower bound '<name>'
<j.andril@bresimar.pt>
BRESIMAR
Anexo B 8 de 18
3700 3701
3745 3746 3747 3748 3749 3903 3904 3905 3906 3907
Subranges are only allowed on Integers! Subrange '<name>' is not compatible with Type '<name>' unknown string length: '<name>' More than three dimensions are not allowed for arrays lower bound '<name>' not defined Invalid duration constant Overflow in duration constant. Invalid date constant Invalid time of day constant Invalid date and time constant
<j.andril@bresimar.pt>
BRESIMAR
Anexo B 9 de 18
4011
4012
4013
Replace the variable by a variable with write access. Add an operand behind the command. Enter a digit. Enter a valid operand at the named position.
Enter one of the both operators at the named position. Use a valid bit address (e.g. %IX0.1). Enter a integer number or the identifier of a valid constant. Check the data type of the variable, for which the INI operator is used. At not reentrant target systems and in simulation mode a function call may not contain a call of itself as a parameter. Example: fun1(a,fun1(b,c,d),e); Use a intermediate table. Replace the constant or the expression by a variable or a direct address. Use BITADR. Please note: The BITADR function does not return a physical memory address
4029 4030
4031
BRESIMAR
Anexo B 10 de 18
4033
4034 4035
4029 4030
4031 4032
4033
4034
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 11 de 18
BRESIMAR
Anexo B 12 de 18
4273
BRESIMAR
Anexo B 13 de 18
4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343
The input of the POU is of type VAR_IN_OUT and is not assigned. The given jump mark is not a valid identifier. Assign a boolean expression to the input of the jump. If this is TRUE, the jump will be executed. Assign a boolean expression to the input of the RETURN instruction. If this is TRUE, the jump will be executed. Assign a suitable expression to the output box. Insert a valid expression or identifier in the input box. To none of the inputs of the operator POU '<name>' a valid expression is assigned. The type of the expression in the output box is not compatible to that of the expression which should be assigned to it. Make sure that the input for the jump is a boolean expression. Make sure that the input for the RETURN instruction is a boolean expression. Assign a valid boolean expression to the EN input of the box. Input '<name>' of box '<name>' is declared as VAR_INPUT CONSTANT. But to this POU box an expression has been assigned in the dialog 'Edit Parameters' which is not type compatible. Insert a valid boolean expression after the Set resp. Reset instruction. An expression is assigned to input '<name>' of POU box '<name>' which is not type compatible.
4344 4345
4346 4347
You can only assign an output to a variable or a direct address with write access. To VAR_IN_OUT parameters only variables with write access can be handed over, because these can be modified within the POU. SFC actions only can be called within the SFC POU in which they are defined. Rename the step or choose a valid identifier as step name. Remove the not valid characters in the step name. Rename one of the steps. Choose an existent step name as aim of the jump resp. insert a step with name <name>. A transition must be a boolean expression.
Use a valid identifier as aim (mark) of the jump. Check whether the library iecsfc.lib is inserted in the library manager and whether the library paths defined in Project Options Pathsare correct. Make sure that in the object organizer the action of the IEC step is inserted below the SFC POU and that in the editor the action name is inserted in the box on the right hand of
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 14 de 18
There is no valid BCD coded time in the accu. Make sure that you only access variables which are defined as input or output. Some STEP5/7 commands are not convertable to IEC 61131-3, e.g. CPU commands like MAS. Some STEP5/7 operands are not convertable to IEC 611313 respectively an operand is missing. The corresponding IEC timer have no reset input.
4404
4405
There is no valid BCD coded counter constant in the accu. Some STEP5/7 instructions cannot be converted to IEC 61131-3, e.g. DUF. Special timer/counter commands are not convertable into IEC 61131-3. A command, which connects the both accus, cannot be
4409
BRESIMAR
Anexo B 15 de 18
4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424
BRESIMAR
Anexo B 16 de 18
4551
4552
4553
4554 4555
4556
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 17 de 18
BRESIMAR
<j.andril@bresimar.pt>
Anexo B 18 de 18