
Organizar una colección remota de lecturas de medidores de electricidad no es una tarea difícil, los medidores son más y más inteligentes cada año y deben enviar todo por sí mismos, pero no, por supuesto, hay información, pero está dispersa. Aparentemente, los fabricantes de equipos también quieren ganar dinero vendiendo su software. Estoy escribiendo este artículo para ahorrar tiempo a todos los que tienen tareas similares.
Inicio
La compañía necesitaba automatizar la recolección de lecturas de medidores eléctricos, unas veinte piezas. Para hacer esto se requería de la forma más rápida y económica posible. Por lo tanto, decidieron recopilar datos utilizando el Zabbix ya implementado, pero para conectarse al contador, fue necesario escribir un pequeño script, más sobre eso a continuación. Resultó que la recopilación de lecturas es solo uno de los parámetros que deben recopilarse, la PC con Debian a bordo es responsable del resto, por lo que no fue difícil conectarse al contador a través del puerto COM. Por supuesto, para la mayoría, será más conveniente usar una red local y obtener información de un conmutador industrial o convertidor de interfaz.
De las opciones de conexión, también puede considerar un puerto óptico, aunque necesitará comprar un dispositivo adicional, por otro lado, no necesita quitar el sello.

Los terminales para conectarse al medidor se encuentran debajo de la cubierta sellada.
Por lo tanto, tuvimos que acordar con una empresa de la red que necesitamos eliminar los sellos, realizar trabajos y volver a sellar los medidores. Pero al final, se alcanzaron acuerdos y fue posible tratar con calma la solución del problema principal.

Resolución de problemas
Como sigue de la
documentación oficial.El contador toma una cadena de entrada de bytes del formato ADDR-CMD-CRC y proporciona el ADDR-CMD-DATA-CRC, donde:
- ADDR - Nombre del contador (para Mercury 203.2T - igual que el número de serie)
- CMD - Comando de código
- DATOS: los datos dependen de la solicitud
- CRC - Código de redundancia cíclica de 2 bytes calculado en todos los bytes anteriores de este paquete. A partir de esta explicación, no está claro qué escribir en el campo de suma de verificación.
No se usa un guión en una secuencia; aquí se usa para separar bloques lógicos.
En primer lugar, conéctese al contador utilizando el programa
konfigurator estándar y, utilizando un rastreador, mire los paquetes transmitidos y descubra qué suma de verificación debe agregarse al final. Debajo, la línea recibida del mostrador.

Usando la
calculadora en línea CRC , descubrimos lo que necesitamos para calcular CRC-16 (Modbus) con el polinomio 0xA001.
Un poco de pitón
Hay suficientes enlaces al algoritmo de cálculo, por lo que no me detendré en él. Para el desarrollo, usé 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
Ahora tratemos de obtener su número de serie del contador y verifiquemos el CRC. Deberá instalar el módulo
pyserial import serial import struct import time sn = 26222790
Genial Ahora obtenemos los valores de la energía consumida en la primera y segunda tarifa, de hecho, solo necesitamos cambiar el campo del equipo y analizar el 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, '(*)')
Todo funciona La versión final del guión publicado en
git . En el futuro, planeo agregar soporte para trabajar en la red local.
Para el desarrollo, se usó el adaptador Mercury-221 USB -> COM, pero puede conectar directamente el contador al puerto COM.
Referencias
Aquí encontrará información útil sobre la conexión de medidores
.Documentación en el sitio web oficial.Sitio web de soporte técnicoAcerca de CRC en
Wikipedia