Tese de Mestrado
Tese de Mestrado
Tese de Mestrado
Abril 1994
Dissertao submetida para satisfao parcial dos requisitos do programa de Mestrado em ENGENHARIA 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. 1.2. 1.3. Enquadramento Objectivos Estrutura da tese
1
1 2 2
AUTMATOS PROGRAMVEIS
2.1. 2.2. Histria e aplicaes industriais Arquitectura dos autmatos programveis CPU Sistema de entradas e sadas Memria Variaes na arquitectura
4
4 5 6 6 6 7 7 8 9 11 12 13 13 13 14 14 15 15 15 15
Linguagens de programao para autmatos Linguagem ladder Instrues do tipo rel Instrues de temporizao e contagem Instrues de manipulao e transferncia de dados Instrues aritmticas Instrues de controlo de programa 2.3.1.1. 2.3.1.2. 2.3.1.3. 2.3.1.4. 2.3.1.5.
2.3.1.
2.4.1. 2.4.2.
FERRAMENTAS UTILIZADAS
3.1. O Microsoft Windows Objectos grficos de interface
18
18 19 21 21 21 21 22 22 23 26 27 28 29
3.1.1. 3.2.
Programao orientada por objectos Classes Encapsulamento Hereditariedade Polimorfismo Metodologia de programao por objectos
A linguagem C++ Windows e C++ Win ++ Arquitectura do Win++ Estrutura das aplicaes baseadas no Win++
31
32 36 37
42
42 42 45 48 52 53 53 55 59 60 60 64
VIRTUALIZAO DO PLC
6.1. 6.2. 6.3. 6.4. Modelo para a arquitectura do PLC virtual Linguagem do PLC virtual Memria do PLC virtual Simulador Varrimento do programa ladder O algoritmo de simulao A funo virtual de simulao para objectos pluri-celulares A funo OwnerSimulation
66
66 67 68 70 71 74 76 79 83 84 85 88 89 90 92
Modos de simulao Simulao rpida Simulao em tempo real A classe de representao de temporizadores no Win++ A classe base de PLCs virtuais tempo real A simulao em tempo real normal A simulao em tempo real interactiva
6.5.1. 6.5.2.
CONSIDERAES FINAIS
7.1. 7.2. 7.3. 7.4. Modos de simulao do PLC virtual Adies ao sistema PLC virtual Concluses Trabalho futuro
96
96 98 100 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
Sadas (monitor)
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.
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.
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.
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 Circuitos de entrada
Processo
Dispositivos de sada do processo
Consola de programao
Unidade CPU
Memria
Circuitos de sada
Fonte de alimentao
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.
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.
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
Incio de continuidade
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 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 C A D Y
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
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
Etapa n-1
Tarefa n-1
T n-1
Etapa n
Tarefa n
Tn
Etapa n+1
Tarefa n+1
Cada etapa, definida como uma situao num sistema de controlo onde as entradas e/ou sadas no variam, tem associada uma aco ou tarefa (conjunto de aces) especfica, que s executada quando a etapa correspondente se encontra activa. A operao sequencial do processo resulta da progresso entre etapas. Contudo a passagem de uma etapa para outra condicionada pela condio de transio. Para que exista uma transio de uma etapa para outra necessrio que a etapa anterior esteja activa e a condio de transio entre as duas etapas seja verdadeira. Por exemplo (figura 4), para que a etapa n fique activa necessrio que a etapa n-1 esteja activa e a condio de transio T n-1 seja verdadeira. A transio completa-se com a inactividade da etapa n-1. Esta linguagem no substitui as outras linguagens, e deve ser vista como uma ferramenta de estruturao de programas. A sua utilizao tem vantagens sempre que o problema a resolver sequencial e dependente do tempo [6].
2.3.3.
Linguagens booleanas
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.
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.
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.
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
Designao IR
Gama de variao Palavras: 000 --- 246 Bits: 00000 --- 24615 Palavras: 247 --- 255 Bits: 24700 --- 25515 Palavras: 00 --- 27 Bits: 0000 --- 2715 Leitura/Escrita: 0000 --- 0999 Somente Leitura: 1000 - 1999 Palavras: 00 --- 99 Bits: 0000 --- 9915 000 --- 511
Special Relay
SR
Auxiliary Relay
AR
DM HR
Timer/Counter
TC
LR TR UM
Palavras: 00 --- 63 Bits: 0000 --- 6315 Bits 00 --- 07 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
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.
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.
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.
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
Elipse
Triangulo
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
BCMultiStringEdit
BCHorizScrollBar
BCMessageDialog
BCButtonControl
BCReplaceDialog
BCStaticControl
BCAboutDialog
BCControlWindow
BCPopUpWindow
BCChildWindow
BCMainWindow
BCTextData
BCSystemMenu
BCFileData
BCDependentData
BCDisplayDevice
BCMemoryData
BCWindow
BCText
BCTimerDevice
BCApplication
BCAccelTable
BCDialog
BCRenderableData
BCDispObject
BCRectangle
BCClipBoard
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.
BCObject
29
BCMsgBox
BCPosition
BCModule
BCDevice
BCLimits
BCResID
BCEvent
BCColor
BCSize
BCErrorBox
BCBitmap
BCCursor
BCMenu
BCBrush
BCCaret
BCFont
BCIcon
BCPen
BCModelessDialog
BCModalDialog
BCTextEdit
BCStringDialog
BCEditControl
BCComboBox
BCFindDialog
BCFileDialog
BCScrollBar
BCListBox
BCSaveAsDialog
BCRadioButton
BVertScrollBar
BCOpenDialog
BCPushButton
BCFileListBox
BCGroupBox
BCNewDialog
BCCheckBox
BCStaticText
BCStringEdit
BCStaticIcon
BCSizeBox
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.
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
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
Memria alocada no PC
Monitor
Uma melhor concretizao do que se expor nos prximos captulos pressupe uma leitura prvia do Manual de Utilizao da aplicao PLC virtual, que se encontra em apndice. 31
4.1.
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
.rc
ficheiro recursos
Compilador de recursos
.res
ficheiro de recursos compilado
Compilador de recursos
.exe
ficheiro executvel
.cpp
ficheiro do cdigo fonte
Compilador C++
.obj
ficheiro objecto
Linker
.obj
ficheiro objecto ligado
.cpp
ficheiro do cdigo fonte
Compilador C++
.obj
ficheiro objecto
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
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.
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
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
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.
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
Input
Module
LineH
OpenOutput ClosedOutput
Counter
TimerOn
ShiftRegister
CounterUpDown
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
Fim de Continuidad
45
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
5.1.3.
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.
Evento Draw Objecto 1
Evento Paint
Objecto ProgramEditor
Evento Draw
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 ... }
O processo de criao e insero de um novo smbolo ladder na grelha de suporte do programa o ilustrado na figura 12.
Opes de seleco de smbolos
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 Testar regras de insero (Cir->InsertLadderObject)
Not Ok
Ok
Apaga objecto
m[x-1,y]
m[x,y]
Clula da Grelha
50
De notar que m(x,y) corresponde ao nodo que identifica completamente a clula (x,y). Na funo WorkElement processam-se as aces de insero ou apagamento de objectos da grelha, na posio seleccionada. O parmetro Element permite descodificar a aco pretendida, isto , verifica qual o tipo de smbolo que o utilizador quer inserir, ou ento se o utilizador quer apagar algum smbolo.
BOOL ProgramEditor :: WorkElement(BCPosition oPos, WORD Element) { BaseShape *Shape = NULL; switch (Element) { // identifica a opo seleccionada case IDC_OPEN_CONTACT: // para insero de um Contacto Normalmente Aberto Shape = new OpenContact(oPos); // cria uma instncia da classe tipo de Contacto Normalmente Aberto if( Cir->InsertLadderObject(SelectedCell, Shape) ) // o objecto foi correctamente inserido na grelha Shape->Draw(); // desenho do objecto break; ... case IDC_DELETE: // a opo seleccionada a Borracha Cir->Delete(SelectedCell); // apaga o objecto presente sobre a clula seleccionada break; } }
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 ?
No
Grelha
L elemento da grelha.
Clula com smbolo L parmetros do smbolo. Escreve no buffer os parmetros: Nome, Etiquetas, Valor, Ligao vertical
Clula vazia
Fim linha ? No
Linha vazia ?
No
Sim
Processa linha vazia
No
Sim
A seguir, apresenta-se um exemplo das duas possveis descries para uma parte de um programa, ou seja, a forma grfica e a forma textual (figura 14). De recordar que uma linha em branco representada pela sequncia {/1}.
{IC IR_10001 , LN , TON TC_000 (#250), LN , LN , LN , LN , LN , OO IR_10000} {IC IR_10001 , IO IR_10000 , LN , LN , TON TC_002 (#250), LN , LN , LN , OO IR_10001} {IC IR_10002 , IO IR_10003 , TON TC_003 (#15000), LN , LN , LN , LN , LN , OO IR_10002} {/1}
54
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 MenuCommand
OpenFile
BCFileData OpenFile
Clear Cria caixa dilogo Abre ficheiro Load Fecha ficheiro
MatrixCircuit Load
LoadCircuit
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
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 statements /* smbolo objectivo */
expression symbol : | |
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 : |
name totallabel cross name totallabel value name totallabel value cross
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); } 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
Ficheiro
Ok
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.
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); };
// 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
IR_00200
5.3.
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
"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.
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
Unidade CPU
Memria
Circuitos de sada
Dispositivos de entrada
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
Memria alocada no PC
Monitor
6.2.
Para o editor de programao havia que escolher uma das linguagens existentes para programao de autmatos. Como os diagramas de escada constituiam uma tcnica muito usada para especificar sistemas de controlo, a linguagem ladder surgiu naturalmente e ainda hoje a linguagem mais utilizada para a programao de PLCs. Na bibliografia podem facilmente encontrar-se opinies que revelam a importncia da linguagem ladder na programao de PLCs: os PLCs so tipicamente programados atravs da linguagem ladder [25]; a programao de PLCs fcil pois ela geralmente no formato ladder [26]; A lgica em formato ladder uma forma de inteligncia artificial. No o state-of-art que conta na engenharia de controlo, mas sim o nvel de aceitao [27]. Pelas razes apontadas e porque quase invariavelmente os fabricantes fornecem a linguagem ladder para os seus autmatos, foi esta a linguagem escolhida para a programao do PLC virtual. Esta forma grfica de programao pode ser considerada uma forma de programao visual (qualquer sistema que permite a especificao de um programa de uma forma bidimensional ou a mais dimenses). um dado adquirido que um estilo de programao mais visual pode ser mais facilmente apreendido, principalmente por programadores pouco
67
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.
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
Estmulos das entradas
Ler para memria
Out_Stim
Estmulos para armazenar os resultados
Ler da memria
CPU (principal)
Simul
O_ladder_1
O_ladder_n NULL
rightObjects
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
Memria PLC
Para acesso 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
1
b
2
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 b
(1,2) (1,1)
d
(2,1)
c
(1,3)
6.4.1.
Recordamos que um PLC uma mquina cclica, isto , o programa nele contido executado indefinidamente, sendo somente interrompido por aco do utilizador ou por falha de alimentao. Cada execuo do programa designada por varrimento.
71
Por analogia com o processo de execuo de um programa num PLC real, o PLC virtual simula o programa de uma forma idntica. A figura 23 ilucidativa desse facto, vendo-se que as tarefas envolvidas na execuo de um programa no PLC real foram transformadas em funes membro do PLC virtual.
Incio InitSimulation
UpdateInputStimulus
SimulationC20
UpdateOutputStimulus
PLC real
PLC virtual
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
4
b
3
c
2
e
1
d
5
Neste caso, o CPU principal envia um evento de Simul (invocao da funo Simul do objecto) para o objecto e; em seguida, esse evento enviado para o objecto c que, por sua vez, o envia para o objecto b, e assim sucessivamente. A funo Simul do objecto c tambm se encarrega de enviar o evento para o objecto ligado abaixo, d. Depois, devido existncia do objecto d em rightObjects, o CPU principal ainda envia o evento de Simul para d, s que, tem como resposta um retorno imediato da funo Simul, pois a funo Simul do objecto d j foi executada no varrimento actual (flagSimulation == TRUE). A funo membro SetDownValSimulation (SetUpValSimulation) serve para actualizar os valores de simulao, valSimulation, de todos os objectos situados abaixo (acima) do objecto actual. Esta actualizao necessria pois o valor de simulao em cada nodo o resultado do OR lgico dos resultados da simulao dos objectos que esto ligados esquerda desse nodo.
BOOL BaseShape :: SetDownValSimulation(BOOL oValue) { if(orDown) orDown->SetDownValSimulation(oValue); return ( valSimulation = oValue ); }
6.4.3.
Para objectos com mais do que uma entrada (pluri-celulares), existe a necessidade de redefinir a funo virtual Simul, de modo a interpretar adequadamente os sinais provenientes dos objectos ligados nas suas entradas. A classe CounterReset representa objectos do tipo Contador Descendente com Reset, pelo que a funo Simul tem que interpretar dois sinais de entrada: um sinal para decremento do 76
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); }
// entrada a deslocar no registo // impulso para deslocar um bit no registo // para fazer o reset do registo
77
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
b
2
h
*h
4 5
c
3
i
11
l
10
n
*n 9
d
g 6
j
13
m
*m 12 *g
e
7
f
*f
Degrau ladder
rightObjects
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
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
} else // o estado do sinal de reset OFF oldReset = FALSE; // guarda o estado do reset para o varrimento seguinte - o estado FALSE if(oldClock != clockOn) { // houve uma transio no estado do sinal clockOn if(clockOn) { // a transio foi positiva // deslocamento da ltima palavra do registo memLocation[0][numberWords] = (memLocation[0][numberWords]) << 1; for (INT i = numberWords - 1; i >= 0; i--) { // deslocamento de todas as outras palavras WORD stWord = memLocation[0][i] & 0x8000; // guarda o estado do 16 bit da palavra i do registo memLocation[0][i] = (memLocation[0][i]) << 1; // deslocamento de um bit na palavra i do registo if ( stWord ) // o estado do bit guardado ON memLocation[0][i + 1] |= 0x0001; // coloca o primeiro bit da palavra i+1 no estado ON else memLocation[0][i + 1] &= 0xFFFE; // coloca o primeiro bit da palavra i+1 no estado OFF } if (inputVal) // entrada de inputVal no primeiro bit da primeira palavra memLocation[0][0] |= 0x0001; // coloca o primeiro bit da primeira palavra no estado ON else memLocation[0][0] &= 0xFFFE; // coloca o primeiro bit da primeira palavra no estado OFF } oldClock = clockOn; // guarda o estado de clockOn para o varrimento seguinte } return (valSimulation = inputVal); }
C20Omron
C20FastSimul
C20RealSimul
C20RealSimulInteractive
C20RealSimulNormal
83
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
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.
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)
Memria Simulador
Incio de actividade
Entradas
Sadas
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
tp tscan
Eventos do Win++
ts
1)
2)
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 Eventos do Win++, com atrasos diferentes Periodos de simulao
tp
tscan
1)
ts
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;
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(""); }
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
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
7.1.
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.
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
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. FALCIONE, Albert, Bruce H. Krogh - Design Recovery for Ladder Logic. In: IEEE Control Systems, April 93. 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.
[2] [3]
HUGHES, Thomas A. - Programmable Controllers. Instrument Society of America (ISA), 1989. MICHEL, Gilles - Programmable Logic Controllers. John Wiley & Sons, 1990. LYTLE, Vincent A. - A Survey of PLC Language Features. In: Proceedings of the Seventh Annual Control Engineering Conference. Rosemont (USA), June 1988. OMRON Corporation - Mini H-type Programmable Controllers - Operation Manual. Omron, July 1990. 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. 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
Abril 94
105
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").
PLC virtual
Sadas (monitor)
109
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.
110
Introduo
Este manual est organizado em seis captulos. No captulo A.1 faz-se uma breve introduo de modo a informar qual o mbito de utilizao desta aplicao. No captulo A.2 encontra-se o necessrio para a instalao completa da aplicao PlcPro. Nos outros captulos procede-se a uma anlise mais detalhada de todos os componentes da aplicao. Assim, so apresentados nos captulos A.3 e A.4 todas as funcionalidades dos editores de programao e de estmulos, respectivamente. No captulo A.5 so apresentados os vrios modos oferecidos pelo PlcPro para a simulao de programas. No captulo A.6 so detalhadas as sequncias de operaes necessrias criao de um programa com o editor de programao; tambm neste captulo se explicita o modus operandi essencial simulao de programas previamente editados.
111
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.
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.
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.
113
Editor de programao
114
O editor de programao permite a escrita de programas em Linguagem de Contactos. Esses programas podero posteriormente ser simulados pelo PLC virtual.
Clulas da grelha
Janela de informaes
Fig. A.4 - Editor de programao 115
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.
116
Editor de programao
Contador ascendente/descendente. Este smbolo tem trs entradas tipo bit: a entrada de impulso de contagem ascendente (II), a entrada do impulso de contagem descendente (DI) e uma entrada para inicializao do contador (R). Existem dois parmetros a definir para este smbolo: o endereo do bit de sada do contador, isto , o bit que sinaliza o fim de contagem; e a constante que representa o valor inicial do contador.
Registo de deslocamento. Este smbolo tem trs entradas do tipo bit: a entrada a deslocar pelo registo (I), uma entrada para impulso de deslocamento (P) e uma entrada de inicializao do registo (R). Para este smbolo existem dois parmetros tipo endereo, que indicam o endereo inicial e o endereo final das palavras de 16 bits que vo constituir o registo.
Tabela 1
A barra de menus mostra os menus existentes no editor de programao. Cada menu tem um conjunto de sub-menus:
Arquivo Novo Abrir Gravar Gravar como Sair Cria um novo programa Carrega um programa para o editor Grava o programa do editor para o disco Grava o programa com um outro nome Abandona a aplicao
117
Editor de programao
Sobre PlcPro
Informao
Editar Cortar Copiar Colocar Apagar Apaga os smbolos seleccionados e copia-os para o clipboard Copia os smbolos seleccionados para o clipboard Coloca os smbolos que esto no clipboard na posio seleccionada 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 Contacto Fechado Sada Aberta Permite inserir um contacto normalmente aberto Permite inserir um contacto normalmente fechado Permite inserir uma sada normalmente aberta
118
Editor de programao
Sada Fechada Temporizador Contador Desc. Registo Desl. Ligao Vertical Ligao Horiz. Borracha Bloqueio
Permite inserir uma sada normalmente fechada Permite inserir um temporizador de atraso operao Permite inserir um contador descendente Permite inserir um registo de deslocamento Permite inserir uma ligao vertical Permite inserir uma ligao horizontal Permite apagar qualquer smbolo Tem o mesmo significado que o sub-menu Bloquear Opo.
Editor de programao
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 .
120
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
borracha).
Premir o boto do rato sobre a clula onde se encontra o smbolo a apagar.
(Inactiva).
Dependendo do tipo do smbolo aparece uma das duas caixas de dilogo seguintes:
Editor de programao
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.
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.
122
Editor de programao
123
Editor de programao
124
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.
>rea de estmulos
>Diagrama temporal
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
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.
126
Editor de estmulos
Tempo
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:
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.
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
Editor de estmulos
Para posicionar o cursor para escrita dos endereos deve usar-se o rato, enquanto que o deslocamento para outros endereos pode ser feito usando o rato ou o teclado (atravs das teclas TAB ou SHIFT TAB)
IR_00000
Endereo da entrada "0" lgico "1" lgico Diagrama temporal
O diagrama temporal pode ser traado ponto a ponto (premindo o boto do rato nas posies adequadas) ou usar o mtodo de arrastamento do rato se se pretende uma definio mais rpida. Para definir um "1" lgico, o cursor do rato deve estar acima da linha mdia, enquanto que para obter um "0" o cursor deve estar abaixo da linha mdia. A ampliao (vide A.4.4.2) e a escala podem facilitar o desenho dos diagramas temporais. Para apagar completamente um estmulo, deve-se seleccionar a opo seguida premir o rato sobre o diagrama temporal do estmulo a apagar. e em
128
Editor de estmulos
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.
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.
129
Editor de estmulos
t = 21.80s Tempo-100s
A posio actual do rato corresponde a um tempo de 21.80 segundos 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
Cria um novo conjunto de estmulos Carrega um conjunto de estmulos para o editor de estmulos Grava um conjunto de estmulos para o disco
130
Editor de estmulos
131
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.
132
Simulao
Simulao
Abrir
Simulao
Grava a janela interactiva para o disco. Esconde a janela do editor de estmulos. Permite executar a simulao interactiva. 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.
Borracha Permite apagar objectos, que representam entradas, sadas ou pontos internos.
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 Sada Insere um objecto do tipo entrada. Insere um objecto do tipo sada (ou ponto interno).
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
Simulao
A.5.4.3.1
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
Simulao
137
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%.
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
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.
139
Fig. A.20 - Editor de estmulos (programa clock - estmulo de entrada de Incio - IR_00000)
140
141
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.
142
ndice - Apndice A
A.1 INTRODUO
A.1.1 A.1.2 A.1.3 A.1.4
109
109
Caractersticas do sistema
Hardware e software necessrios 110 Interface grfica 110 Organizao deste manual 110
A.2 INSTALAO
A.2.1 A.2.2 A.2.3
111
111 111 111
Tipos de ficheiros
113
Smbolos grficos da Linguagem de Contactos Menus e opes 115 Janela de informaes 116
114
Janela do editor de texto 116 Escrita de programas em Linguagem de Contactos Inserir smbolos 117 Apagar smbolos 117 Editar parmetros de smbolos Copiar, cortar e apagar smbolos Gravao e leitura de programas 118 118 119 117
143
A.5 SIMULAO
A.5.1 A.5.2 A.5.2.1 A.5.2.2 A.5.3 A.5.4 A.5.4.1 A.5.4.2 A.5.4.3
127
127 127 128
Parmetros de simulao Simulao em tempo real Janela do autmato real 127 Visualizao dos resultados Simulao rpida Simulao interactiva Opes e menus 129 128 128
128
A.5.4.3.2 Criao das sadas ou pontos internos A.5.4.3.3 Edio dos endereos e/ou etiquetas A.5.4.4 A.5.4.5 Interaco com a simulao 131 Gravao e leitura do aspecto da janela
133
Configurao dos parmetros de simulao Definio dos estmulos de entrada 144 134
Definio das sadas e pontos internos Simulao do programa 135 Simulao em tempo real 135
135
135
145