用minimamodbus python从机提取有效载荷

2024-06-02 10:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我用minimamodbus与微运动流量计通信,它使用rs485协议,我使用usb-rs485转换器。这里给出了micro motion modbus文档。在

http://www2.emersonprocess.com/siteadmincenter/PM%20Micro%20Motion%20Documents/Modbus-Map-Manual-20001741.pdf

当我用这个代码从2个寄存器读取浮点数时

import minimalmodbus
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
import serial
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) 
instrument.serial.baudrate = 9600
instrument.serial.timeout = 1
instrument.serial.baudrate = 9600  
instrument.serial.bytesize = 8
instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 0.05   
instrument.mode = minimalmodbus.MODE_RTU
instrument.debug = True
try:
    values = instrument.read_float(250, 3, 2) 
    print (values)
except IOError:
    print("Failed")

我的回答是:

^{pr2}$

应该是29.879或29.78687之类的。这是由于bytestring的顺序造成的。这里给出了一个解决方法。 https://minimalmodbus.readthedocs.io/en/master/advancedusage.html#workaround-for-floats-with-wrong-byte-order

就像上面写的那样

values = read_registers(3924, numberOfRegisters=2)
registerstring = chr(values[2]) + chr(values[3]) + chr(values[0]) + chr(values[1])
floatvalue = minimalmodbus._bytestringToFloat(registerstring)

或者类似的东西,我们可以把字节顺序调整到正常输出。但是我被困在这里

values = read_registers(3924, numberOfRegisters=2)

返回singed int,如果读取2个寄存器,它将在列表中给出2个值。在

[61552, 16865]

我该如何让bytestring正确设置顺序。现在我的问题是如何从slave保存有效载荷。我想将这个字节串保存到变量中的'\x01\x03\x04\x9f3A–x941',这样我就可以更改字节顺序了。把它传给 _bytestringToFloat() 所以我可以得到一个实际值。我是新手,请帮忙。在


Tags: importtrueread字节顺序timeoutserial寄存器
1条回答
网友
1楼 · 发布于 2024-06-02 10:22:59

使用struct.packstruct.unpack将整数转换为bytestring到float。在

import struct

r=[61552, 16865]
b=struct.pack('HH',r[0],r[1])

>>> b'p\xf0\xe1A'

struct.unpack('f',b)[0]

>>> 28.242401123046875

相关问题 更多 >