[Profesor, le permite aprender TI] El monitoreo de PRTG obtiene datos del sensor de temperatura y humedad a través de Python + TCP Modbus

Este artículo describe cómo Python obtiene datos del sensor de temperatura y humedad a través del protocolo TCP Modbus. Y presentado en el sistema de seguimiento de PRTG.
Este artículo incluye principalmente puntos de conocimiento:

1. Implementación del cliente ModbusTCP de Python
2. En sensores comunes de temperatura y humedad, la ubicación de los registros de temperatura y humedad

Inserte la descripción de la imagen aquí
@ TOC

1. Acerca del protocolo TCP Modbus

1. Introducción al acuerdo

El protocolo Modbus fue introducido por la empresa Modicon (ahora Schneider Electric). Se basa principalmente en el puerto serie físico y la capa Ethernet TCP / IP. Se ha convertido en el estándar de la industria para los protocolos de comunicación en el campo industrial y se utiliza ampliamente en dispositivos electrónicos industriales. Interconexión.
Modbus Poll y Modbus Slave son dos software de simulación de dispositivos Modbus muy populares, que admiten los protocolos Modbus RTU / ASCII y Modbus TCP / IP. A menudo se utilizan para probar y depurar dispositivos Modbus y observar varios mensajes en el proceso de comunicación Modbus.
Cuando se utiliza para admitir el protocolo Modbus RTU / ASCII, ModbusPoll se utiliza como dispositivo maestro y ModbusSlave como dispositivo esclavo. El dispositivo esclavo recibe comandos del dispositivo maestro y devuelve datos. Cuando se utiliza para admitir Modbus TCP / IP, ModbusSlave actúa como servidor y ModbusPoll actúa como cliente. El servidor recibe comandos del cliente y devuelve datos. El cliente debe completar la dirección IP y el número de puerto del servidor remoto que se conectará.

2. Formato de paquete de datos de TCP Modbus

2.1: Solicitar paquete:

Inserte la descripción de la imagen aquí

本次请求:00 4b 00 00 00 06 01 03 00 00 00 02

00 4b es el identificador de esta transacción de comunicación Generalmente, se requerirá agregar 1 después de cada comunicación para distinguir diferentes mensajes de datos de comunicación;

00 00 representa el identificador de protocolo, 00 00 es el protocolo Modbus;

00 06 es la longitud de los datos, utilizada para indicar la longitud de los datos siguientes, en bytes;

01 es la dirección del dispositivo, generalmente se refiere al número de estación de la estación esclava, utilizado para identificar la dirección del servidor remoto conectado a la línea o red en serie.以上七个字节也被称为modbus报文头

03 es el código de función, en este momento el código 03 es para leer los datos del registro de retención;

00 00 es la dirección de inicio, lo que significa leer datos del registro 0

00 02 es el número de registros, que se refiere a los registros mencionados anteriormente, y comienza a leer los datos
de 2 registros. En cuanto a los códigos de función, los códigos de función comunes son los siguientes:

Inserte la descripción de la imagen aquí

2.2: Solicitar paquete:

Inserte la descripción de la imagen aquí
本次响应:00 4b 00 00 00 07 01 03 04 01 b6 01 00
00 4b es el identificador de esta transacción de comunicación, y la solicitud de mensaje de respuesta corresponde a la anterior 请求保持一致;

00 00 es el identificador del protocolo, que corresponde al anterior 请求保持一致;

00 07 es la longitud de los datos, que se utiliza para indicar la longitud de los datos siguientes, en bytes

01 es la dirección del dispositivo, y la solicitud de mensaje de respuesta corresponde a la anterior 请求保持一致;

03 es el código de función. En circunstancias normales, se requiere que el mensaje de respuesta sea consistente con la solicitud anterior correspondiente. Si hay un error, devolverá 80h + el código de función anterior;

04 indica la longitud en bytes de los datos siguientes;

01 b6 01 00 es el valor de los datos en el registro de retención a leer. En este ejemplo, los datos de los dos registros de temperatura y humedad se leen al mismo tiempo. Aquí, se devuelven 4 bytes y un conjunto de datos por cada 2 bytes.
La traducción es: 01b6 = 438, humedad 43,8%. 0100 = 256, humedad 25,6 ℃

Dos, el cliente Modbus TCP de Python

1. Biblioteca de terceros Python modbus_tk

Python proporciona una biblioteca de terceros que admite el protocolo Modbus, modbus_tk. Simplemente instale modbus_tk mediante pip install modbus_tk. El
siguiente ejemplo implementa uno simple, leyendo los datos de dos registros 0000 y 0001 de la
siguiente manera:

import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md

# 远程连接到服务器端
master = mt.TcpMaster("192.168.1.10", port=502)
master.set_timeout(1.0)

# @slave=1 : identifier of the slave. from 1 to 247.  0为广播所有的站号
# @function_code=READ_HOLDING_REGISTERS:功能码
# @starting_address=1:开始地址
# @quantity_of_x=3:寄存器/线圈的数量
# @output_value:一个整数或可迭代的值:1/[1,1,1,0,0,1]/xrange(12)
# @data_format
# @expected_length
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=1, output_value=5)

print(Hold_value)  # 取到的寄存器的值格式为元组(456, 288)

2. Confirme la dirección de registro del sensor de temperatura.

Para el sensor de temperatura y humedad que admite el protocolo TCP Modbus, consulte el manual para confirmar la dirección de registro de temperatura y humedad.
Por ejemplo, para mi sensor de temperatura, la humedad y la temperatura se almacenan en el primer y segundo registro.
Inserte la descripción de la imagen aquí

