Escolar Documentos
Profissional Documentos
Cultura Documentos
Manual Automatos Programaveis
Manual Automatos Programaveis
Virtualizao de autmatos
programveis
Jorge Augusto Fernandes Ferreira
Lic. em Eng. Electrnica e Telecomunicaes
pela
UNIVERSIDADE DE AVEIRO
Abril 1994
Virtualizao de autmatos
programveis
UNIVERSIDADE DE AVEIRO
Departamento de Electrnica e Telecomunicaes
Abril 1994
Resumo
Os autmatos programveis (vulgarmente denominados PLCs, do ingls
"Programmable Logic Controllers") so bastante usados na indstria. Isto implica que um maior
nmero de pessoas deve obter treino suficiente para desenvolver, manter e melhorar aplicaes
envolvendo PLCs, desde o simples comando de um motor at sofisticados controladores de
processos. Neste trabalho foi desenvolvido um sistema (VPC) para o ensino da programao de
PLCs, sem a necessidade de laboratrios de custo elevado, e para testar programas antes de uslos em condies reais.
A ideia bsica a virtualizao de um PLC. Isto significa que o PLC construdo por
software, por exemplo num computador pessoal, de tal modo que as entradas so introduzidas
pelo teclado ou pelo rato, e as sadas so visualizadas no monitor.
O sistema VPC contm trs blocos principais: o Editor de programao, o PLC virtual e
o Simulador. O Editor suporta a conhecida Linguagem de Contactos (Ladder) e fornece as
ferramentas necessrias para desenvolver programas para PLCs, utilizando uma interface pointand-click baseada em menus e cones. O PLC virtual e o Simulador implementam as operaes
comuns de um PLC real, tais como contactos abertos e fechados, sadas, temporizadores,
contadores e registos de deslocamento. Ligado ao Simulador existe um editor de estmulos para
definir as entradas do PLC virtual.
O PLC virtual pode executar programas em trs modos diferentes: a simulao rpida,
onde os sinais aparecem sob a forma de diagramas temporais no editor de estmulos, o qual
fornece tambm informao temporal; a simulao em tempo real, onde as entradas e as sadas
so visualizadas sobre uma imagem do PLC real, cujo comportamento est a ser emulado,
atravs dos usuais dodos emissores de luz; e a simulao interactiva, tambm uma simulao em
tempo real, onde as entradas so definidas durante o processo de simulao e os resultados so
visualizveis numa janela especfica.
Presentemente, o bloco PLC virtual, do sistema descrito, suporta um autmato
especfico, mas o uso de tcnicas de programao por objectos permite uma fcil modificao, de
modo a poder emular outros PLCs comerciais. O uso destas tcnicas permite tambm a fcil
adio de instrues Ladder mais avanadas. O sistema VPC corre como uma aplicao para o
ambiente Microsoft Windows.
Abstract
Programmable Logic Controllers (PLC) are widely used in industry. This implies that
more and more people must be trained in order to obtain enough knowledge to develop, maintain
and upgrade applications involving PLCs, from simple motor commands to sophisticated process
controllers. This project presents a software system (VPC) to teach PLC programming, without
the need of costly practical class rooms, and to test programs before using them in real
conditions.
The basic idea is the virtualization of the PLC. This means that the PLC is software
constructed, for instance inside a personal computer, in such a way that the inputs are obtained
with the keyboard or the mouse and the outputs are visualized on the screen.
The VPC system has three main blocks: the Editor, the Virtual PLC, and the Simulator.
The Editor, with menus, icons and a point-and-click interface, supports the well known relay
ladder programming language and supplies the tools needed to develop a PLC program. The
Virtual PLC and the Simulator implement the common operations of a real PLC, such as open
and closed contacts, outputs, timers, counters and shift registers. Linked to the Simulator there is
a stimuli editor to input the conditions into the Virtual PLC.
The Virtual PLC can simulate programs in three different modes: the fast simulation,
where the signals appear as a diagram of logic states inside the stimuli editor, which also
provides timing information; the real time simulation, where the inputs and outputs are
impressed over an image of the real PLC, whose behaviour is being simulated, with the usual
light emitting diodes; and the interactive simulation, also a real time simulation, where the inputs
are defined by the user during the simulation process and the results are visualized in a specific
window.
Currently, the virtual PLC block of the described system supports a specific PLC, but
the use of object oriented techniques makes it easy to change the system, in order to provide
support for other commercially available PLCs. The use of these techniques also allows an easy
upgrade in order to integrate more advanced ladder instructions, if desired. The VPC system runs
as a Microsoft Windows application.
Agradecimentos
Ao Prof. Doutor Joo Pedro Estima de Oliveira pela orientao.
Ao Eng. Jos Luis Azevedo pelo apoio constante na definio da interface e do simulador.
Ao Eng. Rui Ribeiro pela discusso de ideias sobre a implementao.
Aos colegas de gabinete pela troca de ideias sobre a interface.
A todos os colegas que trabalham no INESC em Aveiro.
A todos os colegas de Mestrado (1991-93).
Ao INESC pelos meios postos disposio no desenvolvimento deste trabalho.
Universidade de Aveiro pelos meios disponibilizados.
JNICT pela bolsa concedida.
ndice
INTRODUO
1.1.
Enquadramento
1.2.
Objectivos
1.3.
Estrutura da tese
AUTMATOS PROGRAMVEIS
2.1.
2.2.
2.2.1.
CPU
2.2.2.
2.2.3.
Memria
2.2.4.
Variaes na arquitectura
2.3.
2.3.1.
Linguagem ladder
7
8
2.3.1.1.
2.3.1.2.
11
2.3.1.3.
12
2.3.1.4.
Instrues aritmticas
13
2.3.1.5.
13
2.3.2.
O GRAFCET
13
2.3.3.
Linguagens booleanas
14
2.3.4.
Linguagens de mnemnicas
14
2.3.5.
15
2.4.
15
2.4.1.
15
2.4.2.
Configurao da memria
15
FERRAMENTAS UTILIZADAS
3.1.
O Microsoft Windows
3.1.1.
3.2.
18
18
19
21
3.2.1.
Classes
21
3.2.2.
Encapsulamento
21
3.2.3.
Hereditariedade
21
3.2.4.
Polimorfismo
22
3.2.5.
22
3.3.
A linguagem C++
23
3.4.
Windows e C++
26
3.4.1.
Win ++
27
3.4.2.
Arquitectura do Win++
28
3.4.3.
29
31
4.1.
32
4.2.
Interface grfica
36
4.3.
A janela da aplicao
37
Editor de programao
42
42
5.1.1.
42
5.1.2.
Suporte do editor
45
5.1.3.
48
5.1.4.
Armazenamento em disco
52
5.2.
5.1.4.1.
Formato do arquivo
53
5.1.4.2.
53
5.1.4.3.
55
Editor de estmulos
59
5.2.1.
Definio de um estmulo
60
5.2.2.
60
5.3.
64
VIRTUALIZAO DO PLC
66
6.1.
66
6.2.
67
6.3.
68
6.4.
Simulador
70
6.4.1.
71
6.4.2.
O algoritmo de simulao
74
6.4.3.
76
6.4.4.
A funo OwnerSimulation
79
6.5.
Modos de simulao
83
6.5.1.
Simulao rpida
84
6.5.2.
85
6.5.2.1.
88
6.5.2.2.
89
6.5.2.3.
90
6.5.2.4.
92
CONSIDERAES FINAIS
96
7.1.
96
7.2.
98
7.3.
Concluses
100
7.4.
Trabalho futuro
102
REFERNCIAS BIBLIOGRFICAS
103
Captulo 1
Introduo
1.1.
Enquadramento
A ideia da criao dos Autmatos Industriais (PLCs), surgiu na dcada de 60, devido
necessidade de reduzir o custo inerente s frequentes alteraes de sistemas industriais baseados
em rels. O primeiro PLC foi instalado em 1969, e provou ser um valioso instrumento na
automao industrial.
A utilizao deste tipo de equipamento tornou-se, a partir de ento, num contributo
fundamental para a modernizao e para o aumento de produtividade no meio industrial,
principalmente nas indstrias de produo [1]. De facto, cada vez mais empresas recorrem a este
tipo de equipamento para controlar os seus processos de fabrico, que podem ir desde um pequeno
controlo de motores at ao controlo de robs, incluindo sistemas integrados para processos
contnuos. A introduo dos microprocessadores veio permitir o desenvolvimento de PLCs cada
vez mais potentes, e acrescentar o nmero e o desempenho das facilidades fornecidas por estes,
nomeadamente controlo analgico, comando numrico, comunicaes, entre outros.
Pelo factos apontados acima, a necessidade de um maior nmero de programadores
aumentou, bem como a necessidade de mais e melhor formao, devido complexidade crescente
das aplicaes. Assim, a aprendizagem rpida dos conceitos bsicos deste tipo de computadores
industriais torna-se fundamental. Contudo, a criao de laboratrios para este efeito torna-se
onerosa, dado o grande nmero de PLCs envolvidos.
Por outro lado, do conhecimento dos programadores de PLCs, o quo difcil testar um
determinado programa em todas as situaes. A extrapolao dos resultados de entradas
incorrectas devidas a avarias em sensores e/ou interruptores torna-se bastante complexa. Uma
possvel falha no controlo pode levar sistemas estveis a comportarem-se de forma imprevisvel,
com todas as desvantagens da inerentes para a segurana do processo a controlar, e das pessoas
eventualmente envolvidas. A possibilidade de teste de um determinado programa, prevendo um
grande conjunto de situaes, de um modo rpido e sem necessidade de montar o PLC,
obviamente uma vantagem importante, que assegura um desenvolvimento mais seguro e expedito
de aplicaes. De facto, esta possibilidade de teste do programa, para vrios comportamentos das
entradas, pode permitir a deteco de erros de concepo que, de outra forma, s seriam
detectados demasiado tarde, possivelmente quando o PLC j estivesse inserido no sistema a
controlar.
1.2.
Objectivos
Editores
grficos
PLC
Visualizadores
virtual
Sadas
(monitor)
1.3.
Estrutura da tese
Captulo 2
Autmatos programveis
2.1.
controlavam, tornando possvel a troca de dados entre autmatos de modo a rentabilizar e tornar
mais eficiente o controlo de mquinas e processos. O fabrico de mdulos de entradas e sadas com
conversores analgico/digitais permitiram aos autmatos entrar no rea do controlo analgico.
Podemos, hoje em dia, encontrar autmatos nos mais variados sectores industriais. Por
exemplo, na indstria metalrgica, onde a fiabilidade e segurana so factores essenciais, os
autmatos so utilizados desde os problemas de anlise de gs ao controlo de qualidade. Na
indstria mecnica e automvel, um dos sectores industriais que mais utilizam os autmatos, estes
podem ser usados, por exemplo, para controlo de linhas de produo e montagem, controlo de
mquinas e robs [2], [3]. No transporte e empacotamento de materiais os autmatos podem ser
utilizados no controlo de gruas e elevadores mecnicos. A utilizao de autmatos inclui tambm
as indstrias qumicas e petroqumicas, agricultura e indstrias de alimentos, indstria textil,
indstria do vidro e plstico, entre muitas outras.
2.2.
Consola de
programao
Processo
Circuitos
de entrada
Dispositivos de
sada do processo
Circuitos
de sada
Dispositivos de
entrada do processo
Unidade
CPU
Memria
Fonte de alimentao
2.2.1.
CPU
2.2.2.
2.2.3.
Memria
2.2.4.
Variaes na arquitectura
2.3.
2.3.1.
Linguagem ladder
Fim de
continuidade
Incio de
continuidade
Stop
Motor
Motor
Quando o boto de Start premido, e o boto de Stop no est activo, existe continuidade
lgica, o motor arranca e o rel Motor accionado. Mesmo que o boto de Start seja agora
levantado, a continuidade lgica assegurada pelo contacto Motor.
Para parar o motor basta premir o boto de Stop, quebrando a continuidade lgica, e
neste caso tambm o rel Motor deixa de estar accionado. Mesmo que o boto de Stop seja agora
levantado, continua a no haver continuidade lgica pois quer o Start quer o Motor esto abertos.
Sada latched
Esta sada colocada a ON quando existir pelo menos um caminho com continuidade
lgica. No entanto, esta continuar ON mesmo que deixe de existir continuidade lgica. A sada
s ser colocada inactiva quando for executada uma instruo de unlatched para o mesmo
endereo.
10
Sada unlatched
programada para colocar OFF uma determinada sada latched. a nica forma de
colocar OFF uma sada latched.
Com estas duas instrues o exemplo do motor apresentado anteriormente poderia ser
realizado pelos dois degraus apresentados a seguir:
Start
Motor
L
Stop
Motor
U
tempo pretendido
11
Condio
de entrada
Sada do
temporizador
tempo pretendido
Estes dois tipos de temporizadores so os mais utilizados pela maioria dos fabricantes de
autmatos para as suas implementaes da linguagem ladder.
Contador ascendente
CTU
A instruo de CTU incrementa de uma unidade o seu valor acumulado de cada vez que
ocorre um evento de contagem. Ao contrrio das instrues de temporizao, o contador, na
maioria das implementaes, continua a contar eventos mesmo aps o seu valor de contagem ser
atingido.
Contador descendente CTD
O princpio de funcionamento idntico ao contador ascendente, s que o processo de
contagem descendente desde o valor pr-programado at zero.
Tambm normal haver outras implementaes de contadores nomeadamente o contador
ascendente/descendente, bem como a introduo de uma entrada para inicializao (reset) em
cada um dos contadores atrs citados. Quando a entrada de reset est inactiva o contador tem um
comportamento normal, e uma activao da entrada de reset inibe imediatamente a contagem e
inicializa o contador com o seu valor pr-programado.
12
2.3.2.
O GRAFCET
13
Tarefa n-1
Etapa n-1
T n-1
Tarefa n
Etapa n
Tn
Tarefa n+1
Etapa n+1
Cada etapa, definida como uma situao num sistema de controlo onde as entradas e/ou
sadas no variam, tem associada uma aco ou tarefa (conjunto de aces) especfica, que s
executada quando a etapa correspondente se encontra activa.
A operao sequencial do processo resulta da progresso entre etapas. Contudo a
passagem de uma etapa para outra condicionada pela condio de transio.
Para que exista uma transio de uma etapa para outra necessrio que a etapa anterior
esteja activa e a condio de transio entre as duas etapas seja verdadeira. Por exemplo (figura
4), para que a etapa n fique activa necessrio que a etapa n-1 esteja activa e a condio de
transio T n-1 seja verdadeira. A transio completa-se com a inactividade da etapa n-1.
Esta linguagem no substitui as outras linguagens, e deve ser vista como uma ferramenta
de estruturao de programas. A sua utilizao tem vantagens sempre que o problema a resolver
sequencial e dependente do tempo [6].
2.3.3.
Linguagens booleanas
2.3.4.
Linguagens de mnemnicas
14
2.3.5.
2.4.
2.4.1.
2.4.2.
Configurao da memria
Para facilitar a gesto de dados existem diversas reas de memria (memria para dados),
cuja utilizao depende do tipo de instrues a executar. Estas diferentes reas de memria
permitem separar os vrios tipos de dados existentes num programa. Outra rea de memria
disponvel a reservada para programas (memria de programa). A tabela seguinte apresenta
alguns detalhes das vrias reas de memria existentes para o C20H.
15
rea de memria
Internal Relay
Designao
IR
Gama de variao
Palavras: 000 --- 246
Bits:
00000 --- 24615
Special Relay
SR
Auxiliary Relay
AR
Palavras: 00 --- 27
Bits:
0000 --- 2715
Data Memory
DM
Holding Relay
HR
Timer/Counter
TC
Link Relay
LR
Temporary Relay
TR
Palavras: 00 --- 63
Bits:
0000 --- 6315
Bits
00 --- 07
Program Memory
UM
Depende da Unidade de
Memria usada.
Funo
Usada para controlar entradas ou
sadas, contadores, temporizadores,
e para armazenar dados.
Contm os relgios do sistema,
flags, bits de controlo, e informao
de estado.
Contm flags e bits para funes
especiais. Guarda o estado durante
falha de energia.
Usada para armazenamento e
manipulao de dados internos.
Usada para armazenar dados e para
guardar valores de dados quando o
PLC desligado.
Usada para definir temporizadores e
contadores, e para aceder s flags
PV e SV.
Disponveis para uso como bits de
trabalho.
Usado para armazenar e ler
condies de execuo.
Contm o programa a ser executado
pelo CPU.
16
A maior parte desta rea de memria dedicada a usos especficos como, por exemplo,
flags, bits de controlo, no podendo ser usada para outros fins. Esta rea mantm o contedo
durante interrupes de energia ou quando o autmato entra no modo de programao.
rea de memria Data Memory
Esta rea s pode ser acedida por palavra e no por bit. utilizada para a escrita ou
leitura de dados, particularmente em instrues de tranferncia de dados. Outra parte desta
memria usada para guardar parmetros do sistema.
rea de memria Holding Relay
usada para armazenar ou manipular vrios tipos de dados e pode ser endereada quer
por bit, quer por palavra. Esta rea mantm o seu contedo quando o modo de operao do
autmato muda, ou quando a alimentao interrompida.
rea de memria Timer/Counter
utilizada para a criao de contadores ou temporizadores e contm os bits de sada, os
valores iniciais e os valores actuais de todos os temporizadores e contadores.
rea de memria Link Relay
Esta rea utilizada como uma rea de dados comum, para autmatos desta famlia que
permitem ligaes entre si.
rea de memria Temporary Relay
Tem capacidade para oito bits e usada para permitir certos tipos de ramificaes na
programao em linguagem ladder.
rea de memria Program Memory
usada para armazenar o programa a executar no autmato.
17
Captulo 3
Ferramentas utilizadas
A interface grfica construda para este trabalho baseada na interface grfica fornecida
pelo Microsoft Windows. Neste captulo vo ser apresentadas as razes da escolha desse ambiente
como interface entre o PLC virtual e o utilizador, bem como as razes que determinaram a
utilizao duma livraria de classes em C++ (Win++) para a comunicao da aplicao com o
Microsoft Windows. Para um melhor entendimento da implementao da interface grfica so
tambm analisadas algumas das particularidades do Microsoft Windows, da linguagem C++ e das
classes do Win++. Sero ainda abordados alguns aspectos sobre o desenvolvimento de aplicaes
para o Windows, com base na biblioteca de classes do Win++.
3.1.
O Microsoft Windows
18
3.1.1.
O objecto grfico mais importante a janela, j que qualquer programa que possibilite
interaco com o utilizador ter que ter uma janela, pois esta permite receber mensagens do rato e
do teclado e permite uma sada grfica.
Janelas
Do ponto de vista do utilizador, uma janela permite a visualizao de dados, mas tambm
pode identificar uma aplicao. Quando o utilizador inicia uma aplicao, aguarda que surja uma
janela, e o fecho da janela termina a aplicao. Para decidir qual a aplicao a usar o utilizador
selecciona a janela correspondente.
Do ponto de vista do programador, uma janela serve para organizar objectos grficos de
interaco e para dirigir o fluxo de mensagens do sistema. As entradas so enviadas para a janela
que, por sua vez, as envia para a aplicao. As aplicaes podem subdividir-se em vrias janelas,
que so criadas obedecendo ao template fornecido pelo Windows.
cones
Um cone um smbolo que funciona como um memorando para o utilizador. As GUI
so construdas considerando que o concreto e visvel de mais fcil compreenso do que o que
abstracto e invisvel. Desta forma o Windows permite aos utilizadores no memorizar informao,
j que com cones possvel representar, de uma forma grfica, comandos, programas ou dados.
Menus
Um menu uma lista de comandos e de opes de um programa. O Windows define
vrios tipos de menus, sendo os mais utilizados os menus de sistema, menus em barras, os menus
tipo pop-up e os menus encadeados.
Barras de deslocamento (Scroll bars)
Quando um scroll bar realado, o utilizador sabe que a rea real da janela maior do
que a rea visvel, e ento os scroll bars podero ser usados para visualizar todos os objectos
contidos na janela.
Cursores
O cursor um bitmap que desliza no ecr em resposta a um movimento do rato ou de
outro dispositivo apontador. A aparncia do cursor pode ser modificada de modo a poder sinalizar
o estado ou uma mudana no programa.
Carets
Tambm um bitmap e serve como um ponteiro para a entrada pelo teclado. A janela
que tem o controlo do teclado (janela que tem o focus) pode criar um caret para notificar o
utilizador desse facto. A interface do Windows apenas suporta um caret de cada vez, devendo as
20
aplicaes que necessitem do caret criar um quando tm o focus de entrada, devendo destru-lo
quando perdem o focus.
Caixas de dilogo
Estes fornecem uma forma standard para entrada de dados. Uma caixa de dilogo uma
janela que suporta outras janelas que, ou fazem o display de informao, ou permitem a entrada de
dados pelo utilizador. Estas pequenas janelas designam-se por controlos de uma caixa de dilogo.
3.2.
O presente trabalho utiliza tcnicas de programao por objectos, pelo que se segue uma
pequena introduo aos conceitos inerentes utilizao destas tcnicas.
A programao orientada por objectos pode considerar-se, de uma forma simplista, uma
tcnica de programao que engloba quatro conceitos distintos: classes, encapsulamento,
hereditariedade e polimorfismo [11], [12], [13] e [14].
3.2.1.
Classes
Uma classe pode ser considerada uma abstraco dos dados referentes a uma entidade,
que pode ser real ou no. Uma classe definida por um conjunto de dados (campos) e por um
conjunto de mtodos (procedimentos), que pertencem unicamente classe e que caracterizam a
entidade que est a ser representada.
3.2.2.
Encapsulamento
Os dados da classe podem ser privados, fechando, desta forma, a classe para o exterior.
Contudo o acesso a esses dados pode ser permitido atravs de mtodos da prpria classe. Esses
mtodos fazem parte da interface da classe com o exterior. A esta caracterstica chama-se
encapsulamento ou dados escondidos (data hiding), porque o acesso a esses dados restrito a uma
lista de mtodos declarados e definidos explicitamente pelo programador. O estado de um objecto
est contido nas suas variveis privadas, visveis somente pelos mtodos do prprio objecto. O
encapsulamento reduz a ocorrncia de erros, permitindo o acesso a dados exclusivamente atravs
de mtodos pr-definidos.
3.2.3.
Hereditariedade
O conceito de herana o que mais distingue a programao orientada por objectos das
outras filosofias de programao. As classes, uma vez definidas, podem ser usados para construir
hierarquias de classes. Nestas hierarquias, as classes podem herdar caractersticas de outras
21
3.2.4.
Polimorfismo
3.2.5.
3.3.
A linguagem C++
O C++ [15], [16], como muitas outras linguagens, surgiu como uma ferramenta para
resolver um problema especfico. Bjarne Stroustrup, um investigador da Bell Labs, necessitou de
escrever alguns programas de simulao. A linguagem Simula 67, a primeira linguagem orientada
para objectos seria a linguagem ideal para a escrita do cdigo para esses programas se no fosse a
sua baixa velocidade de execuo. Stroustrup decidiu ento escrever uma nova verso de C, qual
chamou "C com classes". Passados alguns anos essa linguagem desenvolveu-se
consideravelmente e o nome foi modificado para C++. O termo "++" sugere que a linguagem C++
um pouco mais que o C, oferecendo melhoramentos atravs do suporte de dados abstractos e
programao orientada por objectos.
Desde a sua primeira implementao que a linguagem C++ tem sido cada vez mais
utilizada, existindo hoje em dia implementaes para as mais variadas mquinas. Esta linguagem
tem vindo a ser aplicada em muitas reas da programao, nomeadamente na construo de
interfaces com o utilizador e no desenvolvimento de algoritmos genricos para simulao.
No nosso objectivo descrever a linguagem C++, mas sim rever sucintamente alguns
conceitos e mecanismos que o C++ utiliza para a implementao da filosofia de programao por
objectos. Essa apresentao baseia-se num exemplo, para a hierarquia de classes seguinte.
Figura
Segmento_Recta
Figura_Fechada
Poligono
Triangulo
Elipse
Rectangulo
Como sabemos, muitos conceitos podem ser relacionados com outros conceitos das mais
variadas formas. Por exemplo, os conceitos de avio e de carro relacionam-se com os conceitos de
veculos e transportes; conceitos de mamfero e pssaro fazem parte de um conceito mais geral de
23
Para cada figura v[i], a funo rotacao(), prpria para o tipo actual do objecto,
chamada. O tipo actual do objecto v[i] no conhecido na altura da compilao do programa.
Atravs do mecanismo de herana, as classes descendentes de Figura vo herdar os dados
correspondentes ao centro e cor da figura, no existindo assim a necessidade de definir dados
para o centro e a cor sempre que se cria uma classe para representar uma nova figura. Tambm a
24
25
}
ponto inicio_seg(){return centro_figura();}
ponto fim_seg(){return fim;}
void desenho();
void rotacao(int angulo);
}
3.4.
Windows e C++
26
funo predefinida do Windows, DetWndProc, que contm o cdigo, por defeito, para processar
qualquer mensagem recebida.
A ideia natural conducente criao de uma classe base em C++, para encapsular este
comportamento da classe janela, definir uma funo membro correspondente a cada mensagem
que a classe deve entender. Assim, uma classe derivada s necessitar de redefinir as funes
correspondentes s mensagens que requerem um processamento especial. Contudo, esta ideia no
realizvel, mais uma vez por factores prticos, pois o Windows define uma grande quantidade
de mensagens possveis, donde seria tambm necessrio uma grande quantidade de funes
distintas na classe base, que facilmente excederia a capacidade do compilador de C++.
Outra possibilidade consiste em reproduzir o comportamento do Windows, isto , derivar
classes em C++ que possam anular a funo DispatchMessage do Windows. As mensagens
seriam ento recebidas inalteradas, da mesma forma que so recebidas numa aplicao em C,
devendo o programador saber quais as mensagens a processar e quais as que no deveria
processar, necessitando, portanto, de familiarizar-se com o significado dos parmetros associados
com as mensagens a serem processadas.
Uma ideia alternativa corresponde a uma soluo de compromisso entre as duas
hipteses apresentadas acima. Esta ideia envolve a definio de funes virtuais, associadas com
as mensagens mais comuns, e a permisso de aceder a mensagens subjacentes.
As implementaes deste ltimo tipo necessitam de algum processamento prvio
chamada da funo associada com a mensagem, pois necessrio seleccionar a funo associada
mensagem; por exemplo, mensagem de escolha de um item de um menu est associada uma
funo que invocada sempre que um menu escolhido. No entanto, estas implementaes
escondem alguma complexidade do Windows tornando as mensagens mais abstractas (invocao
de uma funo especfica do evento de escolha de um item de um menu) e, portanto, de mais fcil
compreenso. Outra vantagem destas implementaes que escondem detalhes do trfego das
mensagens adjacentes (neste caso uma mensagem adjacente seria, por exemplo, o identificador do
item escolhido no menu).
3.4.1.
Win ++
27
o Win++ como base; outros detalhes sero apresentados ao longo da descrio do software
desenvolvido.
O objectivo do Win++ fornecer uma classe para quase todas as entidades que o
Windows trata como objectos, especialmente as entidades a que se tem acesso com um handle.
Por exemplo, para o display de janelas existe uma classe base e uma srie de classes derivadas
para as formas de janelas mais comuns. Ento, em vez de usar handles e invocar as funes do
Windows, cria-se uma instncia de uma classe, ou de uma classe derivada adaptada para o efeito,
e chama-se a funo membro fornecida pela classe do Win++. Para os restantes casos, e quando
tal necessrio, o Win++ permite chamar directamente funes do Windows. Verifica-se,
portanto, que o Win++ usa a terceira ideia expressa atrs.
3.4.2.
Arquitectura do Win++
28
BCSaveAsDialog
BCStringDialog
BCMessageDialog
BCOpenDialog
BCFindDialog
BCReplaceDialog
BCNewDialog
BCFileDialog
BCAboutDialog
BCModalDialog
BCDialog
BCPopUpWindow
BCModelessDialog
BCGroupBox
BCCheckBox
BCDisplayDevice
BCTimerDevice
BCApplication
BCErrorBox
BCDevice
BCClipBoard
BCModule
BCMsgBox
BCWindow
BCMainWindow
BCTextEdit
BCChildWindow
BCText
BCMemoryData
BCBitmap
BCTextData
BCFileData
BCDependentData
BCCursor
BCColor
BCRenderableData
BCBrush
BCResID
BCCaret
BCPen
BCRectangle
BCEvent
BCAccelTable
BCLimits
BCObject
BCMenu
BCSize
BCSystemMenu
BCFont
BCPosition
BCPushButton
BCRadioButton
BCControlWindow
BCButtonControl
BCStaticText
BCStaticControl
BCStaticIcon
BCSizeBox
BCHorizScrollBar
BVertScrollBar
BCScrollBar
BCFileListBox
BCListBox
BCStringEdit
BCEditControl
BCMultiStringEdit
BCComboBox
BCIcon
BCDispObject
O Windows um sistema gerido por eventos, e passa os eventos para as aplicaes sob a
forma de mensagens notificadas. O Win++ define funes virtuais nas classes representativas dos
objectos que recebem as mensagens, e chama-as internamente sempre que certos tipos de
mensagens ocorrem. A estas funes de suporte de eventos, o Win++ passa um ponteiro para um
objecto do tipo BCEvent, que contm mais informao acerca do evento. Este objecto, do tipo
BCEvent, contm toda a informao passada pelo Windows para a mensagem e, em alguns casos,
tambm inclui ponteiros para objectos relacionados com a mensagem (por exemplo botes ou
menus).
O Win++ no tem funes individuais de suporte a todos os eventos possveis; para
obviar a esta limitao, fornece, na classe representativa da janela, duas funes (UserEvt e
OtherEvent) para processar, entre outros, os eventos definidos pelo utilizador.
29
3.4.3.
30
Captulo 4
A interface do PLC virtual
Depois desta fase introdutria passar-se- apresentao da interface grfica bem como
de alguns detalhes da sua implementao que so essenciais para a compreenso dos mecanismos
que o Windows juntamente com o Win++ oferecem de modo a facilitar o desenvolvimento de
interfaces grficas.
O modelo do PLC virtual, que vai ser analisado posteriormente, pode esquematizar-se
atravs da figura 6. Como se pode verificar, o PLC virtual comunica com o utilizador
essencialmente custa de editores, nomeadamente o editor de programao e o editor de
estmulos. Em execuo, o simulador l as entradas do PLC virtual atravs do editor de estmulos,
ou do editor interactivo, simula o programa presente no editor de programao, e permite
visualisar os resultados da simulao atravs do editor de estmulos, ou do editor interactivo, ou
ainda atravs duma janela do PLC real.
Devido forte componente interactiva presente no PLC virtual, a construo desses
editores que exteriorizam o PLC virtual deve torna-los amigveis e de rpida aprendizagem, e
fornecer uma interface point-and-click composta por menus e cones de modo a facilitar a
interaco com o PLC virtual.
PLC virtual
Editor de
programao
-Editor de estmulos
-Editor interactivo
Utilizador
Simulador
orientado
para
objectos
Memria
alocada no PC
-Editor de estmulos
-Editor interactivo
-Janela do PLC real
Monitor
Uma melhor concretizao do que se expor nos prximos captulos pressupe uma
leitura prvia do Manual de Utilizao da aplicao PLC virtual, que se encontra em apndice.
31
4.1.
.cpp
ficheiro
do cdigo
fonte
Compilador
C++
.res
ficheiro
recursos
ficheiro de
recursos
compilado
Compilador
C++
Compilador
de recursos
.obj
ficheiro
objecto
.obj
.cpp
ficheiro
do cdigo
fonte
.rc
Compilador
de recursos
.exe
ficheiro
executvel
.obj
Linker
ficheiro
objecto
ligado
ficheiro
objecto
32
Bitmaps
A classe de suporte a recursos do tipo bitmap a classe BCBitmap. Esta permite criar os
objectos que suportam os bitmaps definidos no ficheiro de recursos, como se pode ver no cdigo
para a criao do bitmap usado para representar a opo Contacto Aberto, e cujo o ID
IDR_BMP_OPEN_CONTACT (Apndice A, ponto A.3.3).
Cursores
Para a implementao de cursores o Win++ fornece a classe BCCursor, que suporta os
cursores definidos no ficheiro de recursos. Como j referimos possvel definir a aparncia dos
cursores, sob a forma de bitmaps, utilizando o Workshop.
Para a criar e inserir um objecto do tipo Cursor numa janela apresentado o exemplo
seguinte, que cria o cursor identificado por IDR_EDITOR_PROG_INACTIVE_CURSOR (que
representa o cursor para sinalizar a opo Inactiva), e instala-o na janela atravs da funo
membro da janela, SetCursor.
inactiveCur = new BCCursor(BCResID(IDR_EDITOR_PROG_INACTIVE_CURSOR));
if (inactiveCur)
SetCursor(inactiveCur);
Menus
No ficheiro de recursos so tambm definidos os menus para as vrias janelas do PLC
virtual. A classe tipo para a criao dos menus a classe BCMenu que, alm de permitir a criao
de menus, tambm permite inserir ou modificar items ou sub-menus, incluindo os menus baseados
em bitmaps. A listagem seguinte exemplifica a criao, a insero e a instalao de um item (tipo
bitmap) no menu da janela de aplicao, definido no ficheiro de recursos sob o ID de
IDR_MAIN_MENU.
// Cria o objecto menu, com os items definidos no ficheiro de recurso sob o identificador IDR_MAIN_MENU
opMenu = new BCMenu(BCResID(IDR_MAIN_MENU));
// Cria um objecto do tipo BCBitmap, com o bitmap cujo ID IDR_BMP_OPEN_CONTACT
inputOpenBitmap = new BCBitmap(BCResID(IDR_BMP_OPEN_CONTACT));
if(inputOpenBitmap) // insere o item IDM_INPUT_OPEN na posio POS_INI_MENU+1
opMenu->Insert(IDM_INPUT_OPEN, inputOpenBitmap, POS_INI_MENU+1);
...
SetMenu(opMenu);
// instala o menu na janela
Caixas de dilogo
As classes base para a criao de caixas de dilogo so BCModalDialog e
BCModelessDialog. O template para a caixa de dilogo definido no ficheiro de recursos, sendo a
caixa de dilogo criada com a chamada ao seu construtor, o qual deve invocar a funo para
33
O mtodo a seguir para qualquer outra caixa de dilogo o mesmo, podendo variar no
tipo e quantidade de controlos inseridos na caixa de dilogo, e podendo ainda haver a necessidade
de redefinio de outras funes virtuais a partir das classes antecessoras de BCModalDialog
(BCDialog ou BCWindow), por forma a atender outro tipo de eventos.
35
4.2.
Interface grfica
Alm dos objectivos especficos da interface do PLC virtual com o utilizador, foi
tambm definido como objectivo que ela fosse grfica e que permitisse uma aprendizagem
simples e rpida, tal como acontece em interfaces grficas de aplicaes comerciais.
Para atingir esses objectivos especificaram-se partida algumas caractersticas da
interface, bem como os mtodos a utilizar para atingir esses fins:
a utilizao da interface do Microsoft Windows, com a consequente utilizao das
entidades grficas fornecidas por este, nomeadamente janelas, menus, cones e caixas de dilogo;
desenvolvimento de um editor de programao assente num editor essencialmente
grfico, em que os smbolos a inserir no editor so, na realidade, objectos de classes pr-definidas;
desenvolvimento de um ambiente simulao adequado para cada modo de simulao
implementado (simulao rpida, simulao interactiva e simulao em tempo real);
contruir esses ambientes de modo a que seleces, instrues e operaes sejam
executadas com (e a partir de) menus, cones e utilizao do rato e/ou teclado.
A interface do PLC virtual com o utilizador pode resumir-se a quatro janelas principais
(figura 8) que representam a base para a interface grfica.
Como j foi referido a interface grfica constituda, essencialmente, pelos vrios
editores pertencentes ao modelo do PLC virtual. As classes que suportam as janelas dos vrios so
derivadas de classes do Win++ e, como tal, a comunicao entre o Windows e os editores (que
so objectos instanciados dessas classes) feita custa das classes do Win++. Alm dos vrios
editores, existe tambm a janela de aplicao que fornece alguns mecanismos de comunicao
entre os editores.
Microsoft
Windows
Eventos
Mensagens
Eventos
Mensagens
Classes do
Win++
Eventos
Mensagens
Eventos
Mensagens
Janela
Interactiva
Eventos
Mensagens
Editor de
Estmulos
Janela da
Aplicao
Eventos
Mensagens
Editor de
Programao
A figura 8 mostra a interaco, quando em execuo, das vrias janelas do sistema PLC
virtual com o Windows. Como se pode verificar, o Win++ serve de ligao entre o Windows e o
cdigo em C++ da aplicao.
36
37
38
Como se pode verificar, so criadas instncias das classes representativas dos vrios
objectos usados na aplicao, nomeadamente a janela de suporte ao editor de programao
(opProgramEditor), a janela de suporte simulao (opSimulWindow) e o objecto do PLC virtual
(opC20Omron).
A comunicao entre a janela de aplicao e o utilizador garantida custa de menus (as
opes so menus em forma de bitmaps). O Win++ define duas funes de atendimento a eventos
gerados pela escolha ou seleco de menus, e que so MenuCommand e MenuSelect,
respectivamente. Este ltimo pode ser usado para enviar mensagens para o utilizador sobre o item
do menu seleccionado, como se pode ver no cdigo seguinte, o qual envia para a janela de
informaes a mensagem "Permite inserir um smbolo do tipo Sada Normalmente Aberta"
(Apndice A, ponto A.3.4).
VOID SimulatorC20Window::MenuSelect(BCEvent *opEvt)
{
switch (opEvt->GetMenuID()) { // descobre o item do menu seleccionado
...
case IDM_INPUT_OPEN: // informa na janela de informaes sobre o item do menu
opStatusWin->Commentary("Permite inserir um smbolo do tipo Sada Normalmente Aberta");
break;
}
}
Atravs do objecto do tipo BCEvent, passado internamente pelo Win++ para a funo
virtual MenuSelect, possvel obter informao da mensagem enviada pelo Windows,
39
Verifica-se que, para cada item do menu, existe uma ou mais aces tendo em vista
fornecer a funcionalidade desejada atravs dos menus fornecidos. Existem aces que actuam
sobre a prpria janela de aplicao (IDM_INPUT_OPEN - escolha da opo Contacto
Normalmente Aberto) e aces que invocam funes de outros objectos, nomeadamente
IDM_COPY e IDM_OPEN. A escolha do menu IDM_COPY permite copiar para o clipboard as
linhas de programa seleccionadas na janela do editor de programao.
Em seguida apresentam-se outros mtodos de resposta a eventos para a janela de
aplicao, nomeadamente: eventos de Paint, que ocorrem quando o Windows necessita de fazer o
upgrade grfico da janela (por exemplo, em consequncia de sobreposio de janelas); eventos de
ReSize quando feito o redimensionamento da janela; evento de Activation da janela, que ocorre
quando a janela fica activa ou inactiva.
VOID SimulC20Window :: Paint(BCEvent *opEvt)
{
BCBrush oBrush(BC_LIGHT_BRUSH);
// cria um objecto do tipo pincel
BCBrush *opOldBrush = SetBrush(&oBrush); // instala o novo pincel na janela
PutRect(GetUserRect(),BC_FILL_IT);
// desenha um rectngulo na janela
SetBrush(opOldBrush);
// instala o pincel anterior
}
40
Todo o cdigo (objectos e funes membro) utilizado na funo Paint fornecido pelo
Win++. Nesta funo criado um objecto do tipo BCBrush (para representar um pincel), que
instalado na janela de aplicao. Em seguida, desenhado um rectngulo a cheio, cujas dimenses
correspondem s dimenses da rea de utilizador da janela de aplicao.
A funo Activation invocada internamente quando a janela activada (ou
desactivada), por exemplo atravs do click do rato sobre a janela. Como a janela do editor de
programao se encontra sobre a janela de aplicao deve-se, ento, detectar uma activao da
janela de aplicao de modo a dar o focus de entrada janela do editor de programao.
VOID SimulC20Window :: Activation(BCEvent *opEvt)
{
if (opEvt->IsActivated())
// verifica se a janela foi activada e no desactivada
opProgramEditor->SetFocus();
// d o focus janela do editor de programao
}
A funo ReSize invocada sempre que h variao no tamanho da janela (de aplicao).
As janelas do editor de programao e de informaes dependem das dimenses da janela de
aplicao e, por este motivo, devem ser redimensionadas sempre que h variaes na janela de
aplicao.
VOID SimulC20Window::ReSize(BCEvent *opEvt)
{
// redimensiona a janela do editor de programao
opProgramEditor->SetWindowRect(BCRectangle(BCPosition(EDIT_WINDOW_X,EDIT_WINDOW_Y),
GetUserRect().LowerRight()-BCPosition(0,STATUS_WINDOW_DY+2)));
// redimensiona a janela de informaes
opStatusWin->SetWindowRect(BCRectangle(GetUserRect().LowerLeft(),
BCPosition(STATUS_WINDOW_X,STATUS_WINDOW_DY), GetUserRect().LowerRight()));
}
41
Captulo 5
Editores grficos do PLC virtual
5.1.
Editor de programao
Como j foi referido, o editor de programao deve permitir de uma forma simples e
intuitiva a escrita de programas em linguagem ladder.
A janela do editor de programao (Apndice A, ponto A.3.1) est contida na janela de
aplicao, sendo a sua classe representativa derivada da classe BCChildWindow (classe base para
todas as janelas filhas, incluindo as janelas para representar controlos). A janela do editor contm
a grelha de suporte ao programa e, como tal, tem a responsabilidade de gerir todas as aces que o
utilizador efectuar sobre a grelha.
5.1.1.
BaseShape
Output
OpenOutput
ClosedOutput
Input
Module
OpenContact
Counter
TimerOn
LineH
ShiftRegister
ClosedContact
CounterDown
CounterUpDown
42
Posta esta definio da classe BaseShape, por exemplo para definir uma classe para
representar smbolos do tipo Sada Normalmente Aberta basta criar um novo bitmap para a
representao grfica, e escrever o cdigo correspondente a duas funes virtuais, ao construtor e
destrutor da classe; todas as outras caractersticas so herdadas da classe BaseShape.
43
Como se depreende da definio das classes, as caractersticas dos smbolos podem ser
divididas em dois grupos: a parte grfica (que o utilizador manipula) e a parte funcional (que gere
a funcionalidade do smbolo no diagrama ladder).
Neste captulo, que versa os Editores Grficos, no sero analisadas as caractersticas
funcionais, mas somente as grficas, pois so estas as manipuladas directamente pelo editor de
programao.
Desenho dos smbolos
A aparncia grfica de cada smbolo forosamente diferente da de outros, sendo o
aspecto grfico de um smbolo garantido por um bitmap definido para o efeito. Isto permite que o
aspecto de um smbolo seja facilmente alterado sem haver a necessidade de modificar o cdigo.
Como objectos do mesmo tipo tm a mesma aparncia, no faz sentido haver um bitmap para cada
44
objecto, pelo que se define como static o objecto do tipo BCBitmap em classes terminais (classes
que se podem instanciar dando origem a objectos ladder). Tal procedimento possibilita que o
mesmo bitmap seja visto por todas as instncias dessa classe.
Posto isto, a funo Draw limita-se a colocar o bitmap na posio respectiva da grelha e,
em seguida, escrever os parmetros visveis do objecto sobre o bitmap. Para isso, usam-se as
funes membro de ProgramEditor, que foram herdadas de BCDisplayDevice, para a colocao
de bitmaps e escrita de strings na janela.
A seguir mostra-se o cdigo da funo Draw para a classe BaseShape que, por
mecanismos de herana, serve os objectos do tipo entradas e sadas. De assinalar que o bitmap do
smbolo devolvido pela funo virtual GetShapeBitmap, pelo que a funo BaseShape::Draw
pode servir vrios objectos grficos, j que GetShapeBitmap vai devolver o bitmap
correspondente ao smbolo que est a ser desenhado.
VOID BaseShape :: Draw(void)
{
if ( CanDraw() ){
// verifica se o objecto est na parte visvel da janela
// clculo da posio inicial em pixeis
BCPosition oPos( XYLocation.X() * CELL_WIDTH, XYLocation.Y() * CELL_HEIGHT);
// colocao do bitmap na janela
opProgramEditor->PutBitmap( oPos, BCSize(CELL_WIDTH, CELL_HEIGHT), GetShapeBitmap());
// escrita da etiqueta sobre o objecto
opProgramEditor->PosStr(oPos+BCPosition(CELL_WIDTH/2, 2), ShapeLabel[0]);
}
}
5.1.2.
Suporte do editor
Incio de
continuidade
Nodos
Clula
45
Fim de
Continuidad
A forma mais expedita de construir o suporte para o editor criar uma classe que
caracterize por completo a grelha. Essa classe a classe MatrixCircuit que derivada da classe
BCFileData do Win++. Esta classe (BCFileData) associa um objecto que contm dados com um
ficheiro, fornecendo funes membro para as operaes usuais com ficheiros, nomeadamente
operaes de New, Open, Save, SaveAs e Close. A classe MatrixCircuit define os dados e as
funes membro para todo o tipo de operaes necessrias para suporte, em memria, de
programas em linguagem ladder.
class MatrixCircuit:public BCFileData
{
PointOfGrid ***m;
// ponteiro para a matriz bidimensional de ponteiros
WORD MatrixDx , MatrixDy;
// dimenses da matriz
ProgramEditor *opProgramEditor;
// ponteiro para a janela do editor de programao
...
public:
MatrixCircuit( ProgramEditor *Win, WORD Dx, WORD Dy, MatrixCircuit *Circ = NULL);
// apaga todos os objectos no rectngulo iniciado na clula initPos e terminado na clula endPos
BOOL ClearCircuit(BCPosition initPos, BCPosition endPos);
BOOL InsertLadderObject(BCPosition oPos, BaseShape *Shape); // insere um objecto na posio oPos da matriz
BOOL InsertLineV(BCPosition Pos);
// insere uma linha vertical na posio oPos
BOOL Delete(BCPosition oPos);
// apaga o elemento da posio oPos
BYTE CanInsert(BCPosition oPos, BaseShape *Base);
// verifica se pode inserir um dado elemento
BYTE CanDelete(BCPosition oPos);
// verifica se pode apagar um dado elemento
BOOL Replace(VOID);
// substitui um objecto j existente numa dada posio
// funes virtuais redefinidas
// invocada internamente quando necessrio apagar todo o programa, por exemplo numa operao de Load
BOOL Clear(BOOL blDelete = TRUE);
BOOL Load(BCFile *opFile);
// redefinida para carregar um programa para a memria
BOOL Save(BCFile *opFile);
// redefinida para gravar um programa para disco
// para criar objectos a partir do ficheiro do arquivo
BOOL CreateElement(BCPosition oPos, symbol obj, char *lab[], WORD val=0);
VOID Draw(VOID);
// desenha todos os objectos da grelha
// copia os objectos entre as posies pIni a pEnd para o clipboard
BOOL Copy(BCPosition pIni, BCPosition pEnd);
BOOL Paste(BCPosition oPaste);
// coloca os objectos que esto no clipboard na posio oPaste
BOOL InsertNewLine (WORD oLine); // insere uma linha a partir da linha oLine
// mtodos usados para a simulao
BOOL MakeConections(VOID);
// inicializa as ligaes entre os objectos na grelha
VOID ClearConections(VOID);
// destri todas as ligaes entre objectos
VOID ResetAllTimers(VOID);
// inicializa todos os objectos do tipo temporizadores
// inicializa todos os dados de controle, de modo a simular outro varrimento do programa
VOID ResetForOtherSimulation(VOID);
...
};
Esta classe mantm uma matriz bidimensional de ponteiros para objectos do tipo
PointOfGrid. Cada objecto deste tipo representa um nodo da grelha, nodo este que contm dados
sobre o objecto ladder presente na clula correspondente. Esses dados incluem um ponteiro para o
prprio objecto, e informao sobre o tipo de objecto e sobre a ligao vertical do prprio nodo.
As clulas, por definio, representam os locais possveis para a insero de smbolos,
46
A gerao da matriz dinmica, o que permite criar programas maiores sem haver
constrangimentos de memria. O construtor da classe cria a matriz, inicializa os outros dados da
classe e invoca o construtor de BCFileData, o qual inicializa, por exemplo, a extenso dos
ficheiros (extenso por defeito).
MatrixCircuit::MatrixCircuit(ProgramEditor *Win, WORD Dx, WORD Dy, MatrixCircuit *Circ):
BCFileData(Circ, (BCWindow *)Win, ".c20","",BC_KEEP_DATA | BC_DONT_COPY_DATA)
{
...
// alocao de memria para a matriz
m = new PointOfGrid **[Dx];
for(int i = 0; i < Dx; i++)
m[i] = new PointOfGrid *[Dy];
for(i = 0; i < Dx; i++)
for(int j = 0; j< Dy; j++)
m[i][j] = new PointOfGrid();
}
47
delete oShape;
GetXY(oPos)->SetLeftShape(Shape);
SetModified(TRUE);
return TRUE;
}
else {
delete Shape;
return FALSE;
}
5.1.3.
48
public:
...
BOOL WorkElement(BCPosition oPos, WORD Element); // insere um smbolo na posio oPos da grelha
BCPosition FindCell(BCPosition oPos);
// devolve a clula da grelha que corresponde posio do rato oPos
};
A descrio dos dados considerados mais relevantes pode ser vista na parte privada da
classe. De entre os dados destacam-se os vrios tipos de cursores para sinalizao do utilizador
sobre o estado do editor de programao, e o objecto (Cir) de suporte grelha do programa.
No mtodo Initialize, de que apresentada uma pequena parte, inicializada a maioria
dos objectos que a janela mantm (cursores, pincis e o objecto de suporte grelha).
WORD ProgramEditor :: Initialize(VOID)
{
...
// cria o cursor cujo template est definido no ficheiro de recursos - ID = IDR_EDITOR_PROG_DELETE_CURSOR
deleteCur = new BCCursor(BCResID(IDR_EDITOR_PROG_DELETE_CURSOR )); // cria o cursor deleteCur
// cria o objecto Cir com NUMBER_HORIZONTAL_CELL x NUMBER_VERTICAL_CELL nodos
Cir= new MatrixCircuit(this, NUMBER_HORIZONTAL_CELL, NUMBER_VERTICAL_CELL, NULL);
editClearPen = new BCPen(BC_SOLID_LINE, 2, BCColor(BC_WHITE));
// cria o pincel editClearPen
return(0);
}
Windows
&
Win++
Evento
Draw
Evento
Paint
Objecto
ProgramEditor
Evento
Draw
Objecto
MatrixCircuit
(Grelha)
Objecto 1
Objecto 2
Evento
Draw
Evento
Draw
Objecto n
49
Not Ok
Ok
Left = Objecto
CellState = Nome
Apaga objecto
m[x-1,y]
m[x,y]
BOOL Down
BaseShape *Left
BYTE CellState
Clula da Grelha
50
De notar que m(x,y) corresponde ao nodo que identifica completamente a clula (x,y).
Na funo WorkElement processam-se as aces de insero ou apagamento de objectos
da grelha, na posio seleccionada. O parmetro Element permite descodificar a aco pretendida,
isto , verifica qual o tipo de smbolo que o utilizador quer inserir, ou ento se o utilizador quer
apagar algum smbolo.
BOOL ProgramEditor :: WorkElement(BCPosition oPos, WORD Element)
{
BaseShape *Shape = NULL;
switch (Element) {
// identifica a opo seleccionada
case IDC_OPEN_CONTACT:
// para insero de um Contacto Normalmente Aberto
Shape = new OpenContact(oPos);
// cria uma instncia da classe tipo de Contacto Normalmente
Aberto
if( Cir->InsertLadderObject(SelectedCell, Shape) ) // o objecto foi correctamente inserido na grelha
Shape->Draw();
// desenho do objecto
break;
...
case IDC_DELETE:
// a opo seleccionada a Borracha
Cir->Delete(SelectedCell);
// apaga o objecto presente sobre a clula seleccionada
break;
}
}
51
}
if( shapeToEdit->IsSingleCell() ){
// o smbolo do tipo entrada ou sada
// cria uma caixa de dilogo cujo template se encontra no ficheiro de recursos sobre o identificador
// IDD_EDIT_SHAPE, e cujo tipo dado por uma classe LabelEdit definida para suportar este template
LabelEdit oDlg( BCResID(IDD_EDIT_SHAPE), this, shapeToEdit);
if (oDlg.GetResult())
shapeToEdit->Draw();
}
...
}
Cursores
Existem quatro tipos de cursores para melhor informar o utilizador sobre o tipo de aco
esperada quando o boto do rato premido. Os cursores fornecidos so: cursor para sinalizar a
opo Inactiva (que permite editar um smbolo); cursor para apagamento de smbolos; cursor para
sinalizao de ligao vertical; e um cursor para sinalizao de insero de um smbolo na grelha.
A mudana dos cursores feita na funo redefinida MouseMove, que invocada sempre que h
movimento do rato dentro da janela do editor de programao.
VOID ProgramEditor:: MouseMove(BCEvent *opEvt)
{
WORD Selection =opPrt->GetOptionSelection();
...
if ( Selection == IDC_INACTIVE ) {
// se a opo seleccionada a opo Inactiva
SetCursor (inactiveCur);
// instala o cursor que sinaliza a opo Inactiva
return;
}
if ( Selection == IDC_DELETE ){
// se a opo seleccionada a Borracha
SetCursor (deleteCur);
return;
}
if ( Selection == IDC_LINEV ){
// se a opo seleccionada a ligao vertical
SetCursor (vertLineCur);
return;
}
// instala o cursor, para sinalizar que se pode inserir o smbolo correspondente seleco efectuada
SetCursor (insertCur);
}
5.1.4.
Armazenamento em disco
53
escrita do separador ",". A estrutura dos ficheiros de arquivo, corresponde a uma estrutura
equivalente (com pequenas diferenas) daquela utilizada em [20] para o armazenamento de
ficheiros de programas.
Incio - posio (0,0)
Incio linha ?
Sim
No
Grelha
Escreve "{"
no buffer
L elemento da
grelha.
Clula vazia
L parmetros do smbolo.
Escreve no buffer os parmetros:
Nome, Etiquetas, Valor, Ligao vertical
Fim linha ?
Sim
No
Escreve "}"
no buffer
Escreve ","
no buffer
Linha vazia ?
Sim
No
Processa
linha vazia
Incrementa posio
de leitura na grelha.
Fim de grelha?
No
Sim
A seguir, apresenta-se um exemplo das duas possveis descries para uma parte de um
programa, ou seja, a forma grfica e a forma textual (figura 14). De recordar que uma linha em
branco representada pela sequncia {/1}.
{IC IR_10001 , LN , TON TC_000 (#250), LN , LN , LN , LN , LN , OO IR_10000}
{IC IR_10001 , IO IR_10000 , LN , LN , TON TC_002 (#250), LN , LN , LN , OO IR_10001}
{IC IR_10002 , IO IR_10003 , TON TC_003 (#15000), LN , LN , LN , LN , LN , OO IR_10002}
{/1}
54
BCFileData
MatrixCircuit
Classe
MenuCommand
OpenFile
Load
Funo
Clear
OpenFile
LoadCircuit
Cdigo d
funo
Abre ficheiro
Load
Fecha ficheiro
Interpretador do
arquivo em formato texto
55
reconstruo do programa Ladder. De notar que todo o cdigo para BCFileData j se encontra
definido no Win ++ e que, para se ter acesso a estas facilidades, bastou derivar a classe
MatrixCircuit de BCFileData e redefinir as funes Clear e Load (que so invocados
internamente pelo Win++).
O interpretador constitudo pelos trs mdulos apresentados na figura 16: o analisador
de lxico, o analisador sintctico e o bloco de aces necessrias correcta criao e insero dos
objectos ladder na grelha.
Ficheiro
(Descrio textual)
Analisador
de lxico
Analisador
sintctico
Aces
Programa em
linguagem Ladder
Fig. 16 - Interpretador do programa Ladder
Para a implementao do analisador de lxico foi utilizado o programa lex [21], e para a
implementao do analisador sintctico foi utilizado o programa yacc [22].
O programa lex aceita como entrada uma tabela de patterns e produz um analisador de
lxico, sob a forma de uma funo em linguagem C, capaz de reconhecer palavras que satisfazem
esses patterns. Essa funo l um conjunto de caracteres e agrupa-os em tokens. O processo usado
para implementar o analisador de lxico consiste em definir convenientemente o ficheiro de
entrada do lex e, em seguida, executar o programa lex sobre esse ficheiro. Parte do ficheiro de
entrada do lex apresentado a seguir.
%%
const [0-9]+
ident [a-zA-Z][a-zA-Z_0-9]*
space [ \t\n]+
other .
%%
"IO" return IO;
/* reconhece IO, que o nome atribudo aos smbolos do tipo Contacto Normalmente Aberto
*/
...
"UDC" return UDC;
/* reconhece UDC - smbolos do tipo Contador Ascendente/Descendente */
{space}
;
{const}
{yylval.y_k = atoi(yytext); return Constant;} /* valor numrico - pode ser o parmetro Valor ou o */
/* nmero de linhas vazias */
{ident}
{strcpy(yylval.y_str, yytext); return Label;}
/* identifica uma etiqueta */
{other}
return (yytext[0]);
%%
56
:
;
statements :
statement
expression
symbol
:
|
|
statements
/* smbolo objectivo */
statement
| statements statement
;
: '{'expression '}' { executeWindows(); /*cria um novo smbolo no editor de programao */
c20Prs.lin++;
/* prxima linha */
c20Prs.col = 0;
/* primeira coluna */ }
| '{' '/' Constant '}' {
c20Prs.lin += $3;
/* incrementa o nmero de linhas com o nmero de linhas vazias */
}
;
: symbol
| expression separator symbol
;
/* clula vazia */
cross
name totallabel
57
|
|
|
;
totallabel :
|
|
|
c20Label
{ strcpy(c20Prs.label[0], $1); } /* uma s etiqueta */
c20Label c20Label { strcpy(c20Prs.label[0], $1);
/* duas etiquetas */
strcpy(c20Prs.label[1], $2); }
c20Label c20Label c20Label { strcpy(c20Prs.label[0], $1);
/* trs etiquetas */
strcpy(c20Prs.label[1], $2);
strcpy(c20Prs.label[2], $3); }
;
name
:
|
IO
{ c20Prs.name = C_IO; }
/* Contacto Normalmente Aberto */
IC
{ c20Prs.name = C_IC; }
/* Contacto Normalmente Fechado */
...
UDC { c20Prs.name = C_UDC; } /* Contador Ascendente/Descendente */
|
;
/* quando se encontra um separador pode-se passar para a clula seguinte da grelha, e pode-se criar o objecto ladder
da clula anterior */
separator : ',' { executeWindows();
c20Prs.col++;
/* prxima coluna */
}
;
cross
: '!' { c20Prs.cross = TRUE; } /* existncia de uma linha vertical */
;
value
: '(' '#' Constant ')' { c20Prs.pvalue = $3; } /* a constante corresponde ao valor */
;
c20Label : Label { strcpy($$, $1); }
/* deteco de uma etiqueta */
;
A funo loadCircuit tem por funo inicializar a estrutura de dados de apoio ao parser e
invocar a funo yyparse que realiza o parser.
int loadCircuit(BCFile *fp, MatrixCircuit *circ)
{
/* incializao das variveis usadas no parser */
c20Prs.lin = c20Prs.col = c20Prs.pvalue = 0; /*inicializa a linha, a coluna e o valor */
...
return yyparse();
/* invoca o parser que reconstri o programa */
}
58
Interpretador
Leitura e descodificao
dos parmetros do
smbolo a criar
Ficheiro
Criao do smbolo e
insero dos parmetros
lidos. (CreatElement)
Insero do smbolo na
grelha, usando a funo
Not Ok (InsertLadderObject.)
Ok
Fim de ficheiro?
Sim
No
5.2.
Editor de estmulos
5.2.1.
Definio de um estmulo
No contexto deste trabalho, designa-se por estmulo uma entidade que suporta dois tipos
distintos de informao: um endereo e um diagrama temporal. O endereo identifica a
localizao do bit na memria do PLC virtual, e o diagrama temporal mostra o comportamento do
estado do bit ao longo do tempo, neste caso ao longo do tempo de simulao. Este endereo
referencia um bit que pode corresponder a uma entrada ou sada fsica ou a um ponto interno na
memria.
Para caracterizar esta entidade (estmulo) foi criada uma classe, da qual se apresentam a
seguir alguns dados e funes membro. Objectos instanciados desta classe representam estmulos,
suportando o seu armazenamento em memria e permitindo a sua modificao e visualizao.
Class Stimulus:public BCObject
{
protected:
...
WORD Order;
// ordem numa lista de estmulos
StimulusEditor *opStimulusEditor; // ponteiro para a janela de display do diagrama temporal
StimulLabelEdit *labelStimul;
// ponteiro para o objecto de display do endereo
BCRectangle oRect;
// rectngulo (em pixeis) ocupado pelo diagrama temporal do estmulo
CHAR *StimulusLabel;
// suporte em memria para o endereo do estmulo (etiqueta)
CHAR *StimulusBits;
// suporte em memria para o diagrama temporal do estmulo
WORD numberOfPoints;
// nmero de pontos do diagrama temporal
BCSize StimulusSizeInPixel;
// tamanho, em pixeis, de cada ponto do diagrama temporal
public:
...
VOID DrawBit(WORD opPos);
// desenha o estado de um ponto do diagrama temporal
VOID Draw(VOID);
// desenha o diagrama temporal na janela de display
VOID SetStimulusLabel(CHAR *); // modifica o endereo do estmulo
VOID SetStimulusBits(CHAR *);
// modifica o diagrama temporal dos estmulos
VOID ChangeBit(WORD oPonto, CHAR opValue); // modifica o estado de um ponto no diagrama temporal
VOID ResetStimul(VOID);
// inicializa o estmulo
VOID SetNumberOfPoints (WORD nP){numberOfPoints = nP;} // modifica o nmero de pontos do estmulo
BOOL IsThisStimulusInPos(BCPosition oPos); // verifica se a posio oPos pertence ao rectngulo do estmulo
// modifica o estado do ponto correspondente posio oPos. Acima da linha mdia do diagrama o estado ON
VOID ModifyValueAtPos(BCPosition oPos);
...
};
5.2.2.
O editor de estmulos composto por vrias janelas: uma janela popup que contm os
menus e as opes, e que gere as comunicaes entre as outras janelas, uma janela para edio dos
endereos (caixa de dilogo), uma janela de informaes e uma janela para desenho e display dos
diagramas temporais. Uma das razes que levaram criao de vrias janelas prende-se com o
facto de haver vrios tipos de informao, procurando-se, por isso, que cada tipo de informao
fosse visualizado em janela prpria.
60
61
Por exemplo, a funo Paint, entre outras aces, limpa a janela e faz o display de todos
os estmulos da janela.
VOID SimulationEditor :: Paint(BCEvent *)
{
Clear();
// limpa a janela
for (int i = 0 ; i<numberOfStimulus; i++ )
InputOutput[i]->Draw();
// desenha o estmulo que ocupa o nmero de ordem i
...
}
A janela de endereos
Esta janela permite a edio e a visualizao dos endereos dos estmulos. Definiu-se
esta janela como uma caixa de dilogo, pois a gesto dos objectos a presentes (a maior parte da
gesto feita internamente pelo Windows) torna-se mais simples, e alm disso pode-se utilizar o
utilitrio Workshop para definir a sua aparncia e tambm os controlos que possui. Esta janela
mantm objectos instanciados duma classe StimulLabelEdit, que derivada da classe base do
Win++ para representar controlos de edio de palavras, BCStringEdit. Esses objectos (controlos)
vo ser usados para editar e visualisar os endereos dos estmulos.
class EditStimulusDialog : public BCModelessDialog
{
SimulationWindow *opSimulationWindow;
// ponteiro para a janela que gere o editor
StimulLabelEdit **labelStimul;
// suporte para os controlos criados na caixa de dilogo
Stimulus **opStimulus;
// ponteiros para os estmulos
protected:
WORD Initialize(VOID);
// inicializa, entre outros, os controlos para edio dos endereos
VOID EditChange(BCEvent *opEvt); // invocada quando se modifica alguma palavra suportada pelos controlos
public:
EditStimulusDialog (Stimulus **opStim, SimulationWindow *opParent); // construtor da classe
...
};
Para permitir a modificao, pelo utilizador, dos endereos nos estmulos redefiniu-se a
funo virtual EditChange, que invocada internamente pelo Win++ sempre que uma palavra de
qualquer controlo presente na caixa de dilogo modificada. Nessa funo detecta-se o controlo
modificado, acede-se palavra modificada e, em seguida, altera-se o endereo do estmulo
correspondente, invocando a funo membro adequada da classe Stimulus.
VOID EditStimulusDialog :: EditChange(BCEvent *opEvt)
{
CHAR caText[MAX_LABEL_SIZE];
// descobre o nmero de ordem do controlo cuja palavra foi modificada, atravs de informao retirada do evento
WORD oOrd = opEvt->GetControlID() - IDC_EDIT;
labelStimul[oOrd]->GetText(caText, MAX_LABEL_SIZE-1); // carrega em caText a palavra do controlo
opStimulus[oOrd]->SetStimulusLabel(caText);
// modifica o endereo do estmulo correspondente
...
}
62
Estmulos
IR_00000
Janela de
endereos
Janela dos
diagramas
temporais
IR_00200
Janela popup
(gesto do editor)
5.3.
64
Por exemplo, para actualizar o estado das entradas s necessrio atender o evento de
ButtonSnglClk, que sinaliza que o estado do boto foi mudado por aco do rato ou teclado. Nesta
funo, detecta-se o boto cujo estado mudou e actualiza-se o objecto tipo entrada, de modo a
que, no prximo varrimento da simulao, o estado da respectiva entrada j esteja actualizado.
Caso a opo activa seja a Borracha (Apndice A, ponto A.3.3) deve-se apagar o objecto da
janela.
VOID C20RealSimulInteractive:: ButtonSnglClk(BCEvent *opEvt)
{
InputOutputRadioButton *opIn = (InputOutputRadioButton*)opEvt->GetControl(); // objecto cujo estado variou
...
if (opIn->IsInput() && editOrSimul == SIMUL_MODE )
// o objecto uma entrada
opIn->SetState(!opIn->GetState());
// muda o estado do objecto
else
if (editOrSimul == CLEAR_MODE ) {
// para apagar o objecto entrada ou sada
opIn->SetActive(FALSE);
// inactiva o objecto
opIn->SetLabel("");
// limpa a etiqueta do objecto
opIn->SetAddress("");
// limpa o endereo do objecto
opIn->Hide();
// esconde o objecto tornando-o invisvel
}
}
65
Captulo 6
Virtualizao do PLC
6.1.
Circuitos
de entrada
Dispositivos
de sada
Circuitos
de sada
Dispositivos
de entrada
Unidade
CPU
Memria
66
-Editor de estmulos
-Editor interactivo
Utilizador
Simulador
orientado
para
objectos
Memria
alocada no PC
-Editor de estmulos
-Editor interactivo
-Janela do PLC real
Monitor
6.2.
Para o editor de programao havia que escolher uma das linguagens existentes para
programao de autmatos.
Como os diagramas de escada constituiam uma tcnica muito usada para especificar
sistemas de controlo, a linguagem ladder surgiu naturalmente e ainda hoje a linguagem mais
utilizada para a programao de PLCs. Na bibliografia podem facilmente encontrar-se opinies
que revelam a importncia da linguagem ladder na programao de PLCs: os PLCs so
tipicamente programados atravs da linguagem ladder [25]; a programao de PLCs fcil pois
ela geralmente no formato ladder [26]; A lgica em formato ladder uma forma de inteligncia
artificial. No o state-of-art que conta na engenharia de controlo, mas sim o nvel de aceitao
[27]. Pelas razes apontadas e porque quase invariavelmente os fabricantes fornecem a linguagem
ladder para os seus autmatos, foi esta a linguagem escolhida para a programao do PLC virtual.
Esta forma grfica de programao pode ser considerada uma forma de programao
visual (qualquer sistema que permite a especificao de um programa de uma forma
bidimensional ou a mais dimenses). um dado adquirido que um estilo de programao mais
visual pode ser mais facilmente apreendido, principalmente por programadores pouco
67
6.3.
A memria do PLC virtual espelha a memria do PLC real que est a ser emulado. Como
vimos no ponto 2.4.2, a memria do autmato C20H est dividida em reas, sendo cada uma
identificada por uma designao.
Na definio da classe base do PLC virtual, essa memria existe integralmente no
objecto PLC virtual. A razo do static prende-se com a existncia da vrios objectos do tipo PLC
virtual no sistema, os quais partilham a memria do PLC virtual base.
class C20Omron : public BCPopUpWindow
{
protected:
// dados estticos do PLC virtual, so os mesmos para todas as instncias de PLCs
// memria do PLC virtual
static WORD IR[INTERNAL_RELAY_MEMORY+1];
// memria Internal Relay
static WORD SR[SPECIAL_RELAY_MEMORY+1];
// memria Special Relay
static WORD AR[AUXILIARY_RELAY_MEMORY+1];
// memria Auxiliary Relay
static WORD DM[DATA_MEMORY+1];
// memria Data Memory
static WORD HR[HOLDING_RELAY_MEMORY+1];
// memria Holding Relay
static WORD TC[TIMER_COUNTER_MEMORY+1];
// memria Timer/Counter
static WORD LR[LINK_RELAY_MEMORY+1];
// memria Link Relay
static WORD TR;
// memria Temporary Relay - s acedida por bit
// outros dados
static SimulC20Window *opParent;
// ponteiro para a janela de aplicao
static SimulationWindow *opSimulationWindow;
// ponteiro para o editor de estmulos
static MatrixCircuit *Circ;
// ponteiro para a grelha que contm o programa
static BaseShape *rightObjects[NUMBER_VERTICAL_CELL]; // objectos mais direita de cada linha
// parmetros de configurao da simulao
static WORD numberOfSteps;
// nmero de pontos a simular
static double stepPeriod;
// periodo de varrimento - scan time
static WORD numberClocksPerScan;
// n de clocks por cada scan time
static WORD stepInSimulation;
// n do ponto corrente a ser simulado
// informao sobre cada estmulo - diagrama temporal, endereo do bit em memria (palavra + mscara de acesso)
InputStim inputStimul[MAX_C20_INPUTS];
// estmulos das entradas
OutputStim outputStimul[NUMBER_OF_STIMULUS]; // estmulos para guardar os resultados da simulao
...
public:
WORD *GetIR(WORD index);
// devolve um ponteiro para a palavra em index, na rea de memria IR
VOID SetIR(WORD index,WORD value){ IR[index]=value;} // modifica a palavra index na rea IR
// para desenhar as mudanas da janela do PLC virtual no fim de cada varrimento
virtual BOOL VOID InitSimulation(VOID);
// inicializa para a simulao
virtual BOOL SimulationC20(VOID);
// executa um varrimento no programa - simula a sua execuo
virtual VOID UpdateOutputStimulus(WORD oStepTime); // faz o update dos estmulos de sada
virtual VOID UpdateInputStimulus(WORD oStepTime); // inicializa as entradas para novo varrimento
virtual VOID StopSimulation(VOID){}
// para parar a simulao
...
};
68
A classe base do PLC virtual derivada de uma classe tipo janela (BCPopUpWindow).
Isto deve-se a duas razes, uma que se prende com a existncia de uma janela de display do
prprio PLC, justificada pela necessidade de programar um temporizador do Windows (em alguns
modos de simulao) e de receber os seus eventos no PLC virtual (os eventos do temporizador so
enviados para um objecto do tipo janela).
A figura 21 representa a entidade PLC virtual, atravs dos seus componentes CPU e
memria, bem como a sua funcionalidade, isto , a interligao entre os vrios componentes. Esta
figura elucida o comportamento de objectos instanciados de classes, cuja classe base a classe
C20Omron. A funo do CPU principal ser analisada em altura prpria, podendo-se j referir que
este serve de excitador do processo de simulao.
Memria do PLC virtual
In_Stim
Out_Stim
Estmulos das
entradas
Estmulos para
armazenar os
resultados
Ler da
memria
Ler para
memria
CPU
(principal)
Simul
O_ladder_1
O_ladder_n
NULL
rightObjects
69
Etiquetas
Etiqueta_1
...
Etiqueta_n
Memria PLC
Para acesso
memria
6.4.
Simulador
70
Num diagrama ladder uma soluo possvel consiste em, a partir do incio de
continuidade, fazer deslocar um "testemunho" de continuidade lgica ao longo dos vrios degraus
que constituem o programa. Vejamos o exemplo do degrau ladder correspondente equao
lgica a.b = c .
a
b
1
(1,1)
d
(2,1)
b
(1,2)
c
(1,3)
6.4.1.
Recordamos que um PLC uma mquina cclica, isto , o programa nele contido
executado indefinidamente, sendo somente interrompido por aco do utilizador ou por falha de
alimentao. Cada execuo do programa designada por varrimento.
71
Por analogia com o processo de execuo de um programa num PLC real, o PLC virtual
simula o programa de uma forma idntica. A figura 23 ilucidativa desse facto, vendo-se que as
tarefas envolvidas na execuo de um programa no PLC real foram transformadas em funes
membro do PLC virtual.
Incio
InitSimulation
Leitura das
entradas
UpdateInputStimulus
Varrimento
do programa
Escrita das
sadas
SimulationC20
UpdateOutputStimulus
PLC real
PLC virtual
72
Por analogia com a execuo de um programa num PLC real, os trs mdulos
representados na figura 23 so emulados por trs funes virtuais do PLC virtual: SimulationC20,
UpdateInputStimulus e UpdateOutputStimulus.
A funo SimulationC20, que representa tambm o CPU principal na figura 21, simula
um varrimento do programa que se encontra na grelha do editor de programao. Esta comea por
enviar uma mensagem de inicializao para o objecto grelha (Circ), de modo a inicializar todos os
objectos ladder a presentes para novo varrimento de simulao. Por sua vez, a grelha, por
analogia com os eventos de Draw (ponto 5.1.3), envia para cada objecto a mesma mensagem de
inicializao. Aps esta inicializao, h que estimular os objectos ladder que se situam mais
direita no programa ladder, isto , enviar-lhes a mensagem de Simul.
BOOL C20Omron :: SimulationC20()
{
Circ->ResetForOtherSimulation(); // limpa as variveis usadas em cada varrimento da simulao
int n = 0;
while ( rightObjects[n] )
// enquanto houver ponteiros para objectos ladder em rightObjects
rightObjects[n++]->Simul(); // envia um evento de simulao para o objecto ladder rightObjects[n]
return (TRUE);
}
73
6.4.2.
O algoritmo de simulao
74
J foi referido que a funo virtual Simul opera como um interpretador da linguagem
ladder. Como para todos os objectos que ocupam uma s clula (e portanto tm uma s entrada), a
interpretao do contexto do programa ladder idntica, a funo Simul definida na classe
BaseShape serve todos os objectos uni-celulares.
O parmetro da funo Simul permite conhecer a posio (acima, abaixo, ou na mesma
linha) do objecto que invocou a funo. Esta informao utilizada para evitar ciclos infinitos, j
que os objectos podem estar duplamente ligados, e tambm para fazer actualizaes em objectos
ligados na vertical.
A seguir apresenta-se um exemplo que ilustra a ordem pela qual so invocadas as
funes Simul dos objectos existentes num determinado degrau ladder.
a
d
5
Neste caso, o CPU principal envia um evento de Simul (invocao da funo Simul do
objecto) para o objecto e; em seguida, esse evento enviado para o objecto c que, por sua vez, o
envia para o objecto b, e assim sucessivamente. A funo Simul do objecto c tambm se encarrega
de enviar o evento para o objecto ligado abaixo, d. Depois, devido existncia do objecto d em
rightObjects, o CPU principal ainda envia o evento de Simul para d, s que, tem como resposta
um retorno imediato da funo Simul, pois a funo Simul do objecto d j foi executada no
varrimento actual (flagSimulation == TRUE).
A funo membro SetDownValSimulation (SetUpValSimulation) serve para actualizar os
valores de simulao, valSimulation, de todos os objectos situados abaixo (acima) do objecto
actual. Esta actualizao necessria pois o valor de simulao em cada nodo o resultado do OR
lgico dos resultados da simulao dos objectos que esto ligados esquerda desse nodo.
BOOL BaseShape :: SetDownValSimulation(BOOL oValue)
{
if(orDown)
orDown->SetDownValSimulation(oValue);
return ( valSimulation = oValue );
}
6.4.3.
Para objectos com mais do que uma entrada (pluri-celulares), existe a necessidade de
redefinir a funo virtual Simul, de modo a interpretar adequadamente os sinais provenientes dos
objectos ligados nas suas entradas.
A classe CounterReset representa objectos do tipo Contador Descendente com Reset,
pelo que a funo Simul tem que interpretar dois sinais de entrada: um sinal para decremento do
76
Para objectos do tipo Registo de Deslocamento, devem ser interpretados trs sinais de
entrada: um sinal correspondente ao bit a deslocar no registo (inputVal); um sinal correspondente
ao relgio do registo (clockOn); e o sinal de inicializao do registo (reset).
BOOL ShiftRegister :: Simul(WORD flagOnCall)
{
if (flagSimulation)
return (valSimulation);
...
if (leftShape[0])
inputVal = leftShape[0]->Simul(LEFT_SHAPE_CALL);
if (leftShape[1])
clockOn = leftShape[1]->Simul(LEFT_SHAPE_CALL);
if (leftShape[2])
reset = leftShape[2]->Simul(LEFT_SHAPE_CALL);
OwnerSimulation();
...
return (valSimulation);
}
77
*h
11
10
13
12
*n
*m
g
6
e
*g
7
f
*f
rightObjects
Degrau ladder
78
6.4.4.
A funo OwnerSimulation
Depois de um objecto "ler" as suas entradas (invocando a funo Simul para todos os
objectos ligados sua esquerda), este deve invocar a sua prpria funo OwnerSimulation para
simular a instruo que representa.
Todas as funes de OwnerSimulation, aqui apresentadas, emulam o comportamento das
correspondentes instrues, de acordo com o manual de operao do autmato C20H [7].
A funo OpenContact::OwnerSimulation() implementa a aco de uma instruo ladder
Contacto Normalmente Aberto. A varivel valSimulation guarda o estado da simulao do
objecto, e valInSimulation contm o estado da condio de execuo devolvido pelo objecto sua
esquerda. Caso a condio de execuo seja TRUE (valInSimulation = TRUE), o estado do bit de
trabalho carregado para a varivel valSimulation.
BOOL OpenContact :: OwnerSimulation()
{
flagSimulation = TRUE;
// sinaliza que o objecto actual j foi simulado
if( valInSimulation )
// estado da condio de execuo da instruo - ON
return (valSimulation = (*memLocation[0] & maskBit[0]) ? TRUE : FALSE );
else
// estado da condio de execuo da instruo - OFF
return (valSimulation = FALSE );
}
79
}
BOOL CloseOutput :: OwnerSimulation()
{
flagSimulation = TRUE;// sinaliza que o objecto actual j foi simulado
if(valInSimulation)
*memLocation[0] &= ~maskBit[0]; // coloca o bit de trabalho da instruo no estado OFF
else
*memLocation[0] |= maskBit[0];
// coloca o bit de trabalho da instruo no estado ON
return (valSimulation = valInSimulation);
}
ConterReset a classe para representar um Contador Descendente com Reset. Este tipo
de contador utilizado para contar desde um valor inicial at zero. Para cada execuo da
instruo (OwnerSimulaton) o procedimento o seguinte:
se o estado da entrada de decremento do contador (counterDown) for ON e se esse
estado no varrimento anterior (oldCounterDown) for OFF, ento o valor do contador
decrementado (--cntCount);
se o valor do contador atinge o valor zero, activado o bit de sada do contador;
80
81
return (valSimulation);
}
if( counterDown && counterUp ) // as duas entradas esto actuadas - pelo fabricante no se deve fazer nada
return (valSimulation);
if( oldCounterUp != counterUp ) {
// houve variao da entrada do varrimento anterior para este varrimento
if (counterUp)
// a variao corresponde passagem do estado OFF para o estado ON
if( endOfCount && cntCount == 0) { // fim de contagem com o valor actual igual a zero
++cntCount;
// valor incrementado pois houve uma actuao na entrada counterUp
*memLocation[0] &= ~maskBit[0]; // coloca o bit de sada a FALSE
valSimulation = FALSE;
// o valor da simulao = FALSE
}
else
// incremento normal do contador - fora dos extremos
if(++cntCount > Value) { // incrementa o valor do contador e compara-o com o valor inicial - Value
endOfCount = TRUE; // sinaliza internamente o contador com fim de contagem
*memLocation[0] |= maskBit[0]; // coloca o bit de sada a TRUE
valSimulation = TRUE;
// o valor da simulao = TRUE
cntCount = 0;
// coloca o valor actual a zero
}
oldCounterUp = counterUp;
// guarda o estado actual de counterUp para o varrimento seguinte
}
if(oldCounterDown != counterDown) { // variao, na entrada, do varrimento anterior para o actual
if (counterDown)
// a transio da entrada foi positiva
if( endOfCount && cntCount == Value) {
// fim de contagem com o valor actual igual a Value
--cntCount;
// valor decrementado pois houve uma actuao na entrada counterDown
*memLocation[0] &= ~maskBit[0]; // coloca o bit de sada a FALSE
valSimulation = FALSE;
// o valor da simulao = FALSE
}
else
if(--cntCount < 0) {
// decremento normal do contador - fora dos extremos
endOfCount = TRUE;
// sinaliza internamente o contador com fim de contagem
*memLocation[0] |= maskBit[0]; // coloca o bit de sada a TRUE
valSimulation = TRUE;
// o valor da simulao = TRUE
cntCount = Value;
// coloca o valor actual no valor inicial do contador - Value
}
oldCounterDown = counterDown;
// guarda o estado actual de counterDown para o varrimento seguinte
}
return (valSimulation);
}
82
oldReset = TRUE;
}
return FALSE;
}
else
// o estado do sinal de reset OFF
oldReset = FALSE;
// guarda o estado do reset para o varrimento seguinte - o estado FALSE
if(oldClock != clockOn) {
// houve uma transio no estado do sinal clockOn
if(clockOn) {
// a transio foi positiva
// deslocamento da ltima palavra do registo
memLocation[0][numberWords] = (memLocation[0][numberWords]) << 1;
for (INT i = numberWords - 1; i >= 0; i--) { // deslocamento de todas as outras palavras
WORD stWord = memLocation[0][i] & 0x8000; // guarda o estado do 16 bit da palavra i do registo
memLocation[0][i] = (memLocation[0][i]) << 1; // deslocamento de um bit na palavra i do registo
if ( stWord )
// o estado do bit guardado ON
memLocation[0][i + 1] |= 0x0001;
// coloca o primeiro bit da palavra i+1 no estado ON
else
memLocation[0][i + 1] &= 0xFFFE; // coloca o primeiro bit da palavra i+1 no estado OFF
}
if (inputVal)
// entrada de inputVal no primeiro bit da primeira palavra
memLocation[0][0] |= 0x0001;
// coloca o primeiro bit da primeira palavra no estado ON
else
memLocation[0][0] &= 0xFFFE;
// coloca o primeiro bit da primeira palavra no estado OFF
}
oldClock = clockOn;
// guarda o estado de clockOn para o varrimento seguinte
}
return (valSimulation = inputVal);
}
C20Omron
C20FastSimul
C20RealSimul
C20RealSimulInteractive
C20RealSimulNormal
83
6.5.1.
Simulao rpida
84
de ordem do diagrama temporal de IR_00200. Este processo repetido desde o nmero de ordem
0 at numberOfSteps.
numberOfSteps
Estmulo
de entrada
IR_00000
Simulador
(stepInSimulation)
Estmulo
de sada
IR_00200
6.5.2.
85
Incio de
actividade
Memria
Evento de
Scan Time
Simulador
Relgio
(Temporizador
do Windows)
Sadas
Entradas
Esta simulao em tudo idntica simulao rpida descrita anteriormente, excepto nos
instantes em que so iniciadas as simulaes dos ciclos, os quais, neste caso, so definidos pelo
Relgio de simulao.
Pode haver dois factores distintos que impedem que um programa seja simulvel em
tempo real. Um dos factores tem a ver com o tempo (ts) que o simulador dispende a ler as
entradas, a executar um varrimento do programa e a actualizar as sadas. Esse tempo pode ser
superior ao periodo do relgio de simulao. Isto leva a que o evento de Scan Time no seja
imediatamente atendido, sofrendo portanto um atraso que crescer com o nmero do ciclo a
simular, como se pode detectar na figura 27.
Para verificar se um programa simulvel em tempo real pode utilizar-se uma regra
emprica cujo procedimento deve ser o seguinte: simular o programa com o simulador rpido e
verificar qual o tempo que o simulador leva para executar todo o processamento necessrio. Se
esse tempo for inferior a 80% do tempo total de simulao (parmetro de simulao - Apndice A,
86
ponto A.4.4.1), ento esse programa simulvel em tempo real. Esta regra foi deduzida aps
vrios testes de simulao para vrios programas (verificado experimentalmente num PC com a
configurao mnima - 386 SX a 16 Mhz).
Eventos do
Relgio
tscan
tp
Eventos do
Win++
Periodos de
simulao -OK
Periodos de
simulao -Not OK
1)
ts
2)
ts
at1
at2
at3
at4
Como se pode inferir da figura, quando tsi inferior a tscan ento a simulao em
tempo real e sem quaisquer atrasos. Porm, quando tsi superior a tscan vai existir um atraso
dado por
n
atn = (tsi tscan) , para tsi tscan
i=0
Por exemplo, se Tempo de simulao = 20s; tsi = 60ms para qualquer i; tscan = 50ms; o
tempo de simulao real, em vez de ser de 20s, passar a ser de 24s, havendo portanto um erro de
tempo real de 20%. Contudo, convir referir que os resultados apresentados no Editor de
Estmulos no sofrem qualquer tipo de erro, pois a escala temporal automaticamente adaptada,
no dependendo da temporizao tempo real.
No caso apresentado anteriormente o erro pode ser quantificvel, o que j no acontece
na situao descrita a seguir, e que diz respeito aos atrasos introduzidos pelas sobrecargas do
Windows. Uma sobrecarga no Windows traduzida no atraso da resposta a uma determinada
mensagem do Windows pela aplicao que consome a mensagem, isto , ao surgir uma mensagem
na fila de mensagens da aplicao, a sua resposta s pode ser dada aps algum processamento
pendente. Esta situao, no caso das mensagens enviadas por um temporizador, provoca que o seu
atendimento pelo PLC virtual no seja imediato (nem to pouco com um atraso constante, como
87
no caso do exemplo anterior), variando por isso o periodo do relgio da simulao como se pode
verificar na figura 28. Como se pode ver, em 2) so executados 4 ciclos de simulao enquanto
que em 1), num mesmo intervalo de tempo, so executados 5 ciclos de simulao.
Eventos do
Relgio
Eventos do
Win++, com
atrasos constantes
Periodos de
simulao
tscan
tp
1)
ts
Eventos do
Win++, com
atrasos diferentes
Periodos de
simulao
2)
ts
Fig. 28 - Atraso da simulao tempo real, provocado pelo atraso no consumo das mensagens pelo PLC virtual
Esta sobrecarga pode ser provocada por aplicaes que estejam a correr em background
ou pelo atendimento a interrupts de hardware (gerados, por exemplo, pelo rato ou teclado), j que
se garante, atravs da resposta ao evento Activaction (sinaliza a activao ou desactivao de uma
janela), que a simulao imediatamente interrompida quando a janela do PLC virtual fica
desactivada.
Em situaes de sobrecarga do Windows impossvel quantificar os atrasos ati pois
estes dependem do nmero de eventos gerados durante a simulao, que no so necessariamente
em igual nmero para todos os ciclos de simulao.
Uma das possveis solues para este tipo de problema consiste em retirar todas as
aplicaes que esto a correr em background no Windows, e evitar gerar eventos de rato e/ou
teclado.
6.5.2.1. A classe de representao de temporizadores no Win++
A classe BCTimerDevice do Win++ a interface para as capacidades de temporizao do
Windows. Objectos instanciados desta classe representam temporizadores, que podem ser
programados para gerar um determinado tempo ou para criar um relgio.
No caso presente interessa a segunda hiptese, de modo a criar eventos de Scan Time. A
mensagem do temporizador recebida pelo Windows e enviada para o Win++, que a tranforma
num evento, atravs duma chamada funo virtual (TimerEvent) da classe janela que contm o
temporizador. Depois de criado o temporizador (chamada do construtor de BCTimerDevice),
podem invocar-se vrias das suas funes, nomeadamente a funo de incio de temporizao
(StartTimer) e a de paragem de temporizao (StopTimer). O tempo marcado em milisegundos e
88
Na funo InitSimulation necessrio activar o relgio de simulao, para que este possa
gerar eventos de Scan Time e envi-los para a janela do PLC virtual, que depois os processar da
maneira adequada.
VOID C20RealSimul :: InitSimulation()
{
StopSimulation(VOID)
// para parar a simulao
C20Omron::InitSimulation();
// invoca a funo de inicializao de defeito
updateStimulusClock->StartTimer( (WORD)stepPeriod ); // inicializa o relgio de simulao com stepPeriod
}
89
A partir da classe base de PLCs virtuais (tempo real) podem derivar-se classes para
representar PLCs virtuais para diferentes simulaes tempo real. Neste trabalho implementaramse dois tipos de PLCs virtuais tempo real, que passamos a descrever nos pontos seguintes.
6.5.2.3. A simulao em tempo real normal
A simulao em tempo real normal caracterizada por os estmulos de entrada serem
definidos no editor de estmulos e os resultados da simulao serem apresentados de duas formas:
durante o processo de simulao, as entradas e as sadas so apresentadas sobre uma imagem
digitalizada do autmato real que est a ser emulado, atravs de pretensos LEDs semelhana do
que normalmente se encontranos PLCs (ver figura A.15 do Apndice A, ponto A.5.2.1); aps a
simulao, todos os resultados podem ser analisados em conjunto, utilizando o Editor de
Estmulos.
Para suportar esta simulao derivou-se uma classe (C20RealSimulNormal) da classe
base de PLC's virtuais tempo real e redefiniram-se algumas funes virtuais. A imagem do PLC
real suportada pelo objecto c20OmronBitmap, e as entradas e/ou sadas so representadas por
objectos do tipo BCRectangle.
class C20RealSimulNormal : public C20RealSimul
{
BCBitmap *c20OmronBitmap;
90
BCRectangle inputRect[MAX_C20_INPUTS];
// rectngulos para representar as entradas do PLC
BCRectangle outputRect[MAX_C20_OUTPUTS];
// rectngulos para representar as sadas do PLC
WORD oldInputValue;
// usado na actualizao visual das entradas
WORD oldOutputValue;
// usado na actualizao visual das sadas
...
protected:
virtual WORD Initialize(VOID);
virtual VOID TimerEvent(BCEvent *opEvt);
// atende os eventos enviados pelo relgio de simulao
BOOL QueryEnd(BCEvent *);
// invocada no seguimento da aco de Close da janela
public:
...
virtual VOID UpdateInputStimulus(VOID);
// actualiza e visualiza as entradas (provenientes dos estmulos)
virtual VOID UpdateOutputStimulus(VOID);
// actualiza e visualiza os estmulos e as sadas
virtual VOID InitSimulation(VOID);
// inicia a simulao
};
O relgio de simulao, uma vez inicializado, gera eventos de Scan Time, o que se traduz
na chamada de funo virtual TimerEvent da classe janela. Como a funo TimerEvent est
redefinida para este objecto, ser esta a funo invocada. De cada vez que esta funo invocada,
executa-se a simulao de um ciclo completo de programa. Alm disso, existe a necessidade de
testar se a simulao deve ser ou no terminada.
VOID C20RealSimulNormal :: TimerEvent(BCEvent *opEvt)
{
if ( stepInSimulation == numberOfSteps) { // verifica se j se ultrapassou o nmero de pontos a simular
StopSimulation();
// pra a simulao
opSimulationWindow->GetSimulationEditor()->Draw(); // desenha os resultados no editor de estmulos
return;
}
UpdateInputStimulus(stepInSimulation);
// actualiza as entradas com os estmulos
SimulationC20();
// simula um varrimento completo do programa
UpdateOutputStimulus(stepInSimulation); // actualiza os estmulos de sada e faz a visualizao das sadas
stepInSimulation++;
// incrementa o nmero do ponto a simular no prximo varrimento
...
91
92
93
C20RealSimul::StopSimulation();
opStaticTextInfo->SetText("");
94
else {
if (!opOutputs[i]->GetState() )
opOutputs[i]->SetState(TRUE);
}
// o estado do bit ON
// se o estado do boto for OFF
// coloca o estado do boto a ON
}
}
}
Como vimos, o suporte para estas diferentes simulaes bastante simples, como
resultado dos mecanismos de herana e de polimorfismo fornecidos pela linguagem C++. De
facto, construir um novo modo de simulao corresponde a criar uma nova classe derivada de uma
j existente, herdando assim todas as caractersticas que permitem simular um PLC, sendo
somente necessrio definir algumas funes virtuais.
95
Captulo 7
Consideraes finais
7.1.
96
7.2.
mecanismos de herana serve todos os objectos desse tipo. Para objectos pluricelulares, pode
tambm no ser necessrio redefinir a funo Simul pois esta, derivada da sua classe antecessora,
pode servir os novos objectos, particularmente se eles tiverem o mesmo nmero de entradas e de
sadas que o modelo donde foram derivados.
A funo OwnerSimulation tem de ser obrigatoriamente redefinida caso a caso, j que
responsvel pela aco particular de cada nova instruo. A redefinio de OwnerSimulation para
uma dada instruo tem de ter em conta os sinais de entrada adquiridos pela funo Simul para,
em seguida e de acordo com as especificaes do fabricante do autmato, implementar a
instruo.
Para modificar a interface grfica, de modo a suportar uma nova instruo, s h que
acrescentar o cdigo conveniente, no sendo necessrio reescrever o que se refere s instrues j
existentes.
Para cada nova instruo deve criar-se um token (e uma regra) de identificao ao nvel
do interpretador de reconstruo do programa. Esta adio ocorre nos ficheiros de entrada do lex e
do yacc.
Torna-se tambm necessrio criar uma nova opo na barra de menus do editor de
programao, de modo a que o utilizador possa escolher a nova instruo para inserir nos seus
programas.
Finalmente, h que acrescentar na funo membro WorkElement, da classe
ProgramEditor, o cdigo de criao de um objecto instanciado da nova classe e proceder sua
insero na grelha. Tambm, na funo CreatElement, da classe MatrixCircuit, que invocada
pelo construtor do programa ladder a partir do arquivo em disco, se deve escrever cdigo para a
criar e para inserir objectos deste tipo.
Pode inferir-se da exposio anterior que, para criar uma nova instruo, apenas se torna
necessrio acrescentar uma classe cujos objectos vo suportar a instruo, e adicionar o cdigo
necessrio aos mecanismos de gesto da nova instruo na interface. Por outro lado, o cdigo
previamente escrito para as outras instrues permanece inalterado e, o que mais importante,
que a nova instruo pode ser simulada apenas a partir das funes membro da nova classe. Fica,
assim, relevada uma das preciosas vantagens da utilizao de tcnicas de programao por
objectos: as facilidades de reutilizao de cdigo, originadas pelos mecanismos de herana
prprios dessas tcnicas.
7.3.
Concluses
100
101
envolvendo PLCs. O sistema foi j utilizado em mdulos didcticos de dois cursos de formao
profissional, tendo permitido cumprir cabalmente a leccionao desses mdulos, sem recorrer a
laboratrios equipados com autmatos reais e respectivo software especfico e/ou consolas de
programao. Por outro lado, uma verso preliminar do sistema PLC virtual usada no centro de
desenvolvimento, na Alemanha, de um fabricante de PLCs, para treino dos seus programadores,
pois verificaram que o modo de simulao rpida muito elucidativo e eficaz na deteco de
certos erros na fase de desenvolvimento de programas.
Como foi referido anteriormente, para a construo do sistema foi desenvolvido um
modelo virtual para um autmato programvel, o qual, muito embora tenha sido concretizado para
um PLC em particular, pode ser adaptado para outros autmatos, j que a maioria dos cerca de 70
ficheiros desenvolvidos, contendo mais de 11000 linhas de cdigo, so reutilizveis. Alm disso,
o PLC virtual expansvel, nomeadamente ao nvel dos mdulos de entrada e sada de dados, j
que o modelo prev a possibilidade da adio de outros blocos.
7.4.
Trabalho futuro
102
Referncias bibliogrficas
[1]
PICARD, Robert P., Gordon J. Savage - Instructing Industrial Controls Using Ladder
Diagrams on an IBM PC. In: IEEE Transactions on Education, vol. E-29, no. 1, February
1986.
[2]
FALCIONE, Albert, Bruce H. Krogh - Design Recovery for Ladder Logic. In: IEEE
Control Systems, April 93.
[3]
KNON, Wook Hyun, Jong-il Kim, Jaehyun Park - Architecture of a Ladder Solving
Processor (LSP) for Programmable Controllers. In: Proceedings of IECON'91 International Conference of Industrial Electronics, Control and Instrumentation. Kobe
(Japan), 1991.
[4]
[5]
MICHEL, Gilles - Programmable Logic Controllers. John Wiley & Sons, 1990.
[6]
[7]
[8]
[9]
NORTON, Peter, Paul Yao - Borland C++ Programming for Windows. Bantam Books,
1992.
[10] Microsoft Corporation - Windows Version 3.0 - Software Development Kit - Manuals.
Microsoft Corporation, USA 1990.
[11] STROUSTRUP, Bjarne - What is Object-Oriented Programming ?. In: IEEE Software,
May 1988.
[12] MEYER, Bertrand - Reusability: The Case for Object - Oriented Design. In: IEEE
Software, March 1987.
[13] THOMAS, Dave - What's an Object ?. In: Byte, March 1993.
[14] MEYER, Bertrand - Object oriented software construction. Prentice-Hall International
(UK), 1988.
[15] STROUSTRUP, Bjarne - The C++ programming language. Addison-Wesley, 1986.
[16] STROUSTRUP, Bjarne - A better C ?. In: Byte, August 1988.
PlcPro - Captulo 1
Introduo
PlcPro - Captulo 1
Introduo
Apndice A
Abril 94
105
Captulo A.1
A.1 Introduo
Entradas
(teclado, rato)
PLC
virtual
Sadas
(monitor)
109
Introduo
110
Introduo
Este manual est organizado em seis captulos. No captulo A.1 faz-se uma breve
introduo de modo a informar qual o mbito de utilizao desta aplicao. No captulo A.2
encontra-se o necessrio para a instalao completa da aplicao PlcPro.
Nos outros captulos procede-se a uma anlise mais detalhada de todos os
componentes da aplicao. Assim, so apresentados nos captulos A.3 e A.4 todas as
funcionalidades dos editores de programao e de estmulos, respectivamente. No captulo
A.5 so apresentados os vrios modos oferecidos pelo PlcPro para a simulao de
programas. No captulo A.6 so detalhadas as sequncias de operaes necessrias criao
de um programa com o editor de programao; tambm neste captulo se explicita o modus
operandi essencial simulao de programas previamente editados.
111
Captulo A.2
A.2 Instalao
Este captulo explica como proceder para a correcta instalao do sistema PlcPro.
Nota importante: para a instalao necessrio dispr de, pelo menos, 1.5 MB livres
no disco rgido. Naturalmente que, para desenvolver novos programas, mais espao em disco deve
ser libertado.
livraria
wpp_b3l2.dll
livraria
bwcc.dll
livraria
plcpro.exe
programa executvel
*.c20
*.sim
*.int
Editor de programao
md c:\c20
cd c:\c20
2- Correr o programa install.exe. Inserir a disquete e escrever:
a:install
Aps a instalao e a escolha da resoluo do monitor, o ficheiro de demonstrao,
correspondente resoluo no seleccionada, pode ser apagado.
113
Editor de programao
114
Captulo A.3
A.3 Editor de programao
Barra de menus
Barra de opes
Clulas da grelha
Janela de informaes
Fig. A.4 - Editor de programao
115
Editor de programao
116
Editor de programao
Contador ascendente/descendente. Este smbolo tem trs entradas tipo bit: a entrada de impulso
de contagem ascendente (II), a entrada do impulso de contagem descendente (DI) e uma
entrada para inicializao do contador (R). Existem dois parmetros a definir para este
smbolo: o endereo do bit de sada do contador, isto , o bit que sinaliza o fim de contagem; e
a constante que representa o valor inicial do contador.
Registo de deslocamento. Este smbolo tem trs entradas do tipo bit: a entrada a deslocar pelo
registo (I), uma entrada para impulso de deslocamento (P) e uma entrada de inicializao do
registo (R). Para este smbolo existem dois parmetros tipo endereo, que indicam o endereo
inicial e o endereo final das palavras de 16 bits que vo constituir o registo.
Tabela 1
Arquivo
Novo
Abrir
Gravar
Gravar como
Sair
Abandona a aplicao
117
Sobre PlcPro
Editor de programao
Informao
Editar
Cortar
Copiar
Colocar
Apagar
Opes
Grelha
Permite mostrar/esconder a grelha de suporte do editor de
programao
Redesenhar
Permite desenhar o programa presente no editor
Inserir Linha Permite a insero de uma nova linha no programa (pelo
menos uma clula pertencente linha, a partir da qual se vai inserir a nova linha, deve
estar seleccionada)
Bloquear Opo Bloqueia o mecanismo de opes. Se a opo no estiver
bloqueada, na sequncia de uma qualquer aco na grelha o editor coloca-se num estado
inactivo (vide opo Inactiva). Se o mecanismo estiver bloqueado, qualquer opo
permanece seleccionada at que nova opo seja escolhida. Na janela de informao existe
a informao de bloqueio de opo
Editor de Texto Mostra e torna activa a janela do editor de texto
Simulao
Mostra e torna activa a janela do editor de estmulos
Sobre
Info
Informao
Contacto Aberto
Contacto Fechado
Sada Aberta
Editor de programao
Sada Fechada
Temporizador
Contador Desc.
Ligao Horiz.
Borracha
Bloqueio
Editor de programao
120
Editor de programao
borracha).
Premir o boto do rato sobre a clula onde se encontra o smbolo a apagar.
(Inactiva).
Dependendo do tipo do smbolo aparece uma das duas caixas de dilogo seguintes:
Editor de programao
122
Editor de programao
123
Editor de programao
124
Captulo 4
A.4 Editor de estmulos
>Barra de menus
>Barra de opes
>rea de estmulos
>Diagrama temporal
>Janela informaes
rea de endereos
Editor de estmulos
tambm, como se ver mais tarde, um meio de visualizao dos resultados de alguns dos
modos de simulao implementados, pois permite mostrar os estados das sadas e dos pontos
internos.
O editor de estmulos encontra-se numa janela prpria que pode ser activada por
meio do sub-menu Simulao, contido no menu Opes do editor de programao.
Gravar
126
Tempo
Editor de estmulos
127
Editor de estmulos
Para posicionar o cursor para escrita dos endereos deve usar-se o rato, enquanto
que o deslocamento para outros endereos pode ser feito usando o rato ou o teclado (atravs
das teclas TAB ou SHIFT TAB)
IR_00000
Endereo da entrada
"0" lgico
"1" lgico
Diagrama temporal
O diagrama temporal pode ser traado ponto a ponto (premindo o boto do rato
nas posies adequadas) ou usar o mtodo de arrastamento do rato se se pretende uma
definio mais rpida. Para definir um "1" lgico, o cursor do rato deve estar acima da
linha mdia, enquanto que para obter um "0" o cursor deve estar abaixo da linha mdia.
A ampliao (vide A.4.4.2) e a escala podem facilitar o desenho dos diagramas
temporais.
Para apagar completamente um estmulo, deve-se seleccionar a opo
seguida premir o rato sobre o diagrama temporal do estmulo a apagar.
e em
128
Editor de estmulos
A.4.4.2 Ampliao
A ampliao pode ser alterada de duas formas. Uma delas faz uso da opo
,
que cria uma caixa de dilogo onde se pode inserir o factor de ampliao. O factor de
ampliao estabelece o nmero de pixeis usados na representao de um ponto, at um
mximo de 60 pixeis.
129
Editor de estmulos
t = 21.80s
Tempo-100s
Novo
Abrir
Gravar
130
Editor de estmulos
131
Captulo 5
A.5 Simulao
132
Simulao
Simulao
Abrir
Simulao
Gravar
Sair
Borracha Permite apagar objectos, que representam entradas, sadas ou pontos internos.
Simular
Stop
Botes
Rascunho S uma destas duas opes est activa em cada momento. Quando a opo
est visvel permitido configurar a janela interactiva. Quando a opo
est
Sada
de modo a que
fique visvel.
"Pegar" o objecto no topo e desloc-lo para a nova posio, isto , premir o rato
sobre o topo e arrastar o rato com o boto premido at ao local desejado, deixando s ento
de premir o boto.
135
A.5.4.3.1
Simulao
Como resultado, aparece um objecto que representa uma entrada e situado numa
determinada posio. O objecto pode, ento, ser deslocado como se explicou no ponto
anterior.
A.5.4.3.2
Como resultado, aparece um objecto que representa uma sada/ponto interno e situado
na posio programada por defeito. Naturalmente que, tambm possvel reposicionar o objecto.
A.5.4.3.3
Cada um dos objectos, sejam eles do tipo entrada ou do tipo sada, necessitam pelo
menos de um endereo para representarem uma entrada ou sada/ponto interno do PLC
virtual. Para a edio do endereo ou da etiqueta deve:
Seleccionar a opo
Premir o rato duas vezes seguidas sobre o objecto a editar.
Aparece, ento, a caixa de dilogo (figura A.17) na qual vo ser escritos o endereo
e a etiqueta desejados. Alm disso pode-se escolher, atravs dos botes Etiqueta ou
Endereo, qual dos dois deve ser visualizado em conjunto com o objecto. No caso da figura
A.17 a etiqueta que vai ser visualizada juntamente com o objecto.
A caixa de dilogo informa sobre o tipo de objecto editado (Tipo), o qual, no
exemplo apresentado abaixo, do tipo sada/ponto interno.
136
Simulao
137
Captulo A.6
A.6 Criao e simulao de um programa
Proceder do mesmo modo, para inserir todos os outros smbolos, incluindo as ligaes
horizontais.
Em seguida, h que editar os smbolos para se inserirem os respectivos parmetros:
Seleccionar a opo
Premir duas vezes o boto do rato sobre a clula (4,2)
Preencher a caixa de dilogo da seguinte forma:
139
Fig. A.20 - Editor de estmulos (programa clock - estmulo de entrada de Incio - IR_00000)
140
141
142
ndice - Apndice A
A.1 INTRODUO
109
A.1.1
Caractersticas do sistema
A.1.2
A.1.3
A.1.4
A.2 INSTALAO
109
110
111
A.2.1
Tipos de ficheiros
111
A.2.2
111
A.2.3
111
113
A.3.1
A.3.2
A.3.3
A.3.4
Janela de informaes
A.3.5
A.3.6
114
116
A.3.6.1
A.3.6.2
A.3.6.3
118
A.3.6.4
118
A.3.6.5
119
143
117
A.4.2
A.4.3
A.4.4
Facilidades adicionais
124
A.4.4.1
A.4.4.2
Ampliao
A.4.4.3
Janela de informaes
A.4.4.4
A.5 SIMULAO
123
124
125
125
127
A.5.1
Parmetros de simulao
127
A.5.2
127
A.5.2.1
127
A.5.2.2
A.5.3
Simulao rpida
128
A.5.4
Simulao interactiva
128
128
A.5.4.1
A.5.4.2
A.5.4.3
128
130
130
130
A.5.4.4
131
A.5.4.5
131
Escrita do programa
133
A.6.2
A.6.3
134
134
133
A.6.4
A.6.5
135
A.6.5.1
A.6.5.2
A.6.5.3
Simulao interactiva
136
145
135