SUGESTÕES DE TRABALHOS

Podem ser feitos no Linux ou no Windows 10 com WSL2.


Dicas para WSL2 (Linux sobre Windows10)

VÍDEO: Usando Ubuntu sobre WSL2-Windows10 para fazer trabalhos

Instalar notepad++ no Windows
Criar um diretorio de trabalho no Windows
Baixar simulador da caldeira e exemplos em C para o diretório de trabalho no Windows

----------

Abrir uma janela PowerShell no Windows
Mudar para o diretório de trabalho no Windows
Executa o simulador normalmente com java (liberar acesso dele à internet)
Edita os programas no Windows usando notepad++

----------

Instala WSL2 no Windows, ver como no site da Microsoft e youtube
Escolhe e instala uma distribuição Linux no WSL2, ver site Microsoft
* Usei o Ubuntu mais recente disponibilizado pela Microsoft

----------

Dispara execução do Linux via WSL2
Instalar gcc no Linux
* sudo apt install gcc no Ubuntu
Descobrir o IP da máquina windows (nameserver) com
* cat /etc/resolv.conf

----------

Muda no Linux para o diretório /mnt/c/Users/Romulo/Desktop/....
* No caso coloquei meu diretório de trabalho no Desktop Windows

Compila programas em C com gcc no Linux
Executa os programas compilados pelo gcc no Linux

----------

Temos então:

- Todos os arquivos de trabalho ficam no diretório de trabalho no Windows
- O simulador roda no Windows via PowerShell

- O gcc roda no Linux
- Os programas compilados com o gcc rodam no Linux

- Existe comunicação udp/ip entre Windows e Linux
- Tanto Windows como Linux acessam os mesmos arquivos no mesmo diretório (do Windows)

- Caso necessário, pode-se abrir várias janelas PowerShell simultâneas
- Caso necessário, no PowerShell ao executar "wsl" temos um terminal no Linux rodando bash


Exemplos com códigos auxiliares

Exemplo cliente UDP

Exemplo servidor UDP


Exemplo de tarefa periódica:   periodica.c

VÍDEO: 18.x1 Sistemas Operacionais de Tempo Real (parte extra 1) - Tarefa Periódica com C no Linux


Exemplos com pthreads:   pthread-ex1.c   pthread-ex2.c  
 
VÍDEO: 11.x1 Sincronização e Comunicação entre Tarefas (parte extra 1) - Threads no Linux com C e Pthreads


Exemplos com pthreads:   pthread-ex3.c
 
VÍDEO: 11.x2 Sincronização e Comunicação entre Tarefas (parte extra 2) - Mutex com C e Pthreads


Exemplos com pthreads:   pthread-ex4.c

VÍDEO: 11.x3 EXTRA-3-Mutex-Linux


Exemplo de entrada e saída:   sincrono.c   assincrono.c  
 
VÍDEO: 7.x1 EXTRA-1-Entrada e Saída Síncrona e Assíncrona


Exemplos de como tratar falhas de sensor:   cliente1.c   cliente2.c   cliente3.c   cliente4.c   cliente5.c   servidor1.c   servidor2.c   servidor3.c

VÍDEO: Exemplos de tratamento para falhas de sensor


Exemplo com várias threads usando a tela:
   console1_main.c     console1.c     console1.h  

VÍDEO: Exemplo com várias threads usando a tela


Exemplo com ncurses:   console2_main.c  

VÍDEO: Exemplo com ncurses




Sugestão ST1 - Trabalho do controlador de sistemas contínuos sequencial e tempo real

VÍDEO: Descrição do Trabalho 1 (1 de 3): Descrição da caldeira e sua instrumentação

VÍDEO: Descrição do Trabalho 1 (2 de 3): Simulador da caldeira

VÍDEO: Descrição do Trabalho 1 (3 de 3): Comunicação com o Simulador da Caldeira


Implementar o controle e a supervisão do sistema descrito aqui.

Simulador é usado para simular uma unidade de caldeira e é chamado com:
java -jar aquecedor2008_1.jar <número-porta-escutada>

