TwinCAT PLC
Capitulo 3 – 2ª Parte
Introdução à programação “TwinCAT 3”
ST – “Structured Text”
asaTek / J. Andril
[email protected]
2017
1
ST „Structured Text“
OPERAÇÕES EM ORDEM DECRESCENTE
OPERAÇÕES SIMBOLO PRIORIDADE
maior
Por entre parêntesis (expressão)
Chamar função Nome_função (lista parametros) menor
Exponencial EXPT
Negação NOT
Multiplicação
Divisão *
Modulo /
Soma MOD
Subtracção +
Comparação -
Igual a <,>,<=,>=
Não igual a =
Bool AND (“E”) <>
Bool XOR AND
Bool OR (“OU”) XOR
OR
2
ST „Structured Text“
LISTA DE INSTRUÇÕES EM „ST“
INSTRUÇÕES EXEMPLO
PosWert := 10;
Atribuição := Ton1(IN:=Start, PT:=T2s); Output:= Ton1.Q
Chamar uma função bloco RETURN;
RETURN Ver as paginas seguintes
IF
CASE ;
FOR
WHILE
REPEAT
EXIT
Linha vazia (sem instrução)
3
ST „Structured Text“
INSTRUÇÕES „IF“ (1)
+ Se desejarmos saltar uma instrução PALAVRAS CHAVE :
de programa , dependendo de uma
condição . IF THEN
ELSIF
+ Com a instrução IF não é possível saltar ELSE
para trás num ciclo de PLC . END_IF
+ „GOTO“ não está disponível
4
ST „Structured Text“ Condição Não
Sim
INSTRUÇÕES „IF“ (2)
IF Condição THEN
Bloco instruções ;
END_IF
Bloco instruções
5
ST „Structured Text“
INSTRUÇÕES „IF“ (3)
Condição Não
Sim
IF Condição THEN
Bloco instruções A; Bloco instruções A Bloco instruções B
ELSE
Bloco instruções B;
END_IF
6
ST „Structured Text“ IF Condição 1 THEN
Bloco instruções A;
INSTRUÇÕES „IF“ (4)
ELSE
Condição 1 No IF Condição 2 THEN
Yes Bloco instruções B;
Condição 2 ELSE
IF Condição 3 THEN
No Bloco instruções C;
ELSE
Yes Bloco instruções D;
END_IF
END_IF
END_IF
Condição 3 No
Yes
Bloco instruções A Bloco instruções B Bloco instruções C Bloco instruções D
7
ST „Structured Text“ IF Condição 1 THEN
Bloco instruções A;
INSTRUÇÕES „IF“ (5)
ELSIF Condição 2 THEN
Condição 1 Não Bloco instruções B;
Não
Condição 3 ELSIF Condição 3 THEN
Sim Bloco instruções C;
Sim
Condição 2 ELSE
Bloco Instruções D;
Sim
END_IF
Não
Bloco instruções A Bloco instruções B Bloco instruções C Bloco instruções D
8
ST „Structured Text“
INSTRUÇÕES „IF“ (6)
• Que „condição logica“ podemos ter num IF ?
Condição logica : IF bVar THEN THEN
•Variavel BOOLEANA .
•Comparação
•Chamar Função (FUN) IF a>b THEN
•Chamar instancias FB .
•Nao se pode chamar FB !
IF LEFT(STR:= strVar, SIZE:=7): = 'TwinCAT'
.
IF Ton1.Q THEN
.
IF Ton1(IN:=bVar, PT:=T#1s ) THEN
9
Exercício (1)
Construa um exemplo com estes segmentos de instruções
IF Var1 < Var2 (* Comparação: o resultado será TRUE ou FALSE *)
THEN (* Se TRUE: então (THEN) o bloco de instruções será executado *)
Output32:=TRUE
ELSE (* Se FALSE: este (ELSE) bloco de instruções será executado*)
Output32:=FALSE
END_IF
A instrução IF pode estar dentro de uma outra malha IF .
IF Condição1 IF Condição1
THEN THEN
Instrução Instrução
ELSE ELSIF Condição2
IF Condição2 THEN
THEN Instrução
Instrução ELSE
ELSE Instrução
Instrução END_IF
END_IF
END_IF
10
ST „Structured Text“
INSTRUÇÕES „CASE“ (1)
CASE Critério selecção OF
1: Instrução 1 Critério selecção = 1 Critério selecção = 1
2,4,6: Instrução 2 Não ou 2 ou 4 or 6
7..10 : Instrução 3
.. Sim Critério selecção = 7
ou 8 ou 9 ou 10?
Não
Sim
ELSE Não
Sim
Instrução de defeito
END_CASE Instrução 1 Instrução 2 Instrução 3 Instruções de defeito
Dois valores de critério
repetidos não poderão
estar na listagem .
11
ST „Structured Text“ CASE State OF
INSTRUÇÕES „CASE“(2) INIT: instruções;(*State=0*)
TIPO „Enum“ START: instruções;(*State=1*)
TYPE Operation_mode :
AUTOMATIC: instruções;(*State=2*)
( INIT:=0, START, AUTOMATIC, END);
END_TYPE END: instruções;(*State=3*)
END_CASE
Se a variável de selecção inteira é declarada
como “Enum” , o valor da variável é visível
em modo on-line .
VAR
State: Operation_mode;
(* „State“ declarada como INT também é
possível *)
END_VAR 12
ST „Structured Text“
INSTRUÇÕES „CASE“(3)
VAR CONSTANT CASE State OF
Step1 : INT:= 0;
Step2 : INT:= 1; Step1: instruções ; (*State=0*)
Step3 : INT:= 2;
Step4 : INT:= 3; Step2: instruções ; (*State=1*)
END_VAR Step3..Step4: instruções ; (*State=2 ou 3*)
VAR END_CASE
State:INT;
END_VAR
13
ST „Structured Text“
INSTRUÇÕES „CASE“ (4) (* Estrutura de GRAFCET feita com instruções CASE *)
TYPE Steps :
( INIT:=0, START, AUTOMATIC, END);
END_TYPE
CASE State OF Instruções de etapa
(Acções)
INIT: Q0:=TRUE;
IF Transição THEN state := START; END_IF „condição etapa“
(Transição)
START: Q1:=TRUE;
Etapa IF Transição THEN state := AUTOMATIC; END_IF
AUTOMATIC: Q2:=TRUE;
IF Transição THEN state := END; END_IF
END: Q3:=TRUE;
IF Transition THEN state := INIT; END_IF
END_CASE 14
ST „Structured Text“
INSTRUÇÕES DE REPETIÇÃO „Loop“ (1)
PALAVRAS CHAVE : Se um laço ( „loop“ ) continuo for
executado este não danifica o começo
FOR da fatia de tempo („Real-time“) . As
WHILE tarefas que terão uma prioridade mais
REPEAT elevada são executadas primeiro
sacrificando as tarefas de prioridade
mais baixa .
Desvantagens dos laços (“loop”): Inicio de uma
nova fatia de
Se não tivermos os cuidados necessários
(“bugs”) podemos ter “loops” infinitos . tempo
Passagem para Win
NT
1 1 2 1‘ 3 1‘‘ 4 1‘‘‘ 1‘
ex.: 1ms 2ms 3ms 4ms 5ms
15
ST „Structured Text“
INSTRUÇÕES DE REPETIÇÃO „Loop“ (2)
Todos os „loop“s serão finalizados com as instruções EXIT .
Expressão Fluxo de trabalho n ciclos fixo
FOR SINT/ INT / Controlo fluxo Sim
WHILE DINT feito no inicio . Não
BOOL
Controlo fluxo Não
feito no inicio .
REPEAT BOOL Controlo fluxo
feito no fim .
16
ST „Structured Text“ Inicio
i:=Valor inicial
INSTRUÇÕES DE REPETIÇÃO „FOR“ (3)
i Sim
No principio do “loop” a variavel “i” é >Valor final
definida com um valor inicial .
A variavel é incrementada ou decrementada Não
em cada ciclo dependendo da “largura
passo” ( valor que apareçe depois da Bloco instruções
palavra-chave BY )
Se “í” excede o valor final ( valor depois de i:= i+ largura passo
TO), o „loop“ termina .
ciclo n
FOR i:=1 TO 12 BY 2 DO
Field[i]:=i*2; (*instrução*)
END_FOR
17
ST „Structured Text“ ciclo n
INSTRUÇÕES DE REPETIÇÃO „WHILE“ (4)
O bloco de instruções de um “loop” Sim Expressão Não
WHILE é executado enquanto a booleana
expressão booleana é TRUE .
Bloco instruções
Se a expressão booleana é FALSE o i:= i+largura passo
bloco de instruções do WHILE “loop”
não é processado . ciclo n
i:=0;
WHILE i<100 DO
Field[i]:=i*2;(*Instrução*)
i:=i+1;
END_WHILE
18
ST „Structured Text“ Ciclo n
INSTRUÇÕES DE REPETIÇÃO „REPEAT“ (5)
O bloco de instruções de um “loop” Bloco de instruções
REPEAT é processado até (UNTIL) i:= i+ largura passo
que a expressão booleana não seja
mais válida .
O bloco de instruções é executado
pelo menos uma vez .
i:=0; Sim Expressão Não
booleana
REPEAT 19
Field[i]:=i*2;(*Instrução*) ciclo n
i:=i+1;
UNTIL i>100
END_REPEAT
ST „Structured Text“
CHAMADA de „FB“s em ST (1)
Declaração das variáveis
VAR
TON1:TON;
END_VAR
Programa executado em ST
TON1 (IN:= NOT TON1.Q , PT:=T#1s );
Q0:= TON1.Q ;
A partir de TwinCAT 2.8 :
TON1(IN:= NOT TON1.Q, PT:=T#1s , Q=>Q0 );
20
ST „Structured Text“ VAR
TON1:TON;
CHAMADA de „FB“s em ST (2)
END_VAR
Criar uma instancia de FB
Chamar com o nome da instancia
TON1 (IN:= NOT TON1.Q , PT:=T#1s );
Resultado (saida) Parametros de entrada
Q0:= TON1.Q
Não é possivel ter diversas saidas de FB 21
Q0:=TON1(IN:= NOT TON1.Q, PT:=T#1s);
ST „Structured Text“
CHAMADA de „FB“s em ST (3)
Declaração das variáveis
VAR
TON1:TON;
END_VAR
Programa executado em ST
TON1.IN:= NOT TON1.Q ,
TON1. PT:=T#1s;
TON1();
Q0:= TON1.Q;
22
ST „Structured Text“ VAR
TON1:TON;
CHAMADA de „FB“s em ST (4)
END_VAR
Declaração de instancia
TRANSFERÊNCIA SÓ DE
PARAMETROS DE ENTRADA .
Isto NÃO é uma chamada de FB !!!!!
TON1.IN:= NOT TON1.Q ;
TON1. PT:=T#1s; Chamar FB
TON1();
Resultado (saida) Q0:= TON1.Q; 23
ST „Structured Text“
CHAMADA de „FB“s em ST (5)
Result:=Scale (x:=input, xug:=0.0, xog:=32767.0, yug:=0.0,yog:=100.0);
(* Podemos tambem representar assim :*)
Result:=Scale (input, 0.0, 32767.0, 0.0, 100.0);
(* Podemos tambem representar assim :*)
Result:=Scale (
x:= input,
xug:= 0.0,
xog:= 32767.0,
yug:= 0.0,
yog:= 100.0
);
24
ST „Structured Text“
CHAMADA de „FB“s em ST (6)
Result := Scale (x:=input, xug:=0.0, xog:=32767.0, yug:=0.0,yog:=100.0);
Resultado CHAMADA da FB Parametros entrada
(* podemos tambem representar desta maneira :*)
Result:=Scale (
x:= input,
xug:= 0.0,
xog:= 32767.0,
yug:= 0.0,
yog:= 100.0
);
25