Você está na página 1de 153

Universidade de Aveiro

Departamento de Electrnica e Telecomunicaes

Virtualizao de autmatos
programveis
Jorge Augusto Fernandes Ferreira
Lic. em Eng. Electrnica e Telecomunicaes
pela
UNIVERSIDADE DE AVEIRO

Abril 1994

Virtualizao de autmatos
programveis

Jorge Augusto Fernandes Ferreira


Lic. em Eng. Electrnica e Telecomunicaes
pela
UNIVERSIDADE DE AVEIRO

Dissertao submetida para satisfao parcial


dos requisitos do programa de Mestrado em
ENGENHARIA ELECTRNICA E TELECOMUNICAES

UNIVERSIDADE DE AVEIRO
Departamento de Electrnica e Telecomunicaes

Abril 1994

Tese realizada sob superviso do


Prof. Doutor Joo Pedro Estima de Oliveira
Professor Associado do
Departamento de Electrnica e Telecomunicaes da
Universidade de Aveiro

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.

Palavras Chave: Autmatos Programveis, Linguagem de Contactos, Diagramas de


Escada, PLC Virtual, Virtualizao, Programao Orientada por Objectos, Programao em
Ambiente Windows, Interfaces Grficas, Simulao Orientada por Objectos, Simulao em
Tempo Real.

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.

Keywords: Programmable Logic Controllers, Ladder Diagrams, Virtual PLC,


Virtualization, Object Oriented Programming, Programming in Windows, Graphic Interfaces,
Object Oriented Simulation, Real Time Simulation.

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.

Histria e aplicaes industriais

2.2.

Arquitectura dos autmatos programveis

2.2.1.

CPU

2.2.2.

Sistema de entradas e sadas

2.2.3.

Memria

2.2.4.

Variaes na arquitectura

2.3.

Linguagens de programao para autmatos

2.3.1.

Linguagem ladder

7
8

2.3.1.1.

Instrues do tipo rel

2.3.1.2.

Instrues de temporizao e contagem

11

2.3.1.3.

Instrues de manipulao e transferncia de dados

12

2.3.1.4.

Instrues aritmticas

13

2.3.1.5.

Instrues de controlo de programa

13

2.3.2.

O GRAFCET

13

2.3.3.

Linguagens booleanas

14

2.3.4.

Linguagens de mnemnicas

14

2.3.5.

Linguagens de processamento de informao

15

2.4.

Breve descrio do autmato a emular

15

2.4.1.

Configurao do autmato C20H

15

2.4.2.

Configurao da memria

15

FERRAMENTAS UTILIZADAS
3.1.

O Microsoft Windows

3.1.1.
3.2.

18
18

Objectos grficos de interface

19

Programao orientada por objectos

21

3.2.1.

Classes

21

3.2.2.

Encapsulamento

21

3.2.3.

Hereditariedade

21

3.2.4.

Polimorfismo

22

3.2.5.

Metodologia de programao por objectos

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.

Estrutura das aplicaes baseadas no Win++

29

A INTERFACE DO PLC VIRTUAL

31

4.1.

Implementao de objectos grficos de interface com o Win++

32

4.2.

Interface grfica

36

4.3.

A janela da aplicao

37

EDITORES GRFICOS DO PLC VIRTUAL


5.1.

Editor de programao

42
42

5.1.1.

Smbolos (objectos) ladder

42

5.1.2.

Suporte do editor

45

5.1.3.

Janela e ferramentas do editor de programao

48

5.1.4.

Armazenamento em disco

52

5.2.

5.1.4.1.

Formato do arquivo

53

5.1.4.2.

Gravao dos arquivos

53

5.1.4.3.

Leitura dos arquivos

55

Editor de estmulos

59

5.2.1.

Definio de um estmulo

60

5.2.2.

As janelas do editor de estmulos

60

5.3.

Editor da simulao interactiva

64

VIRTUALIZAO DO PLC

66

6.1.

Modelo para a arquitectura do PLC virtual

66

6.2.

Linguagem do PLC virtual

67

6.3.

Memria do PLC virtual

68

6.4.

Simulador

70

6.4.1.

Varrimento do programa ladder

71

6.4.2.

O algoritmo de simulao

74

6.4.3.

A funo virtual de simulao para objectos pluri-celulares

76

6.4.4.

A funo OwnerSimulation

79

6.5.

Modos de simulao

83

6.5.1.

Simulao rpida

84

6.5.2.

Simulao em tempo real

85

6.5.2.1.

A classe de representao de temporizadores no Win++

88

6.5.2.2.

A classe base de PLCs virtuais tempo real

89

6.5.2.3.

A simulao em tempo real normal

90

6.5.2.4.

A simulao em tempo real interactiva

92

CONSIDERAES FINAIS

96

7.1.

Modos de simulao do PLC virtual

96

7.2.

Adies ao sistema PLC virtual

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

As razes apresentadas no ponto anterior foram determinantes na definio dos


objectivos deste trabalho, os quais se expressam genericamente no desenvolvimento de um
modelo de virtualizao para um PLC. Para exemplificar esse modelo dever ser desenvolvida
uma aplicao, a executar em computador pessoal, que emular o comportamento de um PLC real
especfico.
A ideia de base para o modelo prev a construo do PLC por software, de forma a que
as entradas so obtidas com o rato e/ou teclado e as sadas so visualizadas no monitor (figura 1).
O modelo dever definir a implementao dos componentes principais de um PLC real
nomeadamente a memria, o CPU e as unidades de entrada/sada.
A interaco com o utilizador dever ser simultaneamente amigvel e de rpida
aprendizagem tendo em conta os propsitos a que a aplicao final se destina, que o ensino de
programao de PLCs e o teste de solues para problemas de controlo. Para isso, a interface
fornecida pelo Microsoft Windows dever ser a base para a interface grfica do PLC virtual. A
interaco dever ser feita sobre janelas e privilegiando a utilizao do rato, menus e cones.
Devero ento ser construdos editores grficos e visualizadores que permitam, de uma forma
simples e rpida, comunicar com o PLC virtual, desenvolver e armazenar programas e simular a
execuo destes.
Entradas
(teclado, rato)

Editores
grficos

PLC
Visualizadores
virtual

Sadas
(monitor)

Fig. 1 - Comunicao com o PLC virtual

Para a programao do PLC virtual dever ser utilizada a linguagem de contactos


(Ladder), por ser uma linguagem essencialmente grfica e aceite pela grande maioria dos
fabricantes e programadores de PLCs.
Para o desenvolvimento do software do sistema prope-se o uso duma metodologia
baseada na programao por objectos. Os aspectos essenciais envolvidos neste trabalho, que esto
relacionados com interfaces grficas e questes de simulao, vero facilitada a sua
implementao devido s vantagens das linguagens de programao por objectos, nomeadamente
no desenvolvimento de programas de simulao e na construo de interfaces com o utilizador,
bem como a facilidade de reutilizao de cdigo que estas linguagens proporcionam.

1.3.

Estrutura da tese

Esta tese composta por 7 captulos e um apndice. O primeiro captulo pretende


enquadrar o trabalho e traar, na generalidade, os objectivos a atingir.

Os captulos 2 e 3 so captulos introdutrios, que servem para familiarizar o leitor nas


reas chave que este trabalho envolve. Assim, no segundo captulo feita uma abordagem
arquitectura dos autmatos programveis e s suas linguagens de programao. No terceiro
captulo so introduzidas, a partir de alguns exemplos, as ferramentas utilizadas neste trabalho.
Os captulos 4, 5, 6 discutem o sistema implementado. Assim no quarto captulo discutese a interface grfica para o PLC virtual, e a forma como, genericamente, esta foi implementada.
No quinto captulo discute-se a implementao dos diversos editores grficos criados para o PLC
virtual. No captulo 6 apresenta-se o nosso modelo para a virtualizao de autmatos, e discutemse os vrios modos de simulao de programas pelo PLC virtual.
No stimo captulo 7 discutem-se algumas vantagens e desvantagens dos modos de
simulao implementados, tecem-se algumas consideraes sobre possveis upgrades do sistema
PLC virtual, e apresentam-se as concluses e algumas propostas para trabalhos futuros.
Em apndice (Apndice A) apresentado o manual de utilizao do sistema PLC virtual.
Nota: sendo este trabalho essencialmente de implementao, decidimos apresentar ao
longo do texto algum cdigo de classes em C++ desenvolvidas para o sistema. Queremos com isto
fornecer um melhor meio de consulta para possveis continuadores deste trabalho.

Captulo 2
Autmatos programveis

