如何使用Python读取Modbus传感器的输出

问题描述 投票:0回答:1

我正在尝试使用 Modbus 和 Raspberry Pi 5 读取 这个 Keller 深度传感器。它读取压力(以巴为单位)和温度(以摄氏度为单位)。然后可以使用这些值计算水深。我已经到了可以读取寄存器的地方了。现在,因为我不懂Modbus,所以我不知道我需要读取哪些寄存器来访问我想要的数据以及如何正确读取数据。通信协议文档可以在这里找到。

这些是沟通基础知识:

Mode: RTU Mode (ASCII is not supported)

Coding System: 8–bit binary, hexadecimal 0–9, A–F
Two hexadecimal characters (bytes) contained in each 8–bit field of the message

Bits per Byte: 1 start bit
8 data bits, least significant bit sent first
No parity (default) 1 parity bit: even or odd parity (programmable)
1 stop bit (default) 2 stop bit (programmable) (Class.Group-version 5.21-XX.XX and 5.24-XX.XX)

Error Check Field: 2 Byte Cyclical Redundancy Check (CRC)

Baudrate: programmable 9’600baud (default) or 115’200baud

我一直使用的代码是这样的:

import minimalmodbus

mb_address = 1

sensy_boi = minimalmodbus.Instrument('/dev/ttyACM0',mb_address)

sensy_boi.serial.baudrate = 9600
sensy_boi.serial.bytesize = 8
sensy_boi.serial.parity = minimalmodbus.serial.PARITY_NONE
sensy_boi.serial.stopbits = 1
sensy_boi.serial.timeout  = 0.5
sensy_boi.mode = minimalmodbus.MODE_RTU
sensy_boi.clear_buffers_before_each_transaction = True
sensy_boi.close_port_after_each_call = True

print(sensy_boi) 

data =sensy_boi.read_registers(0, 2, 3)

print(f"Raw data is {data}")

sensy_boi.serial.close()
python raspberry-pi modbus minimalmodbus
1个回答
0
投票

正如@Brits提到的,您可以使用mbpoll等工具进行快速测试。

在这里我会推荐另一个有用的Python工具modpoll,它不仅有助于快速排除故障,而且还可以使用相同的配置文件进一步获取数据。

为通用 Keller 传感器创建一个配置文件

keller-sensor.csv
,其中包含以下内容,

device,testdev01,1,,
poll,holding_register,0,12,BE_BE
ref,Calculated_value,0,float32,r
ref,Pressure_of_sensor1,2,float32,r
ref,Pressure_of_sensor2,4,float32,r
ref,Temperature,6,float32,r
ref,Temperature_of_sensor1,8,float32,r
ref,Temperature_of_sensor2,10,float32,r

注意:仅显示第 4.4.1.1 节过程值读取范围 (0x000x) 中的部分寄存器用于演示

按照指南安装modpoll并运行以下命令,

modpoll --rtu /dev/ttyACM0 --rtu-baud 9600 --config keller-sensor.csv

您应该能够实时查看设备读数

此外,您可以使用相同的配置文件在生产中部署modpoll程序,请参阅官方文档了解更多选项。

修改了旧设备型号的配置文件

根据 keller 手册第 4.3.2 节,对于某些旧型号,一个周期读取的最大寄存器数量有限制。

  • Class.Group 版本 5.20-10.40 之前的版本最多有 2 个寄存器
device,testdev01,1,,
poll,holding_register,2,2,BE_BE
ref,Pressure_of_sensor1,2,float32,r
  • Class.Group-版本 5.20-10.40 及更高版本最多 4 个寄存器
device,testdev01,1,,
poll,holding_register,2,4,BE_BE
ref,Pressure_of_sensor1,2,float32,r
ref,Pressure_of_sensor2,4,float32,r
© www.soinside.com 2019 - 2024. All rights reserved.