Estrutura de Dados com PLC
- Paulo Ricardo Siqueira Soares
- Jul 31, 2023
- 8 min read
Updated: Aug 4, 2023

Estrutura de Dados
Computadores e controladores são máquinas que manipulam dados e informações. A computação abrange o estudo da forma como as informações são organizadas, manipuladas e utilizadas em um computador, e esses mesmos conceitos são aplicáveis para controladores lógicos programáveis (CLP).
Ao desenvolver um programa para realizar o processamento de dados, é preciso transcrever de forma que o computador/controlador possa compreender e executar tal programa e que o programador também compreenda o que escreveu. As linguagens de programação são códigos escritos em uma linguagem que o programador compreende e que o computador consegue interpretar e executar.
As estruturas de dados mais simples e que foram estudadas na seção de algoritmos, são os vetores e matrizes. Estas estruturas de dados são estruturas de dados homogêneos pois permitem o armazenamento de dados de um único tipo de dado. Elas permitem acesso direto a um elemento através do nome do vetor/matriz seguido do índice. Permitem também o acesso sequencial, percorrendo elemento a elemento do vetor/matriz.
Para poder representar de maneira melhor as necessidades temos estruturas heterogêneas, estas estruturas muitas vezes chamadas de registro, armazenam informações de diferentes tipos
Ao criarmos um registro, criamos um tipo especial de dado que armazena dentro de si todas as variáveis declaradas pelo programador. Ao ser chamado pelo usuário, o registro aloca na memória o espaço necessário para aceitação de todas estas variáveis.
Para escrever ou ler as variáveis armazenadas em uma estrutura, basta apenas especificarmos o nome da estrutura, seguido de ponto e a variável interna que desejamos acessar.
1.1 Vetores e Matrizes – Estruturas Homogêneas
Vetores e matrizes são s consideras estruturas homogêneas, pois armazenam apenas um único tipo de dados, como por exemplo um vetor de inteiros ou um vetor de reais. Os vetores e matrizes tem seu uso muito comum, na programação de computadores e de CLP’s, sendo essencial entender o seu conceito. Na apostila de Algoritmos foi feita uma apresentação e introdução ao conceito de vetores, onde tem sua declaração e seu preenchimento, porém algumas funções essenciais um pouco mais avançadas foram deixadas para serem apresentadas aqui na apostila de estrutura de dados.
1.1.1 Ordenação de Vetores
Ordenar vetores e extremamente importante em computação e na programação de CLPS, pois é muito comum que uma saída de um programa seja dada com algum tipo de ordem sobre os dados, por exemplo para enviar para tela uma lista de códigos de produtos já produzidos ou a produção ordenada por código do modelo.
Existem alguns algoritmos já estudados e próprios para ordenação simples e complexa, a seguir alguns dos algoritmos mais comuns que em alguns casos são até mesmo funções prontas dentro de linguagens de programação de computadores e de CLPs.
As explicações foram retiradas do seguinte endereço, onde de forma simples e clara explica esses algoritmos de forma melhor do que esse autor poderia fazê-lo:
Bubble Sort
Bubble sort é o algoritmo mais simples, mas o menos eficiente. Neste algoritmo cada elemento da posição i será comparado com o elemento da posição i + 1, ou seja, um elemento da posição 2 será comparado com o elemento da posição 3. Caso o elemento da posição 2 for maior que o da posição 3, eles trocam de lugar e assim sucessivamente. Por causa dessa forma de execução, o vetor terá que ser percorrido quantas vezes que for necessária, tornando o algoritmo ineficiente para listas muito grandes.

Figura 2.Esquema de funcionamento do Buble Sort
É verificado se o 3 é maior que 5, por essa condição ser falsa, não há troca.
É verificado se o 5 é maior que 1, por essa condição ser verdadeira, há uma troca.
É verificado se o 5 é maior que 2, por essa condição ser verdadeira, há uma troca.
É verificado se o 5 é maior que 4, por essa condição ser verdadeira, há uma troca.
O método retorna ao início do vetor realizando os mesmos processos de comparações, isso é feito até que o vetor esteja ordenado.
Selection Sort
Este algoritmo é baseado em se passar sempre o menor valor do vetor para a primeira posição (ou o maior dependendo da ordem requerida), depois o segundo menor valor para a segunda posição e assim sucessivamente, até os últimos dois elementos.
Neste algoritmo de ordenação é escolhido um número a partir do primeiro, este número escolhido é comparado com os números a partir da sua direita, quando encontrado um número menor, o número escolhido ocupa a posição do menor número encontrado. Este número encontrado será o próximo número escolhido, caso não for encontrado nenhum número menor que este escolhido, ele é colocado na posição do primeiro número escolhido, e o próximo número à sua direita vai ser o escolhido para fazer as comparações. É repetido esse processo até que a lista esteja ordenada.

