【问题标题】:Pymodbus adding float to server context registerPymodbus 将浮点数添加到服务器上下文寄存器
【发布时间】:2014-11-09 20:29:18
【问题描述】:

我是 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 的错误,我的代码主要是来自同步服务器示例的代码。 任何帮助都会非常好

【问题讨论】:

    标签: python modbus


    【解决方案1】:
    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)。

    【讨论】:

      【解决方案2】:

      在对寄存器和浮点数拆分为 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 客户端需要什么,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-08
        • 2022-07-18
        • 2019-08-26
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        相关资源
        最近更新 更多