Os autmatos programveis (vulgarmente denominados PLCs do ingls "Programmable


Logic Controllers") so basicamente unidades de hardware, com um CPU e memria, e que so
geralmente utilizados em ambiente industrial para controlo de mquinas e processos.

2.1.

Histria e aplicaes industriais

Na dcada de 60, a necessidade de reduzir os custos devidos s mudanas frequentes nos


sistemas de controlo industriais baseados em rels levou ao desenvolvimento dos conceitos
associados com os autmatos industriais.
Era suposto que os PLCs iriam diminuir o tempo associado produo e facilitar, no
futuro, possveis modificaes nos sistemas de controlo. Os primeiros autmatos industriais foram
instalados no final da dcada de 60 e logo comearam a provar ser um valioso melhoramento em
relao aos painis lgicos de rels. E isto, porque eram de fcil instalao e programao (ou
reprogramao), porque ocupavam menos espao e porque eram mais seguros do que os sistemas
baseados em rels.
Houve dois factores essenciais no desenho do autmato industrial que o levaram a ter o
sucesso que indiscutivelmente hoje em dia lhe reconhecido.
Primeiro, foram usados componentes muito seguros, e os circuitos electrnicos e
mdulos foram desenvolvidos tendo em conta o ambiente industrial, ou seja foram construdos
para resistir ao rudo elctrico, humidade, leo, e elevadas temperaturas.
O segundo factor tem a ver com a linguagem de programao inicialmente utilizada, e
que era a linguagem de diagramas de escada (do ingls ladder), tambm conhecida por linguagem
de contactos, a qual se baseia na lgica de rels. Os sistemas de computadores anteriormente
utilizados falharam, porque os tcnicos e engenheiros industriais no estavam devidamente
treinados nas linguagens de programao usuais de computadores. Contudo, muitos estavam
treinados no desenvolvimento de sistemas de controlo baseados em rels, e a programao numa
linguagem baseada em circuitos de rels foi rapidamente apreendida.
Na dcada de 70, os microprocessadores foram introduzidos nos autmatos, e a
capacidade e o desempenho aumentaram e melhoraram, ficando assim aptos a realizar tarefas cada
vez mais sofisticadas.
Nos finais dos anos 70, as melhorias nos componentes das comunicaes e nos circuitos
electrnicos permitiram colocar os autmatos a centenas de metros do equipamento que

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.

Arquitectura dos autmatos programveis

Independentemente do tamanho, e da complexidade, praticamente todos os autmatos


programveis partilham dos mesmos componentes bsicos (figura 2) e das mesmas caractersticas
funcionais [4], [5].
Autmato programvel
Memria
programa

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

Fig. 2 - Arquitectura de um autmato programvel

Um autmato composto por uma Unidade Central de Processamento (CPU) que


executa ciclicamente o programa armazenado na memria de programa. No incio de cada ciclo de
execuo as entradas, que podem provir de um qualquer processo, so analisadas. No final de
cada ciclo as sadas so actuadas, de acordo com as entradas e o programa de controlo, de modo a
comandar o equipamento ou mquinas envolvidas no processo. Na execuo do programa, o CPU
utiliza a memria do autmato para armazenamento e transferncia de dados. A utilizao da
memria para armazenamento do programa, separada da outra memria, tem a ver com a
necessidade de armazenar os programas no PLC, mesmo com a alimentao desligada.

A consola de programao geralmente utilizada para o desenvolvimento de programas


e para a tranferncia dos programas para o autmato. Uma vez inserido o programa no autmato,
este autosuficiente no necessitando da consola quando em execuo.

2.2.1.

CPU

A Unidade Central de Processamento responsvel pela execuo do programa,


controlando todas as operaes dentro do autmato, atravs de instrues armazenadas na
memria de programa. Um barramento de dados transporta a informao da memria e do sistema
de entradas sadas para o CPU e vice versa. Na maioria dos autmatos (principalmente os mais
modernos) o CPU baseado em um ou mais microprocessadores e outros circuitos que permitem
realizar as funes de controlo e clculo necessrias execuo de programas.

2.2.2.

Sistema de entradas e sadas

O sistema de entradas/sadas fornece a ligao fsica entre o CPU e o processo a


controlar. O autmato, atravs de sensores apropriados, pode medir quantidades fsicas como
velocidade, temperatura, presso, corrente, etc.. Baseando-se nos valores medidos, e no programa
de controlo, o CPU controla as sadas que podero actuar em dispositivos como, por exemplo,
vlvulas, motores, alarmes.
O sistema de entradas/sadas um dos componentes mais importantes num autmato pois
estas necessitam de interagir directamente com equipamento industrial e podem residir em zonas
de elevado rudo elctrico. De facto, uma das grandes inovaes dos autmatos a possibilidade
de ligao directa aos sensores e actuadores sem haver necessidade de circuitos de adaptao.
Para isso as entradas e sadas do autmatos possuem isolamento galvnico (normalmente ptico),
o que lhes d uma melhor fiabilidade e segurana na comunicao com sensores e actuadores. De
facto, o isolamento das entradas/sadas absolutamente necessrio por questes de rudo e de
modo a compatibilizar os diferentes nveis de tenso e potncia existentes entre o autmato e os
processos a controlar.

2.2.3.

Memria

A memria usada para armazenar o programa de controlo (memria de programa) e


possibilitar o armazenamento e a transferncia de dados. Geralmente os autmatos utilizam
memria do tipo RAM, EPROM ou EEPROM. Na maioria dos casos a memria do tipo RAM
utilizada nas fases de desenvolvimento e teste dos programas, enquanto que as memrias do tipo
EPROM e EEPROM so utilizadas para o armazenamento de programas em cdigo executvel e
tambm para armazenamento de configuraes do sistema. No entando, hoje em dia, a tendncia
para a utilizao de memria RAM, devido ao seu baixo consumo, juntamente com baterias que
permitem manter o contedo da memria mesmo com o autmato desligado.
6

A capacidade de memria de cada autmato tem em conta as potencialidades de cada um


e geralmente medida em termos do nmero mximo de instrues de um programa, ou em
termos da capacidade de memria em bytes. Autmatos pequenos tm geralmente um tamanho de
memria fixo, enquanto autmatos maiores permitem a utilizao de mdulos para expanso da
memria.

2.2.4.

Variaes na arquitectura

A necessidade crescente de autmatos para vrios tipos de aplicaes, umas mais


complexas que outras, levou os construtores a desenvolver vrias famlias de autmatos baseadas
em processadores com vrios nveis de desempenho, permitindo ao utilizador a escolha do tipo de
autmato a utilizar de acordo com as necessidades do programa a executar. Por estas razes,
surgiram arquitecturas para os autmatos que permitem a configurao de sistemas modulares. O
construtor fornece, nestes casos, um mesmo autmato-base ao qual so adicionveis mdulos
consoante os requisitos da aplicao. Podemos citar mdulos de entradas/sadas digitais,
entradas/sadas analgicas, mdulos especficos para controlo do tipo PID (proporcional, integral,
diferencial), mdulos para comunicaes, mdulos de memria adicional, mdulos com
contadores rpidos, entre outros.

2.3.

Linguagens de programao para autmatos

A programao dos autmatos feita usando ferramentas de programao, que podem


ser consolas fornecidas pelo construtor, ou software geralmente executado a partir de um
computador pessoal (PC).
Embora tenha surgido h pouco tempo um standard (IEC 1131 Standard - Part 3, 1993)
que define um grupo de linguagens para a programao de PLCs, no nos foi possvel usar esse
documento em virtude de, embora encomendado, ainda no estar disponvel. Assim, as linguagens
sero apresentadas com base em descries de outros autores.
As linguagens de programao dos autmatos podem ser agrupadas em duas grandes
categorias [5]: Linguagens Grficas e Linguagens Literais. As linguagens grficas, que foram as
primeiras a ser utilizadas nos autmatos, fornecem um conjunto de smbolos grficos que so
ligados entre si de forma a constiturem um programa. Por linguagens literais entende-se um
conjunto de linguagens cujas instrues so escritas na forma de expresses literais usando partes
em texto e palavras reservadas dessas linguagens.
Nas linguagens grficas podemos destacar a linguagem de diagramas de contactos e a
linguagem GRAFCET. Das linguagens literais destacam-se as linguagens booleanas, linguagens
de mnemnicas e linguagens de processamento de informao do tipo das usadas em programao
de computadores.

2.3.1.

Linguagem ladder

A partir dos diagramas de rels, os construtores americanos derivaram uma linguagem


para programao de autmatos industriais, e que tem a grande vantagem de ser parecida com a
lgica tradicional de contactos. A maioria dos fabricantes de autmatos fornece, h j bastante
tempo, a linguagem ladder para a programao dos seus autmatos. Esta linguagem vai ser
analisada com maior detalhe pois a linguagem utilizada neste trabalho, pelas razes que
explicitaremos mais adiante.
A linguagem ladder consiste numa lista de instrues simblicas que, quando
interligadas entre si, de uma determinada forma, constituem um programa para autmatos. Esta
linguagem composta, segundo HUGHES [4], por seis categorias de instrues que incluem:
instrues do tipo rel, temporizao/contagem, manipulao de dados, aritmticas, transferncia
de dados e controlo de programa.
Um programa escrito em linguagem ladder consiste em N degraus, em que cada degrau
pode representar graficamente uma equao booleana. A principal funo destes degraus a de
permitirem controlar sadas a partir de condies de entrada. Tanto as entradas como as sadas
podem ser fsicas ou pontos internos do autmato (posies de memria usadas para armazenar
informao com um formato do tipo bit).
A figura 3 mostra a estrutura bsica de um degrau. Neste caso, a sada s ser actuada
quando existir continuidade lgica, isto quando houver pelo menos um caminho fechado desde o
incio de continuidade lgica at sada.
Sada

Fim de
continuidade

Incio de
continuidade

Caminho necessrio para haver continuidade lgica

Fig. 3 - Degrau num diagrama de escada

As sadas (tambm apelidadas de bobinas) e os contactos, so os smbolos bsicos da


lista de instrues da linguagem ladder. Os contactos, programados ao longo de um determinado
degrau, representam condies que depois de avaliadas determinam o controlo da sada.
A programao dos contactos e das sadas, consiste na atribuio de endereos que
identificam o que est a ser avaliado e o que est a ser controlado. Cada endereo referencia a
localizao de um ponto interno da memria, ou identifica a sada ou a entrada. Um contacto,
independentemente de representar uma entrada ou uma sada, ou um ponto interno, pode ser
utilizado em qualquer parte do programa, sempre que aquela condio necessite de ser avaliada.

A organizao dos contactos nos degraus depende do controlo lgico desejado. Os


contactos podem ser colocados em srie, paralelo ou srie/paralelo, dependendo do controlo
necessrio para uma dada sada.

2.3.1.1. Instrues do tipo rel


Estas instrues permitem examinar o estado (ON/OFF) de um ponto interno ou entrada,
e controlar o estado de um ponto interno ou de uma sada.
Contacto normalmente aberto
O endereo referenciado pode ser uma entrada, um ponto interno ou uma sada. Se o
estado for ON quando o contacto est a ser examinado ento este fecha-se e assegura a
continuidade lgica. Se o estado for OFF ento sucede o contrrio e o contacto abre-se quebrando
a continuidade lgica.
Contacto normalmente fechado
O princpio de funcionamento idntico ao anterior, mas ao contrrio. Quando o estado
for OFF existe continuidade lgica e quando o estado for ON no existe continuidade lgica.
Incio de ramificao
Inicia cada um dos ramos paralelos. a primeira instruo quando se pretende realizar a
funo lgica OR.
Fim de ramificao
Termina um conjunto de ramos paralelos, isto , termina o caminho de continuidade para
um circuito OR.
Sada normalmente aberta
Usada para controlar uma sada ou um ponto interno. Coloca no estado ON, a sada ou o
ponto interno, quando existe continuidade lgica, e vice versa.
Sada normalmente fechada
O seu comportamento o inverso da sada normalmente aberta.
Exemplos:
O degrau que corresponde descrio em linguagem ladder da equao booleana
A + B = C , o seguinte:
A

Para a equao booleana A + B = C , o degrau ser:


C

Como se pode verificar com estes dois exemplos, a realizao de um OR lgico


corresponde ligao em paralelo de dois smbolos, enquanto que para a realizao de uma
negao lgica basta a utilizao de contactos ou sadas normalmente fechadas.
A seguir, apresenta-se um exemplo para se verificar que um AND lgico se realiza
atravs da ligao em srie de contactos. Para a equao lgica ( A + B) C A D = Y , o degrau
correspondente ser:
A

Vejamos agora um exemplo bastante simples, mas concreto: o arranque e a paragem de


um motor com as tradicionais botoneiras Start e Stop. Como bem conhecido, para comandar um
motor a partir de botoneiras necessrio fazer a chamada auto-alimentao. essa a funo do
rel Motor, que garante que o motor continue a trabalhar quando se deixa de premir a botoneira
Start. O degrau para comandar desta forma o motor seria:
Start

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

2.3.1.2. Instrues de temporizao e contagem


So instrues de sada com funes idnticas s fornecidas pelos temporizadores e
contadores construdos mecnica ou electronicamente. So geralmente utilizadas para activar ou
desactivar um dispositivo ao fim de determinado tempo ou contagem.
O seu princpio de funcionamento idntico pois ambos podem ser considerados
contadores. Um temporizador conta um nmero de intervalos de tempo fixos, necessrio para
atingir a durao pretendida, enquanto que um contador regista o nmero de ocorrncias de um
determinado evento.
As instrues de temporizao e contagem necessitam de dois registos: um registo para
armazenar o nmero de contagens j efectuadas e outro registo para armazenar o valor inicial.
Atraso operao TON
Usada para providenciar atraso numa determinada aco, ou para medir a durao da
ocorrncia de um evento. A temporizao iniciada quando a condio de entrada verdadeira,
sendo o temporizador inicializado quando a condio de entrada deixar de ser verdadeira. No
diagrama temporal apresentado a seguir podem-se analisar os sinais da condio de entrada e o
sinal de sada do temporizador.
Condio
de entrada
Sada do
temporizador

tempo pretendido

Atraso desoperao TOFF


Usada para atrasar a desactivao de uma determinada sada ou ponto interno. Se a
continuidade lgica for quebrada por algum motivo, o temporizador inicia a contagem do tempo
respectivo ao fim do qual coloca a sua sada inactiva, como se pode analisar na figura seguinte:

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.

2.3.1.3. Instrues de manipulao e transferncia de dados


A evoluo da linguagem ladder veio permitir a insero de mdulos na linguagem. De
facto a maior parte dos fabricantes no utiliza somente instrues ladder com uma entrada e uma
sada. Nesta abordagem, considera-se como um mdulo as instrues que contm mais do que
uma entrada e/ou sada, ou em que a aco da instruo envolve mais do que um bit. A introduo
deste tipo de instrues permite a utilizao desta linguagem para a resoluo de problemas de
maior complexidade.
Como mdulos encontram-se instrues para transferncias de palavras de uns registos
para outros, converso de formatos das palavras (por exemplo de formato binrio para formato
BCD e vice versa), instrues de deslocamento (shift registers), entre outros. Em quaisquer destas
instrues so especificados os endereos da palavra fonte e da palavra destino.
Outro tipo de instrues so as de comparao de dados, atravs das quais possvel
comparar palavras armazenadas em dois endereos. A sua sada geralmente em bit, o que
permite elaborar estruturas de deciso com base na comparao de dados com mais de um bit.

12

2.3.1.4. Instrues aritmticas


Estas instrues incluem as quatro operaes aritmticas bsicas: adio, subtraco,
multiplicao e diviso. Existem, no entanto, autmatos que fornecem outro tipo de operaes
aritmticas como, por exemplo, a raiz quadrada, complemento, incremento/decremento.

2.3.1.5. Instrues de controlo de programa


Este tipo de instrues usado a fim de alterar a sequncia de execuo do programa. As
instrues de controlo de programa tornam assim possvel a execuo de partes de programa de
uma forma condicional, e alm disso, permitem a utilizao do conceito de subrotina na
linguagem ladder. A subrotina toma geralmente a forma de um mdulo definido pelo utilizador.
As instrues mais representativas so apresentadas a seguir:
JMP label- a prxima instruo a executar a instruo cujo endereo label.
LABEL - permite especificar um endereo na forma textual.
CALL - label chama uma subrotina
cujo cdigo est localizado no endereo
especificado em label. A instruo a executar aps a execuo da subrotina, a instruo
localizada a seguir instruo de CALL.
RET - instruo para marcar o fim de uma subrotina.
END - instruo que marca o fim do programa.
As instrues de chamada a subrotinas permitem uma modularizao dos programas,
pois possibilitam a execuo de mdulos pr-definidos pelo programador, rentabilizando a
memria existente para a criao de programas.
Muito embora o leque de instrues ladder implementadas pelos diversos fabricantes
seja muito variado, dependendo na maioria dos casos da gama do autmato, abordaram-se neste
ponto os tipos de instrues mais geralmente utilizadas em aplicaes de pequena complexidade.

2.3.2.

O GRAFCET

Foi originalmente uma metodologia aplicada na representao grfica de algoritmos


usados em sistemas de controlo. Devido utilizao de smbolos grficos para a representao
desses algoritmos e boa legibilidade na anlise funcional dessas representaes, alguns
construtores transformaram o grafcet numa linguagem de programao.
Um diagrama em grafcet engloba, basicamente, trs entidades distintas que so as etapas,
as condies de transio e as tarefas (figura 4).

13

Tarefa n-1

Etapa n-1

T n-1

Tarefa n

Etapa n

Tn

Tarefa n+1

Etapa n+1

Fig. 4 - Etapas, transies e tarefas no grafcet

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

As linguagens booleanas permitem transcries directas de equaes booleanas. Esta


linguagem foi inicialmente baseada nos operadores booleanos como os operadores AND, OR ou
NOT. Por exemplo, poder-se-ia introduzir directamente a equao lgica ( A B + C) D = Y que
correponderia ao clculo do primeiro membro e atribuio do resultado ao segundo membro.

2.3.4.

Linguagens de mnemnicas

As linguagens de mnemnicas usam o formalismo da linguagem assembler. Uma


linguagem deste tipo corresponde na prtica utilizao directa das instrues fornecidas pelo
autmato. O maior interesse destas linguagens a possibilidade do programador tirar vantagens
de todas as potencialidades oferecidas pelo autmato, muito embora para aplicaes sequenciais
tornem a programao mais complicada e confusa. Por outro lado, a escrita do programa mais
penosa, dificultando tambm a correco de erros nos programas.

14

2.3.5.

Linguagens de processamento de informao

As linguagens de processamento de informao surgiram nos autmatos por influncia


dos computadores, e podem ser consideradas como de alto nvel. So utilizadas para resolver
problemas mais complexos, com destaque para o controlo analgico, controlo PID, controlo de
eixos, manipulao de grandes quantidades de dados, entre outros que seriam de difcil resoluo
utilizando as linguagens mencionadas nos pontos anteriores. De entre estas linguagens podemos
citar as linguagens BASIC, C e PASCAL.

2.4.

Breve descrio do autmato a emular

Como um dos objectivos deste trabalho a contruo de um simulador que execute as


instrues de um autmato real, torna-se necessrio concretizar esse equipamento, de modo a
comparar os resultados de ambos os sistemas.
O autmato escolhido foi o modelo C20H da OMRON, por ser um modelo
razoalvelmente potente e estar disponvel no ambiente de trabalho onde estvamos inseridos.
Segue-se uma apresentao breve do hardware do autmato utilizado, deixando-se a
descrio das instrues para um momento posterior, contemporneo da anlise da implementao
das instrues do PLC virtual.

2.4.1.

Configurao do autmato C20H

Na configurao base, o autmato fornece 12 entradas e 8 sadas; no entanto, o nmero


de entradas e sadas fsicas pode ir at um mximo de 48 entradas e 32 sadas, utilizando unidades
de expanso. O modelo C20H contm uma interface RS-232, que pode ser utilizada para
comunicao com um terminal ou um computador. Em termos de linguagem ladder a OMRON
fornece para este autmato 77 instrues [7].

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

Palavras: 247 --- 255


Bits:
24700 --- 25515

Auxiliary Relay

AR

Palavras: 00 --- 27
Bits:
0000 --- 2715

Data Memory

DM

Holding Relay

HR

Leitura/Escrita: 0000 --- 0999


Somente Leitura: 1000 - 1999
Palavras: 00 --- 99
Bits:
0000 --- 9915

Timer/Counter

TC

000 --- 511

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.

Em geral, para aceder a uma determinada posio de memria utilizada em primeiro


lugar a designao, depois o nmero de palavra e, em seguida, o nmero do bit (se for caso disso).
rea de memria Internal Relay
Esta rea de memria acedida ou por bit ou por palavra, e est compreendida entre as
palavras 000 e 246. Nesta rea encontram-se os bits ou palavras correspondentes s entradas e s
sadas fsicas, e ainda os bits ou palavras para trabalho. Estes bits ou palavras para trabalho so
normalmente usados, ao longo do programa, para armazenamento de informao.
Para o autmato C20H a palavra de entrada IR000, enquanto a palavra de sada
IR002, o que significa que, em termos de bits, as entradas esto compreendidas entre IR00000 e
IR00011 e as sadas entre IR00200 e IR00207.
Para as unidades de expanso, as palavras de entrada e de sada dependem do nmero da
unidade. Por exemplo, para a primeira unidade de expanso a palavra de entrada IR010 e a
palavra de sada IR012.
rea de memria Special Relay
Esta rea de memria contm flags e bits de controlo usados para monitorar as operaes
do autmato, aceder aos impulsos do relgio e sinalizar erros.
rea de memria Auxiliary Relay

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

A escolha do Microsoft Windows para a base da interface grfica do sistema teve em


considerao vrios factores, dos quais se destacam os seguintes:
A deciso da utilizao de um computador pessoal (PC) para esta aplicao. Esta plataforma
parece ser a mais adequada tendo em conta a proliferao de PCs no mundo industrial e
tambm no mundo do ensino [8], dado o seu baixo custo quando comparado com outro tipo de
computadores, como sejam por exemplo as estaes de trabalho.
Parece bvio que um sistema de janelas seria o mais apropriado para este tipo de aplicao.
Como do conhecimento dos programadores de PLCs, o software de apoio programao
fornecido actualmente pela maioria dos fabricantes , em geral, antiquado no que diz respeito
interface com o utilizador. De facto, o tempo dispendido na aprendizagem de uma nova
interface de programao pode ser em alguns casos bastante significativo. Em contrapartida,
os sistemas com janelas, sob o ponto de vista de interaco com o utilizador, permitem uma
aprendizagem mais rpida de uma nova aplicao. Por estas razes, pode aqui afirmar-se que a
interface com o utilizador fundamental, pois quanto mais intuitiva e universal ela for, menor
o tempo de aprendizagem das suas caractersticas.
Analisando as revistas da especialidade, verifica-se que as aplicaes DOS esto a
desaparecer, para dar lugar a aplicaes que correm sobre o Microsoft Windows, pelo menos
quando a interface com o utilizador fundamental como em editores, folhas de clculo,
grficos, simuladores. Actualmente, a interface do Windows conhecida pela maior parte dos
utilizadores de computadores pessoais, donde a aprendizagem de uma nova aplicao que
corra nesse ambiente fica facilitada, j que a base da sua interface idntica de muitas outras
aplicaes.

18

Seguidamente sero revistos globalmente os princpios de funcionamento do Microsoft


Windows, e apresentados sucintamente os diferentes componentes de interaco com o utilizador
utilizados na interface grfica do Windows.
O Windows fornece uma interface grfica (GUI) que facilita a criao de programas
interactivos. Esta GUI fornece um conjunto de objectos de interaco com o utilizador, como por
exemplo menus, janelas e cones, permitindo que todos os programas para o Windows possuam a
mesma aparncia, tornando-os mais fceis de apreender e usar [9].
A estrutura dos programas para Windows diferente da estrutura dos programas para o
MS-DOS, e parecida com outras GUI, como por exemplo Apple Macintosh, OS/2 Presentation
Manager, Motif e XView, que correm em ambientes que so geridos por eventos (event driven),
isto , a estrutura de operao deste tipo de programas centrada volta de eventos gerados pelo
utilizador (teclado ou rato).
A programao event driven suportada atravs do sistema de mensagens do Windows.
A ocorrncia de um evento gera uma mensagem que colocada numa fila de mensagens. Estas,
por sua vez, so enviadas uma a uma para as respectivas aplicaes.
As mensagens so importantes para a programao em Windows, j que, de facto, a
maior parte do trabalho do programador consiste em decidir quais as mensagens que vai processar
e em desenvolver o cdigo para atender a cada mensagem.
Um programa, ao processar uma determinada mensagem, aguarda o aparecimento de
outra mensagem. Quando o utilizador necessita de trabalhar com um programa, ele foca a sua
ateno na janela utilizando o rato ou o teclado. Esta aco faz com que as mensagens sejam
enviadas para a aplicao ou janela que contm o focus de mensagens, isto , a que est activa de
momento.
As mensagens fornecem a entrada para o programa, enquanto que a sada do programa
somente a sada grfica. Esta forma de sada grfica diferente da filosofia dos sistemas
tradicionais onde a sada geralmente em texto.
Usando uma filosofia independente dos dispositivos grficos (GDI), o Windows permite
que um programa escreva da mesma forma em qualquer dispositivo, isto , recorrendo chamada
das mesmas subrotinas. Por exemplo, para escrever numa janela ou imprimir numa impressora,
utilizam-se as mesmas funes, mas actuando sobre dispositivos diferentes. Assim sendo, cada
dispositivo grfico possui uma janela de sada grfica prpria, sendo, o Windows responsvel pelo
clip automtico para essa janela, isto , a sada limitada pelo bordo da janela.

3.1.1.

Objectos grficos de interface

O Windows suporta um conjunto de objectos grficos de interface, nomeadamente


janelas, cones, menus, caixas de dilogo [10]. A forma como o Windows suporta estes objectos
grficos permite aos programadores utiliz-los nas suas aplicaes, sendo mnimo o esforo para a
sua criao e manuteno. Cada objecto grfico tem associado um conjunto de mensagens que
permitem a interaco com a aplicao.
19

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.

Programao orientada por objectos

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

classes definidas acima na hierarquia. Este conceito de hereditariedade reduz a duplicao de


cdigo, e contribui para um desenvolvimento de software mais eficiente.
A herana providencia uma forma de definir uma nova classe de objectos, adicionando
novos dados ou mtodos a classes previamente definidas. Se uma classe, B, herdeira de uma
classe A, todos as caractersticas (dados e mtodos) desta ficam automaticamente disponveis na
classe B, sem haver necessidade de uma nova definio. A classe B pode por seu lado adicionar
novas caractersticas para os seus fins especficos. O conceito de herana permite ainda que
mtodos da classe A possam ser redefinidos na classe B; esta redefinio corresponde reescrita
local, para a classe B, do cdigo adequado ao mtodo redefinido.
Segundo MEYER [14], um dos maiores problemas no desenvolvimento de software
reutilizvel a necessidade de ter em conta as caractersticas comuns aos grupos de dados
abstractos relacionados entre si. Como j foi referido atrs, utilizando o mecanismo da herana
podem-se construir hierarquias de classe ligadas por relaes de herana. Neste contexto, a ideia
mover a definio de cada caracterstica o mais acima possvel na hierarquia de classes, para que
possa ser partilhada (sem necessidade de repetir a sua definio) pelo maior nmero possvel de
classes de nveis mais abaixo. A herana assim uma tcnica fundamental para a reutilizao de
software.

3.2.4.

Polimorfismo

O ltimo conceito, polimorfismo, permite a existncia de mtodos com o mesmo nome


acima e abaixo numa hierarquia de classes, com cada classe a implementar a aco (mtodo) de
uma forma apropriada para si prpria. O conceito de polimorfismo, e o seu complemento
principal, a ligao dinmica (dynamic binding), permitem que as operaes e as aces
(respostas a mensagens) se adaptem automaticamente ao objecto sobre o qual so aplicadas, o que
significa que o sistema, quando em execuo, selecciona automaticamente a verso da operao
correspondente ao objecto que recebe a mensagem, isto , a mesma mensagem pode originar
respostas diferentes consoante o receptor.
O polimorfismo permite, assim, consistncia no envio de mensagens para objectos de
classes que tm um antepassado comum.

3.2.5.

Metodologia de programao por objectos

A tarefa do programador no desenvolvimento de software a de decidir sobre e definir


quais as classes de objectos a utilizar na sua aplicao. As classes devem ser implementadas, tanto
quanto possvel, como unidades teis e interessantes por si prprias, independentemente dos
sistemas a que pertencem, possibilitando desta forma o uso das mesmas classes noutras
aplicaes. O desenvolvimento de programas baseia-se em melhoramentos sucessivos dessas
classes de objectos. A programao com classes muda a nfase do desenvolvimento de algoritmos
para o desenvolvimento de classes.
22

Cada classe uma representao directa de um conceito ou de uma entidade no


programa; cada objecto manipulado pelo programa de uma classe especfica que define os seus
comportamentos. Por outras palavras, qualquer objecto num programa de uma classe que define
a lista de operaes possveis no objecto.
A estruturao do software resulta do estabelecimento das relaes entre os objectos
envolvidos na aplicao, nomeadamente relaes de cliente e de descendente. Uma classe
considerada cliente de outra quando faz uso dos seus mtodos (uso de objectos do tipo dessa
classe), e considerada descendente de uma ou mais classes quando desenvolvida como uma
extenso ou especializao dessas classes.

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

animais vertebrados. No exemplo proposto, os conceitos de crculo, rectngulo e segmento de


recta envolvem o conceito mais geral de figura.
Num programa, a representao de um conceito como um tipo, requer processos para
exprimir as relaes entre os tipos. O C++ permite especificar hierarquias organizadas de classes,
sendo esta a caracterstica chave do suporte para a programao orientada por objectos.
Consideremos um tipo definido, Figura, para uso num sistema grfico. O sistema tem de
suportar crculos, tringulos, rectngulos, elipses e muitas outras figuras. Em primeiro lugar
especifica-se uma classe que define as propriedades gerais de todas as figuras, estabelecendo o
conceito mais geral deste exemplo.
class Figura
{
private:
ponto centro;
int cor;
public:
Figura():centro(0,0);{cor = 0;}
Figura(ponto cent, int co):centro (cent){ cor = co; }
~Figura(){}
ponto centro_Figura(){return centro;}
int cor_figura{return cor;}
void translacao(ponto novo_centro) {centro=novo_centro; desenho();}
virtual void desenho() = 0;
virtual void rotacao(int) = 0;
};

Podemos definir j a interface de chamada para as funes desenho() e rotacao(), mas


ainda no possvel definir a sua implementao. Estas funes so ento, declaradas "virtual" e
vo ser definidas para cada figura especfica. Aplicando os mecanismos de polimorfismo e ligao
dinmica, pode-se querer especificar funes para desenho e de rotao ao nvel de Figura, e
obrigar a que cada classe terminal, descendente de Figura, fornea as implementaes para estas
duas funes. Isto conseguido declarando as funes como funes virtuais puras ( = 0). Uma
classe virtual uma classe que contm pelo menos uma funo virtual.
Dada este definio da classe Figura, podem escrever-se funes gerais de manipulao
de figuras, aproveitando os conceitos de polimorfismo e de ligao dinmica:
void rotacao_todas(Figura* v[], int numero, int angulo)
{
for(int i = 0; i<numero; i++)
v[i]->rotacao(angulo);
}

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

definio e o cdigo correspondentes funo translacao() vo ser herdados pelas classes


descendentes da classe figura. No que diz respeito aos mtodos desenha() e rotacao(), o cdigo
ter que ser fornecido para cada classe criada para representar uma nova figura, pois estes
mtodos devem ser diferentes para cada figura devido forma grfica e ao algoritmo de rotao
serem diferentes para objectos grficos distintos.
Na definio da classe esto implcitas outras regras da linguagem C++, nomeadamente o
conceito de construtor, o conceito de funes inline, o conceito de encapsulamento
(caractersticas publicas (public) e caractersticas privadas (private)), e ainda a possibilidade de
existirem funes com o mesmo nome, sendo estas diferenciadas atravs dos seus parmetros, isto
, overload de funes (o caso dos dois construtores).
O construtor (neste caso, Figura) para uma classe o mtodo invocado automaticamente
quando se quer crir um objecto (instncia de uma classe). Enquanto que uma classe representa um
tipo, um objecto representa uma entidade fsica cujo comportamento definido pela sua classe.
Alm do construtor tambm poder existir o destrutor (~Figura()), que invocado pelos
mecanismos internos da linguagem sempre que um objecto de uma determinada classe
destrudo. O destrutor permite, por exemplo, libertar memria eventualmente alocada com o
operador new.
As funes inline (Figura, translacao, centro_figura e cor_figura) obedecem s regras
usuais dos tipos, ao contrrio das macros comuns usados em C. Essas funes so expandidas na
compilao em vez de serem invocadas quando em execuo. A substituio inline de funes
particularmente importante no contexto da abstraco de dados e programao por objectos. Com
estas tcnicas de programao, as funes muito pequenas so muito comuns, e o aumento do
nmero de chamadas a funes pode no implicar diminuio do desempenho.
Os dados escondidos (encapsulados) so os dados ou mtodos que aparecem a seguir
palavra reservada private, sendo esses dados somente acedidos pelos mtodos centro_figura e
cor_figura. Isto evita o uso indevido desses dados por parte de programadores que usem esta
classe para construir as suas hierarquias de classes.
As caractersticas pblicas (definidas a seguir palavra reservada public) de uma classe
constituem a interface que objectos instanciados desta classe fornecem para o exterior.
Para definir uma figura em particular pode-se declarar que uma figura e especificar as
suas caractersticas especficas; por exemplo, a classe para representar um segmento de recta
poderia ser definida da forma seguinte:
class Segmento_Recta :public Figura
{
private:
//um segmento de recta uma figura.
ponto fim; // o ponto centro herdado de Figura representa o incio do segmento de recta
public:
Segmento_Recta(ponto ini, ponto fi, int cor):Figura(inicio, cor), fim(fi){}
int operator == (Segmento_recta & oSeg) {
return ( (inicio_seg()==oSeg.inicio_seg()) && (fim_seg() == oSeg.fim_seg()) );

25

}
ponto inicio_seg(){return centro_figura();}
ponto fim_seg(){return fim;}
void desenho();
void rotacao(int angulo);
}

A classe Segmento_Recta diz-se derivada da classe Figura, e a classe Figura a classe


base da classe Segmento_Recta. Uma classe derivada herda as caractersticas da sua classe base e
tambm tem as suas caractersticas especficas. Por exemplo, a classe Segmento_Recta tem um
membro "fim", em adio aos membros "cor" e "centro" que herdou da classe Figura. Alm disso,
tem duas novas funes para aceder aos pontos que definem o segmento de recta (inicio_seg() e
fim_seg()). Outra funo (int operator ==), exemplifica outra caracterstica importante do C++
que o overloading de operadores, neste caso trata-se da redefinio do operador relacional == de
modo a que seja possvel testar a igualdade de segmentos de recta, da mesma forma que se testa a
igualdade de, por exemplo, variveis inteiras.
Outra regra aqui detectada a obrigatoriedade da invocao do construtor da classe base
(caso esta o tenha) no construtor da classe derivada. Alm disso, pode-se tambm invocar o
contrutor de objectos membros da classe (neste caso o construtor de classe ponto).
Por fim, verifica-se que a nova figura "Segmento_Recta" foi adicionada sem haver a
necessidade de modificar o cdigo j escrito inclusiv o cdigo para a funo rotacao_todas(). A
capacidade de estender um programa, adicionando novas variaes de uma dada classe (isto ,
adicionando novas classes derivadas de uma classe base) sem modificar o cdigo j escrito, uma
grande vantagem face a outras tcnicas de programao.

3.4.

Windows e C++

O presente projecto envolve o desenvolvimento de aplicaes em C++ para Windows;


para tal recorre-se a mecanismos fornecidos pela linguagem C++ e interactuantes com o
Windows, de forma a utilizar este ambiente numa filosofia de programao por objectos.
O problema que a interface de programao de aplicaes (API) do Windows inclui
uma grande quantidade de funes e, alm disso, define um elevado nmero de mensagens a que
uma janela pode ter necessidade de responder [17].
Qualquer janela no Windows pertence a uma classe que comporta um conjunto de
procedimentos associados a esta. Quando o Windows est a correr, so enviadas mensagens a uma
janela sob a forma de chamada de um procedimento adequado da janela.
A tarefa bsica de um procedimento da classe janela identificar a mensagem que lhe foi
enviada, process-la e devolver o controlo (ao remetente da mensagem). Numa base ideal, todos
os procedimentos da classe janela deviam estar habilitados a processar todas as mensagens
possveis do Windows; como isso impossvel na prtica, a classe janela s fornece
processamento dedicado para uma lista limitada de mensagens, re-enviando as restantes para uma

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 ++

A deciso de utilizar o Windows em conjunto com uma linguagem de programao


orientada para objectos, levou utilizao de uma biblioteca de classes disponveis
comercialmente: o Win++ [18] fornece uma hierarquia de classes para o desenvolvimento de
aplicaes para o Windows, usando as facilidades de programao orientada para objectos,
atravs do uso da linguagem C++.
A utilizao do Win++ implicou um estudo da biblioteca de classes e do seu
enquadramento no mbito do desenvolvimento de aplicaes para o Windows. De seguida
descreve-se sucintamente esta biblioteca de classes, bem com a estrutura das aplicaes que usam

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++

A figura 5 mostra uma parte da hierarquia de classes do Win++, excluindo-se as classes


no utilizadas neste trabalho, de modo a simplificar a apresentao.

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

Fig. 5 - Hierarquia de classes utilizadas neste trabalho (classes do Win++)

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

A apresentao da hierarquia (figura 5) tem por finalidade mostrar ao leitor as relaes


de herana entre as vrias classes do sistema, facilitando assim a exposio do software
desenvolvido neste trabalho. A importncia de algumas destas classes na estrutura do software,
principalmente nos mdulos correspondentes interface grfica, de tal forma acentuada que
necessrio explicar com certo detalhe algumas das caractersticas dessas classes. Essa explicao
ser apresentada nos captulos seguintes, quando tal for considerado necessrio.

3.4.3.

Estrutura das aplicaes baseadas no Win++

A classe BCApplication o ponto de partida para qualquer aplicao desenvolvida com


base nas classes do Win++. Esta classe contm informao identificadora da aplicao
(nomeadamente o seu instance handle, que identifica qualquer aplicao a correr no Windows),
um ponteiro para os argumentos da linha de comando e outra informao de alto nvel associada
com a aplicao.
O cdigo para a funo WinMain est definido no Win++ de tal forma que, nessa funo,
criada uma instncia da classe BCApplication e invocada internamente a funo StartUp
pertencente classe BCApplication. Recordamos que a funo WinMain o ponto de entrada para
todas as aplicaes para ambiente Windows.
As funes StartUp e ShutDown so declaradas, mas no definidas, na classe
BCApplication. O programador deve portanto codificar cada uma destas funes, as quais so
invocadas internamente pelo Win++ quando a aplicao iniciada (StartUp), e quando a
aplicao terminada (ShutDown). Em StartUp deve-se proceder inicializao global da
aplicao, nomeadamente deve criar-se uma instncia da janela de aplicao BCMainWindow e,
em seguida, invocar a funo membro Run, que responsvel pelo processamento das mensagens.
Antes da aplicao terminar, a funo membro ShutDown invocada de dentro da funo
Run. Este procedimento d a oportunidade ao programador de "apagar" informao,
nomeadamente para libertar alguns recursos do Windows que tenham sido alocados pela
aplicao.
Uma vez em execuo, o programa constitui um suporte s mensagens originadas (a
partir dos dispositivos de entrada, rato e teclado) por outras aplicaes, pela prpria aplicao ou
pelo prprio Windows. O trabalho do programador o de criar objectos que captem essas
mensagens. Nesse processo h que criar, principalmente, funes membro para suporte de
eventos, funes essas que substituam as funes fornecidas por defeito pelo Win++, para as
mensagens que explicitamente se querem suportar.

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

Fig. 6 - Modelo para a arquitectura do PLC virtual

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.

Implementao de objectos grficos de interface com o Win++

Como j foi referido, o Windows fornece um conjunto de objectos grficos de interface.


Alguns desses objectos, por exemplo, bitmaps, menus ou cones, podem ser definidos como
recursos dentro de uma aplicao. Um recurso representa ento um objecto de interface do
Windows, que pode ser includo numa aplicao sem haver a necessidade de o gerar atravs de
cdigo na linguagem base. Os recursos so portanto desenhados e especificados fora do cdigo da
aplicao, e posteriormente so adicionados ao cdigo compilado do programa de modo a criar
um ficheiro executvel para o ambiente Windows.
Existem ferramentas, nomeadamente o Borland Workshop [19], que permitem gerar
todos os recursos para uma aplicao, possibilitando tambm a sua gravao num ficheiro de
recursos (.rc). Cada recurso, presente no ficheiro de recursos, identificado com um nmero
nico (ID).
Para construir a a interface entre os recursos da aplicao e o cdigo fonte (.cpp), o
Win++ fornece a classe BCResID. Um objecto, instanciado dessa classe, definido para um
determinado recurso permite aceder a todas as suas caractersticas, sendo assim possvel construir
um do Win++ para representar esse recurso.
Depois de definidos os recursos, o ficheiro de recursos compilado pelo compilador de
recursos (Resourse Compiler [19]) dando origem a um ficheiro de recursos compilado (.res),
sendo posteriormente ligado ao cdigo objecto (.obj) da aplicao pelo mesmo compilador, de
modo a criar um ficheiro executvel (.exe) para o Windows. Na figura 7 apresentada a sequncia
de aces necessria para o desenvolvimento de uma aplicao para ambiente Windows. No topo
dos vrios rectngulos aparece a extenso dos ficheiros definidos no interior do rectngulo

.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

Fig. 7 - Construo de uma aplicao para ambiente Windows

Como j foi referido o Windows define vrios objectos grficos de interface.


Seguidamente apresenta-se a forma como alguns desses objectos so construdos usando as
classes fornecidas pelo Win++, nomeadamente bitmaps, cursores, menus e caixas de dilogo.

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

criao da janela da caixa de dilogo (Create). No caso de classes derivadas de BCModalDialog,


essa funo no regressa enquanto no for invocada a funo para terminus da caixa de dilogo,
EndDlg; para as classes derivadas de BCModelessDialog a funo Create regressa aps a criao.
As seleces so executadas por manipulao de objectos grficos denominados por
controlos. O editor de caixas de dilogo do Workshop permite desenhar a caixa de dilogo
incluindo o posicionamento dos controlos. Por exemplo, a criao de uma caixa de dilogo para a
edio dos parmetros dos objectos na janela da simulao interactiva (Apndice A, ponto
A.5.4.3.3), baseou-se na classe seguinte:
class IntSimulEditButtonDlg : public BCModalDialog
{
InputOutputRadioButton *opInOutButton;
// ponteiro para o objecto a editar os parmetros
C20RealSimulInteractive *opIntSimulDlg;
// ponteiro para a janela de simulao interactiva
BCRadioButton *opRadioLabel;
// ponteiro para o boto Etiqueta
BCRadioButton *opRadioAddress;
// ponteiro para o boto Endereo
BCPushButton *opOKButton;
// boto de controlo OK
BCStringEdit *opLabelEdit;
// para edio da string da etiqueta
BCStringEdit *opAddressEdit;
// para edio da string do Endereo
BCStaticText *infoText;
// para escrita do texto de informao
protected:
WORD Initialize(VOID);
VOID ButtonSnglClk(BCEvent *opEvt);
...
public:
IntSimulEditButtonDlg (InputOutputRadioButton *opInOutButton, C20RealSimulInteractive *opIntSimulDlg,
BCResID &oResID);
...
};

O processo de criao de uma nova caixa de dilogo comporta vrias fases.


Em primeiro lugar deve-se definir o template da caixa de dilogo, com todos os controlos
necessrios, utilizando por exemplo o utilitrio Workshop. O Win++ fornece uma classe tipo para
cada um dos controlos definidos pelo Windows [10]. Cada classe baseia-se na classe base
BCControlWindow, a qual define as caractersticas dos objectos do tipo controlo.
Depois, necessrio derivar uma classe de uma das duas classes base (BCModalDialog
ou BCModelessDialog) do Win++.
Finalmente, devem criar-se ponteiros para os objectos do Win++ que representam os
tipos de controlos inseridos no template da caixa de dilogo, e redefinir algumas funes virtuais
para atendimento a eventos. No exemplo anterior encontram-se objectos do tipo BCRadioButtom
(classe para representar controlos do tipo radio buttons), BCPushButton (classe para representar
push buttons), BCStringEdit (classe-tipo dos controlos para editar strings), BCStaticText (classetipo dos controlos para escrita de texto). As funes virtuais para atendimento a eventos, neste
caso, so s duas: Initialize (para criar os objectos do tipo controlo) e ButtonSnglClk (que
invocada quando um boto seleccionado). Para melhor compreender estas duas funes,
apresenta-se parte do cdigo com alguns comentrios:
34

WORD IntSimulEditButtonDlg:: Initialize(VOID)


{
// criao do objecto do tipo BCRadioButton para representar o boto Etiqueta
// IDC_LABEL_INT_SIMUL o identificador do boto Etiqueta no template da caixa de dilogo
opRadioLabel = new BCRadioButton(BCResID(IDC_LABEL_INT_SIMUL), this);
// criao do objecto do tipo BCRadioButton para representar o boto Endereo
opRadioAddress = new BCRadioButton(BCResID(IDC_ADDRESS_INT_SIMUL),this);
if ( opInOutButton->GetShowLabel() )
opRadioLabel->SetState(TRUE);
// a etiqueta a seleccionada
else
opRadioAddress->SetState(TRUE); // o endereo o seleccionado
// criao do controlo para edio da etiqueta
opLabelEdit = new BCStringEdit(BCResID(IDC_LABEL_INT_SIMUL_UPDATE),this);
opLabelEdit->SetText(opInOutButton->GetLabel()); // insero da etiqueta do objecto no controlo
opLabelEdit->SetFocus();
// focus para este controlo
opLabelEdit->SetCharLimit(MAX_LABEL_SIZE);
// mximo de caracteres da etiqueta
...
// cria o controlo para escrita de informao
infoText = new BCStaticText(BCResID(IDC_INFO_STATIC_TEXT),this);
if(opInOutButton->IsInput())
infoText->SetText("Entrada");
// o objecto editado do tipo Entrada
else
infoText->SetText("Sada / Ponto interno"); // o objecto editado do tipo Sada / Ponto interno
return(0);
}

VOID IntSimulEditButtonDlg:: ButtonSnglClk(BCEvent *opEvt)


{
CHAR caBuf[120];
switch (opEvt->GetControlID()) {
// deteco do boto seleccionado
case IDOK:
// o boto OK foi seleccionado
opLabelEdit->GetText(caBuf, MAX_LABEL_SIZE);
if (IsValidLabel(caBuf))
// verifica a validade da etiqueta introduzida
opInOutButton->SetLabel(caBuf);
// actualiza a etiqueta do objecto editado
...// o mesmo para o endereo
EndDlg(TRUE);
// termina a caixa de dilogo
break;
case IDCANCEL:
// o boto CANCEL foi seleccionado
EndDlg(FALSE);
break;
case IDC_LABEL_INT_SIMUL:
// o boto Etiqueta foi seleccionado
opRadioLabel->SetState(TRUE);
// actualiza o boto Etiqueta
opRadioAddress->SetState(FALSE);
// actualiza o boto Endereo
opInOutButton->ShowLabel(TRUE);
// actualiza o objecto editado
break;
...
// o contrrio para o boto endereo
}
}

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

Fig. 8 - Comunicao entre as vrias janelas do PLC virtual

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

Como j referimos atrs as mensagens enviadas pelo Windows so processadas pela


biblioteca de classes do Win++, a qual internamente invoca funes virtuais de classes que
pertencem hierarquia de classes do prprio Win++. Deste processo so exemplos, entre outras, a
classe base representativa da janela (BCWindow) e a classe base representativa de temporizadores
(BCTimerDevice). O programador deriva, ento, as suas classes das do Win++, por forma a
representar os seus objectos, e redefine as funes virtuais para as mensagens que deseja
processar. Desta forma assegurado o fluxo de mensagens do Windows para a aplicao. Para a
comunicao entre os diversos componentes do sistema so fornecidas funes membro s classes
representativas dos vrios objectos (neste caso, janelas), de modo a permitir a comunicao entre
as vrias janelas do PLC virtual.
Para facilitar a exposio sobre a implementao genrica da interface grfica do PLC
virtual, apresenta-se, no ponto seguinte, o exemplo da implementao da janela de aplicao.

4.3. A janela da aplicao


A janela de aplicao o substrato em que as outras janelas (editores) assentam, pois
atravs de mecanismos de comunicao, implementados ao nvel desta janela, que as outras
comunicam entre si. Passaremos ento a descrever o processo usado para implementar a janela de
aplicao (ver tambm o Apndice A, ponto A.3.1).
Por imposio do Win++, foi construda, por derivao da classe BCMainWindow, a
classe SimulC20Window para representar a janela de aplicao do PLC virtual.
O ponto de entrada da aplicao a funo StartUp, na qual criado um objecto (do tipo
SimulC20Window). Em seguida, invocado o mtodo Run que vai gerir o ciclo de mensagens.
Para terminar a aplicao necessrio desenvolver o cdigo para o funo ShutDown, de
modo a destruir o objecto que representa a janela de aplicao. Este mtodo invocado
internamente pelo Win++ na sequncia de comandos que permitem fechar a aplicao.
A classe BCWindow, que representa o objecto grfico janela na interface Windows,
define as caractersticas de uma janela, nomeadamente aquelas que permitem gerir a janela e os
seus componentes. De entre essas caractersticas destacam-se as funes de gesto da janela e as
funes de suporte a eventos. Todas as funes que providenciam a sada grfica para a janela so
fornecidas pela classe BCDisplayDevice e so herdados por classes descendentes de BCWindow.
Todas as funes para suporte de eventos so declaradas virtuais na classe BCWindow, podendo
ser redefinidas na classe janela do utilizador de modo a esta responder aos eventos de forma
adequada. De entre as funes para gesto da janela, citamos funes para posicionar, esconder e
minimizar a janela, para mudar/instalar menus, e para instalar cursores. Alm disso, objectos
instanciados de classes descendentes de BCWindow podem manter objectos para representar
ferramentas de display como, por exemplo, pincis (brushes), lpis (pens), bitmaps e tipos de
caracteres (fonts).

37

A classe SimulC20Window contm a informao necessria para gerir todo o sistema,


nomeadamente ponteiros para as diversas janelas do PLC virtual e outros para controlo da
interface (e. g. , menus, bitmaps e aceleradores).
As funes de atendimento a eventos so declaradas na zona protegida da classe, e
representam as redefinies das funes virtuais da classe BCWindow. A maneira de descrever, de
uma forma mais exacta, as caractersticas fundamentais da classe representativa da janela de
aplicao a definio da prpria classe. Convir referir que, quer as definies das classes, quer
o cdigo das funes aqui apresentadas, no ser completo, pois uma grande parte das funes
e/ou dados no so relevantes para a compreenso do software desenvolvido.
class SimulC20Window : public BCMainWindow
{
...
C20Omron *opC20Omron;
// ponteiro para o objecto que representa o PLC virtual
ProgramEditor *opProgramEditor;
// janela de suporte ao editor de programao
SimulationWindow *opSimulWindow;// janela de suporte simulao,
StatusWindow *opStatusWin;
// janela de informaes
EditWindow *opTextEditor;
// janela de um editor de texto
BCAccelTable *opAccel;
// aceleradores para os menus da janela de aplicaes
BCMenu *opMenu;
// menu da janela de aplicao
MatrixCircuit *Data;
// objecto que suporta a grelha do programa
WORD OptionSelection;
// identificador da opo seleccionada
BCBitmap *OptionBitmap;
// bitmap representativo da opo seleccionada
CHAR *OptionText;
// nome da opo seleccionada
BCBitmap *inputOpenBitmap, ..., *inputCloseBitmap; // bitmaps de todas as opes
BOOL LockOption;
// sinaliza bloqueamento da opo seleccionada
protected:
// redefinio das funes pr-definidas na classe BCWindow, pertencentes a classes acima na hierarquia
// todas estas funes so invocadas internamente pelo Win++ quando ocorrem eventos especficos
WORD Initialize(VOID);
// invocada para permitir a inicializao de dados, ou ferramentas
VOID Paint(BCEvent *);
// invocada quando necessrio desenhar a janela
VOID MenuSelect(BCEvent *);
// invocada quando um menu seleccionado
VOID MenuCommand(BCEvent *); // invocada quando um menu escolhido
VOID ReSize(BCEvent *);
// invocada quando uma janela redimensionada
VOID Activation(BCEvent *);
// invocada quando uma janela activada
BOOL QueryEnd(BCEvent *);
// invocada antes de terminar uma aplicao
VOID GetMinMaxSizes(BCSize &,BCSize &); // l as dimenses mnimas e mximas da janela
public:
SimulC20Window(VOID);
// construtor da classe
~SimulC20Window(VOID);
// destrutor da classe
...
};

No construtor da classe invocada a funo Create (definida em BCWindow), que cria a


janela. Esta funo invoca internamente a funo virtual Initialize (que est redefinida na classe
SimulC20Window) antes de ser feito o display da janela no monitor. A funo Initialize
geralmente usada para criar ou inicializar objectos de controlo e tambm certos atributos que
necessitem de um handle janela como, por exemplo, menus ou botes. Neste caso, tambm
usada para criar as outras janelas, pois estas, sendo janelas filhas da janela de aplicao,
necessitam obviamente de uma janela me para serem criadas.

38

A seguir apresenta-se uma parte do cdigo da funo Initialize:


WORD SimulC20Window :: Initialize(VOID)
{
opMenu = new BCMenu(BCResID(IDR_MAIN_MENU));
// criao do menu da janela
// criao da janela de suporte ao editor de estmulos
opSimulWindow =new SimulationWindow(this,BCPosition(SIMUL_WINDOW_X,SIMUL_WINDOW_Y));
// criao da janela de suporte ao editor de programao
opProgramEditor = new ProgramEditor(this,BCPosition(EDIT_WINDOW_X,EDIT_WINDOW_Y));
// criao da janela de informaes
opStatusWin = new StatusWindow(this,BCPosition(STATUS_WINDOW_X,STATUS_WINDOW_DY));
// criao do editor de texto
opTextEditor = new EditWindow(this);
opC20Omron = new C20Omron(this, opSimulaChild);
// cria o plc virtual
// criao e insero no menu dos items tipo bitmap para representao das opes
inactiveBitmap = new BCBitmap(BCResID( IDR_BITMAP_INACTIVE )); // representa a opo Inactiva
if(inactiveBitmap)
opMenu->Insert(IDM_INACTIVE,inactiveBitmap,POS_INI_MENU);
// insere o bitmap no menu
...
opAccel = new BCAccelTable(BCResID(IDR_ACCEL_TABLE));
// criao dos aceleradores
GetApp()->SetAccel(this,opAccel);
// insere os aceleradores na aplicao
Data = opChild->GetCircuit();
// ponteiro para a matriz de suporte do programa ladder
return(0);
}

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

nomeadamente o identificador do menu seleccionado. Como se pode ver, quando o menu da


opo Sada Normalmente Aberta seleccionado, enviado para a janela de informao uma
mensagem.
Na funo MenuCommand so tomadas as aces de resposta escolha de um menu.
Neste caso, o menu da janela de aplicao. O cdigo seguinte ilustra o processo de resposta
escolha de alguns menus.
VOID SimulC20Window :: MenuCommand(BCEvent *opEvt)
{
CHAR caBuf[81];
switch (opEvt->GetMenuID()){ // descobre o item do menu seleccionado
case IDM_OPEN: // menu para carregar um ficheiro do disco
if (Data->OpenFile()) { // invoca a funo OpenFile, de modo a carregar o arquivo para o editor
sprintf(caBuf,"Simulc20H - %s",Data->GetFileName() ); // l o nome do ficheiro
SetTitle(caBuf);
// modifica o ttulo da janela de acordo com o nome do ficheiro aberto
}
break;
case IDM_COPY: // menu para copiar parte do programa para o clipboard
if(opProgramEditor->GetIsSelect()) // verifica se existem clulas seleccionadas
Data->Copy(opProgramEditor->GetInitSelect(), opProgramEditor->GetEndSelect()); // copia
break;
case IDM_INPUT_OPEN: // menu para seleccionar a opo Contacto Aberto
OptionSelection = IDC_OPEN_CONTACT; // identifica a opo Contacto Aberto
OptionBitmap = inputOpenBitmap;
// bitmap correspondente opo
break;
...
}
}

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()));
}