Figura 3. Esquema de funcionamento do Selection Sort
Neste passo o primeiro número escolhido foi o 3, ele foi comparado com todos os números à sua direita e o menor número encontrado foi o 1, então os dois trocam de lugar.
O mesmo processo do passo 1 acontece, o número escolhido foi o 5 e o menor número encontrado foi o 2.
Não foi encontrado nenhum número menor que 3, então ele fica na mesma posição.
O número 5 foi escolhido novamente e o único número menor que ele à sua direita é o 4, então eles trocam.
Vetor já ordenado.
Insertion sort
O Insertion sort é um algoritmo simples e eficiente quando aplicado em pequenas listas. Neste algoritmo a lista é percorrida da esquerda para a direita, à medida que avança vai deixando os elementos mais à esquerda ordenados.
O algoritmo funciona da mesma forma que as pessoas usam para ordenar cartas em um jogo de baralho como o pôquer.

Figura 4. Esquema de funcionamento do Insertion Sort
Neste passo é verificado se o 5 é menor que o 3, como essa condição é falsa, então não há troca.
É verificado se o quatro é menor que o 5 e o 3, ele só é menor que o 5, então os dois trocam de posição.
É verificado se o 2 é menor que o 5, 4 e o 3, como ele é menor que 3, então o 5 passa a ocupar a posição do 2, o 4 ocupa a posição do 5 e o 3 ocupa a posição do 4, assim a posição do 3 fica vazia e o 2 passa para essa posição.
O mesmo processo de comparação acontece com o número 1, após esse processo o vetor fica ordenado.
Quick sort
O Quicksort é o algoritmo mais eficiente na ordenação por comparação. Nele se escolhe um elemento chamado de pivô, a partir disto é organizada a lista para que todos os números anteriores a ele sejam menores que ele, e todos os números posteriores a ele sejam maiores que ele. Ao final desse processo o número pivô já está em sua posição final. Os dois grupos desordenados recursivamente sofreram o mesmo processo até que a lista esteja ordenada.

Figura 5. Esquema de funcionamento do Quick Sort
· O número 3 foi escolhido como pivô, nesse passo é procurado à sua direita um número menor que ele para ser passado para a sua esquerda. O primeiro número menor encontrado foi o 1, então eles trocam de lugar.
· Agora é procurado um número à sua esquerda que seja maior que ele, o primeiro número maior encontrado foi o 5, portanto eles trocam de lugar.
· O mesmo processo do passo 1 acontece, o número 2 foi o menor número encontrado, eles trocam de lugar.
· O mesmo processo do passo 2 acontece, o número 4 é o maior número encontrado, eles trocam de lugar.
· O vetor desse exemplo é um vetor pequeno, portanto ele já foi ordenado, mas se fosse um vetor grande, ele seria dividido e recursivamente aconteceria o mesmo processo de escolha de um pivô e comparações.
Sobre algoritmos de ordenação, vale ressaltar que é comum na maioria dos CLPs a existência de funções de ordenação, que são optimizadas para a CPU em questão, no geral utilizam o Quick Sort, não por acaso no geral também essas funções geralmente tem o nome de QSORT.
1.2 Lista encadeada
É uma estrutura de dados linear e dinâmica. Ela é composta por uma sequência de nodos ou células que contém seus dados e também uma ou duas referências ("links") que apontam para o nodo anterior ou posterior. Há diversos modelos de lista ligadas como lista-encadeada simples, listas duplamente ligadas e listas encadeadas circulares.
Para se "ter" uma lista ligada, basta guardar seu primeiro elemento, e seu último elemento aponta para uma célula nula. O esquema a seguir representa uma lista ligada com 5 elementos:
Célula 1 ---> Célula 2 ---> Célula 3 ---> Célula 4 ---> Célula 5 ---> (Nulo)
Para manipularmos estas listas nomeadamente: inserir dados ou remover dados temos que ter sempre em atenção em ter um ponteiro que aponte para o 1º elemento e outro que aponte para o fim, isto porque se queremos inserir ou apagar dados que estão no início ou no fim da lista então a operação é rapidamente executada caso seja um nó que esteja no meio da lista pois terá que haver uma procura até encontrar a posição desejada.
Lista encadeada simples
Uma lista encadeada simples é aquela que contém apenas um link por nodo. Este link aponta para o próximo nodo da lista, ou para um valor nulo (vazio) quando se trata do nodo final.