3. Integración y visualización de datos en el sistema de supervisión de PRTG

import modbus_tk
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
import json

def print_json(value_list):
    try:
        data={
            "prtg": {
            "result": []
            }
            }
        result_data=[]
        for i in value_list:
            Temperature_data={
                "Channel": "%s Temperature"%i,
                "Unit": "Temperature",
                "Mode":"Absolute",
                "DecimalMode":"All",
                "Float":1,
                "LimitMode":1,
                "LimitMaxWarning":35,
                "LimitMinWarning":18,
                "Value":int(value_list[i][1])/10
            }
            Humidity_data={
                "Channel": "%s Humidity"%i,
                "Unit": "Percent",
                "Mode":"Absolute",
                "DecimalMode":"All",
                "Float":1,
                "LimitMode":1,
                "LimitMaxWarning":70,
                "LimitMinWarning":10,
                "Value":int(value_list[i][0])/10
            }
            data['prtg']['result'].append(Temperature_data)
            data['prtg']['result'].append(Humidity_data)

        print (json.dumps(data, sort_keys=True, indent=2))
    except Exception as err:
        raise err

def get_value(host_ip):
    try:
        master = mt.TcpMaster(host=host_ip,port=2000)
        master.set_timeout(1.0)
        Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=2, output_value=5)
    except Exception as err:
        return(0,0)
    else:
        return Hold_value

if __name__ == "__main__":
    try:
        host_list=["10.0.0.213","10.0.0.214"]
        # 多个传感器在这里依次填入IP地址
        value_list={}
        for host_ip in host_list:
            value_list[host_ip]=get_value(host_ip)
        print_json(value_list)

    except Exception as err:
        data={
          "prtg": {
           "error": 1,
           "text": str(err)
          }
         }
        print (json.dumps(data, sort_keys=True, indent=2))

Datos de formato de estructura Json que cumplen con los requisitos de PRTG dados después de ejecutar

{
  "prtg": {
    "result": [
      {
        "Channel": "10.0.0.213 Temperature",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 35,
        "LimitMinWarning": 18,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Temperature",
        "Value": 24.3
      },
      {
        "Channel": "10.0.0.213 Humidity",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 70,
        "LimitMinWarning": 10,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Percent",
        "Value": 39.7
      },
      {
        "Channel": "10.0.0.214 Temperature",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 35,
        "LimitMinWarning": 18,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Temperature",
        "Value": 24.5
      },
      {
        "Channel": "10.0.0.214 Humidity",
        "DecimalMode": "All",
        "Float": 1,
        "LimitMaxWarning": 70,
        "LimitMinWarning": 10,
        "LimitMode": 1,
        "Mode": "Absolute",
        "Unit": "Percent",
        "Value": 41.2
      }
    ]
  }
}
Program ended with exit code: 0

Inserte la descripción de la imagen aquí
Revisión anterior:
[El maestro te hace aprender TI] HUAWEI Funcionamiento y mantenimiento automatizados del firewall de Huawei Equipo de red de administración Python ssh
[El maestro te hace aprender TI] PRTG para obtener el estado del sensor HUAWEI FusionServer iBMC
[El maestro te hace aprender TI] Secuencia de comandos personalizada de PRTG Inicie sesión en el dispositivo de red con ssh para obtener el estado del enlace de equilibrio de carga
[El maestro le hace aprender TI] Django + IIS + Python construye el centro de administración de API de control de dominio AD de Microsoft
[El maestro le hace aprender TI] Presiona el recordatorio de que la contraseña del dominio AD está a punto de expirar a través de WeChat empresarial
[El profesor hace que aprendas TI] Control de dominio de AD Dsquery query command example resumen
[El profesor hace que aprendas TI] Cuenta de servicio de administrador de Google + gestión de API todos los usuarios de dominio en G suit
[El profesor hace que aprendas TI] Se aprobó el sistema de supervisión de PRTG Mensaje de notificación push de WeChat empresarial con gráficos y texto combinados
[El profesor hace que aprenda TI] API HTTP de PRTG para obtener las imágenes del diagrama de flujo de sensores especificados
[El profesor hace que aprenda TI] El sistema de supervisión de PRTG combina datos de varios canales de sensores
[El profesor hace que usted aprenda TI 】 El sistema de supervisión de PRTG envía mensajes de alarma a través de WeChat empresarial
[El profesor hace que usted aprenda TI] El sistema de supervisión de PRTG coopera con Raspberry Pi para recopilar la calidad de la red inalámbrica interna de la empresa
[El profesor le hace aprender TI] vMware ESXi 6.7 incorpora controladores de hardware de terceros
[hace que el profesor] Te lleva a aprender TI] Tutorial de instalación y configuración de Kiwi Syslog Server
[El profesor te hace aprender TI] Certificación Kiwi Syslog Web Access y la integración de Active Directory
[El profesor te hace aprender TI] vMware ESXi 6.7 incorpora controladores de hardware de terceros
[El profesor hace que aprenda TI] Contabilidad y auditoría del Servicio de políticas de red (NPS) de Windows Server
[El profesor hace que aprenda TI] El servicio NPS de Windows Server crea una autenticación de radio basada en el control de dominio AD
[El profesor hace que aprenda TI] Dominio AD Control y entorno de autenticación integrado freeradius, PAP, MSCHAPV2
[El profesor lo llevará a aprender TI] Sangfor SSL acceso remoto y Sangfor comportamiento auditoría información de usuario de inicio de sesión sincrónico

Supongo que te gusta

Origin blog.51cto.com/1737585/2549111
Recomendado
Clasificación