A caldeira possui instrumentação embutida e aceita os seguintes comandos:
"sta0" lê valor de Ta
"st-0" lê valor de T
"sti0" lê valor de Ti
"sno0" lê valor de No
"sh-0" lê valor de H
"ani123.4" define valor de Ni como 123.4
"aq-567.8" define valor de Q como 567.8
"ana123.4" define valor de Na como 123.4
"anf123.4" define valor de Nf como 123.4

Cuidado com a formatação dos valores em ponto flutuante.

Implementar em C no Linux o programa CONTROLADOR, o qual deve incluir as seguintes funcionalidades de controle:

- Laço de controle como tarefa periódica para a temperatura;
- Uso do tanque auxiliar e da saída de água;
- Informações na tela sobre a situação corrente.

Outros requisitos:
- Não usar threads;
- Período do controlador de temperatura deve ser 30ms exato, ver exemplo;
- Atualização da tela pode ser aproximadamente a cada 1 segundo.

 

Medições de tempo real

Partindo do programa controlador desenvolvido, meça o tempo de resposta do controle de temperatura.

O tempo de resposta inicia no momento t de acordar. Após concluir o controlador, antes de calcular o novo t de acordar, obtenha a hora atual t1. Com "t1 - t" temos o tempo de resposta do controlador em questão. Cuidado com a divisão de segundos e nanosegundos. Para maior precisão, NÃO converta para float ou double, mas mantenha em long+long (segundos e nanosegundos) até fazer a subtração.

Armazene esta informação em um array e depois de algum tempo grave em arquivo.

Apresente um histograma destas medições. Identifique o pior caso, isto é, o maior tempo de resposta observado (high water mark).

Até que período seria possível levar o controlador nestas condições de execução ?

Usar as funções clock_nanosleep e clock_gettime.

Adicionalmente:

- Número de amostras >= 10000.

- Usar como unidade microsegundo nos gráficos.

- Fazer a coleta dos dados em máquina real e não em máquina virtual.

- Gerar relatório em PDF com texto descrevendo as observações e os gráficos.


 

Sugestão ST2 - Trabalho do controlador de sistemas contínuos concorrente

VÍDEO: Descrição do Trabalho 2: Controlador da caldeira com várias threads

VÍDEO: 13.5. Mecanismos de Sincronização Variáveis Compartilhadas (parte 5 de 5) - Exemplo Buffer Duplo


Implementar o controle e a supervisão do sistema descrito aqui.

Simulador é usado para simular uma unidade de caldeira e é chamado com:
java -jar aquecedor2008_1.jar <número-porta-escutada>

A caldeira possui instrumentação embutida e aceita os seguintes comandos:
"sta0" lê valor de Ta
"st-0" lê valor de T
"sti0" lê valor de Ti
"sno0" lê valor de No
"sh-0" lê valor de H
"ani123.4" define valor de Ni como 123.4
"aq-567.8" define valor de Q como 567.8
"ana123.4" define valor de Na como 123.4
"anf123.4" define valor de Nf como 123.4

Cuidado com a formatação dos valores em ponto flutuante.

Implementar em C no Linux, utilizando a biblioteca das pthreads, o programa CONTROLADOR, o qual deve incluir as seguintes funcionalidades de controle:

- Laço de controle como tarefa periódica para a temperatura;

- Laço de controle como tarefa periódica para o nível (pode considerar estratégias separadas e não multivariável);

- Uso do tanque auxiliar e da saída de água;

- Informações na tela sobre a situação corrente;

- Verificação da temperatura a cada 10ms para disparo de tarefa de alarme caso esteja acima de 30 graus.

- Entrada através do teclado dos valores de referência para nível e temperatura;

- Armazenagem periódica dos valores lidos de temperatura e armazenagem desses dados
em arquivo, através de buffer duplo (produtor/consumidor).


Outros requisitos:
- Usar mutex para proteger as variáveis compartilhadas;
- Tarefas periódicas implementadas com precisão e não com sleep fixo;
- Período do controlador de temperatura deve ser 50ms;
- Período do controlador de nível deve ser 70ms;
- Atualização da tela pode ser com sleep simples de 1 segundo.


Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux, em C, usando a biblioteca das pthreads ?
- Foi usado um mutex para cada estrutura compartilhada ?
- A aplicação apresenta valores dos sensores na tela ?
- A aplicação possui laços de controle para temperatura e nível ?
- A aplicação acessa teclado durante a execução do controlador, afeta valor de referência ?
- A aplicação grava leituras em arquivo ?
- As tarefas de controle são realmente periódicas ?
- Existe uma tarefa para o alarme ?