Da descrio anterior, sobre a janela de aplicao, constata-se a simplicidade com que se


constroem os mecanismos de interaco com o utilizador usando os conceitos de herana e de
funes virtuais do C++. De facto, bastou derivar uma classe da classe base representativa da
janela de aplicao do Win++ para se obterem, por herana, as funes de gesto da janela
(incluindo as funes para escrita e desenho na janela), e ter acesso a todas as funes virtuais de
suporte a eventos. Algumas dessas funes foram redefinidas de modo a responder aos
respectivos eventos de uma forma apropriada interface a implementar.
Como conhecido, toda a gesto da janela, e dos dispositivos de entrada, feita
internamente pelo Windows e, neste caso, comunicada aplicao atravs da invocao, pelo
Win++, de funes virtuais. De notar que praticamente todo o cdigo apresentado depende do
cdigo do Win++, cdigo esse, reutilizado sem haver necessidade de qualquer modificao.

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.

Smbolos (objectos) ladder

A linguagem ladder composta por um conjunto de instrues identificadas por


smbolos grficos. Algumas das relaes entre esses smbolos grficos podem ser expressas
atravs de hierarquias. Por isso foram criadas classes tipo, ligadas hierarquicamente por
mecanismos de herana, para representar cada um dos smbolos ladder (instrues)
implementados neste trabalho e que se encontram descritos no Apndice A, ponto A.3.2.
BCObject

BaseShape

Output

OpenOutput
ClosedOutput

Input

Module

OpenContact

Counter

TimerOn

LineH

ShiftRegister

ClosedContact
CounterDown

CounterUpDown

Fig. 9 - Hierarquia das classes representativas dos smbolos ladder implementados

42

Todos os smbolos ladder so objectos (instncias) de classes terminais pr-definidas


(ClosedOutput, TimerOn, ...), que pertencem hierarquia (figura 9) cuja classe base a classe
BaseShape. Esta uma classe abstracta que descreve as caractersticas que todas as classes
descendentes devem possuir. Por exemplo, cada objecto (representando um smbolo) tem um
nome, conhece a sua localizao numa grelha bidimensional e, alm disso, deve conhecer os
objectos que lhe esto ligados para poder realizar as tarefas de simulao que lhe esto destinadas
(captulo 6). Cada objecto deve possuir funes membro que sero invocadas para realizar as
operaes de desenho (para se desenhar) e de simulao (quando o comportamento do smbolo
est a ser simulado).
A definio de uma classe abstracta permite, de uma forma consistente, o envio de
mensagens para objectos instanciados de classes pertencentes hierarquia. De facto, uma das
utilidades das classes abstractas reside no facto de objectos com um antepassado comum poderem
ser encarados como objectos do mesmo tipo.
A seguir apresentam-se os dados e as funes membro mais importantes da classe
BaseShape:
class BaseShape : public BCObject
{
protected:
static ProgramEditor *opProgramEditor; // ponteiro para a janela de desenho do smbolo
CHAR *objectName;
// nome do objecto (smbolo)
CHAR **objectLabel;
// etiquetas que indicam posies na memria do PLC virtual, necessrias
// para a execuo da instruo subjacente ao objecto
WORD opValue;
// para armazenar um valor numrico associado com a instruo
BCPosition XYLocation;
// coordenadas da localizao na matriz
BOOL lineUp;
// sinalizao da existncia de uma ligao vertical
BaseShape *leftShape,*upShape,*downShape; // ponteiros para objectos ligados esquerda, acima e abaixo
int **memoryLocation;
// ponteiros para a memria (palavras) referenciadas pelas etiquetas
int *maskBit;
// localizaes dos bits nas respectivas palavras
BOOL flagSimulation;
// flag usada durante a simulao, para sinalizar que o objecto j foi simulado
virtual VOID OwnerSimulation(BOOL inSimul)=0; // funo que processa a sua entrada e actua de acordo com
// a sua prpria funo
...
public:
virtual BOOL Simul(VOID);
// funo pblica para gesto da simulao
virtual VOID ResetValuesToFirstSimulation(VOID); // inicializa os dados do objecto usados na simulao
virtual VOID ResetToOtherSimulation(VOID);
// inicia os dados de controle da simulao
virtual VOID Draw(VOID);
// funo pblica para desenhar o objecto dentro da grelha
virtual VOID UnDraw(VOID);
// funo pblica para apagar o objecto dentro da grelha
virtual BCBitmap * GetShapeBitmap(void) {return NULL;} // devolve um ponteiro para o bitmap do smbolo
...
};

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

class OpenOutput : public Output


{
protected:
static BCBitmap *opShapeBitmap;
// representa o bitmap para representao grfica
virtual BOOL OwnerSimulation(BOOL valIn);
public:
OpenOutput(BCPosition & oPos, CHAR *opLab = "" );
~OpenOutput();
virtual BCBitmap * GetShapeBitmap(VOID) {return opShapeBitmap;} // devolve o bitmap
...
};

Para representar um temporizador, basta derivar uma classe de Module e acrescentar as


particularidades que distinguem objectos deste tipo de outros objectos.
class TimerOn : public Module
{
protected:
static BCBitmap *opShapeBitmap;
// representa o bitmap para representao grfica
WORD timerNumber; // nmero do temporizador
WORD oTime;
// tempo de temporizao
WORD oTimeInSteps; // nmero de varrimentos de simulao necessrios para realizar o tempo de temporizao
// (oTimeInSteps = oTime / stepPeriod)
WORD numberStep; // varrimento actual (contagem a partir de zero)
WORD stepPeriod;
// periodo de varrimento
virtual BOOL OwnerSimulation(BOOL valIn); // realiza a simulao do temporizador
...
public:
virtual VOID Draw(VOID);
// desenha o temporizador
virtual VOID ResetTimer(VOID);
// inicializa o temporizador
virtual VOID ResetValuesToFirstSimulation(VOID);
// inicializa os dados para a simulao
virtual BCBitmap * GetShapeBitmap(VOID) {return opShapeBitmap;}
...
};

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

O suporte para o editor de programao uma matriz bidimensional de ponteiros para


objectos do tipo PointOfGrid (figura 10). Cada objecto deste tipo representa um nodo (ponto de
ligao), nodo este que identifica o contedo da clula sua esquerda. A razo de ser da clula
esquerda, e no direita, tem a ver com o processo de simulao, que feito a partir de objectos
terminais e direccionado para o incio de continuidade do diagrama ladder (captulo 6).

Incio de
continuidade

Nodos

Clula

Fig. 10 - Grelha de suporte ao programa ladder

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

funcionando cada nodo como um meio de acesso ao objecto representativo do smbolo, em


memria. Assim, definiu-se a classe representativa de cada nodo:
class PointOfGrid
{
BOOL Down;
// ligao vertical ao nodo da linha seguinte
BaseShape *LeftShape;
// objecto ladder ligado esquerda (na clula da esquerda)
BYTE CellState;
// identificador do tipo do objecto ladder presente na clula
public:
...
VOID SetLeftShape(BaseShape *Left){ LeftShape = Left; }
BaseShape * GetLeftShape(){return LeftShape;}
};

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();
}

Depois de criado um objecto do tipo MatrixCircuit, este fica com a capacidade de


