Programação orientada a objetos em controladores programáveis

Programação orientada a objetos em controladores programáveis

06 Jun 2018

A Altus desenvolveu diversas séries de controladores programáveis, como Nexto, Hadron Xtorm e Duo, que suportam as linguagens de programação definidas pela norma IEC 61131-3. Além de disponibilizar até seis diferentes tipos de linguagem (ST, FBD, LD, SFC, IL, CFC), estes controladores também suportam programação orientada a objetos (OOP – Object Oriented Programming).

Embora OOP tenha sido originalmente aplicada na programação de computadores e possa soar como algo complexo, trata-se de uma metodologia que oferece vantagens significativas também na programação de CPs (Controladores Programáveis). Este artigo identifica as vantagens de OOP na programação de CPs e faz um breve descritivo técnico deste tipo de programação.

Vantagens de OOP

OOP permite que o programa do CP seja bem organizado e simplificado, além de permitir o reaproveitamento de componentes de software dentro de um mesmo projeto e em diferentes projetos. Uma boa organização de programas os torna mais intuitivos, facilitando seu desenvolvimento e manutenção. A simplificação se refere à interface que os objetos apresentam para os programas que os chamam, escondendo dentro dos objetos diversos detalhes complexos relativos a estruturas de dados e funcionalidades.

Além disso, os objetos desenvolvidos podem ser reutilizados em múltiplos pontos de um mesmo projeto, e também em futuros projetos. É possível, e recomendável, criar bibliotecas com os objetos reaproveitáveis em outras demandas.

A área de Integração de sistemas da Altus, bem como alguns de seus clientes, já vem se beneficiando destas vantagens de OOP, reduzindo horas de engenharia em todas as etapas do projeto: desenvolvimento, comissionamento e manutenção.

Conceito de Objeto

Um objeto combina estruturas de dados e funcionalidades numa mesma entidade que pode modelar o estado e o comportamento de dispositivos do mundo real, processos e outras construções. Os detalhes complexos são escondidos do programa que chama o objeto. O programa enxerga apenas as interfaces externas do objeto, sem necessidade de conhecer detalhes internos de funcionamento e estruturas de dados internas do objeto.

Utilizando a nomenclatura da IEC 61131-3, objetos são instâncias de FBs (Function Blocks). Fazendo um paralelo com linguagens de programação de computadores, FBs são análogos às classes (objetos são instâncias de classes). Num mesmo projeto, é possível criar múltiplas instâncias de um mesmo FB (múltiplos objetos instanciados a partir da mesma classe).

A chave para um bom projeto usando OOP é escolher quais entidades serão modeladas por objetos. Boas escolhas resultarão num projeto legível e intuitivo, e pensar em objetos como dispositivos do mundo real ou processos é um bom começo.

FBs podem ser estruturados em métodos, para particionar ainda mais sua complexidade quando necessário, tento possibilidade de ser implantados usando qualquer uma das linguagens da IEC 61131-3. Outros recursos de OOP também estão disponíveis, tais como propriedades e extensão (herança).

Exemplo de FB e Métodos

A seguir é apresentado um exemplo de FB utilizando métodos e de suas instâncias num programa.

Um exemplo simples foi escolhido para facilitar a compreensão do mesmo. Trata-se do PosVelAc, um FB que calcula posição, velocidade e aceleração de um carro que possui um encoder rotativo conectado em uma de suas rodas, sendo que os pulsos deste encoder são acoplados a um módulo contador rápido do CP.

O FB PosVelAc possui as seguintes entradas:

Cont: contador de pulsos do encoder (contagens)

Resol: resolução do encoder (metros percorridos por contagem do contador)

Reset: comando para zerar as saídas calculadas (posição, velocidade e aceleração)

DeltaT: tempo de ciclo (segundos) para chamada do FB

Além disso, o FB PosVelAc possui as seguintes saídas:

Pos: posição do carro (m)

Vel: velocidade do carro (m/s)

Ac: aceleração do carro (m/s2)

