我使用minimalmodbus与使用rs485协议的微动流量计进行通信,并使用USBRS485转换器。这里给出了微运动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")它给了我这样的响应:
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左右。这是由于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)或者类似的东西,我们可以将字节顺序放在正确的位置,以获得正常的outputs.But。
values = read_registers(3924, numberOfRegisters=2)返回带信号的int,如果你读取2个寄存器,它将在列表中给出2个值。
[61552, 16865]我应该如何获取字节串来正确设置它的顺序。现在我的问题是如何从slave保存有效负载。我想将这个字节字符串保存到变量中的‘\x01\x03\x04\x9f3A?\x941’,这样我就可以更改字节顺序了。并将其传递给_bytestringToFloat(),这样我就可以获得一个实际值。我是新手,请帮帮忙。
发布于 2017-08-13 03:57:58
使用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.242401123046875https://stackoverflow.com/questions/45648813
复制相似问题