executar as operaes necessrias para suportar em memria toda a estrutura associada grelha.
Para a insero na grelha fornecem-se duas funes, sendo uma para inserir uma ligao
vertical (InsertLineV), e a outra para inserir um objecto ladder (InsertLadderObject). Por
exemplo, para a funo InsertObjectLadder o cdigo apresentado a seguir. A funo CanInsert
foi desenvolvida para "obrigar" o utilizador a obedecer a algumas regras, por exemplo, a insero
de sadas somente na ltima coluna e a no possvel insero de smbolos tipo mdulo na primeira
ou ltima coluna.
BOOL MatrixCircuit::InsertLadderObject(BCPosition oPos, BaseShape *Shape)
{
BYTE CanIns = CanInsert(oPos,Shape); // verifica se pode inserir o objecto na posio oPos - testa algumas regras
if( CanIns == CAN_INSERT_ELEMENT ){ // pode inserir o objecto na grelha
GetXY(oPos)->SetLeftShape(Shape); // GetXY(oPos) - devolve um ponteiro para o nodo correspondente
SetModified(TRUE);
// sinaliza mudana no programa para efeitos de gravao em ficheiro
return TRUE;
}
if( CanIns == CELL_IS_NOT_EMPTY )
// clula no est vazia
if( Replace() ) { // pode-se fazer a substituio da clula
BaseShape *oShape = GetPosXY(oPos); // objecto presente na posio oPos

47

delete oShape;
GetXY(oPos)->SetLeftShape(Shape);
SetModified(TRUE);
return TRUE;
}
else {
delete Shape;
return FALSE;
}

// apaga o objecto existente na posio oPos


// insere o novo objecto no nodo correspondente

// apaga o objecto Shape, pois no foi inserido na grelha

5.1.3.

Janela e ferramentas do editor de programao

A janela do editor de programao constitui a interface do utilizador para um objecto do


tipo MatrixCircuit, e fornece as ferramentas para o "desenho" do programa.
A janela do editor filha da janela de aplicao, encontrando-se graficamente sobre essa
mesma janela. O editor possui uma grelha constituda por clulas, na qual vo ser colocados
smbolos grficos. A interligao adequada desses smbolos (na horizontal e na vertical) permite
representar um programa em linguagem ladder.
O editor fornece ferramentas para inserir e apagar smbolos na grelha, e permite utilizar
os comandos tradicionais de Copiar, Cortar, Apagar e Colocar. Alm disso, permite tambm a
edio dos smbolos, de modo a modificar os parmetros que os definem ou caracterizam.
A classe que define todas as caractersticas do editor a seguinte:
class ProgramEditor : public BCChildWindow
{
SimulC20Window *opPrt;
// ponteiro para a janela de aplicao
BOOL IsSelect;
// sinaliza a seleco para copy, clear ou cut
BOOL GridOn;
// sinaliza a visibilidade ou invisibilidade da grelha
BCPosition SelectedCell;
// identifica a clula seleccionada em cada instante
BCPosition initSelect, endSelect;
// clula inicial e final que indicam o rectngulo de clulas seleccionado
BCSize SizeCell;
// tamanho em pixeis de cada clula
MatrixCircuit *Cir;
// objecto do tipo MatrixCircuit que suporta o programa em memria
BCCursor *deleteCur;
// cursor tipo borracha, para sinalizar a opo Borracha
BCCursor *inactiveCur;
// cursor para sinalizar a aco de editar parmetros do objecto
BCCursor *insertCur;
// cursor para sinalizar a aco de insero de objectos na grelha
BCCursor *vertLineCur;
// cursor para sinalizar a aco de insero de linhas verticais
BCPen *editClearPen;
// pincel para apagar smbolos
...
protected:
// redefinio de funes de atendimento a eventos, pertencentes a classes acima na hierarquia
WORD Initialize(VOID);
// atende o evento de inicializao
VOID Paint(BCEvent *);
// desenha completamente a janela, invocada num evento de desenho
VOID Activation(BCEvent *opEvt); // invocada quando a janela activada ou desactivada
VOID VertScroll(BCEvent *opEvt); // invocada quando actuado o scroll bar vertical
VOID HorizScroll(BCEvent *opEvt); // invocada quando actuado o scroll bar horizontal
VOID KeyDown(BCEvent *opEvt); // invocada quando uma tecla premida
VOID MouseDblClk(BCEvent *);
// atende eventos de duplo click do rato
VOID MouseMove(BCEvent *);
// atende o evento de movimento do rato
VOID MouseDrag(BCEvent *);
// atende o evento de drag do rato
VOID MouseDown(BCEvent *);
// invocada quando o boto do rato premido
VOID MouseUp(BCEvent *);
// invocada quando o boto do rato levantado

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);
}

Desenho da janela de programao


A janela de programao usa um objecto (Cir) do tipo MatrixCircuit para suportar em
memria o programa escrito em linguagem ladder, o qual consiste de um conjunto de smbolos
grficos dispostos de forma adequada sobre uma matriz bidimensional de clulas. O desenho da
grelha bidimensional feita no mtodo Paint, no qual tambm enviada uma mensagem de Draw
para o objecto grelha (Cir) de modo a desenhar todo o programa na janela do editor de
programao. A sequncia da passagem de eventos, por forma a redesenhar o programa no editor,
apresentada a seguir: o processo desencadeado pelo Windows, que sinaliza a necessidade de
redesenho da janela atravs de um evento de redesenho; em seguida, na funo Paint enviado
um evento de Draw ao objecto Cir que, por sua vez, o enviar a cada objecto representativo de
cada smbolo na grelha.

Windows
&
Win++

Evento
Draw
Evento
Paint

Objecto
ProgramEditor

Evento
Draw

Objecto
MatrixCircuit
(Grelha)

Objecto 1

Objecto 2
Evento
Draw

Evento
Draw
Objecto n

Fig. 11 - Sequncia de eventos para o desenho da janela do editor de programao

49

VOID ProgramEditor :: Paint(BCEvent *opEvt)


{
Clear();
// limpa a janela - Clear() herdado da classe BCDisplayDevice
if(GridOn){
// desenho da grelha
...
}
Cir->Draw();
// desenha o programa na grelha
}

Insero e apagamento de smbolos


A insero de um smbolo ladder pelo utilizador executada em duas fases: a primeira
corresponde escolha do smbolo a inserir (Apndice A, ponto A.3.6.1) por seleco do smbolo
no menu da janela de aplicao; a segunda parte corresponde insero do objecto na grelha, e
executada premindo o rato sobre a clula onde se deseja inserir o smbolo. Do ponto de vista de
programao, basta responder ao evento de rato premido, de forma adequada, isto , basta
redefinir a funo virtual MouseDown:
VOID ProgramEditor:: MouseDown(BCEvent *opEvt)
{
BCPosition oPos = opEvt->GetPos(); // posio do rato enviada no objecto opEvt
SelectedCell = FindCell(oPos);
// clula onde se quer inserir
UpdateCellInfor();
// actualiza a clula na janela de informaes
// cria e insere na grelha o objecto ladder correspondente opo seleccionada
WorkElement(SelectedCell, opPrt->GetOptionSelection()); // GetOptionSelection() - devolve a opo seleccionada
...
}

Biblioteca de smbolos (classes em C++)

Opes de seleco de smbolos

O processo de criao e insero de um novo smbolo ladder na grelha de suporte do


programa o ilustrado na figura 12.
Escolha do smbolo para
insero na posio (x,y),
da grelha (utilizador)

Criao de uma instncia


da classe tipo representativa
do smbolo escolhido.
(WorkElement)
Objecto:
Posio na grelha,
Nome, Etiqueta, Valor

Not Ok

Testar regras de insero


(Cir->InsertLadderObject)

Ok

Left = Objecto
CellState = Nome

Apaga objecto

m[x-1,y]

m[x,y]

BOOL Down
BaseShape *Left
BYTE CellState

Clula da Grelha

Fig. 12 - Processo de insero de um objecto na 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;
}
}

Para a insero de um smbolo, criado um objecto para representar esse smbolo e, em


seguida, invocada a funo (InsertLadderObject), pertencente ao objecto Cir, para inserir o
objecto na grelha. No caso da opo ser de apagamento, apenas se invoca o mtodo Delete da
grelha.
Edio de parmetros dos smbolos
Como j foi referido, um smbolo ladder, alm do seu aspecto grfico, suporta um
conjunto de parmetros, que necessitam obviamente de ser associados ao objecto correspondente.
Para a edio de um smbolo o utilizador deve premir duas vezes o rato sobre o smbolo, sendo
ento criada uma de dois tipos de caixas de dilogo. Estas caixas de dilogo so representadas
pelas classes ElementEdit ou LabelEdit, consoante se trate de um smbolo tipo mdulo ou de
smbolos tipo entrada e/ou sada (Apndice A, ponto A.3.6.3). Do ponto de vista de programao,
basta responder ao evento de duplo click do rato da forma conveniente, o que se consegue atravs
da redefinio da funo MouseDblClk, que invocada internamente pelo Win++ quando o rato
premido duas vezes seguidas sobre a janela do editor de programao.
VOID ProgramEditor ::MouseDblClk(BCEvent *opEvt)
{
BCPosition oPos = opEvt->GetPos();
// retira, do evento, a posio do rato
SelectedCell = FindCell(oPos);
// descobre a clula correspondente posio do rato
BaseShape *shapeToEdit = Cir->GetPosXY(SelectedCell); // objecto ladder a editar
if(shapeToEdit->IsModule() ){
// o smbolo a editar do tipo mdulo
ElementEdit oDlg( BCResID(IDD_ELEMENT_EDIT), this, shapeToEdit); // cria a caixa de dilogo
if (oDlg.GetResult())
// se foi premido o boto de OK na caixa de dilogo
shapeToEdit->Draw();
// redesenha o smbolo j com os novos parmetros
return;

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

Para a gravao em disco e posterior carregamento de programas ladder foram utilizadas


os tradicionais menus de "Abrir", "Gravar" e "Gravar Como".
A deciso sobre a estrutura dos ficheiros a usar para armazenamento dos programas
ladder recau sobre um formato do tipo texto. Sendo, ento, o arquivo uma traduo fiel da grelha
do editor, esta forma de arquivo dos programas em modo texto permite a escrita dos programas
com um simples editor de texto, possibilitando ao utilizador a escrita de programas noutro
computador mesmo que no possua o Windows.
52

5.1.4.1. Formato do arquivo


De seguida apresenta-se uma breve descrio do formato do ficheiro para
armazenamento.
Cada smbolo tem um conjunto de parmetros que o identificam e que permitem a sua
reconstruo posterior. Esses parmetros, na sequncia em que aparecem no ficheiro, so:
Um nome (obrigatrio)
Trs etiquetas, no mximo (poder no ter nenhuma)
Um valor (optativo)
Um sinalizador da existncia de uma ligao vertical (optativo)
A posio do smbolo na grelha guardada atravs da sua posio no ficheiro.
As regras que definem o formato de programa ladder, quando armazenado no disco, so:
Cada linha inicializada com o smbolo "{" e terminada com o smbolo "}"
A separao entre clulas feita atravs do smbolo ","
Linhas vazias so representadas pela sequncia "{/" n de linhas vazias "}"
O nome do smbolo obrigatrio, sendo os outros parmetros opcionais
Cada parmetro separado por um ou mais espaos e/ou tabs
O valor representado pela sequncia "(#" valor ")"
A ligao vertical, para o nodo imediatamente abaixo, sinalizada pelo smbolo

"!", no fim de todos os outros parmetros


O nmero de etiquetas depende do tipo de smbolo representado; por exemplo, um
Registo de Deslocamento necessita de duas etiquetas que identificam o endereo das palavras
inicial e final.
Exemplos de nomes para identificao de alguns smbolos:
LN
representa uma ligao horizontal
IO
representa um Contacto Normalmente Aberto
IC
representa um Contacto Normalmente Fechado
OO
representa uma Sada Normalmente Aberta
UDC
representa um Contador Ascendente/Descendente
...
SFT
representa um Registo de Deslocamento
5.1.4.2. Gravao dos arquivos
O fluxograma das aces envolvidas na gravao apresenta-se na figura 13, podendo
constatar-se que a grelha percorrida desde a posio (0,0) at ao fim, registando-se em disco os
parmetros que identificam cada objecto. A no existncia de um smbolo implica somente a

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 com smbolo

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

Fig. 13 - Processo de gravao em disco de um programa

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

Fig. 14 - Diagrama Ladder correspondente descrio textual do arquivo anterior

5.1.4.3. Leitura dos arquivos


A sequncia de aces, isto , a sequncia de invocao de funes para carregar um
programa armazenado em disco para o formato da linguagem ladder do editor de programao
esquematiza-se na figura 15.
SimulC20Window

BCFileData

MatrixCircuit

Classe

MenuCommand

OpenFile

Load

Funo

Clear
OpenFile

LoadCircuit

Cria caixa dilogo

Cdigo d
funo

Abre ficheiro
Load
Fecha ficheiro

Interpretador do
arquivo em formato texto

Fig. 15 - Sequncia de invocao de funes para carregar um programa

Na sequncia da escolha do menu "Abrir" da aplicao invocada (internamente pelo


Win++) a funo de suporte a eventos de menus, MenuCommand, herdada de BCWindow e
redefinida em SimulC20Window. Em MenuCommand, e em resposta ao item escolhido "Abrir",
invocada a funo OpenFile pertencente ao objecto grelha. A funo OpenFile executada a
funo definida na classe BCFileData do Win++, em virtude de no haver redefinio desta
funo em MatrixCircuit. Por sua vez, esta funo invoca a funo Clear: por fora dos
mecanismos de ligao dinmica do C++, vai ser executada a funo Clear redefinida na classe
MatrixCircuit.
Aps a execuo de Clear, criada a caixa de dilogo habitual para a abertura de
ficheiros (Apndice A, ponto A.3.6.5) e aberto o ficheiro escolhido pelo utilizador na caixa de
dilogo. A prxima aco da funo OpenFile a chamada da funo Load que, pelas mesmas
razes j referidas para a funo Clear, tambm diz respeito classe MatrixCircuit.
Seguidamente, na funo Load, invoca-se a funo LoadCircuit que realiza o interpretador para a

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

O programa yacc usado para codificar a gramtica de uma linguagem e constri um


parser. O parser examina os tokens de entrada e agrupa-os em unidades sintcticas. Nas diversas
fases desse agrupamento pode haver processamento adequado utilizando rotinas em linguagem C.
O ficheiro de entrada do yacc apresentado a seguir descreve uma linguagem que
identifica o formato do ficheiro de arquivo, dos programas em linguagem ladder. O resultado da
execuo do yacc sobre este ficheiro de entrada uma funo em linguagem C que usada para
reconstruir o programa no editor de programao.
A estrutura de dados de apoio ao parser permite armazenar informao captada por este
durante o processo de descodificao de um smbolo ladder. Essa informao servir para invocar
convenientemente a funo membro CreatElement do objecto do tipo grelha, descrito atrs. Sob a
forma de comentrio est indicado o que cada campo da estrutura representa.
typedef struct {
int lin, col;
int pvalue;
int cross;
char **label;
symbol name;
} my_yacc;
my_yacc C20Prs;

// posio para reconstruo na grelha


// valor
// existncia de ligao vertical
// 1 etiqueta, 2 etiqueta e 3 etiqueta
// tipo de smbolo a criar para insero na grelha
// varivel global do parser

O parser, alm de reconstruir o programa, detecta tambm possveis erros na descrio


dos ficheiros. Alguns desses erros resultam, por exemplo, de instrues onde os parmetros da
instruo esto confinados a certas reas de memria ou de tokens que no identificam nenhum
dos smbolos permitidos na linguagem.
As regras da gramtica para descodificao do formato do ficheiro de arquivo, bem como
as aces necessrias reconstruo do programa, so apresentadas a seguir. De modo a
simplificar a apresentao do ficheiro, no se mostra o cdigo correspondente deteco de erros.
circuit

:
;
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 :
|
|
|

name totallabel cross


name totallabel value
name totallabel value cross

/* configuraes possveis para ser smbolo */

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 */
}

A funo executeWindows invocada internamente pelo parser quando detectado um


smbolo. Esta funo cria o smbolo ladder e insere-o na grelha, insere (caso exista) a ligao
vertical e reinicializa algumas variveis do parser.
void executeWindows()
{
/* cria o objecto e insere-o na grelha -winCircuit um ponteiro para o objecto grelha */
winCircuit->CreateElement( c20Prs.col, c20Prs.lin, c20Prs.name, c20Prs.label, c20Prs.pvalue);
if(c20Prs.cross)
winCircuit->InsertLineV(c20Prs.col, c20Prs.lin); /* cria uma ligao vertical */
/* inicializa as variveis do parser */
c20Prs.name = C_NONE;
...
}

58

Interpretador
Leitura e descodificao
dos parmetros do
smbolo a criar

Biblioteca de smbolos (classes em C++)

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

Acaba com erros

No

Acaba sem erros

Fig. 17 - Reconstruo de um programa ladder a partir do ficheiro de arquivo

A sequncia de aces para a reconstruo do programa mostrada na figura 17. O


interpretador, realizado pelo parser, tem por funo extrair o smbolo (e os seus parmetros), do
arquivo. A funo CreatElement cria o smbolo com os parmetros e insere-o na grelha,
invocando, para isso, a funo membro InsertLadderObject.

5.2.

Editor de estmulos

Um autmato programvel, em funo da leitura do estado das suas entradas e de acordo


com o programa de controlo residente em memria, comanda as suas sadas. Existe ento a
necessidade de introduzir as entradas para o PLC virtual e de verificar o comportamento das
sadas, por forma a avaliar o funcionamento do programa.
Na sua maioria os PLCs utilizam quase exclusivamente variveis do tipo bit, pois a maior
parte dos sinais a processar, em aplicaes envolvendo PLCs, evolui no tempo, mas assumindo
apenas dois estados possveis.
Perante estes argumentos afigura-se interessante a ideia (no disponvel em software
comercial de PLCs) de utilizar diagramas temporais para estimular as entradas do PLC virtual, j
que desse modo possvel variar o seu estado em instantes bem definidos no tempo. Assim, foi
tomada a deciso de criar um editor, com caractersticas idnticas s do editor de programao, e
que permitisse definir os diagramas temporais dos estmulos das entradas em uso no programa
ladder. Alm disso, este editor deveria tambm possibilitar a anlise dos dados resultantes da
simulao do programa, de modo a que o utilizador pudesse visualizar as entradas, sadas ou
pontos internos do PLC virtual, sincronamente no tempo.
Do ponto de vista do utilizador, o funcionamento do editor de estmulos encontra-se
descrito pode ver-se em apndice (Apndice A, captulo A.4).
59

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.

As janelas do editor de estmulos

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

A janela dos diagramas temporais


Esta janela permite visualizar e introduzir os diagramas temporais. Para isso, ela no tem
mais do que gerir uma determinada quantidade de objectos do tipo Stimulus, fornecendo o suporte
para o display e modificao dos mesmos. Por ser uma janela, derivou-se uma classe de
BCChildWindow para a representar e consequentemente, foram redefinidas algumas funes
virtuais de suporte a eventos.
class SimulationEditor : public BCChildWindow
{
SimulationWindow *opSimulationWindow;
// ponteiro para a janela me
Stimulus **InputOutput;
// conjunto de estmulos suportado
WORD numberOfStimulus;
// nmero de estmulos
BCCursor *lineCur;
// cursor do tipo linha para melhor anlise temporal
BCCursor *modifyCur;
// cursor para modificao dos diagramas temporais
BCCursor *clearCur;
// cursor para apagar estmulos
WORD numberOfPoints;
// nmero de pontos dos estmulos
WORD SizeOfPointInPixel;
// tamanho em pixeis de cada ponto (para ampliao)
...
protected:
// redefinio de funes pertencentes a classes acima na hierarquia
VOID Paint(BCEvent *);
VOID MouseDown(BCEvent *);
VOID MouseUp(BCEvent *);
VOID MouseDblClk(BCEvent *);
VOID MouseMove(BCEvent *);
VOID MouseDrag(BCEvent *);
VOID Activation(BCEvent *);
VOID VertScroll(BCEvent *);
VOID HorizScroll(BCEvent *);
VOID KeyDown(BCEvent *);
// para atender eventos de tecla premida
VOID KeyUp(BCEvent *);
// para atender eventos de tecla levantada
WORD Initialize(VOID);
public:
VOID SetModifyCur (VOID);
// instala o cursor de modificao
Stimulus *GetFirstVisible(VOID);
// retorna o primeiro estmulo visvel
// devolve o estmulo, o nmero do ponto, e o estado do ponto correspondente posio oPos (pixel)
Stimulus *GetPosValue(BCPosition oPos, WORD &oPonto, CHAR &oEstado);
};

A funo MouseDown contm cdigo para editar ou apagar estmulos.


VOID SimulationEditor:: MouseDown(BCEvent *opEvt)
{
BCPosition oPos = opEvt->GetPos();
...
for(int i = 0; i< numberOfStimulus; i++)
if (InputOutput[i]->IsThisStimulusInPos(oPos) ) {
if (mouseAction == NORMAL_ACTION)
InputOutput[i]->ModifyValueAtPos(oPos);
if (mouseAction == CLEAR_ACTION )
InputOutput[i]->ResetStimul();
break;
}
}

// oPos = posio do rato


// verifica qual o estmulo mostrado sobre a posio oPos
// aco normal de edio do diagrama temporal
// modifica o estado do ponto de acordo com oPos
// aco para apagar o estmulo
// inicializa o estmulo
// termina, pois j encontrou o estmulo

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

Estes controlos (objectos do tipo StimulLabelEdit) contm mecanismos para display de


palavras e para o controlo da entrada de caracteres; por isso, para carregar uma nova palavra no
controlo (por exemplo numa aco de carregar estmulos pr-gravados no disco), s necessrio
invocar a funo membro SetText com o parmetro adequado.
A janela de gesto
A janela de gesto do editor a janela me de todas as janelas que constituem o editor de
estmulos. Alm de suportar as outras janelas, esta janela tambm mantm os parmetros de
simulao (Apndice A, ponto A.4.4.1), permitindo visualiz-los (atravs da janela de
informaes) e modific-los (atravs das opes e/ou menus).
O objecto representativo desta janela instanciado da classe SimulationWindow,
derivada de BCPopUpWindow, a qual constitui a classe base para representar janelas tipo popup.
class SimulationWindow : public BCPopUpWindow
{
C20FastSimul *opFastSimul;
// objecto PLC virtual - simulao rpida
C20RealSimulNormal *opRealSimulNormal; // objecto PLC virtual - simulao em tempo real
C20RealSimulInteractive *opRealSimulInteractive; // ponteiro para a janela interactiva
EditStimulusDialog *opEditStimulusDialog;
// ponteiro para a janela de endereos
SimulationEditor *sEditor;
// ponteiro para a janela dos diagramas temporais
SimulationStatusWindow *opStatus;
// ponteiro para a janela de informaes
SimulatorC20Window *opParent;
// ponteiro para a janela de aplicao
BCBitmap *opBitmapSave,...*opBitmapZoom;
// ponteiros para os bitmaps das opes
double simulationTime;
// tempo de simulao
double stepPeriod;
// periodo de varrimento do programa durante a simulao
WORD numberPoints;
// nmero de pontos dos estmulos
WORD zoomSizePixel;
// nmero de pixeis por ponto do estmulo
FileStimulus *opFileStimulus;
// objecto que representa o ficheiro de arquivos dos estmulos
BCMenu *opSimMenu;
// ponteiro para o objecto menu da janela
protected:
WORD Initialize(VOID);
VOID MenuCommand(BCEvent *);
VOID ReSize(BCEvent *);
VOID Paint(BCEvent *);
BOOL QueryEnd(BCEvent *);
VOID MenuSelect(BCEvent *);
VOID Activation(BCEvent *);
public:
// carrega os parmetros de uma simulao - invocada na aco de leitura de estmulos pr-gravados em disco
VOID SetSimulationParameters(double timeSimul, double stepPer, WORD zoomPixel);
VOID InitSimulationValues(VOID); // inicializa os parmetros de simulao com valores por defeito
VOID StopSimulation(VOID);
// pra a simulao em tempo real
};

A figura 18 exemplifica os sentidos da comunicao entre alguns dos objectos


constituintes do editor de estmulos (janelas e estmulos). A janela do editor de estmulos a
janela me da janela de endereos e da janela dos diagramas temporais, e como tal, tem a
capacidade de gerir as duas, e ainda de servir como suporte para a comunicao entre ambas.
Cada janela (endereos e diagramas temporais) permite editar e visualizar cada uma das partes
distintas dos estmulos, como so, os endereos e os diagramas temporais.
63

Estmulos
IR_00000

Janela de
endereos

Janela dos
diagramas
temporais

IR_00200

Janela popup
(gesto do editor)

Fig. 18 - Comunicao entre as janelas para edio dos estmulos

5.3.

Editor da simulao interactiva

A ideia da simulao interactiva surge duma anlise de algumas famlias de autmatos


que permitem a interligao de mdulos para simular as entradas atravs de interruptores,
possibilitando a estimulao dos autmatos sem qualquer ligao a entradas reais. Isto
particularmente vantajoso na fase de desenvolvimento dos programas, principalmente na
implementao de controlo lgico binrio, tornando muito fcil o teste de situaes variadas.
A ideia do utilizador actuar sobre os interruptores para modificar o estado das entradas
do autmato real implementada no sistema em anlise com o premir do boto do rato sobre um
objecto do tipo entrada.
Mais uma vez se remete o leitor para o Apndice A, ponto A.5.4, para verificar o
funcionamento do editor, o qual do ponto de vista de programao um objecto do tipo
C20RealSimulInteractive.
class C20RealSimulInteractive : public C20RealSimul
{
WORD editOrSimul;
// sinaliza a permisso de edio da janela ou a permisso de simulao
InputOutputRadioButton *opInputs[ MAX_INT_SIMUL_INPUTS];
// objectos tipo entrada
InputOutputRadioButton *opOutputs[ MAX_INT_SIMUL_OUTPUTS];
// objectos tipo sada / ponto interno
BCBitmap *opBitmapIntLoad,...*opBitmapIntStop;
// bitmaps das opes
WORD numberInputs;
// nmero de objectos do tipo entrada
WORD numberOutputs;
// nmero de objectos do tipo sada
InteractiveSimulFile *opIntSimulFile;
// ponteiro para o objecto de armazenamento em ficheiro
BCMenu *opSimIntMenu;
// ponteiro para o menu
BCStaticText *opStaticTextInfo;
// para display de informao na janela
protected:
VOID MenuCommand(BCEvent *);
WORD Initialize(VOID);
VOID ButtonSnglClk(BCEvent *);
VOID ButtonDblClk(BCEvent *);
VOID Paint(BCEvent *);
VOID MouseDown(BCEvent *);
VOID MouseUp(BCEvent *);
VOID MouseDrag(BCEvent *);

64

VOID Activation(BCEvent *);


VOID TimerEvent(BCEvent *);
// para atender eventos do temporizador da simulao
VOID ReSize(BCEvent *);
BOOL QueryEnd(BCEvent *);
public:
...
InputOutputRadioButton *GetButtonAtMousePos(BCPosition oPos);
// devolve o objecto na posio oPos
BOOL InitSimulation();
// inicia a simulao interactiva
VOID StopSimulation(VOID);
// pra a simulao interactiva
VOID UpdateInputStimulus();
// l o o estado actual dos objectos de entrada -antes da simulao
VOID UpdateOutputStimulus();
// actualiza o estado dos objectos de sada -aps a simulao
};

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

"Virtualizao de" transmite a ideia de emular, ou mais simplesmente de imitar uma


realidade. O aparecimento dos computadores veio fornecer um suporte para imitar essa realidade
de uma forma mais sistemtica, tendo-se tornado a simulao por computador uma ferramenta de
engenharia bastante importante, quer para o desenvolvimento de novos produtos, quer para a
pesquisa de novas solues. De facto, e segundo BIEN [23], a simulao por computador permite
fazer anlise de design, programao off-line e treino.
Tambm na rea do ensino, a simulao tem vindo a assumir um papel importante em
matrias onde necessrio dispender recursos de elevado custo. Por exemplo, e citando WHITE
[8] e RAZ [24], foram realizados alguns trabalhos no intuito de auxiliar o ensino de controlo de
robs em que a ideia geral a simulao do comportamento do rob.
No caso concreto do presente trabalho, como j foi referido, o objectivo simular o
funcionamento de um autmato programvel de modo a que o sistema resultante possa vir a ser
utilizado no ensino de programao de autmatos programveis, e ainda ajudar no teste rpido de
solues para um determinado problema de controlo.

6.1.

Modelo para a arquitectura do PLC virtual

A arquitectura dos autmatos programveis j foi descrita em captulos anteriores. Duma


forma simplista, um autmato um sistema computacional com memria que l as suas entradas,
e comanda as suas sadas de acordo com as entradas e o programa de controlo armazenado em
memria.
Autmato programvel
Memria
programa

Circuitos
de entrada

Dispositivos
de sada

Circuitos
de sada

Dispositivos
de entrada

Unidade
CPU

Memria

Fig. 19 - Arquitectura funcional de um PLC (sem fonte de alimentao)

66

No presente trabalho, o modelo para a virtualizao de um autmato programvel


encontra-se representado na figura 20 e traduz-se pela substituio:
do CPU por um simulador orientado por objectos;
do programa em memria por um editor de programao;
da memria do PLC por uma rea de memria do PC;
das entradas reais por aces introduzidas pelo rato ou pelo teclado;
das sadas por uma sua imagem visualizada no monitor.
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

Fig. 20 - Modelo para a arquitectura do PLC virtual

6.2.

Linguagem do PLC virtual

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

experimentados; de facto, alguns sistemas de programao visual tm demonstrado com sucesso


que no programadores podem produzir programas complexos com pouco treino [28].

6.3.

Memria do PLC virtual

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

Fig. 21 - Interligao entre os vrios componentes do objecto C20Omron

O endereamento de memria do PLC virtual idntico ao endereamento de memria


do autmato real que est a ser emulado (por razes de familiarizao com os endereos fsicos do
PLC real). Para enderear um bit na memria necessrio especificar a rea de memria (IR, AR,
TC, ...), o nmero da palavra (de 16 bits) e o nmero do bit (1 a 16) na palavra.
Cada objecto ladder define um conjunto de etiquetas (ver classe BaseShape, ponto 5.1.1),
que suportam a identificao dos endereos das posies de memria, sobre as quais a instruo
ladder correspondente opera. Alm dessas etiquetas, cada objecto ladder suporta tambm um
conjunto de ponteiros para a memria do PLC virtual, juntamente com um conjunto de mscaras
para aceder aos bits nas palavras referenciadas por esses ponteiros (figura 22).

69

Etiquetas
Etiqueta_1
...
Etiqueta_n

Memria PLC

Ponteiros para memria + mscaras


Conversor
de etiquetas

WORD *pMem_1, mask_1;


...
WORD *pMem_n, mask_n;

Para acesso
memria

Fig. 22 - Suporte para um objecto ladder operar sobre a memria

Como vimos, a questo de endereamento bastante simples. Existem, no entanto,


questes respeitantes s reas de memria que cada instruo pode usar no PLC real, que tm que
ser garantidas tambm no sistema PLC virtual. Para isso foi instalado um switch (reconstruo ou
deteco de erros nos endereos das instrues ladder) no parser de reconstruo do programa, o
qual permite correr o cdigo que garante a concordncia dos endereos das intrues do PLC
virtual com as instrues do PLC real.

6.4.

Simulador

O modelo para a arquitectura do PLC virtual inclui um simulador que emula o


comportamento do autmato real. Para tal o simulador dever compreender a linguagem ladder e
executar sobre a memria do PLC virtual todas as instrues implementadas.
Um dos objectivos principais, para o desenvolvimento do simulador, que este
permanea inaltervel com a introduo de novas instrues ou com a criao de novos PLCs
virtuais. Esta ideia implica que o cdigo j realizado para a simulao no seja modificado, e
tambm que a estrutura da simulao no seja alterada com futuros upgrades.
No que diz respeito implementao de novas instrues, a estratgia seria o
desenvolvimento de um algoritmo genrico (independente do tipo de objectos ladder a simular), e
distribudo (i. ., com cada nova instruo a implementar a sua prpria simulao, e no o
simulador principal do PLC virtual a implementar a simulao da nova instruo).
A ideia de vrios PLCs virtuais resulta da previso de novos tipos de simulao a inserir
no sistema PLC virtual. Isto obriga a que se implementem mecanismos que sustentem a criao de
novos PLCs virtuais (para simular programas de maneira diferente da dos modos implementados
neste trabalho), e permitam a sua rpida insero no sistema. Isto poder ser conseguido atravs
de uma hierarquia apropriada de PLCs virtuais.
A construo de um simulador utilizando tcnicas de programao por objectos, de
acordo com [29], envolve a comunicao entre objectos ao longo do tempo. No caso presente
existem objectos ladder que comunicam entre si, atravs de eventos de simulao, e actuam, de
acordo com a instruo que implementam, sobre a memria do PLC virtual. De facto, esta forma
de simulao enquadra-se no modo como intrepretado um diagrama ladder.

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

A execuo da instruo, cuja etiqueta c, s realizada aps a "chegada" ao nodo 2 de


um sinal indicativo da existncia ou no de continuidade lgica, desde a linha de incio de
continuidade at ao nodo em questo (comparvel a um circuito elctrico que est fechado at ao
nodo 2). Esse sinal corresponde condio de execuo da instruo c. Mas, para que ao nodo 2
chegue essa condio, esta j deve ter chegado ao nodo 1, o que sugere que a simulao de um
objecto ladder implique a existncia de uma condio de execuo de entrada, condio essa que
resulta da auto-simulao do objecto ligado sua esquerda. Podemos, portanto, considerar que
esse esse valor de entrada (condio de execuo) funciona como um testemunho que vai permitir
que o objecto se auto-simule.
A condio de execuo de uma instruo ser TRUE quando houver continuidade lgica
at ao nodo que precede o objecto ladder, e ser FALSE se no houver continuidade lgica.
Outra questo a considerar ocorre quando um ou mais objectos ladder esto ligados na
vertical. necessrio saber como condicionada a continuidade lgica nestas situaes.
Por exemplo, no diagrama ladder apresentado abaixo, a continuidade no nodo (1,1)
depende dos trs objectos (a, b e c). Este diagrama pode ser usado para representar a equao
lgica (a + b + c). d = e , o que sugere que os nodos (1,1), (1,2) e (1,3) so iguais entre si e que
realizam o OR lgico dos trs caminhos de continuidade assegurados pelos objectos a, b e c.
a

(1,1)

d
(2,1)

b
(1,2)

c
(1,3)

6.4.1.

Varrimento do programa ladder

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

Fig. 23 - PLCs (real e virtual) em modo execuo (run mode)

Como a simulao de um programa corresponde simulao de uma srie de varrimentos


do mesmo programa, trataremos seguidamente o processo de simulao de um varrimento.
O algoritmo de simulao baseado na passagem de informao (atravs de eventos) de
objectos ladder situados esquerda na grelha (incio de continuidade) para objectos direita na
grelha. Simultaneamente, o contedo das posies de memria relevantes no PLC virtual
modificado de acordo com o tipo e a aco dos objectos no contexto do programa ladder [30].
O processo de simulao dividido em duas fases: a inicializao e a simulao. Na fase
de inicializao, a informao relevante para a simulao, nomeadamente as ligaes entre os
objectos ladder (MakeConnections de MatrixCircuit), endereos de memria e valores associados
com contadores e temporizadores, so inicializados. Tambm nesta fase so detectados os
possveis erros nos degraus ladder (VerifyCircuitToSimul de MatrixCircuit), nomeadamente
smbolos no ligados ou endereos no vlidos. De modo a acelerar o processo de simulao
criado um array (rightObjects) que contm ponteiros para todos os objectos ladder (para todas as
linhas do programa) situados mais direita na grelha. A funo membro InitSimulation a
responsvel por essa inicializao. Esta funo virtual pois a implementao da inicializao nos
diversos PLCs virtuais pode ser diferente, acontecendo o mesmo com o incio da simulao.
O uso da matriz rightObjects acelera o processo de simulao porque, uma vez
construda no incio da simulao, evita a procura dos objectos mais direita em todos os
varrimentos do programa.

72

BOOL C20Omron :: InitSimulation()


{
if (!Circ->VerifyCircuitToSimul())
// verifica se no existem erros nos degraus do programa ladder
return FALSE;
// existem erros
// cria as ligaes dos objectos ladder no programa e verifica a correco em todas as ligaes
if (!Circ->MakeConections() )
return FALSE;
// existem objectos ladder que no esto ligados correctamente
// inicia toda a memria do PLC virtual
for (int n = 0; n <= INTERNAL_RELAY_MEMORY; n++) // inicializa a rea de memria Internal Relay
IR[n] = 0x0000;
//memria Internal Relay
...
// preenchimento do array dos elementos mais direita
BaseShape *oShape = NULL;
for ( int i = 0, n = 0; n < NUMBER_VERTICAL_CELL; n++ ) {
rightObjects[i] = NULL;
col = NUMBER_HORIZONTAL_CELL -1;
// ltima coluna
while( col-- >= 0 )
// procura o elemento mais direita na mesma linha
if (oShape = Circ->GetXY(col,n)->GetLeftShape() ) {
rightObjects[i++] = oShape; // encontrou - coloca um ponteiro para o elemento no array
break;
}
}
stepInSimulation = 0;
// corresponde ao primeiro varrimento do programa
InitNewStimulus();
// inicializa os estmulos na simulao
}

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);
}

