Protocolo MODBUS para Medidores KRON
Protocolo MODBUS para Medidores KRON
MKM
PROTOCOLO MODBUS
Rev. 1.4
Características
A comunicação baseada no protocolo MODBUS possibilita a conexão com até 247 módulos MKM
numa linha RS-485.
Especificações:
A interface de comunicação é do padrão RS-485, a dois fios, half-duplex, baudrate de 9600 ou 19200,
1 start bit, 8 bits de dados, 2 stop bits e sem paridade. Com exceção da velocidade, os demais
parâmetros são fixos. A especificação da velocidade é feita na especificação do pedido e, uma vez
definida, esta não mais poderá ser alterada.
Apenas o master pode começar um diálogo com os slaves, sendo este diálogo do tipo question/reply
(endereço de apenas um slave) ou endereçando a mensagem para todos os slaves (endereço 0 =
broadcast) sem obter um reply.
No protocolo MODBUS, o instrumento sai de fábrica com apenas o número de série programado,
ficando a cargo do usuário definir um endereço na rede para o dispositivo que vai de 1 até 247.
Algoritmo
Uma mensagem é iniciada com um intervalo de silêncio de no mínimo 3,5 vezes a velocidade de
comunicação de um caracter. Por exemplo, a 9600 bps, um caracter leva 1,15ms para ser transmitido
(8N2 = 11 bits), portanto deve haver um silêncio na rede de 4 ms antes de uma mensagem ser
transmitida. O número máximo de caracteres numa mensagem é 29.
A rede é monitorada continuamente pelo slave, incluindo durante o intervalo de silêncio. Quando o
1o. caracter é recebido, cada dispositivo decodifica-o para verificar se é o seu endereço. Se não for, o
dispositivo deve aguardar que a rede fique em silêncio ( sem transmissão ) por 3,5 vezes a velocidade
de comunicação de um caracter. Se o endereço for o do dispositivo, o mesmo deve receber todo o resto
do frame. O fim do frame é indicado pelo intervalo de silêncio. Uma mensagem deve ser transmitida
como uma cadeia continua de bytes.
Quando ocorrer erro de comunicação, uma retransmissão (retry) para o mesmo slave deve esperar no
mínimo 3 segundos.
O CRC contém dois bytes e é calculado pelo dispositivo transmissor, que anexa o CRC na mensagem.
O dispositivo receptor recalcula o CRC após a recepção da mensagem e compara o valor calculado
com o valor recebido. Se os valores não são iguais, a mensagem é descartada.
void main()
{
unsigned char buf_485[30];
union CRC
{ unsigned char c_crc[2];
unsigned int i_crc;
} crc;
crc.i_crc = 0;
buf_485[0] = 0x1B; // Endereço do Slave
buf_485[1] = 0x04; // Função MODBUS: Read Input Register
buf_485[2] = 0x00; // Registro inicial para ler (MSB)
#define NUM_SHIFT 8
#define POLINOMIAL 0xA001 // Polinomial constant (RTU mode)
Código do Dispositivo
Este documento apresenta as funções MODBUS disponíveis para toda a linha de dispositivos MKM.
Para distinguir as características conforme o modelo do MKM, é fornecido um código que indica
quais funções MODBUS estão disponíveis para um instrumento em particular. Consulte mais adiante
neste manual a função “Report Slave ID (17)” para obter o código do dispositivo.
Funções MODBUS
As funções MODBUS para o MKM são:
* Broadcast - funções que podem ser endereçadas para todos os slaves (endereço 0)
Esta função permite ler o estado das portas de entrada e saída digitais do instrumento. Os seguintes
registros estão disponíveis:
Função
MASTER
Endereço 0x02 0x00 0x00 0x00 0x04 CRC
do Slave 8 bit – 8 bit
(1) Registro
inicial para ler Total de
registros para ler
(1) O registro inicial para ler é obtido removendo o indicativo (número 1) e subtraindo o resultado por
1. No exemplo, o registro 10001 (decimal) é transmitido como 0x0000 (hexadecimal): 10001 = 0001
= (0001 - 1) = 0000 = 0x0000 hexadecimal.
SLAVE
Endereço 0x02 0x01 ESTADO CRC
do Slave 8 bit 8 bit - 8 bit
O estado das entradas e saídas digitais deve ser interpretado conforme tabela abaixo, onde bit 1 indica
porta ligada e bit 0 indica porta desligada.
BIT D7 D6 D5 D4 D3 D2 D1 D0
REGISTRO --- --- --- --- SD-2 SD-1 EDP-2 EDP-1
Esta função permite ler os registros de configuração do instrumento. Os seguintes registros estão
disponíveis:
TIPO DE LIGAÇÃO TL
4 FIOS - 3 ELEMENTOS 0
4 FIOS - 2 ELEMENTOS 1
4 FIOS - 1 ELEMENTO 2
3 FIOS - 3 ELEMENTOS 16
3 FIOS - 2 ELEMENTOS 17
3 FIOS - 1 ELEMENTO 18
3 FIOS - 2 ELEMENTOS (Delta TL48) 48
3 FIOS - 2 ELEMENTOS (Delta TL80) 80
Observe que para cada registro temos dois bytes. Os frames desta função para o master e slave são:
Função
MASTER
Endereço 0x03 0x00 0x02 0x00 0x02 CRC
do Slave 8 bit - 8 bit
(1) Registro
inicial para ler Total de
registros para ler
(1) O registro inicial para ler é obtido removendo o indicativo (número 4) e subtraindo o resultado por
1. No exemplo, o registro 40003 (decimal) é transmitido como 0x0002 (hexadecimal): 40003 = 0003
= (0003 - 1) = 0002 = 0x0002 hexadecimal.
SLAVE
Endereço 0x03 0x04 0x00 0x80 0x89 0x44 CRC
do Slave 8 bit - 8 bit
Byte Count
O registro byte count é igual ao total de registros para ler vezes 2, pois cada registro possui 2 bytes.
No exemplo anterior o master pediu uma leitura dos registros referentes ao TC (40003 e 40004) e
obteve como resposta o valor 0x00808944 (IEEE 32-bit floating point). Convertendo este valor para
decimal temos que TC = 1100,0.
Esta função permite ler os registros no qual as grandezas elétricas estão armazenadas. Os seguintes
registros estão disponíveis no MKM:
(1) Registro
inicial para ler (2) Total de
registros para ler
(1) O registro inicial para ler é obtido removendo o indicativo (número 3) e subtraindo o resultado
por 1. No exemplo, o registro 30015 (decimal) é transmitido como 0x000E (hexadecimal): 30015
= 0015 = (0015 - 1) = 00014 = 0x000E hexadecimal.
(2) No máximo podem ser lidos 12 registros (6 grandezas elétricas) para cada requisição.
SLAVE
Endereço 0x04 0x04 0x00 0x00 0x70 0x42 CRC
do Slave 8 bit - 8 bit
Byte Count
No exemplo anterior o master pediu uma leitura dos registros que contém a frequência (30015 e
30016) e obteve como resposta o valor 0x00007042 (IEEE 32-bit floating point). Convertendo este
valor para decimal temos que Frequência = 60,0 Hz.
Função
MASTER
Endereço 0x05 0x00 0x04 0xFF 0x00 CRC
do Slave 8 bit - 8 bit
(1) Este registro é obtido subtraindo 1 do comando desejado. No exemplo o comando 005 é enviado
como 0x0004.
(2) Utilizado para ligar (0xFF00) ou desligar (0x0000) as saídas digitais. Ignorado pelos outros
comandos
SLAVE
Endereço 0x05 0x00 0x04 0xFF 0x00 CRC
do Slave 8 bit - 8 bit
Esta função serve para programar um dos registros de configuração do instrumento (“Holding
Registers”). Para saber quais são estes registros consulte a função “Read Holding Register (3)”. Os
frames desta função para o master e slave são:
Função
MASTER
Endereço 0x06 0x00 0x05 0x00 0x01 CRC
do Slave 8 bit - 8 bit
(1) O registro para programar é obtido removendo o indicativo (número 4) e subtraindo o resultado
por 1. No exemplo, o registro 40006 (decimal) é transmitido como 0x0005 (hexadecimal): 40006 =
0006 = (0006 - 1) = 0005 = 0x0005 hexadecimal.
Função
SLAVE (echo of the command received)
Endereço 0x06 0x00 0x05 0x00 0x01 CRC
do Slave 8 bit - 8 bit
CÓDIGO DESCRIÇÃO
0x00 Funcionamento correto
0x01 Inversão de Fase ou falta de Fase
0x02 Erro matemático
0x04 Overflow na geração do Pulso de Energia
0x08 Excedido o limite permitido para Urms e/ou Irms
0x10 Sistema reinicializado incorretamente
0x80 Falha Memória de Massa
Observe que o código é binário, ou seja, pode haver uma combinação de códigos. Assim, um código de
erro 09 identifica um código de erro 01 mais código 08.
MASTER
Endereço 07 CRC
do Slave 8 bit - 8 bit
SLAVE
Endereço 07 Código CRC
do Slave 8 bit - 8 bit
Esta função serve para programar vários registros de configuração do instrumento (“Holding
Registers”). Para saber quais são estes registros consulte a função “Read Holding Register (3)”.
(1) O registro inicial para programar é obtido removendo o indicativo (número 4) e subtraindo o
resultado por 1. No exemplo, o registro 40001 (decimal) é transmitido como 0x0000 (hexadecimal):
40001 = 0001 = (0001 - 1) = 0000 = 0x0000 hexadecimal.
Função
SLAVE
Endereço 0x10 0x00 0x00 0x00 0x02 CRC
do Slave 8 bit - 8 bit
No exemplo acima o master programou os registros referentes ao TP (40001 e 40002) como 1500
(IEEE 32-bit float pointing = 0x0080BB44).
MASTER
Slave 0x11 CRC
Address 8 bit - 8 bit
SLAVE
Endereço 0x11 Byte CÓDIGO ON / Versão Config CRC
do Slave Count OFF Software uração
Onde:
• Byte Count = Sempre 0x04
• CÓDIGO = Código do Dispositivo
• ON / OFF = Sempre ON → 0xFF
• Versão Software = 1.0 (10 decimal) a 25.5 (255 decimal)
• Configuração = D7: Protocolo MODBUS
D6: Protocolo Kron
D5: Largura do Pulso de Energia
D4: Chip utilizado
D3: Chip utilizado
D2: 9600 bps
D1: 4800 bps
D0: 2400 bps
D5 LARGURA DO PULSO
0 200ms
1 25ms
D4 D3 CHIP UTILIZADO
0 0 SAMES 9603
0 1 SAMES 9604
1 0 CISS 4010S
MASTER
0x64 0x11 CRC
SLAVE
0x64 0x11 0x04 0x73 0xFF 0xA0 0x94 CRC
1. “No reply”: Caso o slave detecte um erro no formato dos dados, CRC, etc, ele ignorará a
mensagem não gerando um reply (resposta).
SLAVE
Endereço 0x80 + Função Código CRC
do Slave de Erro 8 bit - 8 bit
Número da
função enviada
pelo master com
o bit 7 = 1
• ConfigAddress (0 / 0x42)
• ReadAddress (0 / 0x71)
• ConfigNSerie (0 / 0x72)
• ReadPartidas (0 / 0x75)
• ReportSlaveIdKron (0 / 0x76)
• ReadNSerie (0 / 0x77)
• ConfigDisp (0 / 0x78)
• ReadConfigDisp (0 / 0x79)
ConfigAddress ( 0 / 0x42)
Esta função, embora seja especial, é compatível com os dispositivos Electrex e TKE-01. O slave não
deverá gerar reply e, no caso do MKM, este não necessita estar com o jumper CONFIGURAÇÃO.
Esta função permite configurar o endereço de um dispositivo através de seu número de série. Os
endereços válidos vão de 1 até 247, sendo que cada dispositivo deve possuir um endereço único na
rede. Para certificar-se que o endereço desejado já não está cadastrado em outro dispositivo, antes de
executar esta função envie, por exemplo, a função 07 com o endereço desejado para a rede. Caso você
não obtenha resposta, significa que nenhum dispositivo foi configurado com este endereço.
MASTER
0x00 0x42 Número de Série do Dispositivo Novo Endereço CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit 8 bit - 8 bit
Por exemplo, supondo um dispositivo com número de série 21000, para configurá-lo para o endereço
100:
MASTER
0x00 0x42 0x00 0x00 0x52 0x08 0x64 CRC
ReadAddress ( 0 / 0x71)
Esta é uma função proprietária KRON e não funcionará nos dispositivos Electrex. Embora esta função
seja broadcast (endereço = 0) ela gera reply, fugindo da regra do protocolo.
MASTER
0x00 0x71 Número de Série do Dispositivo CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit
SLAVE
Slave Address 0x71 Número de Série do Dispositivo CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit
Por exemplo, supondo um dispositivo com Número de Série 21000 e endereço 100:
MASTER
0x00 0x71 0x00 0x00 0x52 0x08 CRC
SLAVE
0x64 0x71 0x00 0x00 0x52 0x08 CRC
ConfigNSerie (0 / 0x72)
Esta é uma função proprietária KRON e não funcionará nos dispositivos Electrex. Esta função não
gera reply e o Número de Série do dispositivo deve ser lido através da função Read Input Register (4)
ou da função especial ReadNSerie(0x77).
O dispositivo MKM deverá estar com o jumper CONFIGURAÇÃO . Cuidado deve ser tomado caso
haja uma rede de dispositivos para que apenas um dispositivo esteja com o jumper.
MASTER
0x00 0x72 Número de Série do Dispositivo CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit
MASTER
0x00 0x72 0x00 0x00 0x92 0x90 CRC
ReadPartidas ( 0 / 0x75)
Esta é uma função proprietária KRON e não funcionará nos dispositivos Electrex. Embora esta função
seja broadcast (endereço = 0) ela gera reply, fugindo da regra do protocolo.
MASTER
0x00 0x75 Número de Série do Dispositivo CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit
SLAVE
Slave Address 0x75 Número de Série do Dispositivo Contador de Partidas CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit 8 bit - 8 bit
Por exemplo, supondo um dispositivo com Número de Série 21000, endereço 100 e Contador de
Partidas = 64321.
MASTER
0x00 0x75 0x00 0x00 0x52 0x08 CRC
SLAVE
0x64 0x75 0x00 0x00 0x52 0x08 0xFB 0x41 CRC
ReportSlaveIdKron ( 0 / 0x76)
Esta é uma função proprietária KRON e não funcionará nos dispositivos Electrex. Embora esta função
seja broadcast (endereço = 0) ela gera reply, fugindo da regra do protocolo.
Ela tem a mesma finalidade da função “Report Slave Id (17)”, exceto que esta função envia o número
de série enquanto a outra envia o endereço.
MASTER
0x00 0x76 Número de Série do Dispositivo CRC
8 bit - 8 bit - 8 bit - 8 bit 8 bit - 8 bit
SLAVE
Slave 0x76 Número de Série Byte CODIGO ON / Versão Config CRC
Address Count OFF Software uração
Consulte a função “Report Slave Id (17) para obter mais detalhes do frame retornado pelo slave.
ReadNSerie ( 0 / 0x77)
Esta é uma função proprietária KRON e não funcionará nos dispositivos Electrex. Embora esta função
seja broadcast (endereço = 0) ela gera reply, fugindo da regra do protocolo. É necessário que o
dispositivo esteja com o jumper CONFIGURAÇÃO para que ele possa responder a esta função, além
do que deve-se tomar cuidado para que apenas um dispositivo esteja com este jumper na rede.
MASTER
0x00 0x77 CRC
8 bit - 8 bit
SLAVE
Slave Address 0x77 Número de Série do Dispositivo CRC
8 bit + sig.,8 bit,8 bit, 8 bit - sig. 8 bit - 8 bit
Por exemplo, supondo um dispositivo com Número de Série 21000 e endereço 100:
MASTER
0x00 0x77 CRC
SLAVE
0x64 0x77 0x00 0x00 0x52 0x08 CRC
ConfigDisp ( 0 / 0x78)
Esta função permite configurar parâmetros genéricos do firmware como constantes, deltas, registros
de calibração, etc. Estes parâmetros são gravados numa NVRAM. É possível, inclusive, no futuro
substituir funções como ConfigNSerie por esta função. Para obter uma lista dos parâmetros consulte a
documentação do projeto do firmware. Esta função não gera reply e é necessário a colocação do
jumper de CONFIGURAÇÃO .
MASTER
0x00 0x78 Número de Reg. Byte byte 1 byte 2 byte (bytecount) CRC
Série Inicial Count
Esta função permite ler os parâmetros genéricos do firmware como constantes, deltas, registros de
calibração, etc., configurados através da função “ConfigDisp”. Estes parâmetros estão armazenados
numa NVRAM. É possível, inclusive, no futuro substituir funções como “ReadPartidas” por esta
função. Para obter uma lista dos parâmetros consulte a documentação do projeto do firmware.
MASTER
0x00 0x79 Número Reg. Byte CRC
de Série Inicial Count
Quantidade de
bytes p/ ler
SLAVE
Slave 0x79 Número Reg. Byte byte 1 byte 2 byte (bytecount) CRC
Address de Série Inicial Count
Timing
Os seguintes tempos devem ser respeitados na comunicação entre o Master e o Slave:
Ação Equate
Retry para um mesmo slave DELAY_RETRY_SEND_FRAME
Delay para iniciar a transmissão de um frame DELAY_SEND_FRAME
Aguardar a recepção de um frame TIMEOUT_RECEIVE_FRAME
Delay para transmitir um byte do frame DELAY_SEND_BYTE
Aguardar a recepção de um byte do frame TIMEOUT_RECEIVE_BYTE
Tempo para confirmar silêncio na rede CONFIRM_SILENT
DELAY_RETRY_SEND_FRAME 3 segundos
DELAY_SEND_FRAME > 10 ms
TIMEOUT_RECEIVE_FRAME 1 segundo