在 minimalmodbus python 中从 slave 中提取有效载荷
extracting payload from slave in minimalmodbus python
我正在使用 minimalmodbus 与使用 rs485 协议的微动流量计通信,我正在使用 usb-rs485 转换器。此处提供了微动 modbus 文档。
当我使用这段代码从 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")
它给了我这样的回应:
MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00ú\x00\x02ä:' (01 03 00 FA 00 02 E4 3A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1502310315020.7 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x03\x04\x9f3Aâ\x941' (01 03 04 9F 33 41 E2 94 31) (9 bytes), roundtrip time: 28.8 ms. Timeout setting: 50.0 ms.
-3.7959221374830406e-20
应该是 29.879 或 29.78687 之类的东西。这是由于字节串的顺序。这里有一个解决方法。
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)
或类似的东西,我们可以正确设置字节顺序以获得正常 outputs.But 我卡在这里使用
values = read_registers(3924, numberOfRegisters=2)
return singed int,如果您读取 2 个寄存器,它将在列表中给出 2 个值。
[61552, 16865]
我应该如何获取字节串以正确设置其顺序。现在我的问题是如何从 slave 保存有效负载。我想将此字节字符串保存到变量中的 '\x01\x03\x04\x9f3Aâ\x941' 以便我可以更改字节顺序。并将其传递给
_bytestringToFloat()
这样我就能得到一个实际值。我是新手所以请帮助。
使用 struct.pack
和 struct.unpack
将整数转换为字节串再转换为浮点数。
import struct
r=[61552, 16865]
b=struct.pack('HH',r[0],r[1])
>>> b'p\xf0\xe1A'
struct.unpack('f',b)[0]
>>> 28.242401123046875
我正在使用 minimalmodbus 与使用 rs485 协议的微动流量计通信,我正在使用 usb-rs485 转换器。此处提供了微动 modbus 文档。
当我使用这段代码从 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")
它给了我这样的回应:
MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00ú\x00\x02ä:' (01 03 00 FA 00 02 E4 3A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1502310315020.7 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x03\x04\x9f3Aâ\x941' (01 03 04 9F 33 41 E2 94 31) (9 bytes), roundtrip time: 28.8 ms. Timeout setting: 50.0 ms.
-3.7959221374830406e-20
应该是 29.879 或 29.78687 之类的东西。这是由于字节串的顺序。这里有一个解决方法。 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)
或类似的东西,我们可以正确设置字节顺序以获得正常 outputs.But 我卡在这里使用
values = read_registers(3924, numberOfRegisters=2)
return singed int,如果您读取 2 个寄存器,它将在列表中给出 2 个值。
[61552, 16865]
我应该如何获取字节串以正确设置其顺序。现在我的问题是如何从 slave 保存有效负载。我想将此字节字符串保存到变量中的 '\x01\x03\x04\x9f3Aâ\x941' 以便我可以更改字节顺序。并将其传递给 _bytestringToFloat() 这样我就能得到一个实际值。我是新手所以请帮助。
使用 struct.pack
和 struct.unpack
将整数转换为字节串再转换为浮点数。
import struct
r=[61552, 16865]
b=struct.pack('HH',r[0],r[1])
>>> b'p\xf0\xe1A'
struct.unpack('f',b)[0]
>>> 28.242401123046875