A funo UpdateInputStimulus l o estado das entradas definidas nos diagramas


temporais dos estmulos e actualiza as respectivas entradas do PLC virtual, o que deve ser
executado antes da simulao de um novo varrimento do programa.

73

VOID C20Omron :: UpdateInputStimulus(WORD oStepTime) // actualizao das entradas


{
int i=0;
// coloca as novas entradas com os estmulos correspondentes
while (outputStimul[i].memLocation && i< MAX_C20_INPUTS) { // o estmulo est definido
if ( inputStimul[i].opInput[oStepTime] =='\1' ) // o estado correspondente ao varrimento actual ON
IR[0] |= inputStimul[i].maskBit;
// coloca a entrada i do PLC virtual no estado ON
else
IR[0] &= ~inputStimul[i].maskBit;
// coloca a entrada i do PLC virtual no estado ON
i++;
}
}

A funo UpdateOutputStimulus a definio por defeito para a funo que actualiza os


diagramas temporais dos estmulos aps cada varrimento do programa. A actualizao de um
estmulo consiste em ler o estado do bit endereado pelo estmulo e guard-lo no respectivo
diagrama temporal. Esta funo deve ser invocada aps a simulao de um varrimento, isto ,
aps a invocao da funo SimulationC20.
VOID C20Omron :: UpdateOutputStimulus(WORD oStepTime)
{
int i=0;
while (outputStimul[i].memLocation && i< NUMBER_OF_STIMULUS) { // o estmulo est definido
// Value fica com o estado do bit para o qual o estmulo foi definido - o bit pertence memria do PLC virtual
BOOL oValue = (*outputStimul[i].memLocation) & outputStimul[i].maskBit;
if(oValue)
outputStimul[i].opOutput[oStepTime] = '\1'; // guarda o estado ON, correspondente ao varrimento actual
else
outputStimul[i].opOutput[oStepTime] = '\0'; // guarda o estado OFF
i++;
}
}

Estas funes, UpdateInputStimulus e UpdateOutputStimulus, podero ser redefinidas


nas classes representativas de outros PLCs virtuais, sempre que as actualizaes das entradas e/ou
a actualizao dos resultados da simulao de um varrimento se processe de maneira diferente.

6.4.2.

O algoritmo de simulao

A simulao de um programa suportada pelas funes virtuais Simul e


OwnerSimulation definidas na classe abstracta BaseShape, mas que podem ser redefinidas nas
classes representativas de objectos ladder. A ligao entre os smbolos grficos (e os
correspondentes objectos ladder que representam esses smbolos) define a forma como a
informao passada entre eles. Para cada objecto ladder, a funo Simul pode ser considerada
como o interpretador das ligaes do objecto a outros objectos ladder, e a funo
OwnerSimulation executa a aco da instruo associada com o objecto ladder.

74

BOOL BaseShape :: Simul(WORD flagOnCall)


{
if (flagSimulation)
// indica se o objecto actual j foi simulado, no actual varrimento,
return (valSimulation); // devolve o valor da simulao - condio de execuo para o objecto seguinte
BOOL valDown = FALSE, valUp = FALSE; // guardam os valores da simulao dos objectos abaixo e acima
if (leftShape[0]) {
// se houver um objecto ladder ligado esquerda
valInSimulation = leftShape[0]->Simul(LEFT_SHAPE_CALL); // invoca a funo Simul para esse objecto
OwnerSimulation();
// executa OwnerSimulation do objecto ladder actual
} else
if( col == 0 ) {
// esquerda do objecto est o incio de continuidade
valInSimulation = TRUE;
// o valor de entrada para a simulao TRUE
OwnerSimulation();
}
if (orUp && flagOnCall != DOWN_SHAPE_CALL) // existe um objecto ligado acima
valUp = orUp->Simul(UP_SHAPE_CALL);
// invoca a funo Simul para esse objecto
if (orDown && flagOnCall != UP_SHAPE_CALL)
// existe um objecto ligado abaixo
valDown = orDown->Simul(DOWN_SHAPE_CALL);
valSimulation = valSimulation || valUp || valDown; // o valor da simulao o OR lgico dos trs valores
if(flagOnCall == LEFT_SHAPE_CALL) { // deve-se actualizar os objectos acima e abaixo
if(orDown)
orDown->SetDownValSimulation(valSimulation); // actualiza os objectos abaixo com o novo valor
if(orUp)
orUp->SetUpValSimulation(valSimulation);
// actualiza os objectos acima com o novo valor
}
return (valSimulation);
// devolve o valor da simulao
}

Como j foi referido, a funo do CPU principal (SimulationC20) ser o excitador do


processo de simulao. Essa excitao traduz-se na invocao da funo Simul para todos os
objectos ladder existentes em rightObjects. Desta forma inicia-se uma navegao pela grelha, da
direita para a esquerda, seguida de retorno ao objecto inicial, semelhana do que acontece no
processo de simulao implementado em [20] e [31]. Esta navegao resulta das caractersticas
reentrantes da funo Simul. Para simular a aco de um objecto, os parmetros de entrada que lhe
esto associados (condies de execuo) devem ser conhecidos, o que obtido invocando a
funo Simul dos objectos sua esquerda. Para o objecto imediatamente esquerda, o processo
o mesmo pelo que, assim, a grelha percorrida desde a direita at esquerda; a navegao para a
esquerda termina quando se chega ao incio de continuidade (col = 0), ou quando o objecto j foi
simulado para o mesmo varrimento (flagSimulation = TRUE).
A navegao da esquerda para a direita resulta dos regressos das sucessivas invocaes
da funo Simul para diferentes objectos. Aps a execuo da funo leftShape->Simul para um
objecto ladder, a sua funo de OwnerSimulation tambm executada.
A resoluo das ligaes verticais do objecto (que correspondem a Or's lgicos no
contexto da linguagem ladder), obtm-se invocando as funes upShape->Simul e downShape>Simul. De facto, cada objecto ladder pertence a duas listas ligadas de objectos ladder, uma na
horizontal e outra na vertical. A lista horizontal ligada atravs de objectos leftShape e a lista na
vertical, a existir, uma lista duplamente ligada, pois se um objecto conhece aquele que est
acima, tambm o objecto acima conhece o objecto que est abaixo. Esta lista , portanto, mantida
pelas ligaes verticais entre objectos.
75

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.

A funo virtual de simulao para objectos pluri-celulares

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

valor actual do contador (proveniente do objecto ligado primeira entrada - leftShape[0]) e um


sinal de inicializao (proveniente do objecto ligado segunda entrada - leftShape[1]).
BOOL CounterReset :: Simul(WORD flagOnCall)
{
if (flagSimulation)
return (valSimulation);
// a simulao j foi feita noutro ramo do circuito
...
if (leftShape[0])
// verifica se existe objecto ligado primeira entrada
counterDown = leftShape[0]->Simul(LEFT_SHAPE_CALL); // para decrementar o contador
if (leftShape[1])
// verifica se existe objecto ligado segunda entrada
reset = leftShape[1]->Simul(LEFT_SHAPE_CALL); // reset do contador
OwnerSimulation();
// simula a aco do contador
return (valSimulation);
}

A funo Simul da classe CounterUpDown (usada para representar objectos do tipo


Contador Ascendente/Descendente com Reset) interpreta mais um sinal do que
CounterReset::Simul, que o sinal para incremento do valor actual do contador.
BOOL CounterUpDown :: Simul(WORD flagOnCall)
{
if (flagSimulation)
return (valSimulation);
...
if (leftShape[0])
counterUp = leftShape[0]->Simul(LEFT_SHAPE_CALL);
// para incrementar o contador
if (leftShape[1])
counterDown = leftShape[1]->Simul(LEFT_SHAPE_CALL); // para decrementar o contador
if (leftShape[2])
// reset do contador
reset = leftShape[2]->Simul(LEFT_SHAPE_CALL);
// para fazer o reset do contador
OwnerSimulation();
return (valSimulation);
}

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

// entrada a deslocar no registo


// impulso para deslocar um bit no registo
// para fazer o reset do registo

No desenvolvimento do algoritmo de simulao surgiram duas alternativas sobre quais os


objectos a guardar no array rightObjects:
- guardar somente os objectos terminais (ligados ao fim de continuidade, ou objectos que
no tenham nenhuma sada, como o caso dos Registos de Deslocamento);
- guardar todos os objectos posicionados mais direita em cada linha.
A vantagem da primeira alternativa em relao segunda o menor tempo de simulao
que lhe est associado. Se analisarmos o exemplo anterior, o CPU principal no necessitaria de
enviar o evento de Simul para o objecto d. O acrscimo de tempo da segunda alternativa
corresponde, no exemplo anterior, ao tempo de uma chamada de uma funo virtual, ao teste de
uma varivel (flagSimulation == TRUE), e ao retorno da funo.
A vantagem da segunda alternativa tem a ver com o preenchimento do array
rightObjects, em que s necessrio detectar os objectos mais direita, em cada linha do
programa ladder. Para preencher o array, usando a primeira alternativa, era necessrio detectar
todos os objectos terminais, o que implicaria criar cdigo para distinguir os objectos terminais dos
outros objectos. Esse cdigo teria que ser modificado, aquando da introduo de novas instrues,
pois haveria que testar se os objectos, representativos das novas instrues, eram ou no objectos
terminais. Esta alternativa ia contra aos objectivos de no alterao do cdigo de simulao, no
acrescento de novas instrues ladder no sistema. Por este facto, decidimos pela segunda
alternativa, at porque, o acrscimo de tempo na simulao no nos parece significativo.
semelhana do exemplo j anteriormente apresentado, a seguir apresenta-se um caso
mais elaborado de um degrau que contm um objecto com trs entradas, o qual poder ser, por
exemplo, um Contador Ascendente/Descendente. Veja-se a sequncia (numerada) do evento de
simulao durante um varrimento do degrau ladder.
a
*a
1

*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 );
}

A funo CloseContact::OwnerSimulation() implementa a aco de uma instruo ladder


Contacto Normalmente Fechado. O comportamento da instruo em tudo idntico ao anterior, s
que o estado do bit de trabalho complementado antes de ser carregado na varivel
valSimulation.
BOOL CloseContact :: OwnerSimulation()
{
flagSimulation = TRUE;
if( valInSimulation )
return (valSimulation = (*memLocation[0] & maskBit[0]) ? FALSE : TRUE );
else
return (valSimulation = FALSE );
}

As classes OpenOutput e CloseOutput so as classes representativas de instrues ladder


que escrevem na memria do PLC virtual, ao contrrio das duas anteriores que somente fazem
leitura da memria. O cdigo da funo OwnerSimulation, referente a estas duas classes,
apresentado a seguir:
BOOL OpenOutput :: OwnerSimulation()
{
flagSimulation = TRUE;// sinaliza que o objecto actual j foi simulado
if(valInSimulation)
// estado da condio de execuo da instruo - ON
*memLocation[0] |= maskBit[0];
// coloca o bit de trabalho da instruo no estado ON
else
*memLocation[0] &= ~maskBit[0]; // coloca o bit de trabalho da instruo no estado OFF
return (valSimulation = valInSimulation);

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);
}

Para simular o comportamento de um Temporizador com Atraso Operao, o objecto


ladder correspondente tem de conhecer o nmero de varrimentos (scan time - constante ao longo
de uma simulao) necessrio, para perfazer a temporizao, e o nmero do varrimento actual. A
instruo , ento, interpretada da seguinte forma:
se o valor de entrada (valInSimulation) se mantiver no estado ON, s se deve incrementar
o nmero do varrimento (numberStep) e compar-lo com o nmero total de varrimentos
(oTimeInSteps);
se todos os varrimentos necessrios para atingir o tempo pretendido j foram executados, o
estado do bit de sada do temporizador colocado a ON;
se o estado do sinal de entrada for OFF o temporizador inicializado (numberStep = 0).
BOOL TimerOn :: OwnerSimulation()
{
flagSimulation = TRUE;// sinaliza que o objecto actual j foi simulado
valSimulation = *memLocation[0] & maskBit[0]; // valor, do bit de sada, no varrimento anterior
if (valInSimulation ) {
// o estado do valor de entrada (condio de execuao) ON
if( numberStep > oTimeInSteps +1)
// verifica se j se atingiu o fim de temporizao
return valSimulation;
// j se atingiu o fim de temporizao
if (++numberStep == (oTimeInSteps+1)) { // incrementa o nmero de varrimentos e analisa o fim de temp.
*memLocation[0] |= maskBit[0];
// coloca o bit de sada a ON - indicando fim de temporizao
return (valSimulation = TRUE);
// coloca o valor da simulao do objecto a TRUE
}
} else {
// o estado do valor de entrada FALSE
numberStep = 0;
// inicializa o temporizador
*memLocation[0] &= ~maskBit[0];
// coloca o bit de sada no estado OFF
return (valSimulation = FALSE);
// coloca o valor da simulao do objecto a FALSE
}
}

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

