1) Introdução
A parte I deste artigo apresentou a maneira correta de criar associações para animação dos controles de tela. Na parte II, será discutida a melhor estratégia para o desenvolvimento de uma aplicação para uma planta industrial imaginária.
2) Descrição da planta
A planta deste exemplo consiste em dois tanques, cada um deles com uma válvula para a entrada de líquido e uma bomba para a saída. O tanque será enchido quando a válvula for aberta através de um clique do mouse, e será esvaziado com um clique sobre a bomba de saída. Ao ser aberta, cada válvula ficará verde e apresentará a legenda “Open”. Caso contrário, ela ficará vermelha e apresentará a legenda “Closed”. Já o objeto bomba ficará verde e apresentará a legenda “On” quando aberto, e ficará vermelho e apresentará a legenda “Off” quando fechado. A figura a seguir ilustra o sinótico da planta.
Figura 1: Planta industrial de dois tanques
3) Desenvolvendo a biblioteca de objetos
Ao desenvolver um aplicação no E3, o primeiro passo é determinar quais funcionalidades do processo serão repetidas e também podem ser transformadas em objetos do E3.
Nesta aplicação, vemos claramente os objetos de tela que são repetidos: tanques, bombas, válvulas e tubos. Após a identificação dos objetos, é necessário definir cada uma de suas funcionalidades e propriedades, além do seu desenho.
Também é necessário que a lógica de funcionamento dos tanques seja executada no servidor. Esta lógica está definida no XObject chamado TankLogic.
Vejamos a seguir como cada um destes objetos será construído.
Criando o XObject TankLogic
Inicialmente, criaremos um projeto chamado Plant com uma biblioteca chamada PlantLib. A biblioteca PlantLib contém as definições dos XObjects e XControls. O projeto Plant contém os objetos executados no servidor e as telas do Viewer.
O objeto TankLogic (Figura 2) terá três propriedades para controle do processo de um tanque: ValveOpened, que informa se a válvula de entrada do tanque está aberta ou fechada; Meter, que informa o nível de líquido do tanque; e PumpActivated, que reporta se a bomba de saída do tanque está ligada ou desligada.
DICA: preencha a coluna Texto de Ajuda de cada propriedade adicionada a um ElipseX (Figura 2); este texto será mostrado no AppBrowser, auxiliando futuramente na manutenção da aplicação.
Para os propósitos deste artigo, não discutiremos os detalhes de implementação do objeto; é necessário saber apenas que quando a propriedade ValveOpened for True, o tanque começa a encher até que a propriedade Meter chegue ao limite de 100 unidades. Quando a bomba de saída é ligada através da propriedade PumpActivated, o tanque é esvaziado. Com a bomba ligada e a válvula aberta, a propriedade Meter continua com valor constante.
Figura 2: Definição do objeto TankLogic
Criando o XControl Tank
O objeto Tank é composto pelo desenho do reservatório e mais dois mostradores da quantidade de líquido, um que mostra uma barra vertical analógica e outro com o valor em toneladas presente no tanque (Figura 3).
Figura 3: Objeto Tank
Para demonstrar a flexibilidade das bibliotecas ElipseX, vamos dividir o objeto Tank em duas partes: uma contendo apenas o desenho do reservatório e a outra contendo o desenho dos mostradores. Com isso, podemos ver que um objeto ElipseX pode ser construído usando outros objetos previamente criados.
Figura 4: Definição da propriedade Value do objeto Gauge
O objeto Gauge contém os mostradores e possui uma propriedade chamada Value (ver Figura 4), que será usada para animar os controles internos do objeto. O desenho do objeto Gauge está na Figura 5.
Figura 5: Associações do objeto Gauge
Observe que os dois objetos que formam o Gauge estão associados à sua propriedade Value. Isto é, quando a propriedade Value do Gauge for modificada, este valor será automaticamente enviado para os dois objetos associados a esta propriedade. Depois disso, veremos o objeto Tank, que é composto de um desenho de um reservatório mais o objeto Gauge (Figura 6).
Figura 6: Definição do XControl Tank
Agora é preciso pensar nas propriedades deste objeto. Para isto, existem duas possibilidades: a primeira é adicionar uma propriedade do tipo Integer e associá-la à propriedade Value do objeto Gauge1. A segunda é criar uma propriedade do tipo TankLogic e associar a propriedade Value do objeto Gauge1 à propriedade Meter do TankLogic. Neste exemplo, demonstraremos como efetuar a segunda opção (Figura 7).
Figura 7: Propriedade TankLogic do objeto Tank
Agora basta associar a propriedade Value do objeto Gauge1 à propriedade Meter do TankLogic do objeto Tank (Figura 8). Esta é a maneira com que o objeto Gauge1 irá acessar as propriedades do objeto externo associado à propriedade TankLogic, que é um objeto do tipo TankLogic.
Figura 8: Associações do objeto Tank
Criando o XControl Valve
O objeto Valve é composto por um desenho de uma válvula que fica vermelha quando fechada e verde quando aberta. Ao clicar no objeto, ele inverte o estado atual da propriedade ValveOpened do objeto TankLogic associado, fazendo com que a válvula seja então aberta ou fechada.
O primeiro passo para a construção deste objeto é a criação de uma propriedade chamada TankLogic do tipo TankLogic, fazendo com que este objeto possa ser associado a um objeto TankLogic do servidor.
Figura 9: Propriedade TankLogic do objeto Valve
Após, temos o desenho do objeto Valve e suas associações (Figura 10), onde podemos observar que tanto o objeto Texto1 quanto a Figura1 foram associados à propriedade ValveOpened do TankLogic da Valve.
Figura 10: Associações do objeto Valve
Agora precisamos de um script que faça com que a propriedade ValveOpened do TankLogic seja invertida ao clicar na válvula. Isto é feito através de um script no evento Click() do objeto Figura1 (como visto na Figura 11).
Figura 11: Script no evento Click do objeto Figura1 do objeto Valve
Criando o XControl Pump
O objeto Pump é bastante semelhante ao objeto Valve, mas com duas diferenças: seu desenho é uma bomba, e ele inverte a propriedade PumpActivated do objeto TankLogic (Figura 12).
Figura 12: Associações do objeto Pump
4) Construindo a aplicação
Uma vez pronta a biblioteca, é necessário utilizar os objetos criados e inseri-los em um projeto. Para isto, basta criar os objetos no projeto Plant conforme desejado. Como a aplicação tem dois tanques, precisamos de dois simuladores do processo de tanques, portanto é necessário também criar dois objetos TankLogic na pasta Dados do servidor (Figura 13).
Figura 13: Objetos TankLogic instanciados no servidor
Estes dois objetos, TankLogic1 e TankLogic2, serão depois associados aos objetos de tela, que farão a interface com o usuário para a abertura/fechamento da válvula e ligamento/desligamento da bomba.
Na TelaInicial, incluiremos os objetos de tela criados na biblioteca, como os tanques, bombas e válvulas, além dos tubos (Figura 14). Cada objeto destes será associado a seu respectivo TankLogic.
Figura 14: Inserindo o objeto Tank na tela
Na última etapa do desenvolvimento deste aplicativo, associe os objetos de tela aos seus respectivos objetos TankLogic (Figura 15).
Figura 15: Associando o objeto Tank1 ao Dados.TankLogic1
Vemos assim como é fácil criar e manter aplicações que utilizam os recursos das bibliotecas do E3. Uma vez criada a biblioteca, basta então criar os objetos e associá-los, o que torna o trabalho mais simples.
Note que a biblioteca contém apenas as definições, e não os objetos em si, sendo necessário inseri-los no projeto e configurar suas propriedades para que funcionem do modo desejado.
5) Conclusão
Vimos nesta aplicação como é simples e rápida a criação de objetos funcionais com o uso das bibliotecas do E3. Com elas, não é mais preciso criar a aplicação toda desde início, pois é possível reaproveitar objetos que tenham sido criados em outras aplicações.
Boa noite, meu gauge1 não tem a opção de value em associações. O que pode ser?
Jéssica, o objeto Gauge é um XControl, e a propriedade Value deve ser criada na aba Propriedades (Conforme Figura 4: Definição da propriedade Value do objeto Gauge).