Enunciado

Propaganda
PMR2300 - Computação para Automação
Exercício Programa 1 – Versão 2007
Instruções Gerais
Duas partes compõem este exercício programa. Esta primeira parte deve ser preparada durante o mês de Maio e deve
ser entregue ao monitor da disciplina até o dia 31 deste mês.
Enunciado
Neste exercício programa vamos implementar o menor e mais simples sistema supervisório, o chamado SCADA
(supervisory control and data acquisition system) single-master, single-remote, ou one-on-one system. Para uma
compreensão um pouco melhor do que é um sistema supervisório, faça uma leitura do artigo “Understanding
supervisory systems”. Com indicado na figura 1 do artigo, nosso sistema completo será composto por uma Master
Station, com uma interface com o usuário, conectada a uma RTU (Remote Terminal Unit).
Neste primeiro exercício programa, vamos implementar a parte central da Master Station, que deverá ler dados de um
sensor, armazenar estes dados (gerar um log de dados) e mostrar periodicamente estes dados armazenados na tela. A
arquitetura proposta para este sistema consiste em uma composição de três classes básicas através da classe
MasterStation:
• Classe Sensor: classe responsável pela aquisição periódica de dados.
• Classe DataLog: classe responsável pelo armazenamento de dados.
• Classe UserInterface: classe responsável pela interação do sistema com o usuário.
• Classe MasterStation: classe que contém o ponto de entrada no programa (método main) e que instancia os
objetos que compõem o sistema em tempo de execução.
Entendendo que a aquisição de dados deve ocorrer de forma totalmente independente da interface com o usuário, as
classes Sensor e UserInterface foram desenhadas estendendo a classe Thread do Java. Por este motivo, elas devem
redefinir o método run() e uma instância desta classe irá ser executada em um fluxo de controle distinto (como
processos concorrentes). O “disparo” de uma Thread ocorre através da chamada de seu método start(), como
exemplificado na classe MasterStation.
Material fornecido
Definições das classes Sensor, DataLog, UserInterface e MasterStation.
Você deve:
1) Criar uma nova classe SensorTexto que estende a classe Sensor e que ao invés de gerar valores randômicos,
deve ler, linha a linha um arquivo texto. O nome deste arquivo texto e o nome da variável que esta instância do
sensor deve monitorar devem ser passados como parâmetros no construtor desta nova classe.
2) O arquivo de dados é um arquivo tipo texto que contém três colunas de valores, a primeira coluna indica o
instante de leitura dos dados, a segunda coluna fornece o nome da variável monitorada e a terceira coluna o
valor da leitura do sensor, todas elas separadas por um espaço, como por exemplo:
3)
4)
5)
6)
2007:04:22-00:00:01 Temperatura 22.34
2007:04:22-00:00:01 Vazao 1.2
2007:04:22-00:00:02 Temperatura 22.00
2007:04:22-00:00:02 Vazao 1.1
2007:04:22-00:00:02 Abertura 0.56
2007:04:22-00:00:03 Temperatura 21.90
2007:04:22-00:00:03 Vazao 1.15
....
Como estamos “simulando” leituras de sensores no tempo, para cada ciclo de leitura do sensor, ele deve ler as
linhas do arquivo que possuem o mesmo time stamp. Por exemplo, na primeira leitura, ele deve ler as duas
primeiras linhas, e caso seja um sensor de Temperatura, considerar apenas a informação de Temperatura,
descartando a de Vazao. Na segunda leitura, ele deve processar as próximas 3 linhas e descartar as
informações de Vazão e Abertura. Crie o seu próprio arquivo de dados utilizando o formato aqui indicado.
Criar uma nova classe DataLogCircular que estende a classe DataLog e que implementa a lista de dados
históricos como uma lista circular cuja capacidade de armazenamento possa ser definida dinâmicamente.
Criar uma nova classe UserInterfaceConsole que estende a classe UserInterface e que mostra somente os
dados inseridos pelo sensor no objeto de armazenamento de dados.
Reestruturar a classe MasterStation para utilizar as novas classes. A chamada do programa deve ocorrer da
seguinte forma: java MasterStation [arquivodedados.txt] [variavelmonitorada]
Se o programa não conseguir ler o arquivo ou enfrentar problemas de formato, o programa deve mostrar uma
mensagem de erro adequada e sair.
Descreva o programa feito (alguns parágrafo são suficientes). O programa e documentação deverão ser entregues ao
monitor.
IMPORTANTE: Não se esqueça da identificação de cada membro do grupo (Nome, turma e número USP).
Dicas
Como abrir um arquivo para leitura:
import java.io.*;
public class ExemploLeituraArquivo {
public static void main(String[] args) {
System.out.println("EP1 - PMR2300 - DICAS");
System.out.println("Abertura e leitura de arquivos");
try {
BufferedReader br = new BufferedReader( new FileReader( "C:\\pasta\\subpasta\\arquivo.txt") );
while (br.ready())
System.out.println(br.readLine());
} catch(IOException e) {
System.out.println("Problema na abertura de arquivo!");
System.exit(-2);
}
}
}
Como abrir um arquivo, ler uma linha e recupera elementos separados por espaços
import java.io.*;
import java.util.StringTokenizer;
public class JDica {
public static void main(String[] args) {
String str;
System.out.println("EP2 - PMR2300 - DICAS");
System.out.println("Abertura e leitura de arquivos");
try {
BufferedReader br = new BufferedReader( new FileReader("C:\\pasta\\arquivo.txt") );
while (br.ready()){
str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
while (st.hasMoreTokens())
System.out.println(st.nextToken());
System.out.println();
}
} catch(IOException e) {
System.out.println("Problema na abertura de arquivo!");
System.exit(-2);
}
}
}
Download