Sugestão ST3 – Programação Concorrente

VÍDEO: Descrição do Trabalho 3: Simulação como um Programa Concorrente

Implemente uma simulação usando programação concorrente, onde os elementos ativos (pessoas, carros, máquinas, etc) são representados por threads, e os elementos passivos usados por eles (elevador, cruzamento, peças, etc) são representados por monitores acessados pelas threads.


A simulação será construida como um programa concorrente em C usando a biblioteca das pthreads. Os elementos ativos são representados por threads, e a descrição do ambiente onde ocorre a interação entre eles deve ser feita através de variáveis globais compartilhadas, cujo acesso é regulado por monitores. A evolução do estado do sistema ocorre conforme a dinâmica do sistema simulado. Sleep pode ser usado para simular ações demoradas.

Exemplos de sistemas que podem ser simulados: tráfego urbano, tráfego aéreo, tráfego ferroviário, manufatura, bolsa de valores, sistemas militares, sistemas ecológicos, etc.

Cada grupo deve descrever sua proposta e obter aprovação para ela antes de implementar. Cada grupo deve implementar uma simulação diferente.

A simulação será realizada por um programa único composto por muitas threads. O uso de comunicação via UDP é opcional, não será cobrado. Mas pode ser usado caso o grupo julgue conveniente para a simulação em questão.



Sugestão ST4 - Trabalho do controlador de sistemas contínuos no FreeRTOS

Implementar o controle e a supervisão do sistema descrito aqui.

Para iniciar o desenvolvimento do sistema utilize o tutorial criado por Alan Kunz Cechinel,
disponível no repositório: https://github.com/alankc/FreeRTOS_Posix_Socket

Simulador é usado para simular uma unidade de caldeira e é chamado com:
java -jar aquecedor2008_1.jar <número-porta-escutada>

A caldeira possui instrumentação embutida e aceita os seguintes comandos:
"sta0" lê valor de Ta
"st-0" lê valor de T
"sti0" lê valor de Ti
"sno0" lê valor de No
"sh-0" lê valor de H
"ani123.4" define valor de Ni como 123.4
"aq-567.8" define valor de Q como 567.8
"ana123.4" define valor de Na como 123.4
"anf123.4" define valor de Nf como 123.4

Cuidado com a formatação dos valores em ponto flutuante.

Implementar em C usando FreeRTOS Posix o programa CONTROLADOR, o qual deve incluir as seguintes funcionalidades de controle:

- Laço de controle como tarefa periódica para a temperatura;

- Laço de controle como tarefa periódica para o nível (pode considerar estratégias separadas e não multivariável);

- Uso do tanque auxiliar e da saída de água;

- Informações na tela sobre a situação corrente;

