DAS5306: Informática Industrial II

Trabalhos para 2012/1

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

Um sistema de defesa é composto por um Computador Central ligado a uma estação de radar remota e uma bateria de mísseis terra-ar. Os equipamentos estão ligados ao Computador Central através de uma rede UDP/IP. Existem atrasos de rede significativos entre o Computador Central e o Radar, mas não entre o Computador Central e a Bateria.

Cada equipamento opera de forma autônoma, mas comandados pelo Computador Central. A comunicação é no modo cliente-servidor, com os seguintes comandos sendo aceitos:

RADAR:

"h":

Retorna a hora local no Radar, formato: "segundos nanosegundos"

"p":

Retorna a posição do alvo, formato: "segundos nanosegundos x y"

BATERIA:

"f x y":

Indica alvo (x,y) do tiro, retorna "Atirou em x y"

O espaço é bidimensional, sempre existe um alvo único. O alvo move-se com velocidade e direção constante.

O Computador Central deve obter a posição do alvo 2 vezes, com intervalo de alguns segundos entre elas, calcular sua direção e velocidade, projetar sua posição atual e comandar o tiro. Pode-se considerar o disparo do tiro imediato, porém existem dois problemas:

- Existe atraso de rede entre o Computador Central e o Radar

-O relógio do Radar *não* está sincronizado com o relógio do Computador Central

O comando "p" retorna a posição que o alvo estava no instante indicado pelo relógio do Radar. É necessário converter esta hora para o relógio do Computador Central. Para isto, é necessário:

- Determinar o atraso de rede

- Determinar a diferença instantânea entre os relógios (skew1)

- Esperar no mínimo 10 segundos

- Determinar a diferença instantânea entre os relógios (skew2)

- Calcular a taxa de afastamento entre os relógios e o a diferença original

Uma vez convertida a hora do Radar para o relógio do Computador Central, é possível fazer o cálculo de tiro. A hora local deve ser obtida via

clock_gettime(CLOCK_MONOTONIC ,&t);

Será fornecido um simulador para o Radar e a Bateria, o objetivo do trabalho é desenvolver o Computador Central em C para o Linux. O simulador informa o erro do tiro. Cuidado com overflow na representação dos dados.

Programas relacionados:

cliente2012.c

t1servidor2012

Outras versões do servidor, caso a anterior apresente problemas:

servidor32

servidor32-static

servidor64

servidor64-static



T2 – Controlador de um sistema contínuo

Implementar o controle e a supervisão da planta descrita abaixo. A planta possui instrumentação embutida e aceita 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;


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;
- 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;


Planta:

Info2HenriqueBBehr.pdf

Para compilar:

javac -cp cp.jar CaldeiraHenriqueBehr.java

Para executar:

java -classpath .:cp.jar CaldeiraHenriqueBehr 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 como udp.c



T3 – Programação Concorrente

Implementar usando a biblioteca das Pthreads em C no Linux um programa concorrente composto por 9 threads as quais compartilham 4 estruturas de dados distintas.

Cada uma das 4 estruturas de dados distintas é controlada separadamente, ou seja, o acesso a uma delas é completamente independente do acesso às demais.

As estruturas de dados são acessadas da seguinte forma:

- Um buffer circular do tipo produtor/consumidor.

Operações: insere, retira

- Uma tabela com controle de acesso que permite multiplas leituras simultaneas porém a escrita deve ser exclusiva.

Operações: iniciaLer, fimLer, iniciaEscrever, fimEscrever

- Um dado com leituras e escritas exclusivas porém onde uma thread pode ficar bloqueada a espera de uma alteração naquele dado.

Operações: leValor, escreveValor, esperaAlteracao

- Uma barreira onde as threads são liberadas de duas em duas, não existe mestre.

Operações: esperaOutra



Algumas threads precisam gerar dados (podem ser strings que identifiquem a thread geradora), outras threads apenas obtem dados dos monitores e colocam na tela, enquanto outras tiram dados de um monitor e colocam em outro monitor. Cada thread geradora gera um número finito de strings e depois termina.

O design arquitetônico do programa é representado por um grafo, onde circulos são threads, quadrados são estruturas de dados com a indicação do tipo e as flechas indicam que thread usa qual estrutura de dados e de que forma (qual operação é chamada).

Cada grupo deverá escolher um grafo específico, diferente dos demais grupos, e autorizado pelo professor. Ver grafos.zip .

Cada grupo deverá colocar sleeps no código fonte para permitir uma execução mais lenta e controlada com o objetivo de testar o código.