如何在pymodbus输入寄存器中表示负数?

2024-10-02 06:39:14 发布

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

我想给pymodbus异步服务器中的输入寄存器分配负数。我有一个名为PQV的5元素数组,它包含从0到300的数值,但有些元素是负数

PQV=[145, -210, 54, 187, -10]

我使用下面的代码将PQV分配给从地址0开始的输入寄存器(寄存器4)。我试着把65536加到所有的负数上,但没用。在

如何调整阵列PQV的负元素,使其适合pymodbus?在

context[slave_id].setValues(4, 0, PQV)

Tags: 代码服务器id元素地址context数组寄存器
1条回答
网友
1楼 · 发布于 2024-10-02 06:39:14

在写入数据存储之前,浮点将以IEEE-754十六进制格式表示。你可以做这样的事情来实现它。在

# Import BinaryPayloadBuilder and Endian
from pymodbus.payload import BinaryPayloadBuilder, Endian
# Create the builder, Use the correct endians for word and byte
builder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big)

在你的更新功能中

^{pr2}$

当您读回这些值时,您将获得原始整型值。您必须使用BinaryPayloadDecoder将它们转换回float

>>> from pymodbus.payload import BinaryPayloadDecoder, Endian
>>> r = client.read_input_registers(0, 10, unit=1)
# Use the same byte and wordorders
>>> d = BinaryPayloadDecoder.fromRegisters(r.registers, byteorder=Endian.Big, wordorder=Endian.Big)
>>> d.decode_32bit_float()
120.0
>>> d.decode_32bit_float()
501.29998779296875
>>> d.decode_32bit_float()
-65.19999694824219
>>> d.decode_32bit_float()
140.3000030517578
>>> d.decode_32bit_float()
-202.39999389648438
>>> # Further reads after the registers are exhausted will throw struct error
>>> d.decode_32bit_float()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/sanjay/.virtualenvs/be3/lib/python3.6/site-packages/pymodbus/payload.py", line 440, in decode_32bit_float
    handle = self._unpack_words(fstring, handle)
  File "/Users/sanjay/.virtualenvs/be3/lib/python3.6/site-packages/pymodbus/payload.py", line 336, in _unpack_words
    handle = unpack(up, handle)
struct.error: unpack requires a buffer of 4 bytes
>>>

希望这有帮助。在

相关问题 更多 >

    热门问题