1) INTRODUÇÃO
O uso de bibliotecas no E3 é altamente recomendável, pois elas representam um grande ganho de produtividade para a aplicação. Algumas das vantagens da utilização dos ElipseX são:
- Reutilização de código.
- Minimização de testes durante o desenvolvimento.
- Criação de interface padrão para os objetos desenvolvidos.
- Diminuição do tempo de desenvolvimento de novos projetos.
- Proteção do conteúdo do projeto.
2) QUANDO CRIAR UMA BIBLIOTECA DE OBJETOS
O uso de biblioteca é recomendado na maioria das aplicações. Entretanto, alguns critérios indicam a necessidade da construção de objetos:
- Repetição no uso: quando um mesmo equipamento ou processo será utilizado mais de uma vez no mesmo projeto.
- Procedimentos do conhecimento do usuário: frequentemente, um processo criado por determinada empresa deve ser protegido de cópia ou alteração. Isso é comum no caso de integradores de serviços ou fabricantes de máquinas.
- Uso de controladores: um controlador de processo, cujo mapeamento de memória é fixo, pode ser implementado com todas as funcionalidades disponíveis. A flexibilidade disponível para a construção e uso dos objetos no E3 permite que sejam utilizadas posteriormente apenas as variáveis de interesse, desprezando-se as demais.
3) ESTUDO DE CASO
Para ilustrar o uso de bibliotecas no E3, criaremos o controle de um motor, cujos dados são:
- Um tag para temperatura de operação.
- Um tag de emergência, para bloqueio do funcionamento do motor.
- Um tag de comando para ligar e desligar o motor.
Tanto o comando quanto o status do motor devem ser mostrados através de displays e da mudança da cor do corpo. Além disso, os tags a serem utilizados para o comando do motor devem ser externos à biblioteca.
Criando o Projeto
Primeiramente, crie um aplicativo padrão através do Assistente de Aplicações do E3. Ao ser perguntado sobre drivers, armazenamento e alarmes, responda “não” em todos os casos.
Criando um XObject
A seguir, crie uma nova biblioteca de componentes chamada Motores, e insira um novo XObject chamado LibMotorDados nesta biblioteca. O XObject é um objeto de dados e não possui interface, ou seja, ele não pode criar uma caixa de mensagens para algum evento, por exemplo. Para estabelecer a interface com o usuário, veja a criação do XControl.
Insira um servidor de dados no objeto LibMotorDados, e renomeie-o como Dados. Dentro dessa pasta, insira um tag do tipo Demo e edite os seguintes itens:
- Name: TemperaturaMotor
- Type: 0 – Aleatório
- Maximum: 100
- Period: 1000
- Scan: 1000
Esse tag retorna a temperatura de operação do motor.
A seguir, crie as seguintes propriedades, que serão utilizadas para comando e retorno de status do motor através de um duplo clique sobre o XObject:
- LigaDesliga (Boolean)
- Estado (InternalTag)
- Temperatura (Integer)
- Emergencia (InternalTag)
Estas propriedades serão utilizadas para modificar o comportamento do motor quando o projeto estiver sendo executado.
No tag TemperaturaMotor, crie uma associação entre a propriedade Value e o item LibMotorDados.Temperatura.
Sempre que determinado valor interno de um XObject precisar ser disponibilizado para ser acessado externamente, será necessário criar uma associação sobre o dado a ser disponibilizado com a propriedade criada para esse dado. Para isso, a associação deve seguir o padrão NomeDoXObject.Propriedade.
Depois, configure a seguinte restrição ao funcionamento do motor: a propriedade LigaDesliga deverá ser utilizada para comandar o ligamento ou desligamento do motor. Entretanto, o motor só poderá ser ligado se o valor da propriedade Emergencia for “1”. Caso contrário, o motor não poderá ser ligado.
Para implementar essa restrição, clique com o botão direito sobre a propriedade LigaDesliga e acesse as outras propriedades. No evento OnPropertyChanged, crie o script mostrado abaixo:
IF LibMotorDados.Emergencia = 1 then
LibMedidores.Estado.Value = 1
End IF
ELSE
LibMedidores.Estado.Value = 0
End IF
Salve o objeto e registre a biblioteca com um clique com o botão direito. Para ilustrar o uso da biblioteca sem um XControl, vamos trabalhar sobre o projeto que já foi criado, acessando as propriedades através de botões e scripts. Em seguida, criaremos um objeto de controle para o motor que estamos desenvolvendo.
Utilizando o XObject no projeto
Para começar, insira uma pasta chamada Motor1 dentro da pasta Dados criada na aplicação-padrão. Dentro dessa pasta, crie dois tags internos com o nome EmergenciaMotor1 e EstadoMotor1.
A seguir, insira um objeto LibMotorDados no projeto. Faça associações entre a propriedade Emergencia e o tag EmergenciaMotor1 e entre a propriedade Estado e o tag EstadoMotor1.
Na TelaInicial criada no projeto, insira displays e um botão de comando.
Figura 1: Tela de controle do Motor1
Para as propriedades Temperatura e Estado, devem ser usados displays; já para Emergencia, utilize um setpoint.
O display utilizado para a propriedade Estado deve ser associado à expressão LibMotorDados1.Estado.Value (essa expressão ficará em vermelho quando mostrada na aba de conexões). Já o botão de comando LigaDesliga deve ter um script do tipo Inverter Valor que aponte para a propriedade LigaDesliga, e cujos valores sejam False e True.
Os dois displays inferiores que indicam se o script está funcionando são auxiliares. Para isso, o primeiro display deverá apontar para a expressão Dados.LibMotorDados1.LigaDesliga, e o segundo para a expressão Dados.Motor1.EstadoMotor1.Value. Estes displays não existem no objeto de controle definitivo.
Para verificar a funcionalidade do objeto LibMotorDados, execute o projeto, modifique a variável Emergencia entre 0 e 1, e tente ligar ou desligar o motor.
Criando um XControl
Como interface para o motor que está sendo desenvolvido, será utilizado um item da aba biblioteca Symbol Factory, que está na pasta Motors. A figura a ser utilizada é a 3DISAMotor1, que é a primeira figura da biblioteca. Isso permite que o exemplo aqui descrito seja desenvolvido mesmo com o E3Studio no modo Demo.
Figura 2: XControl LibMotor
Para implementar associações e ações, crie o esqueleto do objeto. Para definir a propriedade Motor desse XControl como sendo do tipo LibMotorDados, digite o nome completo do tipo, ou clique o botão direito para navegar entre os tipos disponíveis. Essa definição de tipo é importante, pois será necessário utilizar todas as propriedades definidas para o objeto LibMotorDados, como por exemplo, a propriedade Emergencia.
Para o motor 3DISAMotor1, a propriedade OverrideFillMode deve ser ajustada como 2 – SolidFill, e a cor de preenchimento ser verde, cujos valores são 87, 255, 87.
O valor do display deve ser associado à expressão LibMotor.motor.Temperatura, onde:
- LibMotor: nome do XControl.
- Motor: propriedade que indica qual a fonte dos dados a serem mostrados.
- Temperatura: característica da propriedade Motor, que é um dado do tipo LibMotorDados.
Qualquer associação ou script a ser criado em um XControl deve seguir o padrão mostrado acima.
O script do botão Liga/Desliga deve ser o seguinte:
LibMotor.motor.LigaDesliga = NOT LibMotor.motor.LigaDesliga
IF LibMotor.motor.LigaDesliga = true then
LibMotor.motor.Estado.Value = 1
Else
LibMotor.motor.Estado.Value = 0
LibMotor.motor.LigaDesliga = false
End IF
Else
MsgBox “Motor não pode ser acionado!! Verifique se existem defeitos!!”
End IF
A figura 3DISAMotor1 deve ter associada a sua propriedade OverrideFillColor através de uma conexão por tabela, a expressão LibMotor.motor.Emergencia*2+LibMotor.motor.Estado.Value, que deverá ter as seguintes faixas de valores:
- Valor mínimo e máximo = 2 (cor verde)
- Valor mínimo e máximo = 3 (cor vermelha)
- Valor mínimo = 0 e máximo = 1 (cor amarela, piscando com azul)
Esses são os possíveis resultados da expressão associada à propriedade OverrideFillColor. Então, salve a biblioteca e registre-a. Para visualizar o uso do XControl desenvolvido, vá até o projeto criado anteriormente e, na TelaInicial, insira um objeto LibMotor. Na sua propriedade Motor, associe o XObject LibMotorDados1. Execute o projeto e verifique o resultado. Perceba que o setpoint para a variável Emergencia deve ser mantido, visto que o tag não está dentro dos objetos desenvolvidos.
4) CONSIDERAÇÕES FINAIS
O uso de tags dos tipos interno e demo auxiliam no entendimento do mecanismo para construção dos objetos. Entretanto, é possível usar qualquer tipo de tag (por exemplo, um tag PLC ou um tag OPC) para este mesmo propósito.
Existem duas maneiras de adquirir ou controlar tags de equipamentos com os XObjects: colocar o driver de comunicação e todos os tags internamente ao objeto, ou criar os tags externamente e associar cada um deles a uma propriedade do XObject. O que vai definir a escolha entre essas possibilidades é a quantidade de IODrivers disponíveis e o tipo de uso que se fará do objeto.
Por exemplo, para aquisição de dados de um controlador de temperatura, pode-se usar o IODriver internamente ao XObject, pois todos os tags são relacionados ao próprio controlador. Já para disjuntores de uma subestação, é preferível criar os tags externamente e então criar links para os tags no XObject, pois normalmente os dados de uma remota (CLP para área elétrica) são agrupados em uma mesma saída (rede Ethernet ou porta serial, por exemplo) e devem ser tratados separadamente. A mesma lógica se aplica para fórmulas ou históricos, que deverão ser mantidos em bancos de dados.
Como visto nesse exemplo, um XObject pode servir como propriedade de um outro XObject ou mesmo de um XControl.
É importante evitar que uma biblioteca utilize recursos da aplicação, para que não seja necessário alterar a biblioteca quando for utilizar em outro projeto. Por exemplo, se a biblioteca utilizar um histórico, pode-se passar o banco de dados como parâmetro, ou seja, o histórico pode ser salvo em qualquer banco de dados, desde que esse seja usado como parâmetro na biblioteca.
Outros exemplos de bibliotecas estão disponíveis no projeto Demo que acompanha a instalação completa do Elipse E3.