DAS 9002: Técnicas de Implementação de Sistemas Automatizados

Trabalhos para 2008

Todos os trabalhos devem ser feitos em C no Linux.

Todos os trabalhos devem ser apresentados pelos alunos no
computador, em horário a ser combinado (extra-classe).

Uma sugestão para quem só tem Windows em casa é usar o MinGW.


T1 - Trabalho de sincronização de relógios

Dados dois computadores quaisquer, determinar a diferença entre os relógios
desses computadores (skew) e também a variação desta diferença no
tempo (drift rate).

Implementar uma aplicação distribuída que usa o modelo cliente-servidor, e onde a comunicação entre
os processos seja feita através de mensagens, usando UDP como nos exemplos em udpcliente2008.c e
udpservidor2008.c .
   
Duas trocas de mensagens são possíveis entre um processo cliente e um processo servidor:
  
M1) Cliente manda uma mensagem TESTE para o servidor, que imediatamente responde com uma
mensagem OK.
  
M2) Cliente manda uma mensagem LEHORA para o servidor, que imediatamente responde com a
hora local em sua máquina.
  
O cliente é capaz de medir a diferença entre o seu relógio e o relógio do servidor, através de 3 etapas:
  
Passo 1) Cliente faz um TESTE e mede o tempo para uma mensagem ir e voltar do servidor, desta
forma estima o atraso da rede. Como o atraso na rede é variável, fazer várias medições e obter a média.

Passo 2) Cliente faz um LEHORA e obtém a hora do servidor, acrescenta o atraso estimado para
a rede e compara o seu relógio com o relógio do servidor.

Passo 3) Cliente faz operações de LEHORA periódicas, para determinar a variação do atraso no tempo,
considerando sempre os atrasos na rede. Fazer várias medições e obter a média.

O relatório técnico Trabalhando com o Tempo Real em Aplicações Sobre o Linux pode
ser consultado sobre funções Unix para manipular tempo.
  

T2 - Trabalho do controlador de sistema contínuo

Implementar o controle do sistema descrito aqui.
 
Simulador é usado para simular uma unidade de caldeira e é chamado com:
      java -jar aquecedor2006_2.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
 

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

O programa CONTROLADOR deve incluir o controle em malha fechada
da temperatura da água e do nível da água.

A comunicação entre o CONTROLADOR e o simulador da caldeira será através
de sockets UDP/IP.
    
A tarefa de controle deve ser uma tarefa periódica com período de 100mS, implementada com
precisão e não com sleep fixo (ver apostila na página da disciplina).

Implementar um programa em C no Linux usando a biblioteca de pthreads que inclua
as seguintes funcionalidades:

- Laços de controle como tarefa periódica para temperatura e nível;
- Alarme associado com valores das variáveis amostradas;
- Armazenagem em arquivo de leitura periódicas dos sensores (arquivo de histórico),
através da técnica de buffer duplo;
- Informações periódicas na tela;
- Leitura de comandos e/ou valores a partir do teclado que alteram os valores de referência.

O programa em si deve ficar no arquivo "controle.c" e deve ser composto por várias threads que
colaboram entre si através de variáveis compartilhadas.

A planta será simulada por um outro programa, cujo código executável será
fornecido. A comunicação entre o controle e o simulador será através
de sockets UDP/IP.

Avaliação composta por:
    - Código fonte;
    - Texto explicando qual a função de cada thread e quais variáveis compartilhadas cada uma acessa;
    - Apresentação do trabalho.


Outros requisitos:
    - Usar mutex para proteger as variáveis compartilhadas;
    - Usar variáveis condição para liberar as threads de alarme;
    - Tarefas periódicas implementadas com precisão e não com sleep fixo (ver apostila na página da disciplina);
    - Período do controlador de temperatura deve ser 150ms;
    - Período do controlador de nível deve ser 200ms;
    - Atualização da tela pode ser com sleep simples de 1 segundo;
    - Usar buffer duplo para a gravação de dados em arquivos, feita por thread própria.