DAS5306: Informática Industrial II

Trabalhos para 2005/2

Trabalhos entregues após a data estipulada perdem 1 ponto por dia de
atraso, inclusive sábado e domingo.

Trabalhos entregues no dia correto mas depois do horário de
aula perdem 1 ponto.

Apresentações individuais podem ser solicitadas.

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

T1 - Trabalho sobre controlador discreto

Considere o problema da Linha de Produção de Cervejas, como descrito no
capítulo 3 da apostila do Prof. Cury sobre "Teoria de Controle Supervisório
de Sistemas a Eventos Discretos", página 20.

http://www.das.ufsc.br/~cury/cursos/apostila.pdf

O objetivo neste trabalho é implementar um controlador para maximizar a
produção da planta, ou seja, manter todas as estações da linha
trabalhando simultaneamente a maior parte do tempo.

Os seguintes arquivos estão disponíveis:

controlador2.c    Exemplo do programa controlador a ser feito

envasilhamento2.h    Descrição das rotinas disponíveis no simulador da planta

envasilhamento2.c    Simulador da planta já compilado

Escrever um novo controlador2.c que seja automático (o fornecido é manual) e que
maximize a produtividade da planta, considerando a produção de um lote de N garrafas.

Comandos do controlador manual:
e - avança esteira
a - liga atuador
b - liga a bomba
t - liga o tampador
r - liga o robô

Todos eles desligam após realizar um ciclo de trabalho.

As rotinas do tipo acionaXYZ retornam -1 quando o dispositivo
está em operação, neste caso um novo pedido de acionamento é
ignorado até que o dispositivo retorne para o estado de repouso.
 
 

T2 - Trabalho sobre tarefas periódicas

Implementar um laço periódico seguindo as recomendações do relatório técnico
"Trabalhando com o Tempo Real em Aplicações Sobre o Linux" e o
exemplo  exemplo-periodica.c .

Medir os seguintes jitters:
- Jitter de Liberação, isto é, a diferença entre quando a tarefa deveria iniciar sua execução
e quando ela realmente iniciou.

- Jitter de Entrada, isto é, a diferença entre o período da tarefa e o tempo entre dois
começos sucessivos da tarefa.

- Jitter de Saída, isto é, a diferença entre o período da tarefa e o tempo entre duas
conclusões sucessivas da tarefa.

Tentar minimizar o jitter de liberação compensando no sleep seguinte, alterando o valor
do sleep conforme o erro observado na ativação anterior. A compensação pode ser no estilo
de um controlador PI, a variável controlada é o jitter de liberação com valor de referência zero
e a atuação é no sleep na conclusão da tarefa.

Apresentar histogramas para cada tipo de  jitter. Plotar o histograma usando matlab, excel,
qualquer planilha eletrônica, ou mesmo a mão.


T3+T5 - Trabalho sobre tabelas e pthreads

Implementar uma tabela hash na forma de um módulo (arquivo .c separado), o qual exporta
as funções de acesso "inserir", "consultar" e "remover". Este módulo deve ser implementado
seguindo a filosofia dos monitores, ou seja, deve usar variáveis mutex para garantir
exclusão mútua entre diferentes threads que chamam estas rotinas simultaneamente. Além disto,
quando uma thread chama a rotina "remover" mas o ítem em questão não existe na tabela,
ela fica bloqueada até que o ítem seja inserido e então removido. Usar para isto uma variável
condição.

Os ítens na tabela são do tipo abaixo, usar a matrícula como chave. É obrigatório usar o tratamento
de colisão apresentado no exemplo tabhash.c da página da disciplina.

struct aluno{
        char nome[40];
        long matricula;
        double media;
        char sexo;
        int ingresso;
};

Implementar um segundo módulo (outro arquivo .c), onde são criadas 3 threads recorrentes,
as quais fazem inserções, remoções e consultas variadas. Usar "sleep" para testar se uma
remoção antes da inserção efetivamente bloqueia a thread.

Todo o trabalho deve ser feito em C, no Linux, usando a biblioteca das pthreads.

T4+T6 - Trabalho sobre escalonamento e mensagens via sockets

Implementar uma aplicação distribuída que usa o modelo cliente-servidor, e a comunicação entre
os processos seja através de mensagens, usando UDP como no exemplo da página da disciplina.

Deve ser criado um programa Servidor para controlar o uso de um recurso único imaginário. Quando um
processo Cliente deseja usar este recurso único imaginário, ele envia uma mensagem “Aloca” para o Servidor.
Como o recurso imaginário é único, o Servidor organiza uma fila de solicitações caso vários clientes desejem
usar o recurso imaginário ao mesmo tempo. Na mensagem "Aloca" cada cliente também informa a sua
prioridade, e a alocação do recurso é concedida pelo Servidor conforme a ordem de prioridade dos clientes.

O Servidor autoriza um dado Cliente a usar o recurso imaginário através da mensagem “PodeUsar”. Ao concluir
o uso do recurso imaginário, o Cliente envia para o Servidor a mensagem “Libera”. Suponha que existam 4 processos
Clientes.

O trabalho consiste em implementar um programa servidor.c e outro cliente.c, que funcionem da forma
descrita acima. A implementação deve ser feita com a linguagem de programação C, no Linux.

T7 - Trabalho do controlador completo

Implementar o controle do sistema descrito aqui.
 
Simulador é chamado com:
      java -jar aquecedor2004_2.jar
escuta a porta 4545.

Aceita os 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.

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

- Laço de controle com tarefa periódica;
- Alarme associado com valores das variáveis amostradas;
- Armazenagem em arquivo de leitura periódicas;
- Informações periódicas na tela;
- Leitura de comandos e/ou valores a partir do teclado.

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 individual do trabalho

Outros requisitos:
    - Cada variável compartilhada deve ter seu próprio mutex.
    - Variáveis condição devem ser usadas para liberar as threads de alarme.
    - Tarefas periódicas implementadas com precisão e não com sleep fixo.

Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux, em C, usando a biblioteca das pthreads ?
- A aplicação apresenta valores na tela ?
- A aplicação grava leituras em arquivo ?
- A aplicação acessa teclado durante a execução do controlador ?
- A aplicação possui alarme disparado via variável condição ?
- A aplicação possui laço de controle ?
- Foi usado um mutex para cada estrutura compartilhada ?
- As tarefas são realmente periódicas, como feito em aula ?
- Elegância do design da solução.
- Legibilidade do código.