DAS5306: Informática Industrial II

Trabalhos para 2013/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 virtualbox.



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, e também 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:

"h":

Retorna a hora local na Bateria, formato: "segundos nanosegundos"

"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 problemas:

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

- Existe atraso de rede entre o Computador Central e a Bateria

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

cliente2013.c

t1servidor2013

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

servidor32

servidor32-static

servidor64

servidor64-static



T2 – Programação Concorrente

As negociações da bolsa de valores feitas através de computadores funcionam no modelo cliente-servidor. O investidor executa um cliente (home-broker) que se comunica com o servidor da bolsa.

O servidor da bolsa mantém um livro de ordens (ofertas) de compras e de vendas, para cada papel (ação) negociado. As ofertas de compra são mantidas em ordem decrescente de preço e as ofertas de venda são mantidas em ordem crescente de preço. Quando a melhor oferta de compra (preço mais alto) supera a melhor oferta de venda (preço mais baixo) o negócio acontece. O preço do negócio é a média entre a melhor oferta de compra e a melhor oferta de venda.

O servidor aceita os seguintes comandos, onde X, Y e Z são as 3 ações negociadas:

“OC X 20,34” Ordem de compra de X ao preço de R$20,34

Responde “123” onde 123 é o inteiro identificador da ordem

“OV X 20,34” Ordem de venda de X ao preço de R$20,34

Responde “123” onde 123 é o inteiro identificador da ordem

“S 123” Pede o status da ordem 123

Responde “c 123” para cancelada, “x 123 21,12” para executada a R$21,12 ou “p 123” para pendente

“E 123” Cancela a ordem 123

Responde “c 123” para cancelada, “x 123 21,12” para já executada a R$21,12 (antes de ser cancelada)

Caso o servidor não entenda a mensagem recebida, ele responde com “???”

Implemente usando a linguagem C e a biblioteca das pthreads no Linux um programa com 4 threads que recebem constantemente comandos como os descritos acima e mantém um livro de ofertas de compra e venda, fechando os negócios sempre que possível. A comunicação é feita através de UDP/IP.

Cada thread deve escutar sua própria porta. As estruturas de dados compartilhadas devem ser protegidas com mutex. Quando um negócio é fechado o nome da ação e o preço fechado devem ser colocados na tela. Não podem ser usados arquivos para armazenar os dados.

As informações sobre uma ordem devem ser mantidas até que a mesma seja executada ou cancelada e o cliente seja informado disto através de um comando de status.

O programa cliente (simulador de home-broker) pode ser baseado neste exemplo de cliente:

cliente2013.c



T3 – Controlador de um sistema contínuo

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 um programa em C no Linux, usando a biblioteca de pthreads.

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

- Laço de controle como tarefa periódica para a temperatura;
- Laço de controle como tarefa periódica para o nível;
- Detecção de temperatura 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 nível e temperatura;
- Entrada através do teclado dos valores limites para o intervalo de temperaturas válidas;
- Armazenagem periódica dos valores lidos de temperatura e armazenagem desses dados
em arquivo.


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:
- 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 100ms;
- Período do controlador de nível deve ser 70ms;
- 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.

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