Você está na página 1de 104

CURSO DE ROBÔS COMAU C4G

MÓDULO LINGUAGEM DE
PROGRAMAÇÃO PDL2 AVANÇADA

Instrutor : Anderson Bezerra


Desenvolvimento: Rafael Amorim
Comau System
Robótica Brasil
ESTRUTURA DO PROGRAMA PDL2
Um programa PDL2 é iniciado com a instrução PROGRAM. Esta
instrução identifica o programa com um nome definido pelo
usuário. O mesmo identifica também o arquivo no qual o
programa foi memorizado. O programa em si pode ser definido
como HOLD ou NOHOLD, os programas HOLD (holdable) são
controlados mediante os comandos START e HOLD, geralmente
tais programas incluem instruções de movimento. Os programas
NOHOLD geralmente são utilizados para controle de processo e
não podem incluir um movimento; uma vez ativo não necessita
de um START. Os programas são subdivididos em uma área de
declaração e uma área de seção executável. A área de
declaração consiste em um conjunto de todas as rotinas e de
todas as categorias de dados que serão utilizados pelo
programa, enquanto a seção executável é formada por um
conjunto de instruções que o controlador deverá executar para
efetuar uma tarefa.
As duas áreas são separadas pela instrução BEGIN. Para esta
instrução, o programador pode associar a opção CYCLE de modo
a criar um ciclo contínuo, e a instrução END, que indica o fim do
programa.
ESTRUTURA DO PROGRAMA PDL2
Exemplo:
UNIDADES DE MEDIDAS EM PDL2

Distancia: milímetros(mm)
Tempo: milissegundos(ms)
Angulo: graus (°)
Velocidade linear: metros/segundos (m/s)
Velocidade Angular: radianos/segundos (rad/s)
Corrente: amperes (A)
Encoder/Resolver Data: revolutions (2 ms)
COMPONENTES DA LINGUAGEM
Set de Caracteres
O PDL2 reconhece os caracteres elencados abaixo:

Letras:
abcdefchijklmnopqrstuvwxyz
ABCDEFGHI JKLMNOPQRSTUVWXYZ

Algarismos:
0123456789

