Comunicação Serial – Java Configuração da Porta Serial Abre porta serial: SerialPort sp; String PortID = “com1”; String AppName = “Aplicacao Jtest”; int timeOut = 1000; sp=(SerialPort)CommPortIdentifier.getPortIdentifier(PortID).open(AppName, timeOut); Configura Porta Serial: sp.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); Comunicação Serial – Java Enviando Dados Obtem stream de saída de uma porta serial: OutputStream os = sp.getOutputStream(); Prepara dados para envio: Byte[] arranjoBytes = new Byte[20]; arranjoBytes[0]= 0x0f; arranjoBytes[1]= 0xef; .... arranjoBytes[19]= 0x00; Envia dados: os.write(arranjoBytes,0,arranjoBytes.length); os.flush(); os.close(); 1 Comunicação Serial – Java Recebendo Dados • Para receber dados através de uma porta serial devemos tratar eventos da porta serial. • Para tanto a nossa classe deve implementar a interface : SerialPortEventListener public class JTest implements SerialPortEventListener { .... } • Devemos também “registrar” a porta serial para que seus eventos sejam monitorados: sp.addEventListener(this); • Devemos habilitar a notificação quando há dados no buffer de recepção sp.notifyOnDataAvailable(true); Comunicação Serial – Java Recebendo Dados • Na ocorrência de um evento da porta serial, a função de callback serialEvent(SerialPortEvent spe) é chamada. • O código da tarefa que trata os dados recebidos devem ser inseridos nesta função. public void serialEvent(SerialPortEvent serialPortEvent) { ... } 2 Comunicação Serial – Java o Método serialEvent • Obter a stream de entrada da porta serial: InputStream is = sp.getInputStream(); • Procurar pelo evento de chegada de dados: switch(serialPortEvent.getEventType()){ case SerialPortEvent.DATA_AVAILABLE: System.out.println("PL: DataAvailable"); //recebe dados break; default: } Comunicação Serial – Java o Método serialEvent • Recebe dados: Byte [] readBuffer = new Byte[300]; int numBytes; if(is.available()>0) numBytes = is.read(readBuffer); System.out.println("Bytes Received:" + numBytes); is.close(); 3 Comunicação Serial – Java Encerrando educadamente Ao terminar o uso de uma porta de comunicação devemos encerrar sua utilização removendo o listener e fechando a porta. try{ sp.removeEventListener(); sp.close(); }catch (Exception e){} RS232 Apenas a camada física... • Como podemos observar, o padrão RS232 define apenas a camada física do modelo OSI: – Sinalização (sinal de tensão) – Conexão física (cabos e conectores) – Codificação para sincronização (bits adicionais) – Handshake – Baudrate 4 MODBUS • • • • Protocolo de Aplicação (camada 7 do modelo OSI) Criado em 1979 pela Modicon. Master-slave/Client-server Padrão aberto largamente difundido (protocolo muito simples) – >7Milhões de dispositivos ModBus. • Aplicação: – Monitoração e programação de dispositivos. – Comunicação entre dispositivos inteligentes, sensores e atuadores. – Monitoração de equipamentos de campo por PCs e HMIs. MODBUS • MODBUS é um protocolo posicionado na camada 7 do modelo OSI • MODBUS é um protocolo de requisição/resposta e oferece serviços especificados por function codes. • Pode ser utilizado com: – TCP/IP em Ethernet. – Transmissões seriais assíncronas: • cabos : EIA/TIA-232-E, EIA- 422, EIA/TIA-485-A; • Fibra optica • RF 5 MODBUS Mensagem •Function Code: apenas um byte (1-255) •Data: tamanho variável •Additional address: server address (1 byte) (RS232) •Error check: 2 bytes (Cyclic Redundancy Check) MODBUS Troca de mensagens bem sucedida 6 MODBUS Troca de mensagens com erro MODBUS Representação de dados - BigEndian • Dados de 16 bits são compostos por 2 bytes, sendo que o mais significativo é sempre enviado antes (BigEndian): Registrador 16 bits Valor 0xFEAB • Primeiro enviamos o primeiro byte: 0xFE • Depois enviamos o segundo byte: 0xAB 7 MODBUS Modelo de Dados MODBUS Dispositivo ModBus Típico 8 MODBUS Funções básicas MODBUS Funções básicas – Read Coils (0x01) 9 MODBUS Funções básicas – Read Discrete Inputs (0x02) MODBUS Funções básicas – Read Holding Registers (0x03) 10 MODBUS Funções básicas – Read Input Register (0x04) MODBUS Funções básicas – Write Single Coil (0x05) 11 MODBUS Funções básicas – Write Single Register (0x06) MODBUS RTU • Utiliza RS232/485 (camada física) • ModBus (camada de aplicação) • Define a camada de enlace (camada 2 do modelo OSI): – Endereçamento – Verificação de erros ModBus ModBus-RTU 12 MODBUS RTU – RS232 MODBUS RTU – CRC • • • • Dispositivo que envia a mensagem gera e envia 2 bytes de CRC. Dispositivo que recebe a mensagem, gera 2 bytes de CRC a partir da mensagem recebida e verifica se é igual aos bytes de CRC enviados. O CRC16 é o resto da divisão dos bytes da mensagem por um polinômio de ordem 16, logo, o resultado deve ter ordem no máximo 15, ou seja, 16 elementos. O polinômio utilizado é: 1 + X2 + X15 + X16 Bytes que entram no cálculo do CRC 13 MODBUS RTU – Gerando CRC16 1. 2. 3. 4. Carrega em um registrador de 16 bits o valor 0xFFFF Realiza um XOR com o primeiro byte da mensagem e guarda no registrador Faz um shift de um bit para a direita, preenchendo o espaço aberto com 0. Se o bit “descartado” for 0 volta para o passo 3, senão: – 5. 6. 7. Realiza um XOR do registrador de CRC com o valor 0xA001 Repete passos 3 e 4 até que 8 deslocamentos tenham sido realizados Repete passos 2 até 5 para o próximo byte da mensagem. Continuar até que todos os bytes da mensagem sejam processados. O conteúdo final do registrador é o valor do CRC MODBUS RTU – Gerando CRC (0x02 0x07) 14 MODBUS RTU – Gerando CRC (0x02 0x07) 15