Considera-se que existem dois carros conectados a um mesmo CP, desta forma, o programa terá duas instâncias (objetos) do FB PosVelAc (classe). A figura 1 mostra o programa TestePosVelAc, onde estas instâncias são declaradas (na área de variáveis) e chamadas (na área de código), utilizando a linguagem FBD. Observe que as instâncias se chamam CalcPosVelAc1 e CalcPosVelAc2, e que ambas possuem o tipo PosVelAc. As demais variáveis declaradas fazem parte das interfaces de entrada e saída das duas instâncias.

 Figura 1 – Declaração e chamada das instâncias do FB PosVelAc

Figura 1 – Declaração e chamada das instâncias do FB PosVelAc


A figura 2 mostra a treeview da definição do FB PosVelAc, mostrando que o mesmo possui quatro métodos, que serão descritos adiante:

 Figura 2 – TreeView com FB PosVelAc

Figura 2 – TreeView com FB PosVelAc


A figura 3 mostra a implementação do FBPosVelAc usando a linguagem LD.

 Figura 3 – Implementação do FB PosVelAc

Figura 3 – Implementação do FB PosVelAc


Na área de declaração de variáveis, observa-se que as interfaces de entrada estão declaradas na seção VAR_INPUT, e que as interfaces de saída estão declaradas na seção VAR_OUTPUT. Estas são as variáveis que realmente interessam para o programa TestePosVelAc, que instancia e chama o FB (ver Figura 1).

Além disso, ainda na área de declaração de variáveis, existem variáveis internas na seção VAR. Estas variáveis, apesar de vitais para o bom funcionamento do FB, não interessam para o programa que instancia e chama o FB, portanto, são detalhes de implementação que ficam escondidos dentro do FB.

Deve-se observar que cada instância do FB possui suas próprias cópias de variáveis de entrada, de saída e internas.

Na área de código, o FB possui 5 redes:

Rede 1: chamada do método CalculoPos, utilizado para calcular a posição;

Rede 2: chamada do método CalculoVel, utilizado para calcular a velocidade;

Rede 3: chamada do método CalculoAc, utilizado para calcular a aceleração;

Rede 4: zera posição, velocidade e aceleração enquanto a entrada Reset está ativada;

Rede 5: chamada do método AtualizaPrev, utilizado para atualizar variáveis internas (PrevCont, PrevPos, PrevVel) para utilização no próximo ciclo de chamada.

As próximas figuras (4 até 7) mostram a implementação dos quatro métodos em linguagem ST.

 

Figura 4 – Implementação do método CalculoPos

Figura 4 – Implementação do método CalculoPos


Figura 5 – Implementação do método CalculoVel 

Figura 5 – Implementação do método CalculoVel


Figura 6 – Implementação do método CalculoAc 

Figura 6 – Implementação do método CalculoAc


 Figura 7 – Implementação do método AtualizaPrev

Figura 7 – Implementação do método AtualizaPrev

Estes métodos possibilitam estruturar (dividir a complexidade) do FB PosVelAc. Métodos são funções definidas dentro do FB, que podem acessar as variáveis de entrada, de saída e internas do FB. Como funções, os métodos podem retornar um valor e possuir diversos variáveis de entrada (VAR_INPUT).

O uso de variáveis de entrada num método muitas vezes é opcional e serve apenas para aumentar a clareza, visto que o método poderia acessar diretamente as variáveis do FB. No caso do método AtualizaPrev, observa-se que não existem variáveis de entrada e que o mesmo acessa de forma direta as variáveis do FB. Retornar um valor pelo nome do método também é opcional. No caso do método AtualizaPrev, isso também não ocorre.

Miguel da Silveira, Coordenador de Projetos

Sobre o autor
Osmar Brune ingressou no time da Altus em 1988 e, desde esta época, vem atuando como Projetista de Produtos e Sistemas nas áreas de P&D e Integração de Sistemas, executando projetos de desenvolvimento de software e especificação de produtos e sistemas.