gpt4 book ai didi

python - Pymodbus 读/写 float (真实)

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:51 27 4
gpt4 key购买 nike

我在我的 AB Micro820 PLC 中设置了 modbus 映射。我在 40001 中有一个数组用于写入,在 42001 中有一个数组用于读取。两者都是 200 个元素和 REAL 类型(32 位 float )。我目前可以读写,所以我知道代码可以工作,只是不正确。这些值被读/写为非常小的值(即 4.58577478E-19)。谁能指出我正确的方向?

#!/usr/bin/env python

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.payload import BinaryPayloadBuilder
from pymodbus.client.sync import ModbusTcpClient

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.INFO)

ip_address = "192.168.2.101"

client = ModbusTcpClient(ip_address)
if client.connect(): # connection is OK
# write float
builder = BinaryPayloadBuilder(endian=Endian.Little)
builder.add_32bit_float(77.77)
payload = builder.build()
result = client.write_registers(1, payload, skip_encode=True)
# read floats
result = client.read_holding_registers(2001, 4)
decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)
print "read_holding_registers: " + str(decoder.decode_32bit_float())

client.close()

最佳答案

简单描述:

使用:

decoder = BinaryPayloadDecoder.fromRegisters(result.registers, Endian.Big, wordorder=Endian.Little)

代替:

decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)

解释尝试:

BinaryPayloadDecoder.fromRegisters 的参数这个包在文档中有描述。

在这种情况下我们要注意:

byteorder – The Byte order of each word

wordorder – The endianess of the word (when wordcount is >= 2)

我相信适合 modbus 寄存器(2 字节)字节顺序的值始终必须是 Endian.Big

wordorder 类似于 byteorder 但用于 modbus 寄存器。

对于 Modbus TCP,始终必须是 byteorder=Endian.Big,wordorder=Endian.Little,因为由超过 2 个字节组成的值的字节顺序在协议(protocol)规范中明确指定 OPEN MODBUS/TCP SPECIFICATION(Appendix B. Data Encoding for non-word data) .

对于 Modbus RTU byteorder for the values,由超过 2 个字节组成的协议(protocol)规范中没有明确规定 Somehow described here .

大多数实现采用 Modbus TCP 方法并将 float 作为 [2, 1, 4, 3] 字节传输。

但是,还有其他的可能性:

  • [4, 3, 2, 1] - byteorder=Endian.Big, wordorder=Endian.Big
  • [3, 4, 1, 2] - byteorder=Endian.Little, wordorder=Endian.Big
  • [1, 2, 3, 4] - byteorder=Endian.Little, wordorder=Endian.Little

关于python - Pymodbus 读/写 float (真实),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com