0

我正在尝试使用 Modbus RTU RS-485 读取工业数字计数器的值。使用 USB-RS-485 转换,这里的主发送代码取自以下数据表,

数据表链接

Autonics CT 系列数据表的片段

我期望读取的输入寄存器是我所期望的,minimalmodbus 的 API 期望指定寄存器号、小数位数和功能代码。

  • 图书馆是否自动分配从属编号,还是我们必须定义它?
  • 从数据表中,是寄存器号是地址吗?
  • 如果有两个数据序列作为响应,我期望多少个小数?
  • CRC16 检查是否已包含在库中,因为我不应该对其进行编码?

到目前为止,这是我的代码,修改示例。

import minimalmodbus
import time

# port name, slave address (in decimal)
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1)

instrument.serial.baudrate = 9600      
instrument.serial.bytesize = 8
instrument.serial.stopbits = 1
instrument.serial.timeout  = 1          
instrument.mode = minimalmodbus.MODE_RTU  
instrument.clear_buffers_before_each_transaction = True
instrument.debug = True

while True:
    # Register number, number of decimals, function code
    # not sure what to expect on number of register, is it 31004, 31005?
    
    digit_count = instrument.read_register(1, 2, 4)
    print(digit_count)
    time.sleep(1) 

我已经阅读了 python Modbus 的其他库,我很乐意获得与 Modbus 相关的任何更好的编码建议。事先谢谢你。

4

1 回答 1

1

图书馆是否自动分配从属编号,还是我们必须定义它?

使用MinimalModbus,您可以在调用中传递从站 ID minimalmodbus.Instrument('/dev/ttyUSB0', 1)(1 是从站 ID)。您在设备本身上设置从 ID 的方式各不相同(Modbus over serial line 规范未涵盖此内容;可能是配置程序、DIP 开关、基于序列号等。其他库可能采用不同的方法(例如默认到从站 ID 1)。

从数据表中,是寄存器号是地址吗?

规格表中的标题显示“否(地址)”,因此“10001(0000)”表示寄存器 1,地址 0(这些指的是同一件事;我建议阅读“Modbus:当 40001 真正表示 1 或 0 时意味着本文中的 1" 部分解释了一些围绕寻址的问题)。

如果有两个数据序列作为响应,我期望多少个小数?

不太清楚“两个数据序列”是什么意思。Modbus 规范仅详细说明位(线圈)和 16 位值(输入/保持寄存器)的发送。快速浏览一下您的规格,该设备似乎只使用一个寄存器;例如“OUT1 输出时间”有“单位:×10㎳”所以取寄存器中的任何内容除以 10 得到 ms。

CRC16 检查是否已包含在库中,因为我不应该对其进行编码?

任何体面的 Modbus 库都会为您处理协议详细信息(例如 CRC)(所以不,您不需要对此进行编码;MinimalModbus 会为您计算)

于 2021-06-10T05:34:25.783 回答