DAS5306: Informática Industrial II

Trabalhos para 2014/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.
Sugestão para quem usa Windows normalmente: virtualbox

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

Um sistema de vigilância aérea é composto por um Computador Central ligado a várias estações de RADAR remotas. As estações de RADAR estão ligadas ao Computador Central através de uma rede UDP/IP. Existem atrasos de rede significativos entre o Computador Central e os vários radares.

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

RADAR:

"h":

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

"p":

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



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

O Computador Central deve obter a posição de cada alvo 2 vezes, com intervalo de alguns segundos entre elas, calcular sua direção e velocidade, projetar sua posição atual. Depois disto, calcular a distância entre os alvos, com o objetivo de detectar possíveis colisões. Porém, existem problemas:

- Existe atraso de rede entre o Computador Central e cada Radar, os quais são diferentes

-O relógio de cada 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, para cada Radar:

- 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, o objetivo do trabalho é desenvolver o Computador Central em C para o Linux. 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 - Trabalho do controlador de sistemas contínuos

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.


Outros requisitos:
- Usar mutex para proteger as variáveis compartilhadas;
- Tarefas periódicas implementadas com precisão e não com sleep fixo;
- 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.


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






T3 – 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 2034” Ordem de compra de X ao preço de R$20,34

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

“OV X 2034” 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 servidor também deve possuir uma thread de auditoria. Esta thread deve ficar bloqueada até que chegue uma ordem de compra ou venda cujo preço seja muito diferente (10x) do valor que está sendo negociado no momento. A thread acorda e faz um registro na tela desta ocorrência, além de atualizar um contador de ocorrências. Usar wait/signal.

O programa cliente (simulador de home-broker) pode ser um programa simples, baseado no exemplo de cliente abaixo. Usar muitos clientes simultaneamente para testar o servidor.

cliente2013.c