【发布时间】:2021-01-30 17:33:25
【问题描述】:
我目前正在使用包 pymodbus 在 python 中编码 modbus rtu。 在这种情况下,我将使用功能代码 4/读取输入寄存器从 TDS 传感器读取数据(请参阅 Aquas SMR-08 数据表)。数据成功获取,我将其转换为十六进制 ,但数据必须再次转换为正确的值。我尝试使用 scadacore(在线十六进制转换器)转换十六进制值,我在 Float Big Endian (ABCD) 上看到了正确的数据
十六进制值为 41FB:
转换结果为 31.375(这是温度值):
那么,pymodbus如何算法或什么代码像scadacore(在线六进制转换)一样转换?
谁能帮忙? 提前致谢,抱歉我的英语不好 hihihi
这是我的代码
import time
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
Defaults.RetryOnEmpty = True
Defaults.Timeout = 5
Defaults.Retries = 5
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=2, stopbits=1, bytesize=8,
parity='N', baudrate=19200)
client.connect()
while True:
tds1 = client.read_input_registers(address=0, count=2, unit=1)
bacatds1 = tds1.registers[0]
bacatds2 = tds1.registers[1]
tds1hex = hex(bacatds1)
tds2hex = hex(bacatds2)
print(tds1hex)
print(tds2hex)
decoder1 = BinaryPayloadDecoder.fromRegisters(tds1.registers, Endian.Little)
hasil1 = decoder1.decode_32bit_float()
print(hasil1)
print('==================================')
time.sleep(1)
# ----------------------------------------------------------------
tds2 = client.read_input_registers(address=1, count=2, unit=1)
bacatds3 = tds2.registers[0]
bacatds4 = tds2.registers[1]
tds3hex = hex(bacatds3)
tds4hex = hex(bacatds4)
print(tds3hex)
print(tds4hex)
decoder2 = BinaryPayloadDecoder.fromRegisters(tds2.registers, Endian.Big)
hasil2 = decoder2.decode_32bit_float()
print(hasil2)
print('===================================')
time.sleep(1)
【问题讨论】:
-
您能否发布有关您正在使用的传感器的 Modbus 寄存器信息的链接?
-
有SMR08的datasheet,Link