{"id":7230,"date":"2018-06-06T00:00:00","date_gmt":"2018-06-06T03:00:00","guid":{"rendered":"https:\/\/www.altus.com.br\/blog\/programacao-orientada-a-objetos-em-controladores-programaveis\/"},"modified":"2024-09-20T10:04:47","modified_gmt":"2024-09-20T13:04:47","slug":"programacao-orientada-a-objetos-em-controladores-programaveis","status":"publish","type":"post","link":"https:\/\/www.altus.com.br\/en\/post\/149\/programacao-orientada-a-objetos-em-controladores-programaveis","title":{"rendered":"Programa\u00e7\u00e3o orientada a objetos em controladores program\u00e1veis"},"content":{"rendered":"<p>A Altus desenvolveu diversas s\u00e9ries de controladores program\u00e1veis, como <b><a href=\"https:\/\/www.altus.com.br\/en\/produto\/9\/serie-nexto\/\" target=\"_blank\" rel=\"noopener\">Nexto<\/a><\/b>, <b><a href=\"https:\/\/www.altus.com.br\/en\/produto\/10\/serie-hadron-xtorm\/\" target=\"_blank\" rel=\"noopener\">Hadron Xtorm<\/a><\/b> and <b><a href=\"https:\/\/www.altus.com.br\/en\/produto\/11\/serie-duo\/\" target=\"_blank\" rel=\"noopener\">Duo<\/a><\/b>, que suportam as linguagens de programa\u00e7\u00e3o definidas pela norma <b>IEC 61131-3<\/b>. Al\u00e9m de disponibilizar at\u00e9 seis diferentes tipos de linguagem (ST, FBD, LD, SFC, IL, CFC), estes controladores tamb\u00e9m suportam <u>programa\u00e7\u00e3o orientada a objetos (OOP \u2013 Object Oriented Programming)<\/u>.<\/p>\n<p>Embora <b>OOP <\/b>tenha sido originalmente aplicada na programa\u00e7\u00e3o de computadores e possa soar como algo complexo, trata-se de uma metodologia que oferece vantagens significativas tamb\u00e9m na programa\u00e7\u00e3o de <b>CPs <\/b>(Controladores Program\u00e1veis). Este artigo identifica as vantagens de OOP na programa\u00e7\u00e3o de CPs e faz um breve descritivo t\u00e9cnico deste tipo de programa\u00e7\u00e3o.<\/p>\n<h3>Vantagens de OOP<\/h3>\n<p>OOP permite que o programa do CP seja bem organizado e simplificado, al\u00e9m de permitir o reaproveitamento de componentes de software dentro de um mesmo projeto e em diferentes projetos. Uma boa organiza\u00e7\u00e3o de programas os torna mais intuitivos, facilitando seu desenvolvimento e manuten\u00e7\u00e3o. A simplifica\u00e7\u00e3o se refere \u00e0 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.<\/p>\n<p>Al\u00e9m disso, os objetos desenvolvidos podem ser reutilizados em m\u00faltiplos pontos de um mesmo projeto, e tamb\u00e9m em futuros projetos. \u00c9 poss\u00edvel, e recomend\u00e1vel, criar bibliotecas com os objetos reaproveit\u00e1veis em outras demandas.<\/p>\n<p>A \u00e1rea de Integra\u00e7\u00e3o de sistemas da Altus, bem como alguns de seus clientes, j\u00e1 vem se beneficiando destas vantagens de OOP, reduzindo horas de engenharia em todas as etapas do projeto: desenvolvimento, comissionamento e manuten\u00e7\u00e3o.<\/p>\n<h3>Conceito de Objeto<\/h3>\n<p>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\u00e7\u00f5es. Os detalhes complexos s\u00e3o 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.<\/p>\n<p>Utilizando a nomenclatura da IEC 61131-3, objetos s\u00e3o inst\u00e2ncias de <b>FBs <\/b>(Function Blocks). Fazendo um paralelo com linguagens de programa\u00e7\u00e3o de computadores, FBs s\u00e3o an\u00e1logos \u00e0s classes (objetos s\u00e3o inst\u00e2ncias de classes). Num mesmo projeto, \u00e9 poss\u00edvel criar m\u00faltiplas inst\u00e2ncias de um mesmo FB (m\u00faltiplos objetos instanciados a partir da mesma classe).<\/p>\n<p>A chave para um bom projeto usando OOP \u00e9 escolher quais entidades ser\u00e3o modeladas por objetos. Boas escolhas resultar\u00e3o num projeto leg\u00edvel e intuitivo, e pensar em objetos como dispositivos do mundo real ou processos \u00e9 um bom come\u00e7o.<\/p>\n<p>FBs podem ser estruturados em m\u00e9todos, para particionar ainda mais sua complexidade quando necess\u00e1rio, tento possibilidade de ser implantados usando qualquer uma das linguagens da IEC 61131-3. Outros recursos de OOP tamb\u00e9m est\u00e3o dispon\u00edveis, tais como propriedades e extens\u00e3o (heran\u00e7a).<\/p>\n<h3>Exemplo de FB e M\u00e9todos<\/h3>\n<p>A seguir \u00e9 apresentado um exemplo de FB utilizando m\u00e9todos e de suas inst\u00e2ncias num programa.<\/p>\n<p>Um exemplo simples foi escolhido para facilitar a compreens\u00e3o do mesmo. Trata-se do PosVelAc, um FB que calcula posi\u00e7\u00e3o, velocidade e acelera\u00e7\u00e3o de um carro que possui um encoder rotativo conectado em uma de suas rodas, sendo que os pulsos deste encoder s\u00e3o acoplados a um m\u00f3dulo contador r\u00e1pido do CP.<\/p>\n<p>O FB PosVelAc possui as seguintes entradas:<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Cont: contador de pulsos do encoder (contagens)<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Resol: resolu\u00e7\u00e3o do encoder (metros percorridos por contagem do contador)<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Reset: comando para zerar as sa\u00eddas calculadas (posi\u00e7\u00e3o, velocidade e acelera\u00e7\u00e3o)<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>DeltaT: tempo de ciclo (segundos) para chamada do FB<\/p>\n<p>Al\u00e9m disso, o FB PosVelAc possui as seguintes sa\u00eddas:<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Pos: posi\u00e7\u00e3o do carro (m)<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Vel: velocidade do carro (m\/s)<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Ac: acelera\u00e7\u00e3o do carro (m\/s2)<\/p>\n<p>Considera-se que existem dois carros conectados a um mesmo CP, desta forma, o programa ter\u00e1 duas inst\u00e2ncias (objetos) do FB PosVelAc (classe). A figura 1 mostra o programa TestePosVelAc, onde estas inst\u00e2ncias s\u00e3o declaradas (na \u00e1rea de vari\u00e1veis) e chamadas (na \u00e1rea de c\u00f3digo), utilizando a linguagem FBD. Observe que as inst\u00e2ncias se chamam CalcPosVelAc1 e CalcPosVelAc2, e que ambas possuem o tipo PosVelAc. As demais vari\u00e1veis declaradas fazem parte das interfaces de entrada e sa\u00edda das duas inst\u00e2ncias.<\/p>\n<p style=\"text-align: center; \">\u00a0<img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura01.png\" style=\"width: 708px;\" alt=\"Figura 1 \u2013 Declara\u00e7\u00e3o e chamada das inst\u00e2ncias do FB PosVelAc\" title=\"Figura 1 \u2013 Declara\u00e7\u00e3o e chamada das inst\u00e2ncias do FB PosVelAc\"><\/p>\n<p style=\"text-align: center; \">Figura 1 \u2013 Declara\u00e7\u00e3o e chamada das inst\u00e2ncias do FB PosVelAc<\/p>\n<p><\/p>\n<p>A figura 2 mostra a treeview da defini\u00e7\u00e3o do FB PosVelAc, mostrando que o mesmo possui quatro m\u00e9todos, que ser\u00e3o descritos adiante:<\/p>\n<p style=\"text-align: center; \">\u00a0<img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura02.png\" style=\"width: 131px; float: none;\" alt=\"Figura 2 \u2013 TreeView com FB PosVelAc\" title=\"Figura 2 \u2013 TreeView com FB PosVelAc\"><\/p>\n<p style=\"text-align: center; \">Figura 2 \u2013 TreeView com FB PosVelAc<\/p>\n<p><\/p>\n<p>A figura 3 mostra a implementa\u00e7\u00e3o do FBPosVelAc usando a linguagem LD.<\/p>\n<p style=\"text-align: center; \">\u00a0<img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura03.png\" style=\"width: 666px;\" alt=\"Figura 3 \u2013 Implementa\u00e7\u00e3o do FB PosVelAc\" title=\"Figura 3 \u2013 Implementa\u00e7\u00e3o do FB PosVelAc\"><\/p>\n<p style=\"text-align: center;\">Figura 3 \u2013 Implementa\u00e7\u00e3o do FB PosVelAc<\/p>\n<p><\/p>\n<p>Na \u00e1rea de declara\u00e7\u00e3o de vari\u00e1veis, observa-se que as interfaces de entrada est\u00e3o declaradas na se\u00e7\u00e3o VAR_INPUT, e que as interfaces de sa\u00edda est\u00e3o declaradas na se\u00e7\u00e3o VAR_OUTPUT. Estas s\u00e3o as vari\u00e1veis que realmente interessam para o programa TestePosVelAc, que instancia e chama o FB (ver Figura 1).<\/p>\n<p>Al\u00e9m disso, ainda na \u00e1rea de declara\u00e7\u00e3o de vari\u00e1veis, existem vari\u00e1veis internas na se\u00e7\u00e3o VAR. Estas vari\u00e1veis, apesar de vitais para o bom funcionamento do FB, n\u00e3o interessam para o programa que instancia e chama o FB, portanto, s\u00e3o detalhes de implementa\u00e7\u00e3o que ficam escondidos dentro do FB.<\/p>\n<p>Deve-se observar que cada inst\u00e2ncia do FB possui suas pr\u00f3prias c\u00f3pias de vari\u00e1veis de entrada, de sa\u00edda e internas.<\/p>\n<p>Na \u00e1rea de c\u00f3digo, o FB possui 5 redes:<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Rede 1: chamada do m\u00e9todo CalculoPos, utilizado para calcular a posi\u00e7\u00e3o;<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Rede 2: chamada do m\u00e9todo CalculoVel, utilizado para calcular a velocidade;<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Rede 3: chamada do m\u00e9todo CalculoAc, utilizado para calcular a acelera\u00e7\u00e3o;<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Rede 4: zera posi\u00e7\u00e3o, velocidade e acelera\u00e7\u00e3o enquanto a entrada Reset est\u00e1 ativada;<\/p>\n<p>\u2022<span style=\"white-space:pre\">\t<\/span>Rede 5: chamada do m\u00e9todo AtualizaPrev, utilizado para atualizar vari\u00e1veis internas (PrevCont, PrevPos, PrevVel) para utiliza\u00e7\u00e3o no pr\u00f3ximo ciclo de chamada.<\/p>\n<p>As pr\u00f3ximas figuras (4 at\u00e9 7) mostram a implementa\u00e7\u00e3o dos quatro m\u00e9todos em linguagem ST.<\/p>\n<p>\u00a0<\/p>\n<p style=\"text-align: center; \"><img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura04.png\" style=\"width: 587px;\" alt=\"Figura 4 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoPos\" title=\"Figura 4 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoPos\"><\/p>\n<p style=\"text-align: center; \">Figura 4 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoPos<\/p>\n<p style=\"text-align: center;\"><\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura05.png\" style=\"width: 526px;\" alt=\"Figura 5 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoVel\" title=\"Figura 5 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoVel\">\u00a0<\/p>\n<p style=\"text-align: center;\">Figura 5 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoVel<\/p>\n<p style=\"text-align: center;\"><\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura06.png\" style=\"width: 553px;\" alt=\"Figura 6 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoAc\" title=\"Figura 6 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoAc\">\u00a0<\/p>\n<p style=\"text-align: center;\">Figura 6 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo CalculoAc<\/p>\n<p style=\"text-align: center;\"><\/p>\n<p style=\"text-align: center;\">\u00a0<img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/figura07.png\" style=\"width: 412px;\" alt=\"Figura 7 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo AtualizaPrev\" title=\"Figura 7 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo AtualizaPrev\"><\/p>\n<p style=\"text-align: center;\">Figura 7 \u2013 Implementa\u00e7\u00e3o do m\u00e9todo AtualizaPrev<\/p>\n<p>Estes m\u00e9todos possibilitam estruturar (dividir a complexidade) do FB PosVelAc. M\u00e9todos s\u00e3o fun\u00e7\u00f5es definidas dentro do FB, que podem acessar as vari\u00e1veis de entrada, de sa\u00edda e internas do FB. Como fun\u00e7\u00f5es, os m\u00e9todos podem retornar um valor e possuir diversos vari\u00e1veis de entrada (VAR_INPUT).<\/p>\n<p>O uso de vari\u00e1veis de entrada num m\u00e9todo muitas vezes \u00e9 opcional e serve apenas para aumentar a clareza, visto que o m\u00e9todo poderia acessar diretamente as vari\u00e1veis do FB. No caso do m\u00e9todo AtualizaPrev, observa-se que n\u00e3o existem vari\u00e1veis de entrada e que o mesmo acessa de forma direta as vari\u00e1veis do FB. Retornar um valor pelo nome do m\u00e9todo tamb\u00e9m \u00e9 opcional. No caso do m\u00e9todo AtualizaPrev, isso tamb\u00e9m n\u00e3o ocorre.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.altus.com.br\/upload\/htmleditor\/perfil-brune.jpg\" alt=\"Miguel da Silveira, Coordenador de Projetos\" border=\"0\" align=\"left\" title=\"Miguel da Silveira, Coordenador de Projetos\" style=\"padding-right: 20px;\"><\/p>\n<div>\n<p style=\"padding-top:10px; text-align:left\">\n<strong>About the author<\/strong><br \/>Osmar Brune ingressou no time da Altus em 1988 e, desde esta \u00e9poca, vem atuando como Projetista de Produtos e Sistemas nas \u00e1reas de P&#038;D e Integra\u00e7\u00e3o de Sistemas, executando projetos de desenvolvimento de software e especifica\u00e7\u00e3o de produtos e sistemas.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Na Perspectiva desta semana, Osmar Brune, Projetista de Produtos e Sistemas, fala sobre programa\u00e7\u00e3o orientada a objetos, Function Blocks e seus m\u00e9todos.<\/p>","protected":false},"author":5,"featured_media":7231,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66],"tags":[474,475,472,470,471,473],"class_list":["post-7230","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perspectivas","tag-fb","tag-function-block","tag-objeto","tag-oop","tag-programacao","tag-programacao-orientada-a-objeto"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/posts\/7230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/comments?post=7230"}],"version-history":[{"count":1,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/posts\/7230\/revisions"}],"predecessor-version":[{"id":8554,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/posts\/7230\/revisions\/8554"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/media\/7231"}],"wp:attachment":[{"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/media?parent=7230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/categories?post=7230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altus.com.br\/en\/wp-json\/wp\/v2\/tags?post=7230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}