本文介绍,Python如何通过TCP Modbus协议获取温湿度传感器数据。PRTG呈现在监控系统中。 本文主要涉及知识点:
1、Python的ModbusTCP客户端实现 2.温湿度传感器中温湿度寄存器的位置
目录
- 一、关于TCP Modbus协议
-
- 1、协议介绍
- 2、TCP Modbus数据包格式
-
- 2.1:请求包:
- 2.2:请求包:
- 二、Python的Modbus TCP客户端
-
- 1、Python modbus_tk第三方库
- 2.确认温度传感器寄存器的地址
- 三、数据集成显示PRTG监控系统
一、关于TCP Modbus协议
1、协议介绍
Modbus协议是由Modicon公司(现施耐德电气)Schneider Electric)主要基于物理串口和以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。 Modbus Poll和Modbus Slave两款很流行Modbus支持设备仿真软件Modbus RTU/ASCII和Modbus TCP/IP协议 ,常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报纸。 当用于支持Modbus RTU/ASCII协议时,ModbusPoll作为主站设备, ModbusSlave作为从站设备,从站设备接收主站设备的命令并返回数据。用于支持Modbus TCP/IP时,ModbusSlave作为服务器, ModbusPoll作为客户端,服务器接收客户端的命令并返回数据。客户端需要填写指定连接的远程服务器IP地址和端口号。
2、TCP Modbus数据包格式
2.1:请求包:
本次请求:00 4b 00 00 00 06 01 03 00 00 00 02
对于此次通信事务处理的标识符,一般要求每次通信后加1,以区分不同的通信数据报文;
表示协议标识符,00 00为modbus协议;
用于指示下一个数据的长度和单位字节;
设备地址一般是指从站号识别连接到串行线或网络的远程服务端的地址。上述七个字节也被称为modbus报文头
代码03是读取保持寄存器数据的功能码;
起始地址是指从第0个寄存器读取数据
寄存器的数量是指从上述寄存器开始读取两个寄存器的数据 常用的功能码如下:
2.2:请求包:
本次响应:00 4b 00 00 00 07 01 03 04 01 b6 01 00
对于此次通信事务处理的标识符,响应报纸要求与之前对应请求保持一致
;
与以前对应的协议标识符请求保持一致
;
单位字节用于指示下一个数据的长度
为设备地址,响应报纸要求与以前对应请求保持一致
;
对于功能码,正常情况下,响应报告的要求与之前相应的要求一致。如果出错,返回80h 以前的功能码;
指示下一个数据的字节长度;
为了保持被读取的寄存器中的数据值,在这种情况下,两个寄存器数据同时读取温度和湿度,每两个字节返回四个字节和一组数据。 翻译是:01b6=438,湿度43.8%。0100=256,湿度25.6℃
二、Python的Modbus TCP客户端
1、Python modbus_tk第三方库
Python提供支持Modbus协议的第三方库——modbus_tk,简单的通过pip install modbus_tk即可安装 下面的例子实现了一个简单的数据,读取000和001两个寄存器 如下所示:
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、确认温度传感器寄存器地址
对于你购买的支持TCP Modbus协议的温湿度传感器,请查阅说明书确认温度、湿度两个数据的寄存器地址。 比如,我这个温度传感器,很简单的就是第1、2两个寄存器内存储着湿度、温度。
三、数据整合展示到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))
运行后给出的符合PRTG要求的json结构格式数据
{
"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
往期回顾: 【逗老师带你学IT】HUAWEI华为防火墙自动化运维Python ssh管理网络设备 【逗老师带你学IT】PRTG获取HUAWEI FusionServer iBMC传感器状态 【逗老师带你学IT】PRTG自定义脚本ssh登录网络设备获负载均衡链路状态 【逗老师带你学IT】Django+IIS+Python构建微软AD域控API管理中心 【逗老师带你学IT】通过企业微信推送AD域密码即将到期提醒 【逗老师带你学IT】AD域控 Dsquery 查询命令实例汇总 【逗老师带你学IT】Google Admin服务账号+API管理G suit内所有网域用户 【逗老师带你学IT】PRTG监控系统通过企业微信推送图文混排告警消息 【逗老师带你学IT】PRTG HTTP API获取指定传感器流量图表图片 【逗老师带你学IT】PRTG监控系统合并多个传感器通道数据 【逗老师带你学IT】PRTG监控系统通过企业微信推送告警消息 【逗老师带你学IT】PRTG监控系统配合树莓派采集企业内部无线网络质量 【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动 【逗老师带你学IT】Kiwi Syslog Server安装和配置教程 【逗老师带你学IT】Kiwi Syslog Web Access与Active Directory集成认证 【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动 【逗老师带你学IT】Windows Server Network Policy Service(NPS)记账与审计 【逗老师带你学IT】Windows Server NPS服务构建基于AD域控的radius认证 【逗老师带你学IT】AD域控和freeradius集成认证环境,PAP,MSCHAPV2 【逗老师带你学IT】深信服SSL远程接入与深信服行为审计同步登陆用户信息