Lista encadeada simples com três valores inteiros.
Lista duplamente encadeadas
Listas duplamente encadeadas ou lista de duas vias, são um modelo mais sofisticado das listas simples: cada nodo possui dois ponteiros - um que aponta para o nodo anterior (ou null se é o primeiro valor ou a lista está vazia) e outro que aponta para o próximo nodo (ou null se é o último nodo ou a lista está vazia).

Um exemplo de uma lista duplamente encadeada
Listas encadeadas circulares
Na lista encadeada circular, o primeiro e o último nodo são ligados entre si. Nas listas circulares simples, há apenas um link que aponta para o próximo nodo; enquanto nas listas circulares duplas há dois links em cada nodo que apontam para o elemento anterior e para o posterior.

Um exemplo de uma lista circular simples
Dentro de estruturas de dados é importante nós citarmos a existência das listas encadeadas, porém temos que lembrar que as listas necessitam de uma alocação dinâmica de memória, que não é um recurso disponível pelos controladores, uma vez que existe uma delimitação de memória de seus sistemas de tempo real, o que torna utilização de memória sempre fixa, diferentemente nos computadores existe a possibilidade de alocação dinâmica de memória, nesse caso o recurso de estruturação de dados em lista encadeadas poder ser uma opção interessante dependendo do tipo de aplicação que está em desenvolvimento
.
1.3 Registros – Estruturas Heterogêneas.
Ao criarmos um registro, criamos um tipo especial de dado que armazena dentro de si todas as variáveis declaradas pelo programador, por natureza o registro é formado por informações (variáveis), logicamente relacionadas, porém de tipos diferentes. Ao ser chamado pelo usuário, o registro aloca na memória o espaço necessário para aceitação de todas estas variáveis.
Para escrever ou ler as variáveis armazenadas em uma estrutura, basta apenas especificarmos o nome da estrutura, seguido de ponto e a variável interna que desejamos acessar.
Criação da estrutura:
Nome da estrutura: estrutura
{declaração das variáveis}
Fim_estrutura
Ler ou escrever em variáveis da estrutura:
Nome da estrutura.nome da variável interna
Nota sobre CLPs:
Em muitos CLPs a estrutura é criada através de uma UDT (User Data Type), ela possui o mesmo conceito porém é criada em uma área específica, dependendo do fabricante, a exceção é a Siemens que possui a estrutura como um tipo para ser declarado dentro das DB (Database block) e possui também a UDT, como regra é sempre melhor criar uma UDT que simplesmente declarar uma estrutura, isso padroniza para todos os fabricantes.
Um exemplo clássico em programação é a estrutura funcionário
Inicio_Algoritimo
FUNCIONARIO: estrutura
Codigo:inteiro
Nome[80]:caractere
Salario: real
Fim_estrutura
Escreva “Digite código do funcionário”
Leia(FUNCIONARIO.codigo)
Escreva “Digite nome do funcionário”
Leia(FUNCIONARIO.nome)
Escreva “Digite Salário do funcionário”
Leia(FUNCIONARIO.Salario)
Escreva “Codigo do Funcionario:”,FUNCIONARIO.codigo, “Nome: “,FUNCIONARIO.nome,”ganha por mês: “, FUNCIONARIO.Salario
Fim_Algoritmo
Para CLP um exemplo clássico seria a UDT Motor
Para esse exemplo ficar mais próximo da realidade com o CLP, um tipo lógico que só possui os estados verdadeiro e falso é o tipo Booleano (Bool), que possui 1 bit e tem o estado zero e 1, que podemos interpretar como verdadeiro ou falso, para ir acostumando, aos poucos conceitos como esse serão mostrados.
Inicio_Algoritmo
Motor:Estrutura
Contator: Bool
Disjuntor:Bool
AcionaMotor:Bool
Falha:bool
Fim_estrutura
Declare
M1:Motor
BotaoLigaMotor:Bool
BotaoDesligaMotor:Bool
M1.contatorßI.0 // Aqui estou enviando a informação da entrada física do CLP para a variável
M1.DisjuntorßI.1 // Aqui estou enviando a informação da entrada física do CLP para a variável
M1.AcionaMotor ß 0
M1.Falha ß0
BotaoLigaMotorßI.2
BotaoDesligaMotorßI.3
Se (M1.Contator ∧ M1.disjuntor ∧ M1.BotaoLigaMotor ∧ BotaoDesligaMotor ∧ M1.falha =0) então //// Nesse caso está considerado que o botão desliga motor é um contato fechado
M1.AcionaMotor ß1
Fim_se
Se (M1.AcionaMotor) então
Q0.0 ß 1 // Acionando saída do CLP
Fim_se
Fim_algoritmo
Bibliografia:
DevMedia:
Construção de algoritmos – Jander Moreira – Universidade Federal de São Carlos – UFScar
留言