DAS5306: Informática Industrial II

Trabalhos para 2010/2

Trabalhos entregues após a data estipulada perdem 10% da nota máxima
por dia de atraso, inclusive sábados e domingos.

Trabalhos entregues no dia correto mas depois do horário de aula também
perdem 10% da nota máxima.

Apresentações individuais podem ser solicitadas.

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


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

Fazer um programa em C para o Linux que atue como cliente
para o programa servidor  novot1servidor.c  o  qual  aceita
os seguintes comandos via UDP:
( versão antiga:      t1servidor.c   )

'h'  faz o servidor devolver um string contendo a hora no
computador do servidor (segundos e microsegundos)..

'p' faz o servidor colocar na tela o tempo entre este comando 'p'
e o último comando 'p' recebido.

O objetivo do programa cliente é, inicialmente usar o comando 'h'
para determinar o atraso médio na rede de comunicação e o drift
rate entre os relógios do servidor e do cliente. Em seguida,
o cliente deve gerar um comando 'p' e, depois de exatamente 20 segundos
pelo relógio do servidor, gerar um novo comando 'p'.

Usar o exemplo em  exemplo.c  sobre como implementar um sleep de
precisão no Linux.

T2 - Simulador de sistema contínuo

Implementar a simulação em tempo real de um sistema físico qualquer,
proposto pelos alunos. O sistema precisa ter pelo menos duas variáveis
físicas sensoriadas e dois atuadores através dos quais elas podem ser afetadas.
Pode ser multivariável.

A simulação ocorre no domínio do tempo. Os alunos deverão entregar um
desenho mostrando os aspectos físicos da planta, assim como a descrição
da sua dinâmica no domínio do tempo.

Usar como base os programas

Aquecedor2006_2.java  e Aquecedor2008_1.java

os quais usam a biblioteca

cp.jar

O aquecedor 2006/2 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
    
O aquecedor 2008/1 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


Blocos disponíveis:

public Atraso(int iterações)
  
public ComparadorUmaEntrada (double inferior, double superior)
-1 <inferior
0 entre
+1 > superior
 
public ControladorPI(double inicial, double ganProp, double ganInteg)
 
public Derivador(double gan)
 
public Diferenca()
 
public Diferenca( double offset)
 
public DiferencaComGanho(double geMais, double geMenos)
 
public DisplayConsole(String s)
 
public DisplayMensagem( javax.swing.JTextArea am, String s)
 
public Divisor( double ganhoNumerador, double ganhoDenumerador)
 
public GanhoProporcional(double ganho)
 
public GeradorConstante(double valor)
 
public GeradorDegrau(long atraso, double valor)
 
public GeradorParametro(String nome, double minimo, double inicial, double maximo, java.awt.Container c)
 
public GeradorPulso(long atraso, long duracao, double valor)
 
public GeradorRampa(long atraso, double inclinacao)
 
public GeradorRuido( long atraso, long duracao, double amplitude)
 
public GeradorSenoide( long atraso, double amplitude, double frequencia)
 
public GeradorTrem(long atraso, long duracao, double valor)
 
public Histerese(double histerese)
 
public Integrador(double inicial, double ganho)
 
public PrimeiraOrdem(double Yinicial, double numerador, double denominador)
 
public Produtorio(double v1, double v2, double v3, double v4)
 
public Saturacao(double min, double max)
 
public Somador()
 
public Somatorio( double g1, double g2, double g3, double g4)
 
public ZonaMortaHorizontal(double zm)
 
public ZonaMortaVertical(double zm)

 

Exemplo de bloco:

Derivador.java

Para compilar:

javac -cp cp.jar Aquecedor2006_2.java

Para executar:

java -classpath .:cp.jar Aquecedor2006_2 12345

O propósito dos comandos via UDP é acessar a instrumentação da
planta simulada. Mostrar através de comandos UDP que a simulação feita
responde corretamente. Para isto, usar um programa cliente UDP
auxiliar qualquer, como aqueles fornecidos como exemplo.

T3 - Trabalho do controlador de sistemas contínuos (preliminar)

Implementar o controle e a supervisão do sistema criado no T2.

A planta do T2 deve possuir instrumentação embutida e aceitar comandos para
acesso aos sensores e atuadores.

Implementar um programa em C no Linux, usando a biblioteca de pthreads.

O programa CONTROLADOR deve incluir as seguintes funcionalidades de controle e
supervisão: 

- Laço de controle como tarefa periódica;
- Detecção de valores fora do intervalo de valores válidos, geração de alarme;
- Informações na tela sobre a situação corrente;
- Entrada através do teclado dos valores de referência para a planta;
- Armazenagem periódica dos valores lidos em arquivo, juntamente com um carimbo de tempo.

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

Outros requisitos:
    - Usar mutex para proteger as variáveis compartilhadas;
    - Usar variáveis condição para liberar thread de alarme;
    - Tarefas periódicas implementadas com clock_nanosleep e não com sleep fixo;
    - Período do controlador menor que 100ms, compatível com a planta em questão;
    - Atualização da tela pode ser com sleep simples de 1 segundo;
    - Usar buffer duplo para a gravação de dados em arquivos, a escrita no disco é feita
       por thread própria.

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 possui alarme disparado via variável condição ?
- A aplicação apresenta valores dos sensores na tela ?
- A aplicação possui laços de controle ?
- A aplicação acessa teclado durante a execução, afeta valor de referência ?
- A aplicação grava leituras em arquivo utilizando buffer duplo e thread própria ?
- As tarefas de controle são realmente periódicas ?
- Existe algum warning na compilação ?
- Elegância do design da solução e legibilidade do código.