使用python的pymodbus实现modbus slave 模拟从站一

news/2026/1/20 14:44:17/文章来源:https://www.cnblogs.com/51testing/p/19506605

使用python的pymodbus实现modbus slave 模拟从站一

import asyncio
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.server import StartAsyncTcpServer
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadBuilder
from aiohttp import web

# ===== 配置 =====
SERVER_IP = "0.0.0.0"
PORTS = [5020, 5021, 5022]
REGISTER_SIZE = 100

slave_contexts = {}
modbus_server_tasks = [] # ← 保存 server task 引用


def create_initial_holding_registers(size=100):
builder = BinaryPayloadBuilder(byteorder=Endian.BIG, wordorder=Endian.BIG)
for i in range(size):
builder.add_16bit_uint(i * 10 + 100)
return builder.to_registers()


async def run_modbus_slave(port):
print(f"[Modbus] Starting slave on port {port}...")

# 创建单个从站的数据存储
slave_store = ModbusSlaveContext(zero_mode=True)
initial_regs = create_initial_holding_registers(REGISTER_SIZE)
slave_store.setValues(3, 0, initial_regs) # 功能码 3 (Holding Registers)

# ✅ 关键:用 ModbusServerContext 包装,指定 unit ID(默认 0)
server_context = ModbusServerContext(slaves=slave_store, single=True)

# 保存到全局(供 HTTP API 使用)
slave_contexts[port] = slave_store # 注意:保存的是 slave_store,不是 server_context

# 启动服务器
server, task = await StartAsyncTcpServer(
context=server_context, # ← 传入包装后的 context
address=(SERVER_IP, port)
)

# 保存 task 引用,防止被 GC 回收
modbus_server_tasks.append(task)
print(f"[Modbus] Slave on port {port} is running.")



# ===== HTTP API =====
async def handle_write_register(request):
try:
data = await request.json()
port = int(data["port"])
address = int(data["address"])
value = int(data["value"])

if port not in slave_contexts:
return web.json_response({"error": f"Port {port} not found"}, status=404)
if not (0 <= address < REGISTER_SIZE):
return web.json_response({"error": f"Address must be 0-{REGISTER_SIZE - 1}"}, status=400)
if not (0 <= value <= 65535):
return web.json_response({"error": "Value must be 0-65535"}, status=400)

slave_contexts[port].setValues(3, address, [value])
return web.json_response({"success": True})
except Exception as e:
return web.json_response({"error": str(e)}, status=400)


async def handle_list_ports(request):
return web.json_response({"ports": list(slave_contexts.keys())})


async def start_http_server():
app = web.Application()
app.router.add_post("/write", handle_write_register)
app.router.add_get("/ports", handle_list_ports)
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, "0.0.0.0", 8080)
await site.start()
print("[HTTP] Server running on http://0.0.0.0:8080")


# ===== Main =====
async def main():
print("🚀 Starting Modbus Slaves and HTTP API...")

# 启动所有 Modbus 从站
for port in PORTS:
asyncio.create_task(run_modbus_slave(port))

# 启动 HTTP 服务器
await start_http_server()

print("✅ All services started. Press Ctrl+C to stop.")
try:
# 永久等待(因为 Modbus server task 已在后台运行)
await asyncio.Event().wait()
except KeyboardInterrupt:
print("\n🛑 Shutting down...")


if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n🛑 Exited.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1189392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【改进差分优化算法L-SHADE】差分进化算法(DE)及其变体线性种群缩减的SHADE(L-SHADE)在CEC2005函数寻优的对比研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

2026年代理ip哪家稳定 - 高级品牌推荐官

行业背景:2026年AI风控下“稳定性”的重新定义跨入2026年,全球互联网环境的审计强度已达到毫秒级。无论是进行跨境电商多店管理、全球大数据抓取,还是高频的海外社交媒体营销,单纯的“连通性”已不再是衡量代理IP的…

芯片制造中如何高效上传设计文档?

.NET程序员的20G文件上传历险记 大家好&#xff0c;我是甘肃的一名苦逼.NET程序员&#xff0c;最近接了个外包项目&#xff0c;客户的需求简直是要我老命啊&#xff01;来给大家扒一扒这个"价值连城"的项目需求&#xff1a; 项目需求&#xff1a;地狱级难度 大文件…

了解秀优国际会展的技术优势,性价比高的会展企业排名 - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家会展服务标杆企业,为企业出海参展选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:深圳市秀优国际会展有限公司(Show-U Expo) 推荐指数:★★★…

【改进差分优化算法L-SHADE-cnEpSin】差分进化算法(DE)及其变体L-SHADE-cnEpSin在CEC2005函数寻优的对比研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真…

收藏级指南|无向量化RAG新范式:从架构拆解到生产落地(小白/程序员必学)

