Hugo Tallys Martins Oliveira e João Arthur Gaia da Rocha Almeida
Segundo Nise, 2017, um sistema de controle consiste em um conjunto de subsistemas e processos (ou plantas) com o propósito de se obter uma saída especificada, dado uma entrada especificada.
Dito posto, o mesmo autor ressalta que esse conceito se faz muito presente no dia a dia. Tendo seu estudo uma grande importância.
Como o controle de sistemas reais exige uma estrutura considerável. O uso de simuladores é uma excelente alternativa para fins acadêmicos e de projeto.
O simulador iDynamic desenvolvido pela UFRN é bastante completo. Contando com simulação gráfica, interativa, 2D, 3D e com vários exemplos de sistemas diferentes.
Sua principal funcionalidade é a possibilidade do usuário inserir o próprio controlador no sistema.
Esse projeto tem por objetivo desenvolver uma aplicação em que seja possível trocar dados com o iDynamic, com a possibilidade de se inserir várias curvas de entrada e plotar as saídas do simulador. Concentrando-se no exemplo de massa-mola complexo.
O iDynamic foi desenhado para funcionar com websockets. Isto é, uma comunicação TCP-IP, onde a aplicação é o servidor e o cliente é o próprio simulador.
Baseado nisso, a primeira comunicação foi feita através do exemplo dado na documentação do iDynamic. Contudo, por comodidade, tentou-se estabelecer uma comunicação através de socket. Já que na conversação TCP-IP pouco importaria se seria utilizado websockets ou socket.
Entretanto, o iDynamic se mostrou apenas compatível com o websockets, encerrando qualquer comunicação via socket rapidamente. Portanto, adaptou-se um servidor websockets a arquitetura do projeto.
Primeiramente, o projeto é estruturado com threading. Uma thread faz a comunicação com o iDynamic e outra controla a interface gráfica. Essa escolha foi tomada devido ao delay que seria demasiado no caso de um processamento single thread.
Como o websockets é baseado em asyncio que é uma biblioteca pensada em processos concorrentes em single thread, sua implementação com múltiplas threads foi um tanto custosa.
Por fim, a comunicação com o iDynamic foi feita com websockets, rodando na thread principal. Uma thread secundária roda a interface gráfica. A comunicação entre as duas threads é feita através de queues.
O projeto acabou tendo conflitos entre as threads, queues, servidor e interface gráfica. Além de um código "macarrônico", com um fluxo de execução confuso. Sendo necessária uma reformulação. A arquitetura atual consiste em subthreads a partir do PyQt, uma especifica para o servidor e outra para contolar a interface gráfica, sem uso de queues. Visto que todas as variáveis são acessíveis por uma mesma classe.
A interface gráfica foi desenvolvia com PyQt6, utilizando-se como guia tutorial. A IDE QT Creator foi utilizada para fácil desenvolvimento e prototipação da interface de usuário. Os gráficos foram desenvolvidos com PyQtGraph, baseando-se no exemplo encontrado em python-live-plotting.
É possível selecionar o sistema como malha aberta ou malha fechada. Em caso de malha aberta, uma curva de entrada é aplicada diretamente ao sistema. Já no caso de malha fechada, é aplicado como entrada do sistema a curva de referência menos a saída anterior do sistema (sinal de erro). Além disso, o sinal de referência pode ser configurado de maneira semelhante à entrada com formas de onda diferentes (senoidal, quadrada etc). Também é possivel selecionar qual saída sera utilizada como fator para calcular o erro em malha fechada (posição do bloco vermelho ou verde).
É possível aplicar um controlador Proporcional Integrador Derivativo no sistema, regulando os ganhos para a melhor resposta, seja em tempo de convergência, overshoot, tempo de subida. Para cada tipo de controlador selecionado é possivel determinar valores de ganho proporcional Kp
, derivativo Kd
ou integral Ki
ou constantes de tempo integral Ti
ou derivativo Td
. Variações do esquema PID
também foram implementadas sendo elas o controle PI-D
e I-PD
.
A avaliação para cada controlador é feita a partir do momento que o mesmo é instanciado, onde as seguintes métricas de erro (índices de desempenho) são calculadas e mostradas num display na própria interface gráfica:
- IAE - Integral Absolute Error
- ISE - Integral Square Error
- ITAE - Integral Time Absolute Error
- Índice de GoodHart com valores de constantes
[0.4, 0.4, 0.2]
Comparando os controladores PID
, PI-D
e I-PD
para valores de Kp = 1.0
, Kd = Ki = 0.5
com o sinal de referência constante R = 10
:
Sintonizando o controlador através do método Ziegler e Nichols em Malha Fechada chegamos a valores de Ku ~ 1.06
e Pu2.5
onde inferimos os seguintes valres de ganho proporcional e tempos derivativo e integral:
Kp | Ti | Td | |
---|---|---|---|
P | 0.53 | ||
PI | 0.48 | 2.08 | |
PID | 0.63 | 1.25 | 0.31 |
$ python3 -m venv env
$ source env/bin/activate
$ pip install -r requeriments.txt
$ python3 main.py
Clique em Connect to Server Em seguida, abra o simulador. Clique em Control e em Play.
Selecione a forma de onda de entrada e altere a amplitude, selecione se a malha é aberta ou fechada e o uso do controlador.
Nas imagens a seguir podemos ver as curvas obtidas através da leitura dos dados dos simulador. Também é possível escrever dados no simulador, como pode ser observado na curva azul (senóide) onde para cada tipo de curva de entrada é fornicido um conjunto de parametros editáveis.