Símbolos:
@<>=/*+,;.#S'[]%(}\:!()_

Caracteres Especiais:
blank (space), tab

O PDL2 não faz distinção entre letras maiúsculas e minúsculas.


PALAVRAS E SIMBOLOS RESERVADOS

Trata-se de palavras, símbolos e operadores que têm um


significado especial e imutável no âmbito do PDL2. As palavras
identificam as seções de um programa, os tipos de dados e as
palavras-chaves de uma instrução, enquanto os símbolos
ressaltam uma instrução. Enfim, os operadores indicam um
cálculo ou uma comparação.

No próximo slide são demonstrados todos os símbolos e palavras


reservadas na linguagem.
PALAVRAS E SIMBOLOS RESERVADOS
IDENTIFICADORES PRÉ DEFINIDOS

Os identificadores pré-definidos constituem a porção restante das


palavras que fazem parte da linguagem PDL2. São utilizados para
a identificação de constantes, variáveis, campos e rotinas que o
PDL2 já compreende. Os identificadores pré-definidos
diferenciam-se das palavras reservadas pois o significado de um
identificador pré-definido pode ser modificado pelo programador.

As constantes pré-definidas são identificadores aos quais estão


associados valores pré-designados. Ao interno de um programa, é
possível utilizar um identificador de constante pré-definida no
lugar de um valor.

No próximo slide são demonstrados todos os identificadores


reservados na linguagem.
IDENTIFICADORES PRÉ DEFINIDOS
VERIFICAÇÃO DA SINTAXE E DA
SEMÂNTICA
O editor controla a sintaxe e a semântica de cada instrução de
programa durante a sua inserção e modificação.
Em caso de erro, o programador é imediatamente informado
através de uma janela de poup-up. Em alguns casos, o editor
corrige automaticamente o erro ou solicita ao programador a
sua correção. Em outros casos, o editor assinala o erro com a
marcação ~ERROR~ na instrução de programa.
Exemplo:
PROGRAM teste NOHOLD
BEGIN CYCLE
~ERROR~ IF
WRITE (‘mensagem’, NL)
END teste
Neste caso, a linha onde aparece ~ERROR~ é um erro, pois a
instrução IF está incompleta. A marcação é removida
automaticamente quando o programador corrige o erro.

*Qual palavra reservada completa a instrução IF citada no


exemplo acima?
VERIFICAÇÃO DA SINTAXE E DA
SEMÂNTICA
O editor de programa trata instruções de mais de uma linha
como unidades. Por exemplo, se o programador elabora
WHILE $DIN [4] DO, o editor fornece automaticamente uma
linha ENDWHILE. Se o programador cancelar a linha WHILE, o
editor cancelará automaticamente toda instrução WHILE.
O editor processa o espaço e o uso das letras maiúsculas em
modo padrão, independentemente do modo no qual as
instruções foram introduzidas. Todos os identificadores dos
usuários são visualizados com letras minúsculas, enquanto
todos aqueles predefinidos e as palavras reservadas são
visualizadas em letras maiúsculas.
INSTRUÇÕES
Os programas PDL2 são constituídos por instruções, formadas por
associações dos seguintes elementos:
•palavras, símbolos e operadores reservados;
•identificadores pré-definidos;
•identificadores definidos pelo usuário.
A sintaxe das instruções deve estar correta, isto é, as instruções
devem ser estruturadas com base nas regras de sintaxe do PDL2.
O editor contido no programa fornece um suporte válido para
garantir a sintaxe correta das instruções durante a digitação das
mesmas.
Alguns exemplos de instruções da linguagem de programação
PDL2:
DELAY, GOTO, SELECT CASE, IF, ELSE ...
ESPAÇOS EM BRANCO E
COMENTÁRIOS
Os espaços em branco servem para separar as palavras e os
identificadores reservados. Mesmo não sendo necessários, os
espaços podem ser inseridos entre os operadores e os relativos
operandos (a + b ou a+b) ou podem ser usados para estruturar as
instruções. Em todo caso, o editor gera automaticamente um espaço
e uma estrutura padrão, independentemente daqueles utilizados
pelo programador.

Por comentário se entende uma parte do texto no interior de um


programa que não faz parte do programa de instruções. Tal
comentário tem como símbolo inicial dois tracinhos (--). O controle
ignorará, portanto, o texto que acompanha os dois tracinhos que não
poderá superar o comprimento de 255 caracteres. Geralmente, os
comentários são usados pelo programador para esclarecer algum
ponto do programa.
IDENTIFICADORES DEFINIDOS
PELO USUÁRIO
Os identificadores definidos pelo usuário são os nomes escolhidos
pelo programador para a identificação de:
•programas
•variáveis
•constantes
•rotinas
•etiquetas
•tipos de dados definidos pelo usuário
•Campos
Um identificador definido pelo usuário deve começar com uma
letra. Pode conter uma quantidade qualquer de letras, cifras e
caracteres de sublinhamento (_) . Este tipo de identificador pode
ter um único significado no âmbito de um determinado contexto. O
contexto de um identificador indica a seção de um programa que
pode referenciar o identificador. Os identificadores de um
programa estão contidos em outro contexto, permitindo ao
operador definir uma variável com o mesmo nome de um
programa.
REPRESENTAÇÃO DOS DADOS EM
PDL2
Um tipo de dado define:
os tipos de valores associáveis a um dado;
as operações que podem ser executadas no dado.
No PDL2 estão definidos os seguintes tipos de dados:

INTEGER VECTOR
REAL POSITION
BOOLEAN JOINTPOS
STRING XTNDPOS
ARRAY PATH
RECORD SEMAPHORE
NODE

Os programas PDL2 podem conter os seguintes dados:


variáveis, que representam valores que podem ser modificados;
constantes, que representam valores que não podem ser
modificados;
literais, que representam os próprios valores.
VARIÁVEIS, CONSTANTES E
LITERAIS
Variáveis e constantes são definidas por um identificador e por um
tipo de dado. Declarar uma variável consiste em associar um
identificador a um tipo de dado. Valores diferentes do tipo declarado
podem ser atribuídos ao identificador ao longo do programa. Um
identificador de variável pode ser associado a qualquer um dos tipos
de dado.

A declaração de uma constante é efetuada associando um valor ao


identificador. Este valor não pode ser modificado ao interno do
programa. O tipo de dado do identificador é determinado pelo valor.
Valores INTEGER, REAL, BOOLEAN e STRING podem ser associados
aos identificadores das constantes.

Os valores literais são os próprios valores usados no programa. Os


mesmos podem ser INTEGER, REAL ou STRING
DADOS DO TIPO INTEGER
O tipo de dados INTEGER representa valores numéricos inteiros
compreendidos entre -2147483647 a + 2147483647. As seguintes
constantes pré-definidas representam, respectivamente, os valores
INTEGER mínimo e máximo:
MAXINT MININT " – “

Um valor INTEGER pode ser representado como decimal (base 10),


octal (base 8), hexadecimal (base 16) ou binário (base 2). A base
default para os valores INTEGER é a decimal. Para poder
representar um valor literal INTEGER em outra base, deve-se
colocar antes do número, a indicação 0o para um valor octal
(0o72), 0x para um valor hexadecimal (OxFF), ou 0b para um valor
binário (ObllOll).

O PDL2 pode executar as seguintes operações nos dados de tipo


INTEGER:
aritméticas (+, -, *, /, div, mod, ** , +=, -=)
relacionais (<, >, =, <>, <=, >=)
a nível de bit (and, or, xor, not, shr, shl, ror, rol)
DADOS DO TIPO REAL

O tipo de dados REAL representa os valores numéricos que incluem


uma vírgula decimal e uma parte fracionária ou números expressos
em notação científica. O PDL2 pode executar as seguintes
operações nos dados de tipo REAL:

- aritméticas (+, -, *, /, **)


- relacionais (<, >, =, <>, <=, >=)

Além disso, o PDL2 contém rotinas internas que permitem a


execução de outras funções do tipo REAL

Os valores do tipo REAL utilizados em um programa PDL2 são


sempre visualizados através de oito algarismos significativos.
DADOS DO TIPO BOOLEAN

O tipo de dados BOOLEAN representa as constantes booleanas pré-


definidas TRUE (ON) e
FALSE (OFF).

O PDL2 pode executar as seguintes operações nos dados da classe


BOOLEAN:

- relacionais ( =, := )
- booleanas (and, or, xor, not)
DADOS DO TIPO STRING
O tipo de dados STRING representa uma série de caracteres ASCII
que são considerados como um grupo único de dados. Um apóstrofe
assinala o início e o fim de um string.
Por exemplo:Além dos caracteres ASCII imprimíveis, os strings
podem conter também seqüências de controle. Uma seqüência de
controle é constituída por uma barra invertida (\) acompanhada por
um código ASCII qualquer de três algarismos.
Por exemplo:

Literal: 'O código ASCII 126 é um til: \126'


Valor: O código ASCII 126 é um til: ~

O programador deve declarar o comprimento de um STRING, o


comprimento efetivo do valor STRING pode estar entre 0 e 254
caracteres. Um comprimento 0 significa que o STRING está vazio.
O PDL2 pode executar as seguintes operações nos dados de tipo
STRING:

- relacional (<, >, =, o, <=, >=)


DADOS DO TIPO ARRAY
O tipo de dados ARRAY representa um agrupamento ordenado de
dados, todos de um mesmo tipo. Tipos de declarações possíveis:
INTEGER VECTOR
POSITION REAL
JOINTPOS BOOLEAN
XTNDPOS STRING
SEMAPHORE RECORD
O programador deve declarar a dimensão (uma ou duas) de cada
ARRAY e o número máximo de dados contidos em cada dimensão, até
um máximo de 65535.
(Obs: A dimensão efetiva poderá ser limitada pela quantidade de
memória de sistema disponível). Todas as operações possíveis em um
particular tipo de dados, podem ser executadas em dados individuais
de ARRAY daquele tipo. Um inteiro ARRAY pode ser usado como
argumento na chamada a uma rotina ou pode ser usado em uma
instrução de atribuição. Neste último caso, ambos os arrays devem ser
do mesmo tipo de dados e devem ter formato e dimensão iguais.
Os arrays SEMAPHORE não podem ser usados nas expressões de
atribuição.
DADOS DO TIPO RECORD
O tipo de dados RECORD é composto por um ou mais dados que
utilizam um único nome. Cada dado pertencente a um record é
denominado campo e pode ser de qualquer um dos tipos de dados do
PDL2, exceto SEMAPHORE, RECORD, NODE ou PATH.
Os tipos de dados pré-definidos VECTOR, POSITION, e XTNDPOS são
exemplos de tipos de record. O usuário pode definir novos tipos de
dados record na seção TYPE de um programa.
O tipo de dados RECORD cria um tipo de dados definido pelo usuário
que é global em relação ao inteiro sistema. Isto significa que é
possível que ocorram conflitos entre definições RECORD que tenham o
mesmo nome mas que possuam campos diferentes. Tais conflitos
acontecem durante o carregamento dos programas. É aconselhável
que o programador utilize uma convenção unívoca para a nomeação
dos tipos de dados RECORD.
O programador pode definir tantos campos quanto queira em um
RECORD lembrando-se, porém, que a dimensão máxima de um record
é de 65535 bytes.
Os campos individuais de um RECORD são identificáveis graças a um
ponto que separa o nome da variável do record do nome do campo.
rec_var.field_name : = exp
DADOS DO TIPO VECTOR

O tipo de dados VECTOR representa um valor com direção e


magnitude. É constituído por três componentes do tipo REAL.
Representa, geralmente, uma posição ou direção cartesiana, com os
componentes correspondendo às coordenadas x, y, z. A Figura 2-3
apresenta um exemplo de vetor. O PDL2 pode executar as seguintes
operações em um tipo de dado VECTOR:

aritméticas (+, -)
aritméticas (*, /) VECTOR-INTEGER, VECTOR-REAL e vice-versa
relacionais (=)
vetoriais (X,Y,Z)
DADOS DO TIPO POSITION
O tipo de dados POSITION é usado para descrever a posição de um
sistema cartesiano de
coordenadas com relação a outro (chamado sistema inicial).
Geralmente, um valor do tipo POSITION é usado para especificar a
posição final para uma instrução MOVE que é posição a ser
alcançada pela ferramenta, instalada na extremidade do braço, com
relação ao sistema do usuário. Os valores tipo POSITION também
definem os sistemas de coordenadas de referência: por exemplo, a
posição da base do robô ($BASE), as dimensões da ferramenta na
extremidade do braço ($TOOL) e o sistema de coordenadas do
usuário ligado à peça de trabalho ($UFRAME) (consultar a seção
"Sistemas de Coordenadas de Referência" neste capítulo para uma
definição geral dos sistemas de coordenadas).
Notar que os valores tipo POSITION, além da posição, definem
também a orientação e, somente para os pontos finais, a
configuração do robô. Portanto, o tipo de dados POSITION é
constituído por três componentes de posição tipo REAL, três
componentes de orientação tipo REAL e um valor tipo STRING que
contém os componentes de configuração.
DADOS DO TIPO JOINTPOS
O tipo de dados JOINTPOS representa a posição real das juntas do
braço, em graus. A cada articulação do braço corresponde um
componente real. Cada valor real é a distância efetiva que a
articulação deve percorrer a partir da sua posição pré-definida
"zero". Cada variável JOINTPOS está associada a um braço
específico e não pode ser utilizada para um braço diferente.

Os componentes individuais de JOINTPOS, como componentes tipo


ARRAY, são referenciados por números índice. Por exemplo:

PROGRAM jnttest VAR


Real_var : REAL jomtpos_var : JOINTPOS BEGIN
real_var := joinzpos_var [5] jointpos_var [2] := real_exp END
jnttest

Não existem operações para o tipo de dados JOINTPOS inteiro. O


PDL2 fornece rotinas internas para executar manipulações no tipo
de dados JOINTPOS.
DADOS DO TIPO XTNDPOS

O tipo de dados XTNDPOS representa a posição do braço que envolve


um número de eixos maior do que está previsto na configuração
básica do robô (seis eixos). É utilizada para o movimento integrado de
um grupo de eixos, constituído por um braço de robô e alguns eixos
auxiliares adicionais, tratados como uma única unidade no sistema.
Por exemplo, um valor tipo XTNDPOS poderia ser utilizado para
representar um robô montado em um trilho. O robô e o trilho seriam
tratados como um único braço pelo sistema.
Cada variável XTNDPOS está associada a um braço específico e não
pode ser utilizada para um braço diferente.
O tipo de dados XTNDPOS é composto por uma posição cartesiana
para o robô e um ARRAY de valores de articulação para os eixos
remanescentes.
Componentes individuais de um valor tipo XTNDPOS são referenciados
utilizando notação de campo com os campos pré-definidos POS, um
valor tipo POSITION, e AUX, um ARRAY de valores tipo REAL.
Não existem operações para o tipo de dados XTNDPOS inteiro.
DADOS DO TIPO NODE
O tipo de dados NODE é similar ao tipo RECORD pois representa uma
coleção de um ou mais tipos de dados agrupados sob um único nome.
Cada dado de um nó é chamado campo e pode ser de qualquer tipo de
dados PDL2 exceto SEMAPHORE, RECORD, NODE ou PATH.
A diferença entre um NODE e um RECORD é que um NODE pode incluir
um grupo de campos de nó pré-definidos além de campos definidos
pelo usuário. Os campos de nó pré-definidos começam por $ e
possuem um significado conhecido pelo sistema idêntico àquele da
variável pré-definida correspondente. A coleção de campos de nó pré-
definidos contém o destino e a descrição de um único segmento de
movimento.
Os valores de tipos nó são definidos na seção TYPE do programa. A
definição do tipo nó cria um tipo de dado definido pelo usuário que é
global para todo o sistema. Isto significa que é possível que ocorram
conflitos entre definições RECORD e NODE que tenham o mesmo nome
mas que possuam campos diferentes. Tais conflitos acontecem
durante o carregamento dos programas. E aconselhável que o
programador utilize uma convenção unívoca para as definições de
RECORD e NODE.
A dimensão máxima de um nó é de 65535 bytes
DADOS DO TIPO PATH
O tipo de dado PATH (Percurso) representa uma seqüência de nós a
serem interpretados em,um único movimento. O tipo de dado PATH é
um record pré-definido que contém os campos NODE, FRM_TBL e
CONDJTBL.
O campo NODE é um ARRAY de nós representando uma seqüência de
nós. É dinâmico no comprimento o que significa que nós podem ser
adicionados ou removidos da tabela durante a execução. O número
máximo de nós em um percurso é 65535 mas a quantidade de
memória no sistema pode não permitir tantos nós.
A estrutura dos nós no array NODE é determinado pela definição de nó
do usuário declarada na seção TYPE do programa. Cada nó contém um
destino e uma descrição para um único segmento de movimento.
Notar que é possível ter diferentes percursos usando diferentes
definições de nós, entretanto, todos os nós em um mesmo percurso
devem ter a mesma definição de nó.
O valor de tipo nó é global para o sistema. Isto significa que é possível
que ocorram conflitos entre tipos de nós que tenham o mesmo nome
mas que possuam campos diferentes. É aconselhável que o
programador utilize uma convenção unívoca para as definições de nós
para evitar tais conflitos.
DADOS DO TIPO SEMAPHORE

O tipo de dado SEMAPHORE (Semáforo) representa um auxílio para


sincronização quando há múltiplos programas concorrentes que
dividem as mesmas fontes. Um SEMAPHORE, ou um array de
SEMAPHOREs é utilizado para obter uma mútua exclusão de um
recurso de modo que cada um dos programas não possa agir sobre o
mesmo contemporaneamente.
Nenhuma operação é possível no tipo de dado SEMAPHORE inteiro,
mas as seguintes instruções utilizam variáveis SEMAPHORE:

WAIT
SIGNAL
DECLARAÇÕES DE CONSTANTES
As Constantes são declaradas na seção CONST de um programa. A
declaração de uma constante estabelece dois atributos a um
identificador de constante; um nome e um valor invariável. O tipo de
dado de uma constante é definido pelo valor que lhe é atribuído, que
pode ser um INTEGER, um REAL, um BOOLEAN, ou um STRING. Ao
interno do programa é possível utilizar o identificador no lugar do seu
valor.
A sintaxe a ser utilizada para a declaração de uma constante é a
seguinte:
name = || literal I predef_const_id II
As declarações de constantes aparecem na respectiva seção, após a
palavra reservada CONST.
DECLARAÇÕES DE VARIÁVEIS
As Variáveis são declaradas na seção VAR de um programa. A
declaração de uma variável estabelece um identificador de variável e
um tipo de dado. O tipo de dado de uma variável é definido pelo
atributo que lhe é informado. Ao interno do programa é possível
utilizar o identificador no lugar do seu valor.
A sintaxe a ser utilizada para a declaração de uma variável é a
seguinte:

name : tipo de dado

As declarações de variáveis aparecem na respectiva seção, após a


palavra reservada VAR.
ROUTINES
Uma rotina é estruturada como um programa, embora geralmente
executa tarefa simples.
Rotinas servem para encurtar e simplificar o programa principal. As
tarefas que se repetem em um programa ou são comuns a
diferentes programas, podem ser isoladas em determinadas
rotinas.
Um programa pode chamar mais de uma rotina e pode chamar a
mesma rotina mais de uma vez.
Quando um programa chama uma rotina, o ponteiro é transferido
para a rotina e as condições presentes na rotina são executadas.
Após a execução da rotina , o ponteiro é devolvido ao ponto de
onde a rotina foi chamada. As rotinas podem ser chamadas de
qualquer lugar dentro da seção executável de um programa ou
rotina.
O programador descreve as rotinas na seção de declaração de um
programa. A estrutura de uma rotina é semelhante à estrutura de
um programa.
ROTINAS DE FUNÇÃO OU
PROCEDIMENTO
Uma rotina de procedimento possui uma seqüência de instruções
que são chamadas e executadas como se fossem uma única
instrução executável. Por exemplo uma rotina de fechamento de
uma garra; em seu interior estão contidas varias instruções mas o
objetivo principal é fechar a garra, ou seja ela é vista simplismente
como: rotina de fechamento da garra.

A rotina de função possui uma seqüência de cálculos que resultam


em um único valor a ser devolvido. Ela é chamada e executada a
partir de uma expressão.
Rotinas de função, muitas vezes são usadas como parte de um teste
de controle, em um loop ou de desvio condicional, ou como parte de
uma expressão, utilizando uma instrução de atribuição, como uma
variável boleana por exemplo.
ROTINAS DE PARÂMETROS

Para tornar as rotinas mais generalizadas para o uso em diferentes


circunstâncias, o programador pode usar rotinas de parâmetros em
vez de usar constantes ou variáveis do programa diretamente.
Os dados são declarados como parte da declaração de rotina.
Quando a rotina é chamada, os dados são passados para as rotinas
de parâmetros a partir de uma lista de argumentos na chamada da
rotina. O número de argumentos executados por uma rotina deve
ser igual ao número de parâmetros declarados para a rotina. Os
argumentos também devem corresponder ao tipo de dados
declarado do parâmetros.
O exemplo a seguir mostra como a rotina time_out pode ser mais
geral, incluindo um parâmetro para o índice de sinal de entrada.
ROTINAS DE PARÂMETROS
PROGRAM input_check
ROUTINE time_out (input : INTEGER) : BOOLEAN
--verifica se a entrada é recebida dentro do tempo limite
CONST
time_limit = 3000
VAR
time_slice : INTEGER
BEGIN
$TIMER[1] := 0
REPEAT
time_slice := $TIMER[1]
UNTIL ($DIN[input] = ON) OR (time_slice > time_limit)
IF time_slice > time_limit THEN
RETURN (TRUE)
ELSE
RETURN (FALSE)
ENDIF
END time_out
BEGIN -- main program
IF time_out(6) THEN
WRITE (Timeout Occurred)
ENDIF
END input_check
DECLARANDO UMA ROTINA
A sintaxe para a declaração de uma rotina de função ou
procedimento é a seguinte:
ROUTINE proc_name <parameter_list>
<constant and variable declarations>
BEGIN
<statement...>
END proc_name

A sintaxe da declaração de uma rotina de função inclui o tipo de


retorno de dados e deve incluir pelo menos uma instrução de
retorno que será executado, como segue:
ROUTINE func_name <parameter_list> : return_type
<constant and variable declarations>
BEGIN
<statement...> must include RETURN statement
END func_name
ROTINAS E VARIÁVEIS
COMPARTILHADAS
Através da cláusula opcional EXPORTED FROM, é possível declarar as
variáveis e as rotinas como pertencentes a outro programa ou como
não exclusivas e utilizáveis por outros programas. Isto permite a
programas de usar as mesmas variáveis e rotinas. A cláusula
EXPORTED FROM pode ser utilizada em qualquer declaração de variável
ou de rotina.
A sintaxe para a declaração de uma rotina compartilhada é a seguinte:
EXPORTED FROM nome_prog

Nome_prog indica o nome do programa ao qual pertence à variável ou


a rotina especificada. Se este nome for igual àquele do programa onde
reside a instrução, o acesso à variável/rotina será permitido por outros
programas.
Se nome_prog for diferente do nome do programa onde reside a
instrução, a variável/rotina pertencerá ao nome_prog. Neste caso, o
programa que contém o dado deverá também exportá-lo, caso
contrário, verificar-se-á um erro no momento do carregamento do
programa
OPERADORES ARITMÉTICOS
RELACIONAIS E LÓGICOS
Os operadores aritméticos são:
+ adição INTEGER, REAL ou VECTOR
- subtração INTEGER, REAL ou VECTOR
* multiplicação INTEGER, REAL ou VECTOR
DIV divisão INTEGER (resultados fracionários truncados)
/ divisão REAL ou VECTOR
MOD módulo INTEGER (resto)
** exponenciação INTEGER ou REAL
+= incremento INTEGER
-= decremento INTEGER

Os operadores relacionais são:


< — menor que
> — maior que
= — igual a
<= — menor ou igual a
>= — maior ou igual a
<> — diferente

Os operadores lógicos são:


AND — TRUE se ambos operandos são TRUE
OR — TRUE se pelo menos um dos operandos for TRUE
XOR — TRUE se somente um operando for TRUE
NOT — Inverso do operando BOOLEAN
MATRIZES DE PORTAS
As matrizes de porta utilizadas no PDL2 são: Matrizes de portas
digitais, analógicas e grupos, configuradas pelo usuário para
predispor aplicações específicas de E/S.

Matrizes de portas definidas pelo sistema, mapeadas internamente


para dispositivos de sistema como os dispositivos operador, braços e
temporizadores.

Matrizes de portas da memória compartilhada utilizadas pelos


programas PLC e PDL2 para comunicação entre os mesmos.

Matrizes de portas definidas pelo usuário utilizadas para ter acesso


aos dispositivos definidos pelo usuário
MATRIZES DE PORTAS
$DIN e $DOUT: Permitem o acesso por parte do programa a entradas
ou saídas digitais. O PDL2 trata estes dados como um valor boleano.
$IN e $OUT: São portas digitais, reservadas para aplicações.
$G I N e $GOUT : Permitem o acesso, por parte do programa, aos
dados de um grupo de sinais de entrada ou de saída. Valor INTEGER
$AIN e $AOUT : Permitem o acesso, por parte do programa, aos
dados na forma de sinal analógico.
$FMI e $FMO: Portas flexíveis para aplicação que assumem sempre
valores inteiros.
$SDIN e $SDOUT: Permitem o acesso somente de leitura, por parte
do programa, aos dados em sinais definidos pelo sistema como se
fossem linhas individuais de entrada ou de saída.
$FDIN e $FDOUT: Permitem o acesso, por parte do programa, aos
dados nos sinais definidos pelo sistema como se fossem linhas
individuais de entrada ou de saída. Tais sinais correspondem às teclas
função e aos LEDs no painel de controle, no terminal portátil de
programação e no CRT
GESTORES DE CONDIÇÃO
Os gestores de condição permitem a um programa monitorar
determinadas condições em paralelo com a execução normal e
executar as ações associadas no caso em que tais condições sejam
satisfeitas. Utilizações típicas compreendem a monitoração e o
controle das unidades periféricas e a gestão dos erros.
Por exemplo, o seguinte gestor de condição controla se existe uma
condição de PAUSE. Quando o programa for colocado no estado
pause, a saída digital $DOUT[21] será desabilitada.
Este exemplo pode ser utilizado para sinalizar a uma ferramenta que
deve desligar-se caso um programa seja inesperadamente colocado
no estado de pause.

CONDITION[1 ] : --define o gestor de condição


WHEN PAUSE DO
$DOUT[21] : = OFF
ENDCONDITION
ENABLE CONDITION[1] --habilita o gestor de condição
GESTORES DE CONDIÇÃO

CONDITION [numero] <FOR ARM [ N ] > <NODISABLE> <ATTACH> <SCAN(numero)> :


WHEN expr_cond DO
<Lista_ações>. . .
WHEN expr_cond DO
<Lista_ações>. . .
ENDCONDITION

O programador identifica cada gestor de condição mediante o número,


uma expressão INTEGER que deve estar compreendida entre 1 e 255.
As condições a serem monitoradas estão especificadas na expressão
de condição (expr _cond). Muitas condições podem ser combinadas
em uma única expressão utilizando os operadores BOOLEAN AND e
OR. Quando a expressão se torna TRUE, o gestor de condição é
ativado. O elenco das ações (Lista_ações) especifica as ações a serem
executadas quando o gestor for ativado
GESTORES DE CONDIÇÃO
CLÁUSULA OPCIONAL FOR ARM

A cláusula opcional FOR ARM pode ser utilizada para designar um


braço especial para o gestor de condição. Se uma condição possuir a
cláusula FOR ARM especificada, um evento de movimento ativará tal
braço. Analogamente, qualquer ação relacionada com braços será
aplicável ao braço especificado por FOR ARM. Se FOR ARM não for
especificada, o braço default (PROG_ARM ou $DFT_ARM) será usado
para qualquer ação relacionada com braços. Eventos de movimento
habilitados globalmente serão aplicáveis a qualquer braço enquanto
que eventos locais serão aplicáveis somente ao braço da instrução
MOVE ao qual estão associados (através da opção WITH).
GESTORES DE CONDIÇÃO

CLÁUSULA OPCIONAL NODISABLE

A cláusula opcional NODISABLE indica que o gestor de condição não


será desabilitado automaticamente quando a condição for ativada.

A cláusula NODISABLE não é permitida nos gestores que contenham


condições de estado.
GESTORES DE CONDIÇÃO
CLÁUSULA OPCIONAL SCAN

A cláusula opcional SCAN pode ser usada para indicar uma taxa
diferente para a varredura do gestor de condição.

Se este atributo não for especificado, o gestor de condição será


monitorado de acordo com o tempo de varredura definido no sistema
(valor STUNE[1]). Se a cláusula SCAN estiver presente na definição da
condição, as expressões contidas em tal gestor de condição serão
verificadas com uma freqüência menor.

Uma variável ou expressão INTEGER positiva deve ser especificada


entre parênteses ao lado da cláusula SCAN; este número indica o fator
multiplicativo a ser aplicado à taxa de varredura normal de
monitoração do gestor de condição.
GESTORES DE CONDIÇÃO
CLÁUSULA OPCIONAL ATTACH

Definindo a cláusula opcional ATTACH (reserva) obtém-se a imediata


reserva do gestor de condição. Se não for especificada, o gestor de
condição pode se reservado em um ponto qualquer do programa
através da instrução ATTACH CONDITION.
A sintaxe para a instrução ATTACH CONDITION é a seguinte:
ATTACH CONDITION [número] <CONDITION [número]>. . .

No caso de reserva de um gestor de condição, somente o código


pertencente ao mesmo programa que contém a instrução ATTACH
pode ser utilizado para habilitar, desabilitar, remover, redefinir o
gestor de condição ou por fim ao seu controle exclusivo por parte do
programa através da instrução DETACH. A sintaxe é a seguinte:
DETACH CONDITION II ALL I [número] <CONDITION
[número]>. . . II

Utilizando a opção ALL é abandonado o controle exclusivo de todos os


gestores de condição reservados. Caso contrário, somente os gestores
especificados terão as suas condições de reserva removidas.
GESTORES DE CONDIÇÃO

REFERENCIAS À VARIÁVEIS

Os tipos de variáveis que podem ser referenciados em um gestor de


condição estão restritos às variáveis globais ou predefinidas.
Variáveis locais ou parâmetros de rotinas não são permitidos em um
gestor de condição a menos que os seus valores sejam obtidos no
instante da definição do gestor de condição. Além disso, variáveis
predefinidas que requerem a utilização de funções internas para o
seu acesso também não são permitidas em um gestor de condição.
Adicionalmente, o valor de uma variável predefinida que tenha seus
limites controlados não pode ser modificado.
GESTORES DE CONDIÇÃO

ESTADOS BOOLEAN

Uma condição de estado BOOLEAN verifica uma variável BOOLEAN


em todas as varreduras. A condição é satisfeita quando a variável for
TRUE. Quando for utilizada em uma cláusula TIL ou WHEN, a variável
BOOLEAN não pode ser uma variável local ou um parâmetro. O
operador BOOLEAN NOT pode ser utilizado para especificar que a
condição será satisfeita quando a variável for FALSE.

Quando duas condições de estado de variáveis BOOLEAN forem


combinadas com os Operadores AND ou OR, não se deve utilizar
parênteses por fora da expressão. Caso sejam usados, o editor trata
a expressão com um igual (=) ao invés de AND ou OR.
GESTORES DE CONDIÇÃO
ESTADO DE PORTAS DIGITAIS
Uma condição de estado de uma porta digital monitora um dos sinais
das matrizes de portas digitais de E/S. O sinal é testado em todas as
varreduras. A condição é satisfeita se o sinal estiver ativado durante
a varredura. O operador BOOLEAN NOT pode ser utilizado para
indicar que a condição será satisfeita se o sinal estiver desativado
durante a varredura.

EVENTOS DE PORTAS DIGITAIS


Uma condição de evento de uma porta digital também monitora o
estado de um sinal digital de E/S das matrizes de portas. As matrizes
$DIN, $DOUT, $SDIN, $SDOUT e $BIT podem ser monitoradas como
eventos. A $FDIN não pode ser monitorada como evento.
Para os eventos, o valor inicial do sinal é testado quando o gestor de
condição for habilitado. Cada varredura verifica se ocorreu a
Modificação especificada do sinal. A condição será satisfeita quando
a modificação ocorrer enquanto o gestor de condição estiver
Habilitado.
GESTORES DE CONDIÇÃO
EVENTOS DE SISTEMA
Uma condição de evento de sistema monitora um evento gerado pelo
sistema. A condição será satisfeita quando o evento especificado
ocorre enquanto o gestor de condição estiver habilitado. A varredura
da expressão de condição é efetuada somente quando ocorre um
evento de sistema.
Os eventos de sistema compreendem:

POWER UP: restabelecimento da execução do programa após uma


falha na alimentação;
HOLD: cada acionamento da tecla HOLD ou execução de uma
instrução do PDL2;
START: cada acionamento da tecla START;
Código EVENT : ocorrência de um evento de sistema, identificado por
um código;
SEGMENT WAIT var_path: o campo $SEG_WAIT do nó executado é
TRUE;
WINDOW SELECT num_scrn: seleção de uma janela de entrada
diferente na tela.
GESTORES DE CONDIÇÃO

EVENTOS DE ERROS

Uma condição de eventos de erro monitora a ocorrência de um erro.


A condição será Satisfeita quando o evento de erro especificado
ocorrer enquanto o gestor de condição estiver habilitado.

A expressão de condição é verificada somente quando ocorre um


erro.
Os eventos de erro compreendem:

ANYERROR: ocorrência de qualquer erro


ERRORCLASS: ocorrência de um erro que pertence à classe
ERRORNUM: ocorrência de um erro, identificado pelo número.
GESTORES DE CONDIÇÃO

EVENTOS DE USUÁRIO

Esta classe de eventos pode ser usada como um meio para a


sincronização de programas.
O usuário pode definir o seu próprio evento especificando um
número incluído no intervalo de 49152 a 50175 com a condição
EVENT.
A condição será satisfeita quando a instrução SIGNAL EVENT ocorrer
para o número de evento especificado.
GESTORES DE CONDIÇÃO
EVENTOS DE PROGRAMA

Uma condição de evento de programa efetua a monitoração de um


evento gerado pelo programa. A condição é satisfeita quando o
evento de programa
especificado ocorre enquanto o gestor de condição estiver habilitado.
A verificação da expressão de condição é efetuada somente quando
ocorre um evento de programa. Os eventos de programa
compreendem:

ACTIVATE: ativação da execução do programa


DEACTIVATE: desativação da execução do programa
PAUSE: pausa na execução do programa
UNPAUSE: eliminação da pausa na execução do programa
EXIT CYCLE: abandono do ciclo corrente e início do ciclo sucessivo
GESTORES DE CONDIÇÃO
AÇÕES INTERNAS E DE ATRIBUIÇÃO

As ações internas são procedimentos internos que podem ser


utilizados como ações de um gestor de condição. Atualmente, as
ações permitidas são somente BIT_SET, BIT_CLEAR e BIT_ASSIGN.
Quando um procedimento interno for chamado como ação, as
variáveis locais não podem ser utilizadas como parâmetros passados
por referência.
A ação de atribuição, atribui um valor a uma variável estática
Definida pelo usuário, a uma variável de sistema ou a uma porta de
saída. O valor pode ser uma variável estática definida pelo usuário,
uma variável predefinida, um elemento de matriz de portas, uma
constante ou um valor literal. Não é possível utilizar uma variável
local ou um parâmetro como valor ou como variável atribuída.
Se for utilizada uma variável como operando à direita do operador
:=, a mesma não precisa ser inicializada quando for definido o gestor
de condição ou quando a ação ocorrer.
GESTORES DE CONDIÇÃO

AÇÃO DE INCREMENTO

A ação de incremento soma um valor a uma variável de programa


inteira. A ação decremento subtrai um valor de uma variável de
programa inteira. O valor pode ser uma variável estática definida
pelo usuário, uma constante ou um valor literal.
Uma variável local ou parâmetro não pode ser usado como o valor ou
como a variável atribuída. Caso uma variável seja usada como o
operando à direita do operador += ou -= , não é necessário que seja
inicializada quando o gestor de condição for definido ou quando a
ação ocorrer.
GESTORES DE CONDIÇÃO

AÇÕES INTERNAS

As ações internas são procedimentos internos que podem ser


utilizados como ações de um gestor de condição. Atualmente, as
ações permitidas são somente BIT_SET, BIT_CLEAR e BIT_ASSIGN.
Quando um procedimento interno for chamado como ação, as
variáveis locais não podem ser utilizadas como parâmetros passados
por referência.
GESTORES DE CONDIÇÃO
AÇÕES DE MOVIMENTO
As ações de movimento cancelam ou retomam um movimento e as
ações de braço liberam de reserva, bloqueiam e desbloqueiam os
braços. Tais ações têm o mesmo efeito das instruções
correspondentes, como descrito no capítulo "Controle do
Movimento". As seguintes ações (exceto SIGNAL SEGMENT) podem
ser utilizadas no braço default, em um ou mais braços especificados
ou em todos os braços.
A ação RESUME não produzirá sempre a ordem de execução esperada
em uma lista de ações. A ação RESUME é executada sempre após
todas as outras ações com exceção da ação de chamada de rotina. O
restante das ações são executadas na ordem na qual ocorrem.
CANCEL: cancela o movimento
SIGNAL SEGMENT: retoma o movimento do percurso
DETACH: libera um ou mais braços reservados
LOCK: bloqueia um ou mais braços,
RESUME: retoma um movimento suspendido devido a uma instrução
LOCK.
UNLOCK: desbloqueia um ou mais braços
GESTORES DE CONDIÇÃO

AÇÕES DOS GESTORES DE CONDIÇÃO

As ações dos gestores de condição executam as seguintes operações:


ENABLE CONDITION: habilita o(os) gestor(es) de condição
especificado(s)

DISABLE CONDITION: desabilita o(os) gestor(es) de condição


especificado(s)

PURGE CONDITION: remove o(os) gestor(es) de condição


especificado(s)

DETACH CONDITION: libera o(os) gestor(es) de condição


especificado(s)
CONTROLE DE FLUXO NA EXECUÇÃO
DE UM PROGRAMA
A execução de um programa começa geralmente com a primeira
instrução, colocada geralmente após a instrução BEGIN, e prossegue
até chegar à instrução END. O PDL2 contém instruções que modificam
esta ordem de execução nos seguintes modos:

Escolha das alternativas:


Instrução IF
Instrução SELECT

Malha:
Instrução FOR
Instrução WHILE
Instrução REPEAT

Salto incondicional:
Instrução GOTO
INSTRUÇÃO IF
A instrução IF permite ao programa escolher entre dois possíveis
fluxos de execução em base ao resultado de uma expressão
BOOLEAN. Se a expressão for TRUE (verdadeira), as instruções
colocadas após á cláusula IF serão executadas.
O controle do programa passa, depois, à instrução colocada após o
ENDIF. Se a expressão for FALSE (falsa), as instruções colocadas
após a cláusula IF são saltadas e o controle do programa passa à
instrução colocada após o ENDIF. A figura 6-1 ilustra a execução de
uma instrução IF.
Um cláusula ELSE opcional, posicionada entre a última instrução da
cláusula IF e o ENDIF, pode ser utilizada para executar uma série de
instruções caso a expressão BOOLEAN seja FALSE.
Ao interno das cláusulas IF ou ELSE é possível inserir um número
qualquer de instruções PDL2 executáveis, assim como, também,
outras instruções IF.
INSTRUÇÃO SELECT

A instrução SELECT permite ao programa escolher entre algumas


alternativas, em base ao resultado de uma expressão INTEGER . Cada
uma dessas alternativas é denominada caso. O resultado da
expressão INTEGER é comparado com o valor de cada caso,
procurando identificar uma correspondência. Se existir
correspondência, serão executadas as instruções referentes àquele
caso e o controle do programa passa à instrução colocada após a
instrução ENDSELECT. Todos os outros casos são saltados.
Uma cláusula opcional ELSE, posicionada entre o último caso e a
instrução ENDSELECT, pode ser usada para executar uma série de
instruções se a expressão INTEGER não corresponder a nenhum dos
valores dos casos. Sem esta cláusula ELSE, um erro é sinalizado caso
não ocorra a correspondência a um dos valores dos casos.
Os valores INTEGER em cada caso podem ser constantes ou valores
literais predefinidos ou definidos pelo usuário. Não são permitidas
expressões. Além disso, não é possível utilizar o mesmo valor
INTEGER em mais de um caso.
INSTRUÇÃO FOR
A instrução FOR é utilizada quando for necessário repetir uma
seqüência de instruções por um determinado número de vezes
(malha ou loop). E baseada em uma variável INTEGER a qual é
atribuído inicialmente um valor de partida e que será, depois,
incrementado ou decrementado cada vez que o loop for executado
até alcançar um valor final. Os valores inicial e final são especificados
como expressões INTEGER.
Antes de cada loop, o valor da variável INTEGER é comparado com o
valor final. Se o loop for do tipo incremento, a partir do valor de
partida ao valor final (TO) será utilizado um teste "menor ou igual a".
Em caso de resultado negativo deste teste, o loop não será
executado. Se o valor do STEP for um, o loop será executado por um
número de vezes igual ao valor absoluto (valor final - valor inicial +
1).
Se o loop for do tipo decremento, do valor inicial até o valor final
(DOWNTO) será utilizado um teste "maior ou igual a". Em caso de
resultado negativo deste teste, o loop não será executado.
INSTRUÇÕES WHILE & REPEAT

A instrução WHILE executa uma seqüência de instruções enquanto


uma expressão BOOLEAN for true (verdadeira). Se antes de começar
o loop, a instrução BOOLEAN for FALSE (falsa), o loop não será
executado.

A instrução REPEAT faz com que uma seqüência de instruções seja


executada até quando uma expressão BOOLEAN for TRUE. O loop será
sempre executado pelo menos uma vez, mesmo se a expressão
BOOLEAN seja TRUE antes que o mesmo seja executado pela primeira
vez. A figura 6-3 ilustra a execução de uma instrução REPEAT.
INSTRUÇÃO GOTO

A instrução GOTO gera um salto incondicional que permite uma


transferência direta do controle a outra parte do programa saltando
as condições intermediárias. Na maior parte dos casos, onde for
necessário um loop ou um fluxo não seqüencial do programa ao
interno de um programa, esta instrução pode ser utilizada junto às
outras instruções de controle descritas neste capítulo. As instruções
de salto incondicional devem ser consideradas como última solução,
quando nenhuma outra instrução de controle funciona.
Com a instrução GOTO o controle do programa passa a um ponto
especificado mediante uma etiqueta da instrução, um identificador de
constante colocado na margem esquerda. A etiqueta da instrução é
acompanhada por dois pontos consecutivos (::). As instruções
executáveis podem ser colocadas na mesma linha da etiqueta ou nas
linhas seguintes.
INSTRUÇÃO DELAY

A instrução DELAY suspende por um período de tempo


especificado a execução do programa a partir do qual tenha
sido emitida.
Sintaxe: DELAY expr_int
Comentários: expr_int indica o período de tempo em
milisegundos.
DELAY represente uma instrução assíncrona; a mesma
continua a ser executada mesmo se o programa for colocado
em estado paused e permite o início das rotinas de interrupção
antes do seu encerramento.
Exemplo:
MOVE TO pnt xxx
DELAY 20000
MOVE TO pny yyy
INSTRUÇÃO BEGIN
A instrução BEGIN marca o início das instruções executáveis em
um programa ou em uma rotina.
Sintaxe: BEGIN<CYCLE>
Comentários: As seções de declarações de variáveis, tipos e
constantes devem ser colocadas antes da instrução BEGIN.
A opção CYCLE é permitida para qualquer instrução BEGIN de
programa, mas não pode ser utilizada por um instrução BEGIN
dentro de uma rotina.
A opção CYCLE cria um ciclo contínuo. Quando for encontrada a
instrução END do programa, a execução prosseguirá
recomeçando pela instrução BEGIN. O ciclo continuará até que o
programa não seja desativado ou até que não seja executada
uma instrução EXIT CYCLE. Uma instrução EXIT CYCLE termina
o ciclo em andamento: a execução prossegue imediatamente
recomeçando pela instrução BEGIN.
INSTRUÇÃO END

A instrução END marca o fim de um programa ou de uma


rotina.
Sintaxe: END nome
Comentários: nome é o identificador definido pelo usuário
utilizado para dar um nome ao programa ou rotina.
Se a instrução END estiver presente em uma rotina tipo
procedimento, o controle do programa é restituído à
rotina ou programa que a chama.
INSTRUÇÃO WAIT FOR

A instrução WAIT FOR suspende a execução do programa até que


seja satisfeita a condição especificada.

Exemplo:
A instrução WAIT FOR suspende a execução do programa até que
seja satisfeita a condição especificada.
INSTRUÇÃO ACTIVATE

Os programas carregados em memória podem ser ativados em modo


concorrente através da instrução ACTIVATE. É possível somente uma
ativação de um determinado programa em um determinado
momento. O resultado da ativação de um programa depende do
atributo holdable ou no-holdable do programa que envia a instrução
e do programa que deve ser ativado. Se a instrução for emitida por
um programa no-holdable, os programas holdable são colocados em
estado de ready e os programas no-holdable são colocados em
estado de running. Se a instrução for emitida por um programa
holdable, os programas serão colocados em estado de running.
INSTRUÇÃO PAUSE
A instrução PAUSE coloca um programa em estado paused . Para
reativar o programa é necessário executar uma operação UNPAUSE.
A instrução PAUSE em um programa em fase ready, o coloca em
estado paused-ready.
Durante o estado paused de um programa, as seguintes operações
continuam sendo executadas:
- movimentos em andamento ou pendentes;
- varredura dos gestores de condição;
- pulsos de saídas em andamento;
- chamadas ao sistema em andamento ou pendentes;
instruções assíncronas (DELAY, PULSE, WAIT, etc)
Se especifica o nome_prog ou um elenco de nomes, serão colocados
em estado paused os programas indicados. Se não se especifica
nome algum, será colocado em estado paused o programa que indica
a instrução. Indicando ALL, todos os programas em fase de execução
e aqueles em estado ready são colocados em estado paused. A
instrução não tem efeito nos programas que não estão em fase de
execução.
INSTRUÇÃO UNPAUSE

A instrução UNPAUSE remove os programas da condição de


interrupção habilitada através da instrução PAUSE. O efeito que esta
instrução tem sobre um programa depende do atributo holdable/no
holdable do próprio programa. Se a instrução for emitida por um
programa não holdable, os programas holdable serão colocados em
estado ready e os programas não holdable em estado running. Se a
instrução for emitida por um programa holdable, os programas serão
colocados em estado running.
Especifica-se o nome_ prog ou um elenco de nomes, serão liberados
os programas indicados. Indicando ALL, serão liberados todos os
programas que estavam em estado paused. A instrução não terá
algum efeito nos programas que não se encontram em estado
paused.
INSTRUÇÃO DEACTIVATE
A instrução DEACTIVATE desativa os programas que se encontram
nos estados running, ready, paused ou paused-ready . Após terem
sido desativados, os programas permanecem carregados na
memória, mas não serão mais executados e não serão retomados.
Podem ser reativados somente através de uma instrução ACTIVATE.
Quando um programa está desativado podem ser executadas as
seguintes operações:
- são anulados os movimentos em andamento e pendentes;
- os gestores de condição são removidos;
- o programa é eliminado de todas as listas (semaphores);
- as operações de leitura, os pulso, se os atrasos são anulados;
- as chamadas de sistema em andamento ou pendentes são
abortadas;
- os arquivos abertos são fechados;
- dispositivos, timers e gestores de condição selecionados (attached)
são liberados;
- os braços bloqueados são soltos mas é necessário ainda prosseguir
com o movimento.
INSTRUÇÕES CYCLE & EXIT CYCLE
A instrução CYCLE pode ser uma instrução por si só ou então
constituir uma opção da instrução BEGIN que permite ao
programador criar um ciclo contínuo. Quando a instrução END do
programa for encontrada, a execução recomeça a partir da instrução
CYCLE. Este ciclo continua até a desativação do programa. A
instrução CYCLE é permitida somente no programa principal, não
sendo possível a sua utilização em uma rotina. No interior de um
programa deve existir no máximo uma instrução CYCLE.
Com a instrução EXIT CYCLE, a parte restante do ciclo atual é
ignorada e a execução recomeça diretamente a partir dó início do
ciclo sucessivo. Não é possível recomeçar um ciclo para o qual foi
utilizada a instrução EXIT CYCLE para sair do mesmo. Esta instrução
anula todas as instruções suspensas e aquelas em execução, cancela
todas as instruções assíncronas em espera de execução e reinicializa
o stack de programa. A saída de um ciclo NÃO fecha os arquivos,
NÃO desconecta recursos, NÃO desabilita ou cancela o conteúdo dos
gestores de condição e NÃO desbloqueia os braços.
INSTRUÇÃO ERR_POST
O procedimento ERR_POST built-in executa um erro definido pelo
usuário.
Ele trabalha com alarmes ativos: estes são os alarmes que exigem
respostas por parte do usuário.
Quando o usuário tiver selecionado a resposta, o programa é
notificado (evento de sinal ou conjunto de variáveis).
Sequencia de carregamento:

ERR_POST (error_num, error_str, error_sev <, post_flags> <,


resp_flags> <, alarm_id> <, resp_data> <,parameters>)
Parametros:
error_num : INTEGER [IN]
error_str : STRING [IN]
error_sev : INTEGER [IN]
post_flags : INTEGER [IN]
resp_flags : ARRAY OF INTEGERs [IN]
alarm_id : INTEGER [OUT]
resp_data :INTEGER [OUT]
INSTRUÇÃO ERR_POST
error_num pode ser qualquer expressão inteira cujo valor é na
faixa de 43008-44031. Esses erros correspondem a EC_USR1 e
classe EC_USR2.
error_str é uma expressão String que contém uma mensagem de
erro a ser exibido.
error_sev é uma expressão inteira, cujo valor está na faixa de 2 a
12. Estes valores representam as gravidades seguinte erro:
– 2 : Warning
– 4 : Pause, hold if holdable
– 6 : Pause all, hold if holdable
– 8 : Hold
– 10 : DRIVE OFF, pause all, deactivate
– 12 : DRIVE OFF, deactivate all
INSTRUÇÃO ERR_POST

Quando ERR_POST é executado, o erro é tratado como qualquer


erro no sistema.
O erro é enviado para o log de erro e qualquer manipulação da
condição de erro específicas são armazenadas.
A variável $ERROR não está definida para o programa que chama a
ERR_POST built-in. Para testar se o erro especificado no ERR_POST
ocorreu a variável predefinida , SYS_ERROR pode ser usada.
post_flags é uma expressão inteira cujo valor é composto das
seguintes das máscaras elencadas a seguir.
INSTRUÇÃO ERR_POST
Bit1: Não é salvo no arquivo ERROR_LOG
Bit2: Não é postado na janela de status da tela do sistema
Bit3: Não é postado ao manipulador a condição processo de
leitura de novas intruções.
Bit4: Não é postado na janela de rolagem da tela do TP
Bit5: Não é postado na janela de rolagem da tela do PC
Bit6: Não é postado ao sistema o estado do controlador
Bit7: Ocorre transição do estado do programa com base na gravidade
de erro
Bit10: Retorno automático de rotina atual (Bit 7 também deve ser
definido)
Bit12: Não é postado o log de erros para a tarefa
Bit13: É adicionado ao log binário o nível de gravidade (2)
Bit15: Um alarme com trava
Bit16: Um alarme com trava com DRIVE desativado
Bit17: Um alarme com trava com desabilitação do estado AUTO
INSTRUÇÃO ERR_POST
resp_flags: Uma Array de dados inteiros que contém no mínimo quatro
elementos:

[1]: Uma máscara com as respostas disponíveis, que o usuário pode


selecionar;

[2]: Resposta padrão;

[3]: Ação a ser executada quando o usuário reconhece o alarme.


Sinal evento ou definir uma variável:
0 = Cancelar o alarme activo
1 = Post um evento com os dados do evento a ser gerado
2 = Definir uma variável. Quando o alarme ocorre é reconhecido a
variável;

[4]: Os dados associados com o exemplo de ação. variável a ser


definida ou ID de evento para ser ativada.
INSTRUÇÃO ERR_POST

alarm_id: variável opcional (por referência) que irá conter o


identificador de alarme após o alarme tornar-se ativo.

resp_data: variável opcional (por referência) que irá conter a resposta


dada pelo utilizador com palavra de baixo a palavra alarm_id e alta a
resposta.
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Existem 6 teclas no menu direito do TP, que podem ser manipuladas
pelo usuário para atender as demandas de programas.
Cada aplicação, poderá receber um menu que ficará separado em grupo
e poderá ser acessado pressionando a tecla MORE.
Os menus são circulares, ou seja, através do MORE aparecerão
sequentemente em grupos separados.
Cada tecla poderá ser habilitada ou desabilitada, o pressionamento de
uma das softkeys só terá efeito se estiver habilitada.
Note que o aspecto da tecla permanence o mesmo, então cabe ao
programador, inserir eventos que mudem a cor, nome, status, etc.

Eventos poderão ocorrer no pressionamento ou abandono do


pressionamento da softkey
O arquivo de configuração (XML) deverá ficar no local apropriado na
unidade LD:
LD:\tp4i\tp4iInternalfs\config\rigthmenu
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Após o restart, os arquivos XML serão carregados automaticamente no
TP. Cada página(arquivo xml) corresponde a definição de um grupo de
teclas, que não podem ser mais do que 6.
A sintaxe da página é:
<?xml version="1.0"?>
<NewMenu>
<group>
<progName>GroupName</progName>
<numItems>Number</numItems>
<arName>Names</arName>
<arIconName>Icons</arIconName>
<arStatus>Colours</arStatus>
<arEnabled>Enabled</arEnabled>
<evPressed>NumberOfEvent</evPressed>
<evLongPressed> NumberOfEvent </evLongPressed>
<evReleased> NumberOfEvent </evReleased>
</group>
</NewMenu>
CUSTOMIZAÇÃO: USO DO RIGTHMENU
As palavras contidas entre os símbolos < > devem existir no programa
referenciado. As palavras em negrito são exemplos do que deve haver
no programa PDL.

Exemplo:
Se houver necessidade de usar 8 teclas em um grupo e dois grupos de
um outro programa:
2 arquivos XML devem ser ser definidos. No primeiro arquivo, um
grupo com 8 softkeys sera definido;
No segundo, 2 grupos com 3 softkeys cada. TP4i/WiTP criará as
seguintes páginas:
– Uma página com 6 softkeys pertencentes ao primeiro arquivo xml
– Uma página com as 2 restantes softkeys do grupo primeiro arquivo
xml
– Uma página com as 3 softkeys do primeiro grupo do Segundo XML
– Uma página com as 3 softkeys do Segundo grupo do Segundo XML.
CUSTOMIZAÇÃO: USO DO RIGTHMENU

Segue abaixo, algumas explicações:


– Tag XML
– Eventos das Softkey Apertar(pressure) e Soltar(release)
– Exemplo de configuração XML
– Exemplo de configuração do right menu
Parâmetros “TAG” do XML

Segue as TAGs para XML-C4G.


<progName> ... </progName>
É a tag que conecta a página rigthmenu ao programa PDL2
< numItems >...</numItems >
É a tag responsável para indicar a quantia do vetor(número de teclas)
rigthmenu
CUSTOMIZAÇÃO: USO DO RIGTHMENU

<arName>...</arName>
É a tag que indicará o nome a ser visualizado na página(rigthmenu)
<arIconName>...</ arIconName >
É a tag responsável por conectar o ícone(que deve estar na mesma
pasta que o XML
E deverá ter o formato(.GIF).
< arEnabled >...</ arEnabled >
Tag que define se a tecla estará habilitada ou não para uso
< arStatus>...</ arStatus >
Essa tag definirá qual sera a cor que aparecerá no interior do status do
botão
Ex.: WIN_BLUE, WIN_RED, WIN_GRAY, WIN_YELLOW,
WIN_BLACK,WIN_GREEN, etc…
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Eventos Softkey Pressure(teclar) e Release(soltar)
Três tags para eventos das teclas:
– Evento (teclar) Softkey (< evPressed >...</ evPressed >)
– Evento (soltar) Softkey (< evReleased >...</ evReleased>)
– Evento (teclar e segurar) Softkey (< evLongPressed>...</
evLongPressed >)

Descrição:
< evPressed >...</ evPressed >
Um evento de teclar pode ser associado a cada softkey(tecla).
Um evento de usuário CONDITION (WHEN EVENT ... ) deve monitorar o
pressionamento da tecla. A classe do evento de usuário deverá ser
definido entre 49152 à 50175.
Essa tag XML deverá conter um desses valores.
Os outros eventos das outras teclas serão automaticamente
Sequenciais ao primeiro valor inserido.
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Por exemplo <evPressed >50100</ evPressed> em um grupo de 6
softkeys, o evento 50100 será gerado ao pressionar a primeira softkey
do grupo, O evento 50105 ser gerado ao pressionar a 6ª tecla.

< evReleased >...</ evReleased>


Um evento sera gerado ao soltar a tecla(softkey).

< evLongPressed>...</ evLongPressed >


Um evento deverá ser gerado ao pressionar a tecla por 2 segundos.

< evShow>...</ evShow >


Essa tag permite o forçamento da aparição do menu em questão.

Deve ser definido assim:


(WHEN EVENT..) quando ocorrer tal evento, faça:
SIGNAL EVENT xxx
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Exemplo de página XML
Este exemplo definirá dois grupos de teclas, o primeiro grupo com 4
teclas e o nome será ‘nomi’, o ícone será ‘icone’, a habilitação será
armazenada em ‘en’ e as cores em ‘colori’.
O programa a ser manuseado será ‘group1’.
O segundo grupo definirá 2 softkeys e os atributos serão guardados
nas mesmas variáveis.
O programa a ser manuseado será ‘group2’.

<?xml version="1.0"?>
<NewMenu>
<group>
<progName>group1</progName>
<numItems>4</numItems>
<arName>nomi</arName>
<arIconName>icone</arIconName>
<arStatus>colori</arStatus>
<arEnabled>en</arEnabled>
CUSTOMIZAÇÃO: USO DO RIGTHMENU
<evPressed>50100</evPressed>
<evLongPressed>50120</evLongPressed>
<evReleased>50130</evReleased>
</group>
<group>
<progName>group2</progName>
<numItems>2</numItems>
<arName>nomi</arName>
<arIconName>icone</arIconName>
<arStatus>colori</arStatus>
<arEnabled>en</arEnabled>
<evPressed>50150</evPressed>
<evLongPressed>50160</evLongPressed>
<evReleased>50170</evReleased>
</group>
</NewMenu>
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Agora o exemplo do programa PDL2 usado.
PROGRAM group1 NOHOLD
VAR
nomi : ARRAY[5] OF STRING[10]
icone: ARRAY[5] OF STRING[10]
en : ARRAY[5] OF BOOLEAN
colori : ARRAY[5] OF INTEGER
BEGIN
CONDITION[1] NODISABLE :
WHEN EVENT 50100 DO
colori[1] := WIN_RED
en[2] := FALSE
WHEN EVENT 50101 DO
colori[2] := WIN_GREEN
en[1] := FALSE
ENDCONDITION
ENABLE CONDITION[1]
CYCLE---
DELAY 1000---
END group1
CUSTOMIZAÇÃO: USO DO RIGTHMENU
Exemplo de configuração right menu
O arquivo XML define um grupo com 5 softkeys. O programa a
manusear é o ‘rightmenu’.
O nome é armazenado em ‘nomi’, os icons em ‘icone’, a habilitação em
‘en’ e as cores em ‘colori’. O evento para “teclar” a primeira tecla é
50120. O evento para “pressionar e segurar” é
A primeira softkey é 50120. O evento para “soltar” a primeira tecla é
50000.
<?xml version="1.0"?>
<RightMenu>
<group>
<progName>rightmenu</progName>
<numItems>5</numItems>
<arName>nomi</arName>
<arIconName>icone</arIconName>
<arStatus>colori</arStatus>
<arEnabled>en</arEnabled>
<evPressed>50100</evPressed>
CUSTOMIZAÇÃO: USO DO RIGTHMENU
<evLongPressed>50120</evLongPressed>
<evReleased>50130</evReleased>
<evShow>50000</evShow>
</group>
</RightMenu>
O programa iniciará com 4 teclas…
PROGRAM rightmenu NOHOLD
VAR
nomi : ARRAY[5] OF STRING[10]
icone : ARRAY[5] OF STRING[10]
en : ARRAY[5] OF BOOLEAN
colori : ARRAY[5] OF INTEGER
BEGIN
-- primeira softkey
nomi[1] := 'S1'
icone[1] := 'i1'
en[1] := TRUE
CUSTOMIZAÇÃO: USO DO RIGTHMENU
colori[1] := WIN_BLUE
-- segunda softkey
nomi[2] := 'S2'
icone[2] := 'i1'
en[2] := TRUE
colori[2] := WIN_RED
nomi[3] := 'S3'
icone[3] := 'i1'
en[3] := TRUE
colori[3] := WIN_YELLOW
nomi[4] := 'S4'
icone[4] := 'i1'
en[4] := TRUE
colori[4] := WIN_GREEN
CUSTOMIZAÇÃO: USO DO RIGTHMENU
CONDITION[1] NODISABLE :
WHEN EVENT 50100 DO
colori[1] := WIN_RED
colori[2] := WIN_GREEN
WHEN EVENT 50101 DO
colori[1] := WIN_PINK
colori[2] := WIN_RED
ENDCONDITION
ENABLE CONDITION[1]
CYCLE
DELAY 1000
icone[2] := 'i2'
DELAY 1000
icone[2] := 'i1'
END rightmenu
VARIÁVEL DE SISTEMA $STARTUP

Esta variável indica ao sistema qual o programa a ser carregado


e ativado após a inicialização do controlador. Esta variável pode
ser definida através de uma declaração PDL2 ou através do do
comando CONFIGURE CONTROLER STARTUP(CCS). Para limpar o
valor desta variável, basta atribuir a ela uma string vazia ou não
especificar o parâmetro de nome de programa para o comando
CCS. Para ativar e salvar as atribuições definidas para esta
variável deve-se realizar o comando CONFIGURE SAVE
SOFTWARE DE COMUNICAÇÃO COM O
CONTROLADOR C4G “WINC4G”
O WINC4G é um software utilizado para realizar a conexão entre um PC
e o controlador Comau C4G, esta conexão deve ser feita com um cabo
Ethernet cruzado como exemplificado abaixo:
CONFIGURAÇÃO NECESSÁRIA DO PC
PARA UTILIZAÇÃO DO WINC4G

Para estabelecer a comunicação entre o PC e o controlador altere as


configurações de endereço IP de seu PC para:

IP address: 172.22.121.1 Obs: Estas configurações são defaut de


Subnet mask: 255.255.0.0 fábrica, caso não consiga estabelecer a
Default Gateway: 0.0.0.0 conexão, verifique o ip atual do controle.
CONECTANDO-SE AO WINC4G

Antes de iniciar a conexão, selecione as propriedades do software


com as quais deseja trabalhar. Propriedades descritas a seguir.
CONECTANDO-SE AO WINC4G

Todas as propriedades do software necessárias estão disponíveis e


configuráveis nesta janela.
CONECTANDO-SE AO WINC4G

Após selecionar as opções, feche o software para que as modificações


sejam atualizadas, reabra-o logo em seguida e selecione a opção
coligar-se no canto esquerdo da tela.
CONECTANDO-SE AO WINC4G
Ao selecionar a opção coligar-se, automaticamente será aberta uma
nova janela para que seja digitado o nome de usuário e login,
forneça estes dados e selecione a opção conectar.
CONECTANDO-SE AO WINC4G

Com a conexão estabelecida será possível acessar todas as partições


disponíveis na CPU SMP+, editar programas on e off-line, e realizar
todas as funcionalidades presentes ao controlador via comando TP-INT
CONECTANDO-SE AO WINC4G

Para ativar o emulador TP-INT, basta estar conectado ao controlador e


clicar no botão de habilitação do aplicativo.
CONECTANDO-SE AO WINC4G

O software possui também uma importante janela de diagnose chamada


causa/remédio, onde é possível digitar um código de alarme e obter a
possível causa e solução para o problema apresentado.
MUITO
OBRIGADO POR
SUA ATENÇÃO!!!