se o sinal de reset for ON, o contador imediatamente inicializado e o bit da sada

colocado no estado OFF.


BOOL CounterReset:: OwnerSimulation()
{
flagSimulation = TRUE;
// sinaliza que o contador j foi simulado
valSimulation = *memLocation[0] & maskBit[0]; // valor da simulao o valor anterior do bit
if(reset) {
// a entrada correspondente ao reset do contador foi actuada
cntCount = Value;
// coloca o valor inicial no contador
endOfCount = FALSE;
// coloca o sinalizador de fim de contagem a FALSE
*memLocation[0] &= ~maskBit[0]; // coloca o bit de sada a FALSE
valSimulation = FALSE;
// o valor da simulao FALSE
return (valSimulation);
}
if( oldCounterDown == counterDown) // o estado da entrada igual ao estado no varrimento anterior
return (valSimulation);
if (counterDown)
// o estado da entrada TRUE e, anteriormente, era FALSE
if(!endOfCount) {
// ainda no se atingiu o fim de contagem
if(--cntCount == 0) { // decrementa o valor do contador e verifica se se atingiu o fim de contagem
endOfCount =TRUE; // sinaliza o fim de contagem
*memLocation[0] |= maskBit[0]; // coloca o bit de sada a TRUE
valSimulation = TRUE;
}
} else
// fim da contagem
valSimulation = TRUE;
oldCounterDown = counterDown; // guarda o valor para o prximo varrimento do programa
return valSimulation;
}

A aco de objectos do tipo CounterUpDown (Contador Ascendente/Descendente com


Reset) igual aco do contador anterior para o sinal de reset. Para os sinais de counterDown e
counterUp a aco a seguinte:
se os dois sinais so iguais nada acontece;
quando existe uma transio positiva (passagem do estado OFF para o estado ON), o
valor do contador decrementado ou incrementado, dependendo do sinal de entrada onde
houve a transio;
nos limites, isto , quando o valor do contador chega a zero ou ao valor inicial do
contador, o processamento depende do estado das entradas no varrimento seguinte
se o valor for zero e a entrada counterDown for actuada, ento o valor do contador
passa a ser o valor inicial e o bit de sada do contador actuado;
se o valor for o inicial e a entrada counterUp for actuada, ento o valor do contador
passa a ser zero e o bit de sada do contador actuado.
BOOL CounterUpDown :: OwnerSimulation()
{
flagSimulation = TRUE;
// sinaliza que o contador j foi simulado
valSimulation = *memLocation[0] & maskBit[0]; // valor da simulao o valor anterior do bit
if(reset) {
// a entrada correspondente entrada de reset do contador foi actuada
cntCount = 0;
// inicializa o contador - iguala o valor actual do contador a zero
endOfCount = FALSE;
// sinaliza internamente o contador que ainda no terminou a contagem
*memLocation[0] &= ~maskBit[0]; // coloca o bit de sada a FALSE
valSimulation = FALSE;
// o valor da simulao FALSE

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);
}

A funo ShiftRegister:: OwnerSimulation() simula o comportamento de um Registo de


Deslocamento (como o definido em [7]). O objectivo criar um registo de deslocamento desde a
palavra inicial at palavra final (especificadas nas etiquetas do objecto ladder).
Numa transio positiva do sinal clockOn, feito o deslocamento de um bit no registo e

lido o estado do sinal de entrada inputVal para o bit zero do registo.


Quando o sinal de reset est activo, o registo inicializado colocando todas as palavras
que o definem a zero.
BOOL ShiftRegister:: OwnerSimulation()
{
flagSimulation = TRUE;
if ( reset) {
// o sinal de reset est activado
if ( !oldReset ) {
// o estado anterior do sinal de reset era OFF
for (WORD i = 0; i <= numberWords; i++)
// inicializao do registo
memLocation[0][i] = 0x0000;
// palavra i inicializada

82

oldReset = TRUE;
}
return FALSE;

// guarda o estado do reset para o varrimento seguinte

}
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);
}

6.5. Modos de simulao


Como j foi referido ao longo deste trabalho, foram implementados vrios modos de
simulao de um programa no PLC virtual. Cada modo de simulao corresponde a um objecto
diferente, que instanciado duma classe pertencente hierarquia de classes de PLCs virtuais
(figura 24). Desta forma, a criao de um novo modo de simulao tem o seu suporte numa nova
classe, a definir como uma classe descendente de uma das classes de PLCs virtuais j existentes.
As classes terminais da hierarquia, quando instanciadas, do origem a PLCs virtuais que simulam
o programa em modos diferentes.
BCPopUpWindow

C20Omron

C20FastSimul

C20RealSimul

C20RealSimulInteractive

C20RealSimulNormal

83

Fig. 24 - Hierarquia de classes representativas dos PLCs virtuais implementados

Os modos de simulao implementados tm as suas caractersticas prprias, permitindo


diferentes anlises para o funcionamento de um mesmo programa. A opo de criar vrios modos
de simulao (e de dar o suporte criao de outros modos) foi tomada com o objectivo de dotar
o sistema com capacidades acrescidas para o seu uso no ensino de programao e proporcionar
diferentes formas de testar programas.

6.5.1.

Simulao rpida

O Manual de Utilizao, que se encontra em apndice (ponto A.5.3), apresenta a


simulao rpida na ptica do utilizador. Esta simulao define-se como um modo de simulao
em que as entradas so introduzidas atravs do Editor de Estmulos, o programa simulado sem
pausas para todos os pontos definidos no Editor de Estmulos sendo os resultados analisados (aps
a simulao) usando o mesmo editor. Para construir os estmulos so fornecidas ferramentas (j
atrs referidas aquando da apresentao do Editor de Estmulos) que permitem desenhar os
estmulos de uma forma rpida e simples. Para analisar os resultados, de modo a verificar a
correco do programa ladder, so fornecidas ferramentas de ampliao e de medio de tempos.
Do ponto de vista de programao, este modo de simular o funcionamento do PLC
suportado por um objecto que se instancia da classe C20FastSimul. Esta classe derivada de
C20Omron, tendo sido redefinidas duas funes virtuais: InitSimulation e UpdateOutputStimulus.
class C20FastSimul : public C20Omron
{
public:
C20FastSimul(SimulC20Window *opPrnt, SimulationWindow *opSimulWindow); // construtor da classe
virtual VOID InitSimulation(VOID);
// para iniciar a simulao
virtual VOID UpdateOutputStimulus(VOID);
// para actualizar os estmulos
};

Em InitSimulation invocada a funo C20FastSimul::InitSimulation() que inicializa por


defeito o objecto, por forma a que este possa simular correctamente o programa. Em seguida, para
todos os pontos definidos nos estmulos (numberOfSteps), feita a actualizao das entradas, o
varrimento do programa e a actualizao (e visualizao) dos estmulos em simultneo com a
apresentao dos resultados do varrimento actual.
A figura 25 mostra o comportamento da funo InitSimulation para um exemplo de um
programa com uma entrada (IR_00000) e uma sada (IR_00200). O ponto do diagrama temporal
do estmulo IR_00000, cujo nmero de ordem stepInSimulation, lido pelo simulador
(UpdateInputStimulus); em seguida feita uma simulao de um varrimento do programa
(SimulationC20); por fim, o resultado da simulao arquivado no ponto com o mesmo nmero

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

Fig. 25 - Processamento dos pontos dos estmulos pelo simulador

O cdigo para a funo InitSimulation() apresentado a seguir. Pode ver-se a codificao


da ideia do processamento ilustrado na figura 25. De notar que os varrimentos do programa
(SimulationC20) so feitos sequencialmente e sem pausas.
VOID C20FastSimul :: InitSimulation()
{
C20Omron::InitSimulation();
// para a inicializao por defeito
for (stepInSimulation = 0;stepInSimulation < numberOfSteps; stepInSimulation++) { // para todos os pontos
UpdateInputStimulus(stepInSimulation);
// inicializa as entradas com os pontos dos estmulos
SimulationC20();
// simula um varrimento do programa
UpdateOutputStimulus(stepInSimulation); // actualiza os estmulos
}
...
}

A funo UpdateInputStimulus herdada do PLC virtual base, mas a funo


UpdateOutputStimulus redefinida neste PLC virtual, de modo a permitir a visualizao dos
resultados na janela do editor de estmulos. Esta janela invoca a funo UpdateOutputStimulus do
PLC base, por forma a guardar os estmulos e, em seguida, desenha o estado do ponto actual para
todos os estmulos de sada que esto definidos.
VOID C20FastSimul :: UpdateOutputStimulus(VOID)
{
C20Omron::UpdateOutputStimulus();
// para arquivar os resultados nos estmulos de sada
int i = 0;
while(outputStimul[i].outStimul != NULL) {
// se o estmulo estiver definido
outputStimul[i].outStimul->DrawBit(stepInSimulation); // desenha os estado do ponto correspondente
i++;
// incrementa o nmero de ordem do estmulo
}
...
}

6.5.2.

Simulao em tempo real

85

As marcas de tempo na execuo de um programa num PLC so o scan time (tempo


correspondente execuo de um ciclo completo - figura 23), e os tempos envolvidos nos
temporizadores eventualmente presentes no programa. Para emular, em tempo real, o
funcionamento de um PLC necessrio garantir que o PLC virtual respeite essas marcas
temporais.
A figura 26 ilustra a filosofia do simulador de tempo real desenvolvido, cujo
funcionamento pode ser descrito da seguinte forma: o utilizador d a ordem ao Simulador
(atravs de um boto) para que este inicie a simulao em tempo real do programa ladder; o
Simulador procede ento s inicializaes necessrias e, em seguida, envia um evento de Incio
de actividade para o Relgio de simulao, aps o que se mantm num estado de espera de
eventos de Scan Time enviados pelo Relgio; quando receber um evento o Simulador simula um
ciclo de execuo completo, lendo as Entradas, fazendo um varrimento completo e actualizando
as Sadas.
Incio de simulao
(utilizador)

Incio de
actividade

Memria

Evento de
Scan Time

Simulador

Relgio
(Temporizador
do Windows)

PLC virtual em execuo (verso tempo real)

Sadas

Entradas

Fig. 26 - PLC virtual em execuo (verso tempo real)

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

Fig. 27 - Atraso da simulao tempo real provocado pelo tempo de simulao de um


ciclo.
tscan - periodo do Relgio de simulao (periodo de tempo entre eventos de Scan
Time)
tp - tempo de processamento dos eventos de Scan Time pelo Windows e
Win++
ts tempo de processamento de um ciclo (UpdateInputStimulus,
SimulationC20 e UpdateOutputStimulus)
1) - tempo de execuo de um ciclo menor que o periodo de Relgio.
2) - tempo de execuo de um ciclo maior que o periodo de Relgio.
at1, ..., atn - atrasos na simulao do ciclo n relativamente ao evento n do relgio
de simulao.

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

enviado como parmetro para a funo StartTimer, contudo a resoluo aproximadamente 55


milisegundos (dados do fabricante do PC), e afectada pela carga do sistema, como j foi referido
anteriormente.

6.5.2.2. A classe base de PLCs virtuais tempo real


A classe base para os PLCs virtuais em tempo real a classe C20RealSimulation, que
define o temporizador a utilizar na simulao tempo real. Alm disso, esta classe define o cdigo
para parar a simulao em tempo real (StopSimulation), o cdigo para iniciar a simulao em
tempo real e, ainda, o cdigo para parar a simulao quando as condies deixam de ser
favorveis a que esta seja executada em tempo real, isto , quando a janela do PLC virtual fica
inactiva.
class C20RealSimul : public C20Omron
{
protected:
BCTimerDevice *updateStimulusClock;
// relgio de scan time
virtual VOID Activation(BCEvent *opEvt);
// invocada na alterao da activao da janela
...
public:
C20RealSimul(SimulatorC20Window *opPrnt, SimulationWindow *opSimulWindow);
virtual VOID StopSimulation(VOID);
// para parar a simulao
virtual VOID InitSimulation(VOID);
// para iniciar a simulao tempo real
};

No construtor da classe, entre outras inicializaes, criado o objecto que serve de


relgio da simulao.
C20RealSimul :: C20RealSimul(SimulatorC20Window *opPrnt, SimulationWindow *opSimulWindow)
: C20Omron(opPrnt,opSimulWindow)
{
...
updateStimulusClock =new BCTimerDevice(this, ID_UPDATE_INPUTS_CLOCK, FALSE, GetApp() );
}

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

Na funo StopSimulation, o relgio de simulao desactivado deixando, por isso, de


gerar eventos de Scan Time, o que tem como consequncia parar a simulao. Alm disso,
tambm so inicializados todos os objectos ladder, presentes no programa, que dependem do
tempo (temporizadores).

VOID C20RealSimul :: StopSimulation(VOID)


{
updateStimulusClock->StopTimer();
// desactiva o relgio de simulao
Circ->ResetAllTimers();
// inicializa todos os temporizadores presentes no programa
}

A funo Activation a funo de atendimento a eventos de activao/desactivao da


janela. Neste caso, ao detectar-se a desactivao da janela imediatamente "desligada" a
simulao em tempo real pelas razes j anteriormente apontadas.
VOID C20RealSimul :: Activation(BCEvent *opEvt)
{
if(!opEvt->IsActivated() )
// verifica a flag de activao/desactivao proveniente do objecto BCEvent
StopSimulation();
// se a janela foi desactivada pra a simulao
}

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;

// bitmap da imagem do PLC real

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
};

A redefinio da funo InitSimulation suporta as aces que se referem especificamente


a este objecto, nomeadamente "trazer" a janela do PLC real para o topo e inicializar algumas das
variveis utilizadas no processo de simulao. , tambm, invocada a funo InitSimulation do
PLC real base para inicializar o relgio de simulao.
VOID C20RealSimulNormal:: InitSimulation()
{
BringToFront();
// traz para o topo a janela
if( !IsVisible())
// verifica se a janela est ou no visvel
Show();
// mostra a janela caso esta esteja visvel
oldInputValue = 0;
oldOutputValue = 0;
...
C20RealSimul::InitSimulation(); // inicia a simulao tempo real
}

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

A funo UpdateInputStimulus inicializa as entradas do PLC tempo real, com os novos


estmulos correspondentes ao varrimento actual, e actualiza os "LEDs" correspondentes s
entradas em que houve comutao do estado.
VOID C20RealSimulNormal:: UpdateInputStimulus(VOID)
{
C20Omron::UpdateInputStimulus();
// para actualizar as entradas com os novos estmulos
WORD val = *GetIR(0)^oldInputValue;
// carrega em val as modificaes das entradas
for(int i = 0; i < MAX_C20_INPUTS; i++ ) // para todas as entradas
if( val & oMaskBit[i] )
// se o estado da entrada i variou
InvertRect(inputRect[i]);
// inverte o rectngulo correspondente a essa entrada
oldInputValue = *GetIR(0);
// guarda o estado das entradas para o prximo varrimento
...
}

A funo UpdateOutputStimulus actualiza os estmulos de sada, com os resultados do


varrimento actual, e actualiza os "LEDs" correspondentes s sadas em que houve comutao do
estado.
VOID C20RealSimulNormal:: UpdateOutputStimulus(VOID)
{
C20Omron::UpdateOutputStimulus();
// actualiza os estmulos de sada
WORD val = *GetIR(2)^oldOutputValue; // carrega em val as modificaes das sadas
for(int i = 0; i < MAX_C20_OUTPUTS; i++ )
if( val & oMaskBit[i] )
// se o estado da sada i variou
InvertRect(outputRect[i]);
// inverte o rectngulo correspondente a essa sada
oldOutputValue = *GetIR(2);
// guarda o estado das sadas para o prximo varrimento
...
}

6.5.2.4. A simulao em tempo real interactiva


Define-se a simulao em tempo real interactiva como sendo uma simulao em tempo
real em que as entradas so actualizadas pela aco do rato ou teclado, por oposio simulao
tempo real normal em que existe a necessidade de definir os estmulos de entrada no editor de
estmulos. De facto, j BARKER [32] preconizava que um modo de simulao interactivo deve
permitir ao utilizador estimular directamente o sistema, escolhendo um evento de cada vez.
Importa realar que este tipo de simulao foi implementado por forma a permitir ao
utilizador a construo da sua prpria janela interactiva, pelo que esta janela pode variar
consoante as necessidades de teste de cada programa. O funcionamento, do ponto de vista do
utilizador, pode ser analisado no Apndice A, ponto A.5.4.3.
O processo que suporta este tipo de simulao idntico ao anterior. Corresponde, neste
caso, a derivar uma classe (C20RealSimulInteractive) da classe base (C20RealSimul), a adicionar
novos dados e funes membro e a redefinir as necessrias funes virtuais.

92

class C20RealSimulInteractive : public C20RealSimul


{
InputOutputRadioButton *opInputs[ MAX_INT_SIMUL_INPUTS];
// botes para as entradas
InputOutputRadioButton *opOutputs[ MAX_INT_SIMUL_OUTPUTS]; // botes para as sadas/pontos internos
BCStaticText *opStaticTextInfo;
// para mostrar informao durante a simulao
protected:
WORD Initialize(VOID);
// inicializao dos objectos geridos pela janela interactiva
VOID TimerEvent(BCEvent *opEvt);
// para atender os eventos do relgio de simulao
public:
...
virtual BOOL InitSimulation();
// para iniciar a simulao
virtual VOID StopSimulation(VOID);
// para parar a simulao
virtual VOID UpdateInputStimulus();
// l os estmulos para as entradas
virtual VOID UpdateOutputStimulus(); // actualiza as sadas/pontos internos definidos na janela interactiva
};

O objecto instanciado desta classe comporta um conjunto de objectos do tipo


InputOutputRadioButton. A classe representativa desses objectos derivada da classe do Win++,
fornecida para representar Radio Buttons. Assim, estes objectos herdam todas as caractersticas
desses botes, incluindo as necessrias gesto de eventos de rato ou teclado; alm disso, atravs
de outras caractersticas especificamente desenvolvidas, objectos deste tipo permitem fazer a
monitorizao do estado de bits na memria do PLC virtual, bem como fornecer uma plataforma
para a modificao do estado das entradas.
class InputOutputRadioButton : public BCRadioButton
{
protected:
char *opAddress; // endereo do bit que o boto monitoriza ou trabalha (sada/ponto interno ou entrada)
char *opLabel;
// etiqueta, para representar a entrada ou sada/ponto interno
WORD *memLocation;
// ponteiro para a palavra que contm o bit na memria do PLC
WORD maskBit;
// mscara para acesso ao bit
BOOL isActive;
// sinaliza se o boto est ou no activo
BOOL isInput;
//sinaliza se o boto representa uma entrada ou uma sada/ponto interno
BOOL showLabel;
// qual a informao que deve ser visualizada com o objecto (endereo ou etiqueta)
public:
VOID SetMemLocation(WORD *mem);
// modifica o ponteiro para a palavra em memria
WORD *GetMemLocation(){return memLocation;} // devolve o ponteiro para a palavra em memria
BOOL IsInput(){return isInput;}
// devolve a sinalizao de entrada ou sada/ponto interno
...
};

As funes InitSimulation e StopSimulation apenas invocam as funes idnticas da sua


