如何用minimalmodbus读取数字计数器的寄存器

How to read register of digital counter with minimalmodbus

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

Datasheet Link

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

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

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 相关的任何更好的编码建议。先谢谢你了。

Does the library auto-assign the slave number, or we have to define it?

MinimalModbus you pass the slave ID through in the minimalmodbus.Instrument('/dev/ttyUSB0', 1) call (the 1 is the Slave ID). How you set the slave ID on the device itself varies (this is not covered by the Modbus over serial line spec;可以是配置程序、DIP 开关、基于序列号等。其他库可能采用不同的方法(例如默认为从 ID 1)。

From the datasheet, is it the register number is the address?

规格表中的 header 表示“No(Address)”,因此“10001(0000)”表示寄存器 1,地址 0(这些指的是同一件事;我建议阅读“Modbus: this article 中的“当 40001 真的意味着 1,或 0 真的意味着 1”部分解释了有关寻址的一些问题)。

And how many decimals do I expect if there's two data sequence as a response?

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

Is the CRC16 check already included within the library as i shouldn't code it?

任何体面的 Modbus 库都会为您处理协议细节(例如 CRC)(所以您不需要编写代码;MinimalModbus will calculate 为您编写)