如何用minimalmodbus读取数字计数器的寄存器
How to read register of digital counter with minimalmodbus
我正在尝试使用 Modbus RTU RS-485 读取工业数字计数器的值。使用USB-RS-485转换,这里是master发送代码取自下面的datasheet,
我期望读取输入寄存器是我所期望的,并且 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 相关的任何更好的编码建议。先谢谢你了。
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 为您编写)
我正在尝试使用 Modbus RTU RS-485 读取工业数字计数器的值。使用USB-RS-485转换,这里是master发送代码取自下面的datasheet,
我期望读取输入寄存器是我所期望的,并且 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 相关的任何更好的编码建议。先谢谢你了。
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 为您编写)