Pymodbus将float添加到服务器上下文寄存器

时间:2014-09-16 07:22:35

标签: python modbus

我一般都是pymodbus和modbus的新手,我已经尝试了一段时间直接添加一个浮子
到服务器上下文没有任何成功,我想知道你是否有任何关于如何做到这一点的领导。我已经尝试通过执行以下操作来使用有效负载:

builder = BinaryPayloadBuilder(endian=Endian.Little)
builder.add_32bit_float(long(69000))
payload = builder.build()

context[slave_id].setValues(register, address, payload)

但是我得到一个关于pymodbus尝试将有效负载转换为int的错误,我的代码主要来自同步服务器示例。 任何帮助都会很好

2 个答案:

答案 0 :(得分:2)

builder = BinaryPayloadBuilder(endian=Endian.Little)
builder.add_32bit_float(30.3)
payload = builder.to_registers()

context[slave_id].setValues(register, address, payload)

这是正确的方法,请注意"注册"是起始寄存器,所有modbus寄存器都是16位宽,因此32位浮点数占2(寄存器和寄存器+ 1)。

答案 1 :(得分:1)

在对寄存器进行了一些研究并将浮点数分成16位整数后,我提出了:

register = 3
slave_id = 0x00
address  = 0x01

values   = context[slave_id].getValues(register, address, count=2)

# Two integers to a floating point
i1 = values[0]
i2 = values[1]
f = unpack('l',pack('<HH',i1,i2))[0]
f = f+1
# Floating point to two integers
i1, i2 = unpack('<HH',pack('l',f))
print(f,i1,i2)

context[slave_id].setValues(register, address, [i1,i2])

我在Endian中遇到了一些编码问题,检查你的modbus客户端需要什么,