在AI企业级应用落地的浪潮中&#xff0c;**检索增强生成&#xff08;RAG&#xff09;**早已成为海量文档问答系统的核心支撑技术。无论是智能客服快速响应产品咨询、法律助手精准解析条文&#xff0c;还是医疗系统提取病历关键信息&#xff0c;RAG都能助力大模型高效调取专属知…

2026年海外代理哪家稳定 - 高级品牌推荐官

行业背景:2026年AI风控环境下“稳定性”的技术壁垒步入2026年,全球互联网平台的安全审计已全面进入“全路径AI监测”时代。对于从事跨境电商矩阵、海外社交媒体运营及大数据采集团队而言,代理IP的稳定性不再仅仅指“…

指纹浏览器哪家稳定 - 高级品牌推荐官

行业背景:2026年全球互联网风控的“全息识别”挑战跨入2026年,全球主流互联网巨头(如Amazon、TikTok、Meta、Google等)的账号安全审计与反欺诈系统已全面迈入“全息识别”时代。现在的审计逻辑已不再满足于基础的I…

ABB板卡PP C907 BE

核心产品信息PP C907 BE 指的是 ABB Freelance 2013 / AC 700F 控制器系列 中的核心组件&#xff1a;控制器&#xff1a; AC 700F (或兼容的 Freelance 2013 系统控制器)。模块类型&#xff1a; CPU 处理器模块。具体型号&#xff1a; C907 是这个CPU模块的具体型号代码。功能与…

为什么辅助驾驶系统需要 CCR:不是让 AI 开车,而是防止它“越权”

一、辅助驾驶真正的风险,不在“看不见”,而在“看错也执行了” 在辅助驾驶系统中,AI 通常承担的是: 驾驶员状态识别 风险提示 行为建议 问题在于: 一旦判断结果直接影响提醒、接管或制动, 那它就已经进入“半执行…

代理ip哪个好用 - 高级品牌推荐官

行业背景:2026年AI风控时代下的代理IP选型标准跨入2026年,全球互联网生态的防御机制已全面进入“全路径AI审计”时代。对于从事跨境电商矩阵管理、海外社交媒体精准引流、以及全球大数据抓取的企业而言,代理IP的好用…

设计模式学习(15) 23-13 模版方法模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0.个人感悟 个人对这个模式印象很深&#xff0c;属于是工作中自己无意识地用到过&#xff0c;后面看书才发现原来已…

2026 升降炉生产厂家权威推荐,聚焦控温精度与节能性能的品质品牌全解析 - 品牌推荐大师1

升降炉作为高温热处理领域的核心设备,广泛应用于材料科学、冶金陶瓷、半导体加工、新能源研发等关键行业,其温控精度、稳定性、节能性及安全性直接决定生产与实验效果。随着制造业向高端化、智能化转型,市场对高性能…

海外代理ip哪个好用 - 高级品牌推荐官

2026年海外代理IP哪个好用?精选高权值住宅ISP代理实测排行榜行业背景:2026年AI风控时代下的“身份信用”博弈步入2026年,全球互联网生态的防御机制已全面进入“全路径AI审计”时代。对于从事跨境电商矩阵管理、海外…

详细介绍:Linux内核(升级、编译)

详细介绍:Linux内核(升级、编译)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

指纹浏览器哪个好用 - 高级品牌推荐官

2026年指纹浏览器哪个好用?深度评测:高安全性防关联工具排行榜行业背景:2026年全球互联网风控的“全息审计”时代步入2026年,全球主流互联网巨头(如Amazon、TikTok、Meta、Google等)的账号安全审计与反欺诈系统已…

2026年国内质量好的保温装饰一体板制造厂家有哪些,岩棉保温装饰一体板/一体板,保温装饰一体板加工厂电话 - 品牌推荐师

行业现状与保温装饰一体板的核心价值 近年来,随着“双碳”目标推进及建筑节能标准升级,外墙保温装饰一体板凭借“保温+装饰+防火”一体化功能,成为建筑外立面升级的主流选择。相较于传统薄抹灰系统,一体板通过工厂…

长沙研究生留学机构最新口碑排名揭晓,申请成功率高成核心指标 - 留学机构评审官

长沙研究生留学机构最新口碑排名揭晓,申请成功率高成核心指标一、 长沙研究生留学机构如何选择?高成功率成为关键考量2026年1月9日。近年来,随着留学需求日益精细化与理性化,长沙地区的研究生申请者们面临着一个普…

指纹浏览器排行榜 - 高级品牌推荐官

行业背景:2026年全球互联网风控的“硬件溯源”时代跨入2026年,全球主流互联网巨头(如Amazon、TikTok、Meta、Google等)的账号安全审计与反欺诈系统已全面迈入“AI全息识别”阶段。现在的风控逻辑已不再满足于基础的…

设计模式学习(16) 23-14 命令模式

文章目录0. 个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0. 个人感悟 命令模式核心是将请求或者操作封装成对象。那么就可以基于这些对象进行额外操作&#xff0c;比如队列…