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