modbus_tk库的使用和分析
目录
modbus_tk库的使用和分析
modbus版本:0.5.7
下载地址:https://github.com/ljean/modbus-tk
1:应用示例程序
2:web形式的主机端(bottle搭建的后台)
3:modbus_tk主代码
4:单元测试代码
目前只讨论1中两个和3
如何使用modbus_tk的主机和从机?
【rtuslave_example.py】
功能:开启rtu从端,然后通过命令行设定从机号(地址)、数据块、寄存器或者线圈数值。这就是一个命令行操作的从机端软件。
使用步骤:
- 修改rtuslave_example.py中“PORT = 'COM11'”后运行。
我的虚拟串口地址是COM11。
- 添加从机:add_slave 3
添加地址为3的从机
- 添加从机的块数据:add_block 3 hold 3 0 3
该从机中添加0-3内存块,类型为3表示用作保持寄存器(设置模拟量输出),取名为hold。
注意:0-3内存已经分配出去,添加的新块不能包含此三个。以上类型设置参照fefines.py中的“supported block types”
- 设定寄存器/线圈数值:set_values 3 hold 0 1 2 3
设置前步骤中的三个内存值为1,2,3
*以上命令参考资料详见rtuslave_example.py代码。
以上产生了一个从机3,内部地址0-3用作保持寄存器,其数值分别为1-3,且从机串口连接在计算机的COM11。在虚拟串口的设置中,是将COM11和COM10连接的,所以从机需要连接COM10来读取从机数据。
【主机读数据流程】
- rtumaster_example.py中修改PORT = 'COM10',注释掉所有logger.info,添加如下modbus取数据代码:
logger.info(master.execute(3, cst.READ_HOLDING_REGISTERS, 0, 3))
表示要读取保持寄存器从0-3地址上的值
- 运行该py
上图,成功取出寄存器的值为1,2,3
主从Demo代码分析
从端(服务器)代码是基于RtuServer类的应用,除此以外代码中封装了几个交互命令
主端代码分析:
log相关代码+功能性代码,流程很简单:
- 生成RtuMaster实例,在此配置了串口参数
- 设置从机应答的timeout为5s
- 打开debug的log输出 master.set_verbose(False)
- 向从机发出取值命令,收信后结束程序
master.execute(3, cst.READ_HOLDING_REGISTERS, 0, 3)
以上函数的返回值就是收到的三个寄存器值得tuple
modbus_tk库函数主代码分析
目前只讨论以上红框部分(RTU模式)
未完待续……