news 2026/5/2 12:46:42

别再到处找破解版了!手把手教你用Python+PyModbus模拟Modbus Slave设备(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再到处找破解版了!手把手教你用Python+PyModbus模拟Modbus Slave设备(附完整代码)

用Python构建Modbus从站模拟器的全流程指南

在工业自动化领域,Modbus协议因其简单可靠而成为设备通信的事实标准。许多工程师习惯使用商业软件如Modbus Slave进行测试,但这类工具往往价格昂贵,导致部分用户转向非授权版本。其实,借助Python生态中的PyModbus库,我们可以轻松构建功能完整的虚拟从站,不仅完全合法,还能根据项目需求灵活定制。

1. 环境准备与基础概念

Modbus协议诞生于1979年,最初为PLC通信设计,如今已发展出RTU、ASCII和TCP三种主要变体。无论哪种形式,其核心都是主从架构下的寄存器读写机制。作为从站模拟器,我们需要实现以下基础功能单元:

  • 线圈(Coils):1位可读写布尔值,常用于表示开关状态
  • 离散输入(Discrete Inputs):1位只读布尔值,模拟传感器输入
  • 保持寄存器(Holding Registers):16位可读写数值,存储设备参数
  • 输入寄存器(Input Registers):16位只读数值,反映实时测量值

安装所需环境仅需两条命令:

pip install pymodbus==3.1.3 pip install pyserial==3.5 # 如需RTU模式需额外安装

提示:建议使用Python 3.8+环境,某些旧版本可能存在兼容性问题。虚拟环境能有效隔离依赖,避免与其他项目冲突。

2. 构建基础从站服务器

我们先从TCP模式的从站实现开始,这是最易上手的方式。以下代码创建了一个包含所有四种数据类型的从站:

from pymodbus.server import StartTcpServer from pymodbus.datastore import ModbusSequentialDataBlock from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext def run_server(): # 初始化数据存储 coils = ModbusSequentialDataBlock(0, [False]*100) # 100个线圈 inputs = ModbusSequentialDataBlock(0, [True]*100) # 100个离散输入 hr = ModbusSequentialDataBlock(0, [0]*100) # 100个保持寄存器 ir = ModbusSequentialDataBlock(0, [0]*100) # 100个输入寄存器 # 创建从站上下文 slave_context = ModbusSlaveContext( di=inputs, co=coils, hr=hr, ir=ir, zero_mode=True # 地址从0开始计数 ) # 注册到服务器上下文 context = ModbusServerContext(slaves={1: slave_context}, single=False) # 启动TCP服务器 StartTcpServer(context=context, address=("0.0.0.0", 502)) if __name__ == "__main__": run_server()

启动后,这个服务会监听502端口(Modbus TCP标准端口),响应单元ID为1的所有请求。我们可以使用Modbus Poll等主站工具进行测试:

功能码地址范围操作类型示例值
010-99读线圈0x0001
020-99读离散输入0x0000
030-99读保持寄存器0x1234
040-99读输入寄存器0x5678
050-99写单个线圈0xFF00
060-99写单个寄存器0xABCD

3. 高级功能实现

基础从站能满足简单测试需求,但真实场景往往需要更复杂的功能。下面我们实现几个实用特性:

3.1 动态数据模拟

保持寄存器中的静态数据缺乏真实感,我们可以添加周期性变化:

from threading import Timer import random def simulate_dynamic_data(context): slave_context = context[1] values = [random.randint(0, 100) for _ in range(100)] slave_context.setValues(3, 0, values) # 3表示保持寄存器 Timer(1.0, simulate_dynamic_data, [context]).start()

run_server()StartTcpServer调用前添加:

simulate_dynamic_data(context)

3.2 多从站支持

PyModbus支持在单个服务器实例中托管多个从站,只需扩展上下文配置:

slaves = { 1: ModbusSlaveContext(...), # 单元ID 1 2: ModbusSlaveContext(...), # 单元ID 2 3: ModbusSlaveContext(...) # 单元ID 3 } context = ModbusServerContext(slaves=slaves, single=False)

3.3 异常响应与日志

完善的从站应该正确处理异常并记录通信日志:

from pymodbus.exceptions import ModbusException from pymodbus.pdu import ExceptionResponse class CustomDataBlock(ModbusSequentialDataBlock): def validate(self, address, count=1): if address + count > len(self.values): raise ModbusException(f"地址越界 {address}") return True def getValues(self, address, count=1): self.validate(address, count) return super().getValues(address, count)

4. 串行通信(RTU/ASCII)实现

对于硬件测试,串行通信模式更为常见。RTU模式的服务器配置与TCP类似:

from pymodbus.server import StartSerialServer def run_rtu_server(): # ...相同的上下文配置... StartSerialServer( context=context, port='/dev/ttyUSB0', # 串口设备 framer=ModbusRtuFramer, baudrate=19200, timeout=0.005 )

关键参数配置建议:

参数典型值注意事项
baudrate9600/19200/38400需与主站一致
parity'N'/'E'/'O'无/偶/奇校验
stopbits1/2通常为1
bytesize7/8ASCII模式用7,RTU用8
timeout0.005-0.1过小可能导致响应丢失

5. 实战:PLC联调案例

假设我们需要测试一个温控系统的PLC程序,该程序会:

  1. 读取温度传感器值(输入寄存器40001)
  2. 比较设定值(保持寄存器40002)
  3. 控制加热器(线圈00001)

对应的从站模拟器可以这样增强:

def simulate_heating_system(context): slave = context[1] while True: # 当前温度模拟(带随机波动) current_temp = 25 + random.uniform(-2, 2) slave.setValues(4, 0, [int(current_temp * 10)]) # 4=输入寄存器 # 读取设定温度 set_temp = slave.getValues(3, 1)[0] / 10 # 3=保持寄存器 # 控制逻辑 heater_on = current_temp < set_temp - 0.5 slave.setValues(1, 0, [heater_on]) # 1=线圈 time.sleep(1)

这个案例展示了如何构建有业务逻辑的智能从站,远超商业软件的固定模式。通过Python的灵活性,我们可以模拟设备的各种特殊行为和异常场景,这在真实测试中非常宝贵。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 12:46:41

告别IOU匹配!手把手带你复现MOTR:首个端到端Transformer多目标跟踪模型

从零构建MOTR&#xff1a;端到端Transformer多目标跟踪实战指南 在计算机视觉领域&#xff0c;多目标跟踪(MOT)一直是个充满挑战的任务。传统方法依赖复杂的启发式规则和手工设计的关联策略&#xff0c;而MOTR的出现彻底改变了这一局面。作为首个完全基于Transformer的端到端解…

作者头像 李华
网站建设 2026/5/2 12:45:25

ChineseSubFinder:自动化中文字幕下载的终极解决方案

ChineseSubFinder&#xff1a;自动化中文字幕下载的终极解决方案 【免费下载链接】ChineseSubFinder 自动化中文字幕下载。字幕网站支持 shooter、xunlei、arrst、a4k、SubtitleBest 。支持 Emby、Jellyfin、Plex、Sonarr、Radarr、TMM 项目地址: https://gitcode.com/gh_mir…

作者头像 李华
网站建设 2026/5/2 12:39:12

如何快速解决机械键盘重复输入问题:终极防抖方案指南

如何快速解决机械键盘重复输入问题&#xff1a;终极防抖方案指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 还在为机械键盘某些按键…

作者头像 李华
网站建设 2026/5/2 12:34:25

2026年AI技术四大突破重塑产业格局

2026 年全球人工智能产业进入技术落地与价值兑现的关键周期&#xff0c;大模型技术从参数竞赛转向架构创新与场景深耕&#xff0c;多模态融合、AI 智能体、端云协同推理、世界模型四大方向实现突破性进展。 AI 能力边界从数字内容生成延伸至物理世界交互&#xff0c;在电子制造…

作者头像 李华