pmr2300_comucomunicação serial
DESCRIPTION
Como fazer comunicação através da porta serialTRANSCRIPT
1
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();
2
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 SerialPortEventListen er {
....
}
• 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çãosp.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 serialPortE vent) {
...
}
3
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();
4
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
5
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
6
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
7
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):
• Primeiro enviamos o primeiro byte: 0xFE
• Depois enviamos o segundo byte: 0xAB
0xFEAB16 bits
ValorRegistrador
8
MODBUS Modelo de Dados
MODBUS Dispositivo ModBus Típico
9
MODBUS Funções básicas
MODBUS Funções básicas – Read Coils (0x01)
10
MODBUS Funções básicas – Read Discrete Inputs (0x02)
MODBUS Funções básicas – Read Holding Registers (0x03)
11
MODBUS Funções básicas – Read Input Register (0x04)
MODBUS Funções básicas – Write Single Coil (0x05)
12
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
13
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
14
MODBUS RTU – Gerando CRC16
1. Carrega em um registrador de 16 bits o valor 0xFFFF2. Realiza um XOR com o primeiro byte da mensagem e guarda no registrador3. Faz um shift de um bit para a direita, preenchendo o espaço aberto com 0.4. Se o bit “descartado” for 0 volta para o passo 3, senão:
– Realiza um XOR do registrador de CRC com o valor 0xA001
5. Repete passos 3 e 4 até que 8 deslocamentos tenham sido realizados
6. Repete passos 2 até 5 para o próximo byte da mensagem. Continuar até que todos os bytes da mensagem sejam processados.
7. O conteúdo final do registrador é o valor do CRC
MODBUS RTU – Gerando CRC (0x02 0x07)
15
MODBUS RTU – Gerando CRC (0x02 0x07)