- Verificação da temperatura a cada 10ms para disparo de tarefa de alarme caso esteja acima de 30 graus.
Essa funcionalidade deve ser implementada utilizando notificações do freeRTOS (Documentação: https://www.freertos.org/RTOS-task-notifications.html)

- Valores de referência para nível e temperatura devem ser configurados no próprio código;

- Armazenagem periódica dos dez últimos valores lidos de temperatura. Apresentar a média destes valores na tela e conjunto com os demais dados.

- Medir o tempo em segundos para o sistema sair do estágio inicial e chegar a 5% do valor de referência para temperatura. Começar a apresentar este dado na tela apenas quando a caldeira alcançar 5% do valor de referência pela primeira vez. (Pode utilizar: xTaskGetTickCount())

Outros requisitos:
- Usar mutex para proteger as variáveis compartilhadas;
- Tarefas periódicas devem ser implementadas utilizando a função vTaskDelayUntil;
- Período do controlador de temperatura deve ser 50ms;
- Período do controlador de nível deve ser 70ms;
- Atualização da tela com período de 1 segundo.

Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux, em C, usando o freeRTOS Posix ?
- Foi usado um mutex para cada estrutura compartilhada ?
- A aplicação apresenta valores dos sensores na tela ?
- A aplicação possui laços de controle para temperatura e nível ?
- A aplicação apresenta média dos últimos dez valores de temperatura lidos?
- A aplicação mede o tempo para chegar a 5% do valor de referência e mostra na tela apenas no momento adequado?
- Existe uma tarefa para o alarme ?
- Implementou o alarme utilizando notificação no freeRTOS?


Sugestão ST5 - Controlador sequencial para um boiler com aquecimento solar

VÍDEO: Descrição do Trabalho 5 (1 de 3): Descrição da planta e sua instrumentação

VÍDEO: Descrição do Trabalho 5 (2 de 3): Simulador da planta

VÍDEO: Descrição do Trabalho 5 (3 de 3): Comunicação com o simulador da planta


Implementar o controle de um boiler com aquecimento solar. Os coletores solares ficam abaixo do boiler para que a água desça do boiler para os coletores por gravidade. Existe uma bomba para levar água de volta dos coletores para o boiler. Desta maneira os coletores estão sempre cheios de água, a não ser que o boiler esteja completamente vazio. Também existe um mecanismo de recirculação da água dos canos do prédio para o boiler. Caso a temperatura da água nos canos esteja muito baixa é possível acionar uma bomba que leva a água dos canos de volta para o boiler e por gravidade a água do boiler preenche os canos novamente. Os canos estão sempre cheios de  água, a não ser que o boiler esteja completamente vazio.

Características físicas:

Temperatura da água de entrada:   16.0 Celsius
Vazão de entrada:   35.0/60.0 l/s
Vazão de esgotamento:   45.0/60.0 l/s
Vazão de uma bomba:   50.0/60.0 l/s
Potência do boiler:   8000 J/s
Capacidade do boiler:   1200.0 l
Área da base do boiler:   2.0 m^2
Capacidade dos coletores solares:   1800.0 l
Capacidade dos canos:    45.0 l
            
Acionamentos on/off:

Bomba do coletor solar
Bomba de recirculacao
Aquecedor elétrico no boiler
Válvula de entrada de água
Válvula de esgotamento

Sensores lidos:

Nível da água no boiler
Temperatura da água no boiler
Temperatura da água nos coletores solares
Temperatura da água nos canos

O controlador acessa a instrumentação da planta através de mensagens UDP/IP no modo cliente/servidor. Para cada string de comando enviado pelo controlador existe um string de resposta retornado pela instrumentação:

Pedido para ligar/desligar a bomba do coletor
    "bombacoletor <1 ou 0>"
Resposta
    "zbombacoletor <1 ou 0>"

Pedido para ligar/desligar a bomba de circulacao
    "bombacirculacao <1 ou 0>
Resposta
    "zbombacirculacao <1 ou 0>

Pedido para ligar/desligar o aquecedor eletrico
    "aquecedor" <1 ou 0>
Resposta
    "zaquecedor <1 ou 0>

Pedido para ligar/desligar a válvula de entrada
    "valvulaentrada <1 ou 0>
Resposta
    "zvalvulaentrada <1 ou 0>

Pedido para ligar/desligar a válvula de esgoto
    "valvulaesgoto <1 ou 0>
Resposta
    "zvalvulaesgoto <1 ou 0>"

Pedido para ler o nível do boiler
    "nivelboiler"
Resposta
    "znivelboiler <nível em metros>"

Pedido para ler a temperatura do boiler
    "tempboiler"
Resposta
    "ztempboiler <temperatura em graus celsius>"

Pedido para ler a temperatura do coletor
    "tempcoletor"
Resposta
    "ztempcoletor <temperatura em graus celsius>"

Pedido para ler a temperatura dos canos
    "tempcanos"
Resposta
    "ztempcanos <temperatura em graus celsius>"

Por sua vez, o controlador recebe de uma aplicação na nuvem (IoT) mensagens com a temperatura de referência para o boiler. O controlador não precisa responder a estas mensagens. A mensagem em questão é apenas um número inteiro entre 30 e 60, sendo esta a temperatura desejada para a água do boiler.


Simulador é usado para simular a planta em tempo real e é chamado com:
./solar2022   <número-porta-instrumentação>

O controlador acessa a instrumentação através da porta <número-porta-instrumentação>, como cliente e a instrumentação como servidor.

O controlador recebe mensagens da nuvem através da porta  <número-porta-instrumentação> + 1.

A simulação ocorre em tempo real, mas a simulação para no caso de erro como boiler vazio ou capacidade do boiler esgotada.


Implementar em C no Linux o programa controlador, o qual deve incluir as seguintes funcionalidades:

- Laço de controle como tarefa periódica para a temperatura do boiler e nível do boiler;

- Coloca informações na tela sobre a situação corrente (estado da planta).


Outros requisitos:

- Não usar threads (serão usadas no trabalho ST6);
- Período do controlador de temperatura deve ser 30ms exato, ver exemplo mais acima nesta página;
- Atualização da tela pode ser aproximadamente a cada 1 segundo.
- Referência de temperatura 45 graus Celsius.
- Referência de nível em 75% da capacidade.
- Acionar a bomba de recirculação quando temperatura nos canos ficar 5 graus Celsius abaixo da do boiler.
        

Medições de tempo real

Partindo do programa controlador desenvolvido, meça o tempo de resposta do controlador.

O tempo de resposta inicia no momento t de acordar. Após concluir o controlador, antes de calcular o novo t de acordar, obtenha a hora atual t1. Com "t1 - t" temos o tempo de resposta do controlador em questão. Cuidado com a divisão de segundos e nanosegundos. Para maior precisão, NÃO converta para float ou double, mas mantenha em long+long (segundos e nanosegundos) até fazer a subtração.

Armazene esta informação em um array e depois de algum tempo grave em arquivo.

Apresente um histograma destas medições. Identifique o pior caso, isto é, o maior tempo de resposta observado (high water mark).

Até que período seria possível levar o controlador nestas condições de execução ?

Usar as funções clock_nanosleep e clock_gettime.

Adicionalmente:

- Número de amostras >= 10000.

- Usar como unidade microsegundo nos gráficos.

- Fazer a coleta dos dados em máquina real e não em máquina virtual.

- Gerar relatório em PDF com texto descrevendo as observações e os gráficos.


Sugestão ST6 - Controlador concorrente para um boiler com aquecimento solar

Implementar o controle de um boiler com aquecimento solar, descrito na sugestão ST5, como um programa concorrente. Implementar em C no Linux utilizando a biblioteca das pthreads.

Incluir:

- Armazenagem periódica dos valores lidos em arquivo, através de buffer duplo (produtor/consumidor). Incluir anotação de tempo (timestamp);

- Aceita mensagens com o valor de referência para a temperatura do boiler;

- Aceita pelo teclado novo valor de referência para a temperatura do boiler;

- Emitir alarme na tela caso o nível do boiler chegue perto dos valores limites.


Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux, em C, usando a biblioteca das pthreads ?
- Foi usado um mutex para cada estrutura de dados compartilhada ?
- A aplicação apresenta valores dos sensores na tela ?
- A aplicação possui laços de controle para temperatura e nível ?
- A aplicação acessa teclado durante a execução do controlador, afeta valor de referência ?
- A aplicação recebe mensagens com o valor de referência da temperatura ?
- As tarefas de controle são realmente periódicas, implementadas com precisão e não com sleep fixo ?


Sugestão ST7 - Simulador concorrente em tempo real

VÍDEO: Descrição do código fonte do simulador usado no ST5 (a ser publicado)

A partir do código fonte do simulador usado na sugestão ST5, implemente um simulador concorrente usando a biblioteca das pthreads, o qual simula em tempo real uma planta de sua escolha. A planta em questão deve ter no mínimo 4 atuadores e 4 sensores. A dinâmica pode ser totalmente contínua ou híbrida, mas não pode ser totalmente discreta. A dinâmica da planta deve ser lenta o bastante para que passos de simulação de 1ms forneçam realismo razoável.

Para implementar o simulador é conveniente descrever a dinâmica da planta com equações diferenciais, no domínio do tempo. A atualização das variáveis contínuas é feita a partir de uma integração numérica simples. Use o simulador do ST5 como ponto de partida.

Sugestão ST8 - Análise temporal do controlador concorrente

Faça uma análise temporal do simulador implementado na sugestão ST7. Meça o desempenho da thread responsável por atualizar as variáveis de estado da planta e gere gráficos como aparecem nas figuras 16.1, 16.2, 16.3 e 16.4 do capítulo 16 do livro. Considere como deadline e período desta tarefa a duração do passo de simulação, dado que a simulação ocorre em tempo real. Caso nenhum deadline seja perdido com um passo de 1ms, diminua a duração do passo de simulação até alguns deadlines serem perdidos.

Sugestão ST9 - Internet das Coisas, Lado da Nuvem

VÍDEO: Descrição dos Trabalhos ST9 e ST10 (1 de 4): Internet das Coisas (Visão Geral)

VÍDEO: Descrição dos Trabalhos ST9 e ST10 (2 de 4): Internet das Coisas (Exemplo)

VÍDEO: Descrição dos Trabalhos ST9 e ST10 (3 de 4): Internet das Coisas (Lado Nuvem)

VÍDEO: Descrição dos Trabalhos ST9 e ST10 (4 de 4): Internet das Coisas (Lado Dispositivo)

Através da plataforma WEGnology ou Losant implemente uma aplicação na nuvem que suporte uma página web de acesso ao controlador da planta da Caldeira (ST2) ou do Boiler com Aquecimento Solar (ST6).

Neste trabalho implemente apenas o lado da Nuvem, com acesso ao estado da planta e o envio de comandos ou valores de referência para o controlador. Imagine que existirá um controlador (device/dispositivo de campo) com o qual a aplicação da Nuvem trocará dados.

Para testar o lado da Nuvem adapte o programa abaixo, o qual deverá fazer a comunicação como se fosse o controlador da planta.
mqtt_cliente.c

REFERÊNCIAS:

Linha de compilação
gcc -o mqtt_cliente mqtt_cliente.c  -lmosquitto

Página da Weg sobre WEGnology
https://www.weg.net/institutional/BR/pt/solutions/digital-solutions/wegnology

Vídeo de introdução da WEGnology
https://www.youtube.com/watch?v=GPXuY0NjaHM

Documentação da WEGnology
https://docs.app.wnology.io/

Página de login na plataforma WEGnology
https://accounts.app.wnology.io/signin?

Introdução ao MQTT (UFRJ)
https://www.gta.ufrj.br/ensino/eel878/redes1-2019-1/vf/mqtt/

Site do MQTT
https://mqtt.org/

Cursos da Losant University
https://www.losant.com/university

Trabalho de Leon Cesar Carmona
https://repositorio.ufsc.br/handle/123456789/233253

Programas para testar o broker Mosquitto, mostra como programar clientes
https://github.com/eclipse/mosquitto/tree/master/test/lib/c

Man da libmosquitto
https://mosquitto.org/man/libmosquitto-3.html
   
API do libmosquitto, a biblioteca cliente do Mosquitto:
https://mosquitto.org/api/files/mosquitto-h.html

A biblioteca Paho para clientes MQTT também pode ser usada
https://www.embarcados.com.br/paho-mqtt-em-c-no-linux-embarcado/

Exemplos de uso da biblioteca cliente libmosquitto
https://github.com/eclipse/mosquitto/blob/master/examples/publish/basic-1.c
https://github.com/eclipse/mosquitto/blob/master/examples/subscribe/basic-1.c

Como a WEGnology espera as mensagens
https://docs.app.wnology.io/mqtt/overview/
https://docs.app.wnology.io/devices/state/
https://docs.app.wnology.io/devices/commands/

Sugestão ST10 -  Internet das Coisas, Lado do Dispositivo

Adapte o controlador construído no ST2 ou no ST6 para que o mesmo atue como dispositivo de campo em um contexo de Internet das Coisas, interagindo com a aplicação na nuvem construída no ST9. Todos os vídeos e referências do ST9 são também válidos para o ST10.