classe antecessora e imprimem mensagens de informao para o utilizador.
BOOL C20RealSimulInteractive :: InitSimulation()
{
opStaticTextInfo->SetText("A simular");
// imprime uma mensagem de sinalizao
C20RealSimul::InitSimulation();
// inicia a simulao tempo real
}
VOID C20RealSimulInteractive :: StopSimulation(VOID)
{

93

C20RealSimul::StopSimulation();
opStaticTextInfo->SetText("");

// para parar a simulao


// imprime uma mensagem de sinalizao

Na funo TimerEvent simula-se um ciclo de execuo do programa. Neste caso, e ao


contrrio do PLC tempo real normal, no existe nenhum processamento adicional para parar a
simulao, j que esta, no necessitando de definir os estmulos de entrada, no uma simulao
finita (simulao de um nmero limitado de pontos). A partir do momento em que a simulao
iniciada, o PLC virtual assemelha-se em tudo a um PLC real em execuo, s parando aps ordem
do utilizador (Opo de paragem de simulao - Apndice A, ponto A.5.4.2).
VOID C20RealSimulInteractive :: TimerEvent(BCEvent *opEvt)
{
UpdateInputStimulus();
// actualiza as entradas
SimulationC20();
// simula um varrimento
UpdateOutputStimulus(); // actualiza os objectos de sada/pontos internos
}

A funo UpdateInputStimulus apenas necessita de ler o estado dos vrios botes,


representativos dos objectos do tipo entrada, e de actualizar as entradas do PLC virtual.
VOID C20RealSimulInteractive :: UpdateInputStimulus()
{
WORD *mem = NULL;
for(int i=0;i< MAX_INT_SIMUL_INPUTS; i++ ) { // para todos os objectos que representam entradas
mem = opInputs[i]->GetMemLocation();
// posio de memria que o objecto opInputs[i] representa
if (mem)
// se o objecto estiver definido
if ( opInputs[i]->GetState() )
// analisa o estado do boto
// o estado do boto ON, ento actualiza a entrada correspondente ao objecto opInputs[i] com o estado ON
*mem |= opInputs[i]->GetMaskBit();
else
// o estado do boto OFF, ento actualiza a entrada correspondente ao objecto opInputs[i] com o estado OFF
*mem &= ~opInputs[i]->GetMaskBit();
}
}

Para cada objecto do tipo sada/ponto interno, a funo UpdateOutputStimulus l o


estado do bit em memria e actualiza o estado do boto correspondente.
VOID C20RealSimulInteractive :: UpdateOutputStimulus()
{
WORD *mem = NULL;
BOOL oValue = FALSE;
// para todos os objectos que representam sadas/pontos internos
for(int i=0;i< MAX_INT_SIMUL_OUTPUTS; i++ ) {
mem = opOutputs[i]->GetMemLocation(); // posio de memria que o objecto opOutputs[i] representa
if( mem ) {
// se o objecto estiver definido
oValue=(*mem)&opOutputs[i]->GetMaskBit(); // l o estado do bit que o objecto opOutputs[i] analisa
if(!oValue) {
// se o estado for OFF
if (opOutputs[i]->GetState() )
// se o estado do boto for ON
opOutputs[i]->SetState(FALSE);
// coloca o estado do boto a OFF
}

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.

Modos de simulao do PLC virtual

Uma das vertentes importantes do presente trabalho foi o desenvolvimento de diversos


modos para a simulao de programas, os quais, naturalmente, apresentam vantagens e
inconvenientes que passaremos a enunciar.
Simulao Rpida
O modo Simulao Rpida permite uma anlise bastante detalhada dos resultados de um
programa, atravs da observao de diagramas temporais de entradas e sadas/pontos internos
definidos no editor de estmulos. Essa anlise auxiliada por ferramentas fornecidas pelo editor
de estmulos, nomeadamente ferramentas de scroll e de ampliao, e tambm de escalas temporais
associadas posio dos cursores.
A possibilidade de criar estmulos apropriados para diversas situaes contribui
decisivamente para o aumento da capacidade de teste de programas. De facto, podem definir-se
estmulos sincronizados ou atrasados no tempo, por forma a simular situaes razoavelmente
complexas de controlo de processos com mltiplas combinaes entre entradas.
Os resultados de programas fortemente dependentes do tempo, em particular os
provenientes de processos lentos, podem ser obtidos a uma velocidade muito superior ao tempo
real. Assim, devido rapidez deste modo de simulao, o sistema torna factvel a simulao de
mltiplas hipteses para solucionar um mesmo problema.
Como j foi referido anteriormente, possvel armazenar, em disco, conjuntos de
estmulos e de caractersticas de simulao (como sejam, tempo de simulao, perodo de
varrimento e factor de ampliao) de maneira a possibilitar posteriores simulaes ou anlises de
resultados. Por exemplo, podem escrever-se vrios conjuntos de estmulos para um programa (ou
para vrios programas) e, lanando duas aplicaes do PLC virtual, comparar os resultados com
base em diferentes janelas do editor de estmulos.
Alguns utilizadores menos experimentados podero, no incio, encontrar algumas
dificuldades na interpretao de diagramas temporais. Contudo, com alguma formao e aps
treino essas dificuldades so rapidamente ultrapassveis.

96

A limitao imposta pelo sistema ao tempo de simulao constitui a desvantagem mais


evidente do modo Simulao Rpida, pelo que se deve, nos casos em que tal seja problemtico,
complementar a anlise com a Simulao Interactiva, cujo tempo de simulao no limitado.
Simulao Normal em tempo real
Em aplicaes simples, os utilizadores experimentados testam os seus programas atravs
da observao dos indicadores luminosos (correspondentes s entradas e s sadas) existentes no
painel do autmato programvel. O modo Simulao em tempo real Normal, em virtude de
apresentar a imagem do PLC com os respectivos sinalizadores luminosos, permite exactamente o
mesmo tipo de observao, ou seja, a verificao em tempo real do funcionamento do programa.
Se os tempos envolvidos no forem demasiado pequenos, este modo de simulao pode
ser til para seguir, em tempo real, o comportamento de temporizadores e contadores existentes
no programa, bem como acompanhar a evoluo de sadas que deveriam, por exemplo, ser
activadas de uma forma sequencial.
Com a Simulao Normal em tempo real no existe a possibilidade de verificar o estado
de pontos internos do PLC, semelhana do que acontece com um autmato real, que s
apresenta as entradas e sadas fsicas. Contudo, no PLC virtual, os pontos internos podem ser
analisados aps a simulao recorrendo ao editor de estmulos.
Por ser em tempo real, o uso exclusivo da Simulao Normal no desenvolvimento e teste
de solues, particularmente em processos lentos, pode traduzir-se em tempos de projecto
demasiado dilatados.
Simulao Interactiva em tempo real
Como o prprio nome indica, a principal vantagem deste modo de simulao a
interactividade que se consegue utilizando botes que ligam e desligam entradas, semalhana
dos mdulos fornecidos por alguns construtores para simular entradas a partir de interruptores
mecnicos.
Com a Simulao Interactiva possvel testar equaes booleanas, traduzindo-as por
degraus de diagramas ladder, experimentando vrias combinaes de entradas e verificando
imediatamente o comportamento das sadas.
Este tipo de simulao permite verificar, em tempo real, o estado de pontos internos de
um programa, complementando, assim, a Simulao Normal.
Dada a possibilidade de definir etiquetas para os bits que se pretendam analisar, a tarefa
do utilizador na introduo de dados e na interpretao das sadas fica simplificada. Por outro
lado, permitido ao utilizador definir a posio e o nmero de objectos na janela interactiva de
cada fase de teste de um programa; desse modo, e atravs de um posicionamento expressivo dos
97

objectos representativos dos bits de entrada ou de outros bits a analisar, a interpretao do


funcionamento de um programa pode tornar-se mais clara.
semelhana do que acontece com o editor de estmulos, tambm aqui possvel gravar
em disco as janelas interactivas construdas, de modo a poder executar-se a posteriori simulaes
de um dado programa. Com a criao e gravao de vrias janelas interactivas, torna-se fcil
avaliar, quase em simultneo, partes distintas de um mesmo programa.
Finalmente, na Simulao Interactiva, e ao contrrio do que acontece na Simulao
Rpida, no existe a possibilidade de guardar os resultados da simulao, devido ao facto de se
tratar de um modo que no define um tempo finito de simulao.

7.2.

Adies ao sistema PLC virtual

O desenvolvimento de todo o sistema PLC virtual foi baseado em metodologias de


programao por objectos, as quais permitem a reutilizao das classes construdas e simplificam
futuras adaptaes, nomeadamente a adio de novas instrues ladder ao leque das instrues
implementadas no PLC virtual, e ainda o desenvolvimento de verses virtuais para outros PLCs
reais.
Integrao de instrues ladder
A integrao, no PLC virtual, de novas instrues ladder requer um conjunto de aces,
quer ao nvel da construo das classes que definem essas instrues, quer no que respeita ao
desenvolvimento do cdigo que ir permitir a sua insero na interface grfica e no mdulo de
arquivo, que passaremos a apresentar.
A classe representativa de uma nova instruo pode ser derivada de qualquer classe j
existente na hierarquia de classes de objectos ladder. Por exemplo, se a instruo tiver mais do
que uma entrada ou sada, essa classe deve ser derivada da prpria classe Module (ou de uma sua
descendente), para que adquira as caractersticas do tipo mdulo que a diferenciam de instrues
de outro tipo.
Para cada nova instruo, deve ser criado, por exemplo com o Workshop, um bitmap que
lhe confira o aspecto visual que se pretende que aparente. O objecto, do tipo BCBitmap, que
suporta esse bitmap deve ser declarado static, por forma a servir todos os objectos desse tipo
eventualmente presentes num programa. Alm disso, necessrio redefinir a funo virtual
GetBitmap, que devolve o novo bitmap, ou ento redefinir a funo virtual de Draw, se se
pretender um display diferente para o objecto.
A funo virtual Simul deve, se necessrio, ser redefinida. Tal no o caso, para novos
objectos unicelulares, j que essa funo, definida ao nvel da classe BaseShape, por efeito dos
98

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.

Emulao de outros PLCs reais


O modelo de virtualizao de autmatos programveis descrito neste trabalho pode ser
aplicado a qualquer tipo de PLC, sendo relativamente simples adaptar o software desenvolvido de
modo a emular outros autmatos comerciais, como se pode verificar pela apresentao seguinte.
99

A interface grfica permanece inalterada, mas torna-se necessrio modificar a hierarquia


de PLCs virtuais e a hierarquia de classes representativas das instrues ladder.
As instrues bsicas para entradas, sadas e temporizadores so implementadas pelos
fabricantes de formas muito similares. Para outras instrues ser, eventualmente, necessrio
desenvolver o cdigo para a funo OwnerSimulation, por forma a simular o comportamento
dessas instrues de acordo com as especificaes do fabricante do PLC.
Ao nvel da hierarquia dos PLCs virtuais obrigatrio definir a memria para o PLC
virtual na classe base de PLCs virtuais, substituir o cdigo da funo GetMemoryAddress, de
modo a suportar o mecanismo de endereamento do novo PLC, e modificar todas as funes
membro que acedem directamente memria do PLC.

7.3.

Concluses

Neste trabalho foi desenvolvido um sistema que permite virtualizar autmatos


programveis, muito particularmente o modelo C20H da Omron. O sistema foi construdo como
uma aplicao para o Microsoft Windows e para trabalhar sobre computador pessoal.
Globalmente e do ponto de vista de desenvolvimento, o sistema apresentado pode
encarar-se como contendo duas partes distintas: a interface grfica e o PLC virtual.
Para a implementao da interface grfica com o utilizador recorreu-se a uma biblioteca
de classes em C++ (Win++ da Blaise Computing), a qual permitiu utilizar o Windows numa
filosofia de programao por objectos. Os objectos grficos da interface do PLC virtual foram
construdos derivando novas classes, a partir do Win++, s quais foram adicionados dados e
funes membro para manipular os novos objectos, e redefinindo algumas funes virtuais de
atendimento a eventos.
Outro aspecto importante da interface tem a ver com o uso de bitmaps para a
representao dos smbolos ladder. O utilitrio Workshop simplificou as tarefas de manipulao
de bitmaps necessrias definio da aparncia dos smbolos ladder, podendo essa aparncia ser
modificada sem recompilar o programa.
De relevar ainda, ao nvel da interface, a organizao dos vrios componentes do
sistema em janelas autnomas. Esta forma de organizao permite ter todo o sistema operacional,
nomeadamente o Editor de Programao, o Editor de Estmulos, a janela da Simulao Interactiva
e a janela do PLC real (figura 29). Deste modo, o utilizador pode proceder a alteraes no
programa e, por exemplo, com um simples click do rato, simular de imediato o programa num dos
trs modos de simulao implementados, verificando rapidamente os resultados.

100

Fig. 29 - Janelas do PLC virtual

A construo do PLC virtual tem por base um conjunto de classes, desenvolvidas em


C++, que permitem representar quer os PLCs virtuais, quer as instrues que eles reconhecem.
Assim, foram criadas duas hierarquias: uma para suportar todos os PLCs virtuais e a outra para
suportar as instrues ladder que o PLC virtual reconhece. Para cada hierarquia foi definida uma
classe abstracta de base, de modo a definir as funcionalidades e caractersticas a que todas as
classes descendentes devem obedecer. Desta forma, a criao de novas instrues e/ou de novos
PLCs virtuais encontra-se "regulamentada" pelas classes ascendentes, e corresponde derivao
de uma classe a partir de uma das hierarquias.
Para a simulao de programas desenvolveu-se um algoritmo genrico, implementado
com base nos mecanismos de herana e de polimorfismo das linguagens de programao por
objectos. O algoritmo de simulao traduz a forma como interpretada a linguagem Ladder,
dotando os vrios objectos ladder, presentes num dado programa, com competncias de
simulao, ou seja, cada objecto ladder interpreta as suas ligaes a outros objectos e simula a
instruo que representa na memria do PLC virtual.
O sistema visa dois tipos de utilizao: como auxiliar de ensino para cursos iniciais sobre
programao de PLCs; como ferramenta para programao e diagnstico de aplicaes

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

Um trabalho da ndole do que foi apresentado necessariamente uma pea incompleta e


imperfeita, que requer alteraes que a melhorem e complementem.
O sistema PLC virtual deveria ser testado com um maior nmero de utilizadores, de
modo a inferir sobre possveis modificaes principalmente ao nvel da interface grfica.
Outras possibilidades para prosseguir este trabalho, por forma a aumentar as suas
capacidades, so apresentadas a seguir:
- Desenvolver uma placa para comunicao do PLC virtual com o exterior, o que
corresponde a construir um sistema de entradas/sadas semelhante ao existente nos PLCs reais.
Tal placa permitiria a insero do sistema PLC virtual em situaes reais de controlo.
- Incorporar no PLC virtual outros editores de programao, que permitam programar o
PLC virtual noutras linguagens, principalmente nas definidas no recente standard (IEC 1131
Standard - Part 3 Programming Languages, 1993), o qual engloba duas linguagens grficas
(Linguagem Ladder e Diagramas de Blocos Funcionais), duas linguagens textuais (Lista de
Instrues e Texto Estruturado) e uma linguagem grfica com uma estrutura baseada no Grafcet
(Sequential Function Chart).
- Estabelecer mecanismos de converso entre as diversas linguagens.

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]

HUGHES, Thomas A. - Programmable Controllers. Instrument Society of America (ISA),


1989.

[5]

MICHEL, Gilles - Programmable Logic Controllers. John Wiley & Sons, 1990.

[6]

LYTLE, Vincent A. - A Survey of PLC Language Features. In: Proceedings of the


Seventh Annual Control Engineering Conference. Rosemont (USA), June 1988.

[7]

OMRON Corporation - Mini H-type Programmable Controllers - Operation Manual.


Omron, July 1990.

[8]

WHITE, Robert B., R. K. Read, M. W. Koch, R. J. Schilling - A Graphics Simulator for a


Robotic Arm. In: IEEE Transactions on Education, vol. 32, no. 4, November 1989.

[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

[17] CUTRONA, Louis J. - Class Conflit. In: Byte, September 1991.


[18] BLAISE Computing - WIN++, class library for Windows, Version 2.1. Blaise Computing,
Inc., 1991.
[19] Borland - Borland C++ 3.1, Manuals. Borland International, USA 1991.
[20] AZEVEDO, J. L., J. A. Ferreira, J. P. Estima de Oliveira - Universal System to Program
and Simulate Programmable Controllers. In: Actas das 3as Jornadas Hispano-Lusas de
Ingeniera Elctrica. Barcelona (Espanha), July 1993.
[21] LESK, E., E. Schmidt - Lex: A Lexical Analyser Generator. In: The Unix Programmer's
Manual, Suplementary Documents. 1975.
[22] JONHSON, Stephen C. - YACC: Yet Another Compiler-Compiler. In: The Unix
Programmer's Manual, Suplementary Documents. 1975.
[23] BIEN, Christopher - Simulation a necessity in safety engineering. In: Robotics World,
December 1992.
[24] RAZ, Tzvi - Graphics Robot Simulator for Teaching Introdutory Robotics. In: IEEE
Transactions on Education, vol. 32, no 2, May 1989.
[25] WILLIAMS, Tom - Object oriented methods transform real time programming. In:
Computer Design, September 1992.
[26] SWAINSTON, Fred - A system approach to programmable controllers. Delmar
Publishers Inc., 1992.
[27] BABB, P. - Is Ladder Logic The Right Software Tool ?. In: Control Engineering, June
1988.
[28] MYERS, Brad A. - Taxonomies of visual programming and program visualization. In:
Journal of Visual Languages and Computing, March 1990.
[29] BISCHAK, Diane P., Stephen D. Roberts - Object Oriented Simulation. In: Proceedings
of the 1991 Winter Simulation Conference. Phoenix (USA), December 1991.
[30] FERREIRA, J. A., J. L. Azevedo, J. P. Estima de Oliveira - Virtualization of
Programmable Logic Controllers. In: Proceedings of the International AMSE Conference
on Systems Analysis, Control & Design - SYS' 93. London (England), September 1993.
[31] ESTIMA DE OLIVEIRA, J. P., J. L. Azevedo, J. A. Ferreira, P. J. Ferreira - Software
Development for Programmable Logic Controllers - a methodology and a system. In:
Proceedings of the IFAC Workshop on CIM in Process and Manufacturing Industries.
Espoo (Finlndia), November 1992.
[32] BARKER, A., J. Song - A Graphical simulation Tool for programmable logic
controllers. In: IEE Colloquium on Discret Event Dynamic Systems - Generation of
Modelling, Simulation and Control Applications. London, 1992.
104

PlcPro - Captulo 1

Introduo

Apndice A

Manual de Utilizao da aplicao PLC virtual


(PlcPro)

Abril 94

105

Captulo A.1
A.1 Introduo

Desde o seu aparecimento na dcada de 60, os autmatos programveis tm vindo a


dar um contributo fundamental para o aumento de produtividade nas indstrias,
principalmente nas indstrias de produo.
Hoje em dia cada vez mais empresas, nas mais variadas reas, usam este tipo de
computadores industriais para automatizar as suas linhas de produo, para controlar
mquinas e processos, etc.. Por este facto, e devido complexidade crescente deste tipo de
aplicaes, aumentou a necessidade de formar mais tcnicos especializados na programao
de autmatos.
O sistema aqui descrito (denominado PlcPro) permite a instalao com baixo custo de
laboratrios para o ensino da programao de autmatos industriais, tambm designveis
abreviadamente por PLCs (do ingls "Programmable Logic Controllers").

A.1.1 Caractersticas do sistema


A ideia subjacente ao sistema PlcPro a construo de um PLC por software, de
forma a que as entradas so obtidas com o rato ou com o teclado, e as sadas so
visualizadas no monitor.
Este sistema constitudo por uma aplicao que corre em ambiente Windows e que
representa a virtualizao de um autmato programvel.

Entradas
(teclado, rato)

PLC
virtual

Sadas
(monitor)

Fig. A.1 - Comunicao com o PLC virtual

109

PlcPro - Apndice A - Captulo A.1

Introduo

Esta virtualizao completa e permite a escrita e a execuo de programas


desenvolvidos em Linguagem de Contactos. Depois de escrito o programa, o funcionamento
do autmato pode ser simulado em trs modos diferentes: em tempo real, simulao rpida
e simulao interactiva. Cada uma destas simulaes tem as suas vantagens nas diversas
formas de teste dos programas.
Os vrios autmatos existentes no mercado so conceptualmente muito similares,
quer no que diz respeito ao modo de funcionamento, quer na maneira de os programar.
Contudo h diferenas fundamentais entre as marcas, as famlias e mesmo os modelos de
autmatos disponveis; essas diferenas traduzem-se, por exemplo, no nmero de entradas e
sadas, nmero mximo de passos de programao e, principalmente, nos endereos fsicos
atribudos pelo fabricante aos diferentes componentes que constituem um PLC.
Assim, o presente sistema foi desenvolvido tendo como objectivo a simulao do
modelo C20H da OMRON.

A.1.2 Hardware e software necessrios


A configurao mnima de hardware constituda por computador pessoal PC AT
386Sx, equipado com disco rgido, 2 MB de RAM e rato.
Para correr a aplicao PlcPro so necessrios os ficheiros fornecidos e uma verso
do Microsoft Windows (3.0 ou 3.1) instalada no computador.

A.1.3 Interface grfica


A interface grfica de todo o sistema tem por base a interface fornecida pelo
Microsoft Windows. A escolha desta interface justifica-se pelas suas caractersticas
amigveis e pela imensa divulgao no mundo dos computadores pessoais; o seu uso permite
a novos utilizadores do sistema uma rpida aprendizagem da interface com o utilizador.
Minimizar o tempo de aprendizagem da interface essencial de modo a aproveitar o
mximo tempo disponvel para o que realmente importante que, neste caso, aprender a
programar autmatos.
O sistema oferece um editor de programao em Linguagem de Contactos, um
editor de estmulos de simulao e um editor prprio para a simulao interactiva.

A.1.4 Organizao deste manual

110

PlcPro - Apndice A - Captulo A.1

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.

A.2.1 Tipos de ficheiros


Os ficheiros necessrios so apresentados a seguir:
wpp_b3l1.dll

livraria

wpp_b3l2.dll

livraria

bwcc.dll

livraria

plcpro.exe

programa executvel

*.c20

ficheiros de programas - exemplos

*.sim

ficheiros de estmulos - exemplos

*.int

exemplos de janelas interactivas

A.2.2 Instalao no disco rgido


Juntamente com o sistema, fornecido o programa (install.exe) que permite a
instalao automtica de todos os ficheiros necessrios. A instalao mais correcta
corresponde colocao de todos esses ficheiros no mesmo directrio. Deve ento proceder
da seguinte forma:
1- Criar o directrio C20, digitando as seguintes duas linhas:
112

PlcPro - Apndice A - Captulo A.2

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.

A.2.3 Criao do cone de programa


Para a criao do cone de programa (supondo a verso Inglesa do Windows) devem
seguir-se os passos:
1- Criar uma janela de grupo
Seleccionar o menu FILE do Program Manager
Seleccionar o sub-menu NEW
Seleccionar a opo Program Group
Na opo Description escrever por exemplo PlcPro, e premir no boto OK

2- Seleccionar novamente FILE e em seguida NEW


3- Seleccionar a opo Program Item
4- Preencher a caixa de dilogo apresentada na figura A.2 e, em seguida, seleccionar
OK.

Dever aparecer o cone de programa como se mostra na figura A.3.

113

PlcPro - Apndice A - Captulo A.2

Editor de programao

Fig. A.2 - Caixa de dilogo para criao do cone da aplicao

Est agora em condies de iniciar a aplicao PlcPro.

114

Fig. A.3 - cone do PLC virtual

Captulo A.3
A.3 Editor de programao

O editor de programao permite a escrita de programas em Linguagem de


Contactos. Esses programas podero posteriormente ser simulados pelo PLC virtual.

A.3.1 Janela do editor


O editor encontra-se na janela principal da aplicao e possui uma grelha
constituda por clulas, na qual vo ser colocados smbolos grficos. A interligao
adequada desses smbolos (na horizontal e na vertical), permite representar um programa
em Linguagem de Contactos. A figura A.4 mostra a janela principal e a grelha. Nesta verso
do PlcPro a grelha composta por 9x50 clulas.

Barra de menus
Barra de opes

Clulas da grelha

Janela de informaes
Fig. A.4 - Editor de programao
115

PlcPro - Apndice A - Captulo A.2

Editor de programao

O editor fornece ferramentas para inserir e apagar smbolos na grelha, e permite


utilizar os comandos tradicionais de Copiar, Cortar, Apagar e Colocar. Alm disso, permite
tambm a edio dos smbolos, de modo a modificar os parmetros que os definem ou
caracterizam.

A.3.2 Smbolos grficos da Linguagem de Contactos


Esto implementados smbolos para representar contactos, sadas, contadores,
temporizadores e registos de deslocamento.
Os smbolos implementados correspondem s instrues bsicas (em diagramas de
contactos) utilizadas praticamente por todos os construtores de autmatos. De agora em diante, e
por uma questo de facilidade de apresentao, os smbolos grficos sero divididos em dois
grupos: smbolo tipo elemento - os primeiros quatro da tabela 1; e smbolos tipo mdulo - os
restantes.
Contacto normalmente aberto. O endereo do bit (condio lgica) a testar o nico parmetro
necessrio para smbolos deste tipo.
Contacto normalmente fechado. O endereo idntico ao do contacto normalmente aberto.
Sada normalmente fechada. O endereo representa tambm o endereo da sada ou ponto interno.
Sada normalmente aberta. O endereo representa tambm o endereo da sada ou ponto interno.
Temporizador com atraso operao. So dois os parmetros para este smbolo: o endereo do bit de
sada do temporizador, isto , o bit que sinaliza o fim da temporizao; e o valor que representa o
tempo pr-programado em milsimos de segundo.
Contador descendente. Este smbolo tem duas entradas tipo bit sendo uma a entrada do impulso de
contagem (I) e a outra uma entrada de 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.

116

PlcPro - Apndice A - Captulo A.2

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

A.3.3 Menus e opes


Os menus e as opes permitem dar a funcionalidade desejada aplicao. A
distino que feita tem a ver com a aparncia de ambos, isto , os menus apresentam-se de
uma forma textual, enquanto que as opes se apresentam de uma forma iconizada. Neste
ponto faz-se uma descrio de cada um dos menus e opes:

A barra de menus mostra os menus existentes no editor de programao. Cada


menu tem um conjunto de sub-menus:

Arquivo
Novo

Cria um novo programa

Abrir

Carrega um programa para o editor

Gravar

Grava o programa do editor para o disco

Gravar como

Grava o programa com um outro nome

Sair

Abandona a aplicao
117

PlcPro - Apndice A - Captulo A.2

Sobre PlcPro

Editor de programao

Informao

Editar
Cortar

Apaga os smbolos seleccionados e copia-os para o clipboard

Copiar

Copia os smbolos seleccionados para o clipboard

Colocar

Coloca os smbolos que esto no clipboard na posio seleccionada

Apagar

Apaga os smbolos seleccionados

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

So as seguintes as opes fornecidas pelo editor de programao:


Inactiva

A opo Inactiva permite ao utilizador editar e seleccionar smbolos


j inseridos na grelha (a seleco de smbolos necessria para a
utilizao dos comandos do menu Editar)

Contacto Aberto

Permite inserir um contacto normalmente aberto

Contacto Fechado

Permite inserir um contacto normalmente fechado

Sada Aberta

Permite inserir uma sada normalmente aberta


118

PlcPro - Apndice A - Captulo A.2

Editor de programao

Sada Fechada

Permite inserir uma sada normalmente fechada

Temporizador

Permite inserir um temporizador de atraso operao

Contador Desc.

Permite inserir um contador descendente

Contador Asc./Desc. Permite inserir um contador ascendente/descendente


Registo Desl.
Ligao Vertical

Permite inserir um registo de deslocamento


Permite inserir uma ligao vertical

Ligao Horiz.

Permite inserir uma ligao horizontal

Borracha

Permite apagar qualquer smbolo

Bloqueio

Tem o mesmo significado que o sub-menu Bloquear Opo.

A.3.4 Janela de informaes


A janela de informaes apresenta informaes importantes para o utilizador,
nomeadamente: sobre o tipo de interaco que o rato vai ter no editor, atravs da indicao
da opo seleccionada, e sobre o bloqueio do mecanismo de opes. Alm disso, indica qual a
coluna e a linha da clula de trabalho activada, e fornece uma ajuda automtica na escolha
das opes e/ou menus.

Fig A.5 - Janela de informaes do editor de programao

A.3.5 Janela do editor de texto


A finalidade deste editor de texto a visualizao dos arquivos dos programas
escritos no editor de programao, j que o arquivo uma traduo fiel da grelha do editor.
A forma de arquivo dos programas em modo texto permite a escrita dos programas com um
simples editor de texto, possibilitando ao utilizador a escrita de programas noutro
computador mesmo que no possua o Windows. Este editor tambm til para copiar
linhas de outros programas para o programa presente no editor de programao, sem haver
a necessidade de carregar o dito programa para o editor de programao; para tal basta
abrir o ficheiro de arquivo com o editor de texto, seleccionar da forma tradicional as linhas
a copiar e, em seguida, usar o sub-menu "Colocar" na posio desejada do editor de
programao.
Os comandos deste editor so idnticos aos usados normalmente nos editores de
texto.
119

PlcPro - Apndice A - Captulo A.2

Editor de programao

Fig. A.6 - Janela do editor de texto com o arquivo de um programa semac20

A.3.6 Escrita de programas em Linguagem de Contactos


Neste ponto sero dadas todas as informaes necessrias para o desenvolvimento
de programas em Linguagem de Contactos usando o editor de programao, mas
pressupondo que o utilizador est familiarizado com a estrutura dessa linguagem. Contudo,
algumas regras de construo deste tipo de linguagem so verificadas pelo editor, como por
exemplo:
- na ltima coluna do editor somente podero existir sadas, no permitindo o editor
inserir outros smbolos;
- as sadas s podero ser inseridas na ltima coluna e no em qualquer outra.

A.3.6.1 Inserir smbolos


Para inserir um determinado smbolo na grelha, deve proceder-se da seguinte
forma:
Seleccionar a opo que corresponde ao smbolo desejado.
Premir o rato sobre a clula onde se pretende colocar o smbolo.

Quando a opo seleccionada permite inserir um smbolo, o cursor do rato


representado por um lpis, enquanto que para a insero de uma ligao vertical o cursor
do rato representado por uma linha vertical. Para a opo Inactiva o cursor
representado por Edit .

A.3.6.2 Apagar smbolos

120

PlcPro - Apndice A - Captulo A.2

Editor de programao

Para apagar smbolos pode-se proceder de duas formas diferentes, dependendo do


nmero de smbolos a apagar: utilizando o processo associado ao menu Editar/Apagar, ou
utilizando a opo
(Borracha).
O menu Apagar descrito no ponto A.3.6.4; no segundo caso o procedimento deve
ser o seguinte:
Seleccionar a opo

da barra de opes (o rato agora representado por uma

borracha).
Premir o boto do rato sobre a clula onde se encontra o smbolo a apagar.

A.3.6.3 Editar parmetros de smbolos


Um smbolo, alm de ter uma representao grfica na Linguagem de Contactos,
contm vrios parmetros que o identificam, dependendo o nmero de parmetros do tipo
de smbolo em questo. Por esse motivo, existem dois tipos de caixas de dilogo para edio
dos referidos parmetros, podendo estes ser endereos ou valores numricos. Os endereos
representam posies de memria, sendo possvel enderear um bit ou uma palavra de 16
bits. Um valor numrico pode representar, por exemplo, o tempo pr-programado de um
temporizador ou o valor inicial de um contador.

Para editar os parmetros de um smbolo o utilizador deve proceder da seguinte


forma:
Seleccionar a opo

(Inactiva).

Premir duas vezes o boto do rato sobre o smbolo a editar.

Dependendo do tipo do smbolo aparece uma das duas caixas de dilogo seguintes:

Fig. A.7 - Edio de um elemento

Fig. A.8 - Edio de um mdulo


121

PlcPro - Apndice A - Captulo A.2

Editor de programao

A caixa da figura A.7 permite editar um s endereo, enquanto que a caixa da


figura A.8 permite editar no mximo trs endereos e um valor. A edio destas etiquetas
feita normalmente, ou seja, com os comandos existentes para as caixas de dilogo.

A.3.6.4 Copiar, cortar e apagar smbolos


Para copiar smbolos dentro de um programa deve-se:
1- Seleccionar o(s) smbolo(s) a copiar
Premir o boto do rato sobre a clula a copiar(ou usar o rato numa aco

tradicional de arrastamento (drag) sobre as clulas a copiar).


Escolher o sub-menu Copiar do menu Editar.

2- Seleccionar a clula destino do primeiro smbolo a copiar


Premir o boto do rato sobre a clula pretendida.

3- Escolher o sub-menu Colocar do menu Editar.

Para usar o comando Cortar o processo semelhante ao anterior, mas substituindo


a escolha do sub-menu Copiar pelo sub-menu Cortar.
Para usar o comando Apagar basta seleccionar os smbolos a apagar e escolher o
sub-menu Apagar.

A.3.6.5 Gravao e leitura de programas


Os comandos implementados para a leitura (gravao) de programas de (no) disco so
os tradicionais. Para qualquer deles criada uma caixa de dilogo de modo a facilitar as aces do
utilizador. Os menus so:
Novo
Cria um novo programa
Abrir
Carrega um programa para o editor de programao
Gravar
Grava o programa presente no editor para o disco
Gravar como Permite gravar o programa presente no editor com outro nome
Como j se referiu no ponto A.3.5, os ficheiros de arquivo so em formato de texto.

122

PlcPro - Apndice A - Captulo A.2

Editor de programao

Fig. A.9 - Caixa de dilogo para carregar programas

123

PlcPro - Apndice A - Captulo A.2

Editor de programao

124

Captulo 4
A.4 Editor de estmulos

Como sabido, um autmato industrial, em funo da leitura do estado das suas


entradas e de acordo com o programa de controlo residente em memria, comanda as suas
sadas. Existe ento a necessidade de introduzir as entradas para o PLC virtual e de
verificar o comportamento das sadas, por forma a avaliar o bom ou o mau funcionamento
do programa. Com base nessa avaliao, o programador proceder, se for caso disso, s
necessrias correces.

>Barra de menus
>Barra de opes

>rea de estmulos

>Diagrama temporal

>Janela informaes
rea de endereos

Fig. A.10 - Editor de estmulos

Para fazer face ao problema apresentado, oferece-se um editor para a criao de


estmulos que traduzam os estados das entradas do PLC virtual. Este editor constitui
125

PlcPro - Apndice A - Captulo A.4

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.

A.4.1 Opes e menus


Na barra de menus, o menu Arquivo contm os sub-menus tradicionais, pelo que
apenas os outros so aqui apresentados.
Opes
Redesenhar
Permite redesenhar todo o editor de estmulos.
Linha no rato Transforma o cursor do rato numa linha vertical para analisar com maior
detalhe as transies no diagrama temporal.
Perodo
Este menu permite escolher o perodo para a simulao em tempo real. Aqui, o perodo
determina a taxa a que cada ciclo do programa executado. No incio de cada execuo
lido um conjunto de estmulos de entrada, e no fim de cada execuo so gerados os sinais
resultantes.
50 ms
O perodo de varrimento de todo o
programa feito com intervalos de 50 milisegundos.
100 ms
Idem, 100 milisegundos.
...
500 ms
Idem, 500 milisegundos.
Interactiva
Int_Simul Mostra a janela de simulao interactiva.
Na barra de opes encontram-se as seguintes facilidades:
Abrir

L estmulos, pr-gravados no disco, para o editor.

Gravar

Grava o contedo do editor de estmulos para disco.

126

PlcPro - Apndice A - Captulo A.4

Tempo

Editor de estmulos

Permite definir o tempo de simulao (expresso em segundos) at um mximo


de 300 segundos. Para inserir o tempo existe uma pequena caixa de dilogo:

Fig. A.11 - Insero do tempo de simulao

Ampliao Permite definir o factor de ampliao do editor de estmulos.


S. Rpida Executa a simulao rpida, se no houver erros no programa. Havendo erros no
programa, eles so sinalizados atravs de mensagens.
S. Real
Executa a simulao em tempo real.
Stop

Interrompe a simulao em tempo real. A simulao em tempo real tambm


interrompida automaticamente se o utilizador provocar alguma aco que no
permita o correcto funcionamento desta simulao como, por exemplo, escolher
menus ou mudar de janela.
Borracha Permite apagar completamente um estmulo, incluindo o diagrama temporal e o
endereo.
Sair
Esconde a janela do editor de estmulos.

A.4.2 Definio de endereos


Os endereos so escritos, pelo utilizador, na rea respectiva (rea de endereos), e
servem para: identificar as entradas que necessrio definir antes da simulao; identificar
as sadas ou os pontos internos que se pretendem visualizar aps a simulao. Cada
endereo identifica um s bit, ao qual pode corresponder uma entrada, uma sada ou um
ponto interno.

Para cada entrada deve definir-se o endereo e o diagrama temporal


correspondente.
No fim da simulao, o editor mostra os diagramas temporais das sadas ou dos
pontos internos correspondentes aos endereos definidos na rea de endereos.

127

PlcPro - Apndice A - Captulo A.4

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)

A.4.3 Definio dos estmulos das entradas


A definio do diagrama temporal dos estmulos das entradas feita utilizando o
rato sobre a rea de estmulos do editor. Na figura A.12 mostra-se um estmulo, que
composto por um endereo e pelo seu diagrama temporal.

IR_00000
Endereo da entrada

"0" lgico

"1" lgico

Diagrama temporal

Fig. A.12 - Composio de um estmulo

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

A.4.4 Facilidades adicionais


Para ajudar o utilizador e tornar o editor mais flexvel so fornecidas outras
facilidades.

A.4.4.1 Definio de parmetros


Podem-se definir os seguintes parmetros:

128

PlcPro - Apndice A - Captulo A.4

Editor de estmulos

O tempo de simulao (Tempo) - define o tempo total da simulao. Pode ser

modificado pelo utilizador utilizando a opo

O perodo do relgio de simulao (Perodo) - define o instante de cada

execuo do programa. Pode-se escolher um dos perodos do menu Perodo.


Na janela de informaes mostra-se outro parmetro que o nmero mximo de
pontos do diagrama temporal (Pontos); calculado, tendo em conta os dois parmetros
anteriores, atravs da frmula Pontos = Tempo / Perodo.

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.

Fig. A.13 - Insero do factor de ampliao

A outra forma de modificar o factor de ampliao, obtm-se seleccionando o menu


Linha no rato e utilizando o rato para escolher a rea a ampliar: premir o rato no incio da
rea e, em seguida, premir novamente o rato no fim da rea pretendida. Desta forma
consegue-se visualizar a rea escolhida em toda a dimenso da janela, modificando assim o
factor de ampliao.

A.4.4.3 Janela de informaes


Esta tem a mesma funo da janela de informaes do editor de programao.

Fig. A.14 - Janela de informaes do editor de estmulos

129

PlcPro - Apndice A - Captulo A.4

Editor de estmulos

A informao apresentada no exemplo acima tem o seguinte significado:

t = 21.80s

A posio actual do rato corresponde a um tempo de 21.80 segundos

Tempo-100s

O tempo de simulao de 100 segundos

Perodo-200ms O perodo pr-programado 200 milisegundos


Ampl.-1

O factor de ampliao 1 pixel por ponto

Pontos-500 O nmero total de pontos a simular 500

A.4.4.4 Gravao e leitura de estmulos


Os comandos disponveis para a gravao e leitura de programas so os
tradicionais:

Novo

Cria um novo conjunto de estmulos

Abrir

Carrega um conjunto de estmulos para o editor de estmulos

Gravar

Grava um conjunto de estmulos para o disco

Gravar como Permite gravar o conjunto de estmulos com outro nome

130

PlcPro - Apndice A - Captulo A.4

Editor de estmulos

131

Captulo 5
A.5 Simulao

O programa presente no editor de programao pode ser simulado em vrios


modos, possibilitando um teste alargado ao seu funcionamento. Esses mtodos de simulao
so aqui designados por "simulao em tempo real", "simulao rpida" e "simulao
interactiva". Este captulo descreve o conjunto de operaes a efectuar para a introduo,
simulao e visualizao de dados em cada um dos modos referidos.

A.5.1 Parmetros de simulao


Os parmetros a definir para a simulao so dois e j foram referidos no ponto
A.4.4.1: o tempo de simulao (Tempo) e o perodo do relgio da simulao (Perodo).

A.5.2 Simulao em tempo real


Como o prprio nome indica, esta simulao permite a execuo em tempo real do
programa, respeitando desta forma os tempos associados aos temporizadores e os instantes
exactos em que as entradas mudam de estado.

A.5.2.1 Janela do autmato real


Esta janela aparenta a imagem do autmato real, onde as entradas e as sadas so
mostradas usando os tradicionais sinalizadores, mais conhecidos por LEDs.
possvel desta forma verificar as mudanas de estado das sadas e das entradas,
medida que o programa vai sendo executado.

132

PlcPro - Apndice A - Captulo A.5

Simulao

Fig. A.15 - Janela do autmato real

A.5.2.2 Visualizao dos resultados


Os resultados podem ser visualizados durante ou no fim da simulao. Durante a
simulao a visualizao dos resultados feita sobre a janela do autmato real. Aps a
simulao, a janela do autmato real escondida automaticamente, sendo os resultados
visualizveis sobre a janela do editor de estmulos que, entretanto, se torna activa (veja-se a
figura A.10).
Para utilizar o editor de estmulos necessrio definir os endereos de bit das sadas
e/ou dos pontos internos que se querem observar no final da simulao. Esses endereos so
editados na rea de endereos.
No final da simulao, os diagramas temporais dos estmulos das entradas, e os
resultantes do processo de simulao, podem ser analisados em detalhe utilizando as
facilidades de ampliao e de scroll.

A.5.3 Simulao rpida


A simulao rpida permite executar o programa sem pausas, isto , aps um
varrimento do programa (o qual corresponde a um ciclo de execuo do autmato real)
passa-se de imediato para o varrimento seguinte. Este modo de simulao de extrema
utilidade quando se est a testar um programa fortemente dependente do tempo e se
pretende observar os resultados rapidamente, continuando a garantir uma excelente
preciso na medida.
A visualizao dos resultados idntica da simulao em tempo real, quando se
usa o editor de estmulos. Assim remete-se o leitor para o captulo A.4 onde esse editor
descrito, e para o pargrafo A.6.5.1 onde se apresenta um exemplo ilustrativo.
133

PlcPro - Apndice A - Captulo A.5

Simulao

A.5.4 Simulao interactiva


Esta simulao no necessita da definio prvia dos estmulos de entrada atravs do
editor de estmulos. Durante a simulao, os estmulos das entradas so introduzidas pelo
utilizador, usando o rato sobre uma janela construda para o efeito. Os resultados so tambm
visualizados nessa janela.

A.5.4.1 Janela de simulao interactiva


Com o menu Interactiva do editor de estmulos possvel criar uma janela
interactiva. Esta janela permite a insero de objectos que representam entradas, sadas ou
pontos internos, de acordo com as necessidades de teste. Cada objecto contm um endereo e
uma etiqueta, podendo o utilizador escolher a etiqueta ou o endereo para ser visualizado
com o objecto. Por exemplo, na figura seguinte, para todas as sadas, s so visualizadas as
etiquetas.

Fig. A.16 - Janela interactiva

A.5.4.2 Opes e menus


O nico menu disponvel, neste modo de simulao, o Arquivo, o qual idntico
aos menus Arquivo dos editores de programao e de estmulos.

As opes so as apresentadas a seguir:

Abrir

L uma janela interactiva previamente gravada em disco.


134

PlcPro - Apndice A - Captulo A.5

Simulao

Gravar

Grava a janela interactiva para o disco.

Sair

Esconde a janela do editor de estmulos.

Borracha Permite apagar objectos, que representam entradas, sadas ou pontos internos.
Simular

Permite executar a simulao interactiva.

Stop

Interrompe a simulao interactiva. Esta, semelhana da simulao em tempo


real, tambm interrompida automaticamente se o utilizador executar alguma
aco que no permita o correcto funcionamento da simulao como, por
exemplo, escolher menus ou mudar de janela.

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

visvel, possvel executar a simulao interactiva. Como estas opes ocupam


a mesma posio na barra de opes, em cada momento s uma estar visvel.
Entrada

Insere um objecto do tipo entrada.

Sada

Insere um objecto do tipo sada (ou ponto interno).

A.5.4.3 Configurao da janela interactiva


Como se pode ver na figura 16 oferece-se a possibilidade de colocar os objectos
(entradas ou sadas) em qualquer posio na janela; esta pode tambm ter as dimenses e a
localizao que o utilizador desejar. Isto permite que, para cada programa, o utilizador
coloque as entradas e/ou as sadas nas posies mais adequadas aos seus propsitos de teste.
Por exemplo, para um pequeno programa de controlo de semforos de trnsito, as sadas
poder-se-iam organizar como se mostra na figura A.16.
Para deslocar um objecto de uma posio para outra deve:
Seleccionar a opo

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

PlcPro - Apndice A - Captulo A.5

A.5.4.3.1

Simulao

Criao das entradas

A janela interactiva permite no mximo 12 entradas distintas. Para criar uma


entrada deve:
Seleccionar a opo
Seleccionar a opo

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

Criao das sadas ou pontos internos

A janela interactiva comporta no mximo 18 sadas (ou pontos internos) distintas.


Para a criao de uma sada/ponto interno deve:
Seleccionar a opo
Seleccionar a opo

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

Edio dos endereos e/ou etiquetas

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

PlcPro - Apndice A - Captulo A.5

Simulao

Fig. A.17 - Edio de objectos da janela interactiva

A.5.4.4 Interaco com a simulao


Para iniciar o processo de simulao interactiva deve seleccionar a opo

A interaco do utilizador faz-se utilizando o rato. Esta interaco permite


modificar o estado lgico das entradas; para tal, basta premir o boto do rato sobre o
objecto que representa a entrada desejada.
Os resultados da simulao so ilustrados atravs da mudana de estado das sadas
(ou pontos internos) previamente definidas sobre a janela interactiva.

A.5.4.5 Gravao e leitura do aspecto da janela


Os comandos implementados para a leitura e gravao de programas so os
tradicionais:
Novo
Cria uma nova janela interactiva
Abrir
L uma janela interactiva do disco
Gravar
Grava uma janela interactiva para o disco
Gravar como Permite gravar uma janela interactiva com um outro nome

137

Captulo A.6
A.6 Criao e simulao de um programa

Neste captulo, e partindo de um pequeno exemplo, descrevem-se as aces


necessrias para escrever e simular programas utilizando o sistema PlcPro.
Exemplo - Construir um relgio com uma entrada de Incio. O relgio deve ter um
perodo de 1 segundo e um tempo de servio de 50%.

A.6.1 Escrita do programa


O programa apresentado na figura seguinte uma das solues possveis para o
problema proposto. Comecemos ento, por escrev-lo em Linguagem de Contactos:

Fig. A.18 - Editor de simulao (programa clock)


Usar o sub-menu Novo do menu Arquivo para criar um novo programa
Seleccionar a opo
Seleccionar a opo
Seleccionar a opo
Seleccionar a opo

e premir o boto do rato na clula (1,2), isto , coluna 1-linha 2


(para bloquear o mecanismo de opes)
e premir o boto do rato nas clulas (2,2) e (1,4)
e premir o boto do rato na clula (9,2)
138

PlcPro - Apndice A - Captulo 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:

Fig. A.19 - Edio de mdulo (programa clock)


Premir duas vezes o boto do rato sobre a clula (1,2)
Preencher a caixa de dilogo:

Para os outros smbolos procede-se de forma idntica.


Finalmente, deve-se gravar o programa, por exemplo sob o nome clock, usando o
sub-menu Gravar (ou Gravar Como) do menu Arquivo.

A.6.2 Configurao dos parmetros de simulao


Os parmetros para simulao devem ser inicializados com os valores indicados na
janela de informaes do editor de estmulos (figura A.20). Para isso basta seleccionar, atravs
dos menus convenientes, o perodo de 50ms, o tempo de simulao de 20 segundos e o factor de
ampliao de 2.

139

PlcPro - Apndice A - Captulo 6

Criao e simulao de um programa

A.6.3 Definio dos estmulos de entrada


No exemplo proposto existe um s estmulo de entrada (Incio), cujo endereo
IR_00000. Para editar o endereo, deve-se premir o boto do rato na posio correspondente e
escrever o endereo. Para definir o diagrama temporal do estmulo utiliza-se o rato, como se fosse
um lpis, desenhando o diagrama apresentado na figura A.20.

Fig. A.20 - Editor de estmulos (programa clock - estmulo de entrada de Incio - IR_00000)

A.6.4 Definio das sadas e pontos internos


Neste exemplo h duas sadas (IR_00200 e IR_00201) e dois pontos internos (TC_000
e TC_001, que so os bits de sada dos temporizadores). Deve-se escrever, nas posies
indicadas na rea de endereos, os endereos IR_00200, IR_00201, TC_000 e TC_001, por
forma a visualizar os resultados da simulao nessas sadas e nesses pontos internos.

A.6.5 Simulao do programa


A.6.5.1 Simulao em tempo real
Executando a simulao em tempo real (opo
), verifica-se que a sada 1
(correspondente a IR_00201) do PLC virtual fica activa de forma intermitente com
intervalos de 0.5 segundo.

140

PlcPro - Apndice A - Captulo 6

Criao e simulao de um programa

A.6.5.2 Simulao rpida (usando o editor de estmulos)


Com a simulao rpida (opo
) podem avaliar-se os resultados usando o editor
de estmulos. Para uma melhor anlise temporal deve-se seleccionar o sub-menu Linha no rato do
menu Opes, nomeadamente pode verificar-se que a sada 1 fica activa, pela primeira vez, um
segundo depois do sinal Incio (IR_00000) ficar activo.

Fig. A.21 - Janela de estmulos (programa clock - resultados da simulao)

A.6.5.3 Simulao interactiva


possvel executar a simulao interactiva de tal modo que o sinal de Incio seja
introduzido pelo prprio operador durante a simulao. Seleccione o sub-menu Simul_Int do
menu Interactiva.
necessrio, agora, construir a janela interactiva, que poder ter o aspecto da figura
A.22. Para isso deve criar-se 1 objecto do tipo entrada e 3 objectos do tipo sada/ponto interno:
Seleccione uma vez a opo

, e trs vezes a opo


.
Em seguida, deve editar o endereo e a etiqueta de cada objecto. Por exemplo, para o
objecto do tipo entrada, prima o boto do rato duas vezes sobre este, e preencha a respectiva caixa
de dilogo (ver figura A.23).

141

PlcPro - Apndice A - Captulo 6

Criao e simulao de um programa

Fig. A.22 - Janela interactiva para o programa clock

Fig. A.23 - Edio dos parmetros para a entrada

Proceder da mesma forma para os objectos do tipo sada/ponto interno.


Finalmente, deve deslocar os objectos para as posies indicadas na figura A.22 (isto
se for esse o aspecto desejado) e, em seguida, deve gravar a janela de estmulos por exemplo sob o
nome de clock.
Usando a opo
, verifique, por exemplo, que a sada 1 "pisca" uma vez no incio,
e s volta a "piscar" novamente quando premir com o rato sobre a entrada Incio. A figura A.24
mostra uma simulao interactiva a correr, muito embora a imagem seja pouco expressiva, porque
parada.

Fig. A.24 - Janela interactiva em simulao

142

ndice - Apndice A

A.1 INTRODUO

109

A.1.1

Caractersticas do sistema

A.1.2

Hardware e software necessrios 110

A.1.3

Interface grfica 110

A.1.4

Organizao deste manual

A.2 INSTALAO

109

110

111

A.2.1

Tipos de ficheiros

111

A.2.2

Instalao no disco rgido

111

A.2.3

Criao do cone de programa

111

A.3 EDITOR DE PROGRAMAO

113

A.3.1

Janela do editor 113

A.3.2

Smbolos grficos da Linguagem de Contactos

A.3.3

Menus e opes 115

A.3.4

Janela de informaes

A.3.5

Janela do editor de texto 116

A.3.6

Escrita de programas em Linguagem de Contactos

114

116

A.3.6.1

Inserir smbolos 117

A.3.6.2

Apagar smbolos 117

A.3.6.3

Editar parmetros de smbolos

118

A.3.6.4

Copiar, cortar e apagar smbolos

118

A.3.6.5

Gravao e leitura de programas

119

143

117

PlcPro - Apndice A - Captulo 6

Criao e simulao de um programa

A.4 EDITOR DE ESTMULOS 121


A.4.1

Opes e menus 122

A.4.2

Definio de endereos 123

A.4.3

Definio dos estmulos das entradas

A.4.4

Facilidades adicionais

124

A.4.4.1

Definio de parmetros 124

A.4.4.2

Ampliao

A.4.4.3

Janela de informaes

A.4.4.4

Gravao e leitura de estmulos

A.5 SIMULAO

123

124
125
125

127

A.5.1

Parmetros de simulao

127

A.5.2

Simulao em tempo real

127

A.5.2.1

Janela do autmato real

127

A.5.2.2

Visualizao dos resultados

A.5.3

Simulao rpida

128

A.5.4

Simulao interactiva

128

128

A.5.4.1

Janela de simulao interactiva

A.5.4.2

Opes e menus 129

A.5.4.3

Configurao da janela interactiva 130

A.5.4.3.1 Criao das entradas

128

130

A.5.4.3.2 Criao das sadas ou pontos internos

130

A.5.4.3.3 Edio dos endereos e/ou etiquetas

130

A.5.4.4

Interaco com a simulao

131

A.5.4.5

Gravao e leitura do aspecto da janela

131

A.6 CRIAO E SIMULAO DE UM PROGRAMA


A.6.1

Escrita do programa

133

A.6.2

Configurao dos parmetros de simulao

A.6.3

Definio dos estmulos de entrada


144

134

134

133

PlcPro - Apndice A - Captulo 6

Criao e simulao de um programa

A.6.4

Definio das sadas e pontos internos

A.6.5

Simulao do programa 135

135

A.6.5.1

Simulao em tempo real 135

A.6.5.2

Simulao rpida (usando o editor de estmulos)

A.6.5.3

Simulao interactiva

136

145

135

Você também pode gostar