Recebemos dados dos contadores Mercury 203.2T na RS-485



Organizar uma coleção remota de leituras de medidores de eletricidade não é uma tarefa difícil, os medidores são cada vez mais inteligentes e devem enviar tudo eles mesmos, mas não, é claro que há informações, mas estão espalhadas. Aparentemente, os fabricantes de equipamentos também querem ganhar dinheiro vendendo seus softwares. Estou escrevendo este artigo para economizar tempo para todos que têm tarefas semelhantes.

Iniciar


A empresa precisava automatizar a coleta de leituras de medidores elétricos, cerca de vinte peças. Para isso, era necessário o mais rápido e o mais barato possível. Portanto, eles decidiram coletar dados usando o Zabbix já implantado, mas para conectar-se ao contador, foi necessário escrever um pequeno script, mais sobre isso abaixo. Verificou-se que a coleta de leituras é apenas um dos parâmetros que precisam ser coletados; o PC com o Debian a bordo é responsável pelo restante, portanto não foi difícil conectar-se ao contador via porta COM. Obviamente, para a maioria, será mais conveniente usar uma rede local e obter informações de um comutador industrial ou conversor de interface.

Das opções de conexão, você também pode considerar uma porta óptica, embora precise comprar um dispositivo adicional; por outro lado, não é necessário remover o lacre.



Os terminais para conexão ao medidor estão localizados sob a tampa selada.
Portanto, tivemos que concordar com uma empresa de rede que precisamos remover os selos, realizar trabalhos, vedar novamente os medidores. Mas, no final, foram alcançados acordos e foi possível lidar com calma com a solução do problema principal.



Resolução de problemas


A seguir, da documentação oficial.

O contador utiliza uma sequência de bytes de entrada do formato ADDR-CMD-CRC e fornece o ADDR-CMD-DATA-CRC, onde:

  • ADDR - Nome do contador (para Mercury 203.2T - igual ao número de série)
  • CMD - Comando de Código
  • DADOS - Os dados dependem da solicitação
  • Código de redundância cíclica CRC - 2 bytes, calculado em todos os bytes anteriores deste pacote. Nesta explicação, não está claro o que escrever no campo de soma de verificação.

Um hífen em uma sequência não é usado; aqui é usado para separar blocos lógicos.

Primeiro, conecte-se ao contador usando o programa konfigurator padrão e, usando um farejador, observe os pacotes transmitidos e descubra qual soma de verificação deve ser adicionada ao final. Abaixo, a linha recebida do contador.



Usando a calculadora online CRC , descobrimos o que precisamos para calcular o CRC-16 (Modbus) com o polinômio 0xA001.

Um pouco de python


Existem links suficientes para o algoritmo de cálculo, por isso não vou insistir nele. Para o desenvolvimento, usei o Python 3

def crc16(data): crc = 0xFFFF l = len(data) i = 0 while i < l: j = 0 crc = crc ^ data[i] while j < 8: if (crc & 0x1): mask = 0xA001 else: mask = 0x00 crc = ((crc >> 1) & 0x7FFF) ^ mask j += 1 i += 1 if crc < 0: crc -= 256 result = data + chr(crc % 256).encode() + chr(crc // 256).encode('latin-1') return result 

Agora vamos tentar obter o número de série do contador e verificar o CRC. Você precisará instalar o módulo pyserial

 import serial import struct import time sn = 26222790 #   ser = serial.Serial('/dev/ttyUSB0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE) print ('Connected:', ser.isOpen()) # \x2f -      chunk = struct.pack('>L', int(sn)) chunk += b'\x2f' chunk = crc16(chunk) #          ser.write(chunk) time.sleep(1) out = ser.read_all() ser.close() print ('Check CRC:', out[-2:] == crc16(out[:-2])[-2:]) print ('Result string:', ':'.join('{:02x}'.format(c) for c in out)) 

Ótimo! Agora, obtemos os valores para a energia consumida na primeira e na segunda tarifas; na verdade, precisamos apenas alterar o campo da equipe e analisar o resultado.

 chunk += b'\x27' t1 = ''.join('{:02x}'.format(c) for c in out[5:9]) t2 = ''.join('{:02x}'.format(c) for c in out[9:13]) print ('T1 =', float(t1)*0.01, '(*)', 'T2 =', float(t2)*0.01, '(*)') 

Tudo funciona. A versão final do script postada no git . No futuro, pretendo adicionar suporte para trabalhar na rede local.

Para o desenvolvimento, foi utilizado o adaptador Mercury-221 USB -> COM, mas você pode conectar diretamente o contador à porta COM.



Referências:

Informações úteis sobre a conexão de medidores estão aqui.
Documentação no site oficial
Site de Suporte Técnico
Sobre a CRC na Wikipedia

Source: https://habr.com/ru/post/pt418209/


All Articles