python modbus_tk库 学习记录

本文介绍Modbus协议在Python中的应用,重点讲解了modbus_tk库的使用方法及modbusmaster客户端如何通过TCP连接远程slave服务器请求数据。同时列举了支持的modbus功能代码和异常代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:目前的开发只涉及 modbus master即 client端的开发,未涉及 slave端服务器的开发,slave服务器的设计,一般开发嵌入式设备作为数据采集器的时候用到,市面上有现成的slave数据采集器使用。

python封装的modbus库有这几个:

modbus_tk :完整modbus协议栈的实现,支持modbus tcp/RTU{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}

pymodbus:使用twisted实现的modbus完整协议(支持异步通讯)

MinimalModbus :只支持modbus rtu

使用modbus tcp模式通讯是推荐modbus_tk库

==============================================================================

modbus master 为client,连接远程的slave来请求采集到的数据。

modbus slave 为 server ,监听502端口,一般slave为plc,plc为嵌入式设备从modbus网络上采集数据。master发送modbus协议数据请求salve获取数据。

1.连接到远程的slave(即modbus server的502端口服务器)

master = modbus_tcp.TcpMaster("192.168.2.20",502)

master.set_timeout(5.0)

2.进行调用modbus_tk库的接口,向slave请求采集的数据

类TcpMaster下有如下接口:

set_timeout(秒)

_send(modbus请求) modbus请求,即:需要自己封装modbus协议头和请求命令

_recv() 返回modbus协议数据

open()

close()

execute(slave,功能代码,开始地址,quantity_of_x=0,output_value=0,data_format="",指定长度=-1)//execute为线程安全函数

使用例子:

import modbus_tk.defines as de

master.execute(slave_id=1,de.READ_HOLDING_REGISTERS,100,3)

slave_id:1

slave_id : identifier of the slave. from 1 to 247. 0为广播所有的slave

功能代码:de.READ_HOLDING_REGISTE 定义见:defines.py

开始地址为: 100

quantity_of_x = 3 (寄存器或者线圈的数量)

output_value: (一个整数或者可迭代的值) 如:

output_value = 1或 54 或 output_value=[1,1,0,1,1,0,1,1] 或者 output_value = xrange(12)

返回的一个元祖类型的数据,返回的元祖取决于查询的功能码,参考详细的modbus协议说明书来构造data_format

modbus 功能代码: defines.py

#modbus 异常代码

ILLEGAL_FUNCTION = 1 功能代码不合法
ILLEGAL_DATA_ADDRESS = 2 数据地址不合法
ILLEGAL_DATA_VALUE = 3 数据值不合法
SLAVE_DEVICE_FAILURE = 4 slave设备失败
COMMAND_ACKNOWLEDGE = 5 命令已收到
SLAVE_DEVICE_BUSY = 6 slave设备忙
MEMORY_PARITY_ERROR = 8 内存奇偶误差

#supported modbus 功能代
READ_COILS = 1 读线圈
READ_DISCRETE_INPUTS = 2 读离散输入
READ_HOLDING_REGISTERS = 3 【读乘法寄存器】
READ_INPUT_REGISTERS = 4 读输入寄存器
WRITE_SINGLE_COIL = 5 写单一线圈
WRITE_SINGLE_REGISTER = 6 写单一寄存器
WRITE_MULTIPLE_COILS = 15 写多个线圈 【强制多点线圈】
WRITE_MULTIPLE_REGISTERS = 16 写多寄存器 【写乘法寄存器】

#supported block types 支持的块类型
COILS = 1 线圈
DISCRETE_INPUTS = 2 离散输入(数字量输入)
HOLDING_REGISTERS = 3 乘法寄存器
ANALOG_INPUTS = 4 模拟量输入

下面这段话来自网络

The master uses function codes 5, 6, 15 & 16 to send data to the slave.
Function code 5 allows the master to write a single coil (address 00001->) to the slave device
Function code 15 allows the master to write multiple coils (address 00001->) to the slave device
Function code 6 allows the master to write a single holding register (address 40001->) to the slave device
Function code 16 allows the master to write multiple holding registers (address 40001->) to the slave device

3.接下来的工作就是进行modbus协议的封装 对接受的modbus数据解析

### 安装 `modbus_tk` 为了在 Python 中使用 `modbus_tk` ,可以通过以下命令完成安装: ```bash pip3 install modbus_tk==1.1.2 ``` 这一步确保了版本号为 1.1.2 的 `modbus_tk` 被正确安装到环境中[^1]。 --- ### 基本功能概述 `modbus_tk` 是一个支持 Modbus 协议的 Python ,主要用于实现 Modbus RTU 和 Modbus TCP 功能。它提供了创建 Modbus 主机(Master)和从机(Slave)的能力,并允许开发者通过简单的 API 进行数据交互[^4]。 以下是该的一些核心功能: - 支持 Modbus RTU 和 Modbus ASCII 协议。 - 提供 Master 和 Slave 类型的支持。 - 可配置串口参数以适应不同的硬件环境。 需要注意的是,在实际应用前应熟悉 Modbus 协议以及目标设备的具体通信需求[^3]。 --- ### 使用示例代码 #### 示例 1:RTU 主机读取数据 下面是一个基于 `rtumaster_example.py` 修改后的简单例子,展示如何设置端口号并获取远程设备的数据: ```python import modbus_tk.defines as cst from modbus_tk import modbus_rtu as mb_rtutk import serial # 配置串口参数 PORT = 'COM10' # 替换为目标设备的实际端口号 master = mb_rtutk.RtuMaster( serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0) ) try: master.set_timeout(5.0) # 设置超时时间 master.set_verbose(True) # 启用调试模式 # 发送请求给从机地址为1的目标设备,读取保持寄存器 (起始地址0,数量10) data = master.execute(slave=1, function_code=cst.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=10) print(f"Read Data: {data}") # 输出读取的结果 except Exception as e: print(f"Error occurred: {e}") finally: master.close() ``` 上述代码展示了如何初始化一个 Modbus RTU 主机实例,并向指定从机发送读取保持寄存器的操作请求。 --- #### 示例 2:TCP 主机写入数据 如果需要通过网络连接访问 Modbus 设备,则可以采用 Modbus TCP 方式: ```python import modbus_tk.defines as cst from modbus_tk import modbus_tcp as mb_tcptk # 创建 Modbus TCP 主机对象 host_ip = "192.168.1.100" # 替换为目标设备IP地址 port_num = 502 # 默认Modbus TCP端口 master = mb_tcptk.TcpMaster(host=host_ip, port=port_num) try: master.set_timeout(5.0) # 设置超时时间为5秒 # 写单个线圈状态至从机ID为1的位置,线圈地址为0,值设为ON result = master.execute(slave=1, function_code=cst.WRITE_SINGLE_COIL, output_address=0, output_value=1) print(f"Write Result: {result}") except Exception as e: print(f"Exception during write operation: {e}") finally: master.close() ``` 此脚本演示了利用 Modbus TCP 将单一线圈的状态更新为开启的过程。 --- ### 注意事项 在正式部署项目之前,请确认已充分理解 Modbus 协议的工作原理及其变体(如 RTU 或 TCP)。此外,对于嵌入式平台上的开发工作,可能还需要额外考虑硬件接口兼容性和性能优化等问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值