首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在minimalmodbus python中从从机提取有效负载

在minimalmodbus python中从从机提取有效负载
EN

Stack Overflow用户
提问于 2017-08-12 17:43:50
回答 1查看 878关注 0票数 2

我使用minimalmodbus与使用rs485协议的微动流量计进行通信,并使用USBRS485转换器。这里给出了微运动modbus文档。

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

当我使用下面的代码从2个寄存器读取浮点数时

代码语言:javascript
复制
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")

它给了我这样的响应:

代码语言:javascript
复制
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

因为它是使用下面的代码编写的

代码语言:javascript
复制
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。

代码语言:javascript
复制
values = read_registers(3924, numberOfRegisters=2)

返回带信号的int,如果你读取2个寄存器,它将在列表中给出2个值。

代码语言:javascript
复制
[61552, 16865]

我应该如何获取字节串来正确设置它的顺序。现在我的问题是如何从slave保存有效负载。我想将这个字节字符串保存到变量中的‘\x01\x03\x04\x9f3A?\x941’,这样我就可以更改字节顺序了。并将其传递给_bytestringToFloat(),这样我就可以获得一个实际值。我是新手,请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 03:57:58

使用struct.packstruct.unpack将整数转换为字节串,再转换为浮点数。

代码语言:javascript
复制
import struct

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

>>> b'p\xf0\xe1A'

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

>>> 28.242401123046875
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45648813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档