本地主站 (PROFINET IO Controller) 测试方案
只读调研文档 (2026-08-14)。回答用户问题: "你有主站模拟器吗" / "模拟一下是否可以开发机自己连接自己 IO"。 本文档只做调研落档, 不含任何代码改动。
0. 结论速览
| 问题 | 答案 |
|---|---|
| 仓内有没有主站模拟器? | 没有。p-net (rt-labs) 是纯从站 (IO Device) 协议栈, 无 Controller 角色; SDK/服务/GUI 全部只面向设备侧; 测试目录只有对测说明, 无主站工具 |
| 开发机能否"自己连自己"测 IO? | 能, 但不是单网卡回环。正确拓扑 = 同一台机器上两块独立物理网卡 (设备侧 1 块 + 主站侧 1 块), 交叉线/小交换机直连; 同一块网卡双侧不可行 (见 §4.2) |
| 最简可行方案 | 测试机 (已装驱动/服务的那台) 再加一块 USB 网卡当主站口 + 免费软主站 profinet-py (或 CODESYS Control Win V3 demo), 零授权成本, 当天可搭 |
| 需要用户决策 | ① 是否采购第二块 USB 网卡 ② 是否允许安装第三方软件 (Npcap / profinet-py / CODESYS) ③ 主站放测试机还是开发机 (见 §6) |
1. 仓内资产盘点 (结论: 无主站侧资产)
1.1 vendored p-net 栈 — 纯从站, 无 Controller 角色
Darra_Pnet_Core/ThirdParty/p-net/ (rt-labs p-net 协议栈):
- 栈自身 README 第一句即定性: "Profinet device stack for embedded systems"; 特性 = PROFINET v2.43, Conformance Class A/B, Real Time Class 1 — 全部是设备侧能力。
- 全仓 grep
PNET_ROLE_CONTROLLER/controller_role/io_controller= 0 命中; pnet_api.h 中所有 "controller" 字样均指对端主站 (如 "Connect request from the Profinet controller" 是设备侧收到的事件)。 - 状态机模块 (
src/下cmina/cmdev/cpm/csm/cmsu等) 全是从站侧状态机 (CMDEV=设备上下文管理, CPM=从站参数化/看门狗)。 tools/仅clean_no_alarm.sh(清理脚本), 无主站模拟工具;test/是从站栈单元测试 (mocks 模拟对端控制器发帧给从站, 不是主站实现)。
1.2 Darra_Pnet_Core / Service / SDK / GUI — 全设备侧
| 位置 | 内容 | 主站能力 |
|---|---|---|
Darra_Pnet_Core/main/core/ | 从站 wrapper: pnet_stack / pnet_dcp / pnet_iocr / pnet_gsdml / pnet_alarm / pnet_slot | 无 |
Darra_Pnet_Kernel/Windows/Pnet/ | 驱动: 0x8892/0x88CC 帧编解码、周期 PPM/CPM 循环、共享内存 — 全部从站侧 | 无 |
Darra_Pnet_Service/ | 服务 (HTTP 18840 固定端口): status/io/启停 — 设备侧服务模式 | grep PnetController/ControllerMode/MasterMode = 0 命中 |
Darra_Pnet_SDK/ (6 语言) | 设备侧 SDK (服务模式主路径 + Python native 直连) | 无 |
Darra_Pnet_GUI/ | 设备配置上位机 (GSDML/槽位/IO 编辑) | 无 |
1.3 测试目录 — 只有"对测说明", 无主站工具
测试项目/TEST_Pnet_Sim/README.md已登记主站侧对测三方式 (均需测试机, 2026-08-07 全部如实 SKIP):- 方式 A — 抓包验证 (无需任何主站): Wireshark 过滤
ethertype 0x8892, 看从站周期 PPM 帧 (帧尾0xDA55Magic) — 证明帧路径通, 但不做 IO 数据往返。 - 方式 B — 外部模拟器: README 明说 "p-net 本身是从站协议栈, 模拟器侧需要独立的 PROFINET 控制器实现", 具体工具未落地。
- 方式 C — 真西门子 PLC: 终态对测 (TIA 组态 + GSDML 导入)。
- 方式 A — 抓包验证 (无需任何主站): Wireshark 过滤
测试/sdktest-license.mjs: 授权后台测试, 与主站无关。工具/: build-all.ps1 / NetCfgInstall — 构建与装驱动工具, 无主站侧工具。
1.4 结论
仓内没有主站模拟器资产; SDK 只面向设备侧服务 (确认)。 主站侧必须外求 (§2) 或买真 PLC。
2. 外部主站方案对比表
| 方案 | 免费? | 主站能力 | 平台/前置 | 来源 |
|---|---|---|---|---|
| profinet-py | ✅ 免费 (GPL-3.0 / 商用双许可; 仅作内部测试使用无问题, 不得进产品) | IO Controller 库 + CLI: DCP 发现/设名/IP、AR + IO CR 建立 (DCE/RPC)、周期 IO RTC1 (状态机/双缓冲/看门狗)、报警、诊断解析、--gsdml 直接导入本仓 GUI 生成的 GSDML | Windows (Npcap "WinPcap 兼容模式" + 管理员) / Linux (AF_PACKET); Python 3.10+; v0.6.1 早期版本, 互操作需实测 | github.com/f0rw4rd/profinet-py, pip install profinet-py |
| CODESYS Development System + Control Win V3 | ⚠️ IDE 免费; Control Win 运行时无授权 demo 模式仅 2 小时 (到点重启); PROFINET Controller SL 是付费 add-on (数百欧元级, 官方 Store) | 完整软 PLC 主站: PROFINET Controller (官方规格支持 Windows/Linux/VxWorks/WinCE, Windows Control Win V3 可当主站), 全组态/编程/IO 数据面 | Windows 10/11 x64; ≥3.5.19.0 起需 Npcap (旧 WinPcap 不行); 需改 CODESYSControl.cfg 指定适配器名 + 关防火墙; 软实时 (无硬实时) | us.store.codesys.com (注册免费账号下载 IDE) |
| SIMATIC S7-PLCSIM Advanced (V5.0/V6.0) | ❌ 付费浮动授权 (有试用); 需 TIA Portal (TIA 有 21 天试用) | 虚拟 S7-1500 / ET 200SP 主站, 真 PROFINET 网络功能 (实例可绑真网卡), 虚拟以太网适配器真 TCP/IP; 基础授权 2/16 实例 | Windows; GB 级安装; SIOS 下载 | SIOS 西门子支持 |
| 真西门子 PLC (S7-1200/1500) | ❌ 硬件成本 | 最真实主站 (终态对测 = TEST_Pnet_Sim 方式 C) | 已有硬件 + TIA 组态 | 用户手头硬件 |
| openPLC | ✅ 免费 | ❌ 不支持 PROFINET (仅 Modbus / EtherNet/IP / DNP3 等) — 排除 | — | openplcproject.com |
| 仓内 p-net (rt-labs) | GPL-3.0/商用 | ❌ 纯从站栈, 无 Controller 角色 — 排除 | — | github.com/rtlabs-com/p-net |
备注: 另有一些小工具 (pn-tools / profinet-io-communication 等, ~10-16 star) 功能碎片化, 不推荐; TwinCAT + TF6271 PROFINET Master 是另一条付费路线 (需 Beckhoff 授权), 不展开。
推荐排序 (按"测试目的 = 让本仓从站 Connected + IO 双向交换"):
- profinet-py — 免费、轻量、直接吃仓内 GSDML、当天可跑; 风险 = 0.6.1 早期版本 + Windows 软实时抖动 (见 §4.3 应对)。
- CODESYS Control Win V3 — 免费注册即可装, demo 2h 窗口够单次测试; PROFINET Controller add-on 若要全功能需付费 (可先用 demo 验证互操作再决定买不买)。
- PLCSIM Advanced (试用) — 最贴近真西门子 PLC 行为, 但安装重、授权/试用门槛高。
- 真 PLC — 终态。
3. 本地自连拓扑
方案甲 — 测试机双网卡自连 (零额外设备, 只需再加一块 USB 网卡):
┌────────────────────── 测试机 (已装 DarraRT_Pnet.sys + 服务) ──────────────────────┐
│ │
│ [设备侧] USB 以太网卡 A ── DarraRT_Pnet.sys 经 IOCTL_PNET_BIND_ADAPTER │
│ │ (RequireExclusiveBinding=1, 独占) │
│ │ NDIS 协议收发裸 L2: 0x8892 (RT/非周期) + 0x88CC │
│ │ │
│ │ ═══ 交叉线 或 小交换机 (同一 L2 广播域, 不过任何路由器) ═══ │
│ │ │
│ [主站侧] USB 以太网卡 B (新增) ── 主站软件独占 (Npcap 发裸帧 / CODESYS) │
│ │ DCP 发现 (0x8892 广播) → 设设备名/IP → Connect → AR/IO CR │
│ │ → 周期 IO RTC1 双向交换 (主站写输出 → 从站输入; 从站输出 → 主站) │
│ │
│ 判据: 服务日志/共享内存 Connected=1 + Heartbeat 递增 + ActiveIocr>0; │
│ /api/io 双向读写一致 (TEST_Pnet_Sim §对测判据 复用) │
└────────────────────────────────────────────────────────────────────────────────────┘
方案乙 — 开发机当主站 + 测试机当从站 (跨机, 不违反"开发机不装驱动"铁律):
┌────────── 开发机 ──────────┐ ┌────── 测试机 ──────┐
│ [主站] USB 以太网 2 (100M) │──直连/交换机──│ [从站] 设备网卡 │
│ profinet-py / CODESYS Win │ 同一 L2 段 │ DarraRT_Pnet + 服务 │
└────────────────────────────┘ └─────────────────────┘
前提: 两台机器的这两块网卡物理同段直连 (网线可达); 不能走 WiFi/路由器跨网段
(DCP 是链路层广播 + RT 裸帧, 不过三层路由)。
3.1 帧路径可行性 (为什么双 NIC 直连可行)
- PROFINET RT 周期帧 = 裸 L2 帧 (EtherType 0x8892, 帧内带 frame_id 与 VLAN 优先级标签), 根本不进 IP 栈, 不需要双方"IP 连通"。
- 两块独立网卡各有独立 PHY/线缆路径, 全双工以太网双向同时收发: 设备帧从卡 A 出线 → 卡 B 收到; 主站帧从卡 B 出线 → 卡 A 收到。这就是 PROFINET 真实部署的最小形态, 与两台真设备互连完全同构。
- 补充: DCP (0x8892) 走链路层广播, 同段可达; 非周期 RPC (AR 建立/读写记录) 走 UDP/IP — 两块卡各配一个同网段 IP 即可 (Npcap/CODESYS 都能自动配); LLDP (0x88CC) 同段可达。
- 本仓驱动侧已为此设计:
IOCTL_PNET_BIND_ADAPTER绑定指定网卡, 帧分类在DarraRT_Pnet_Frame.c(0x8892 周期/非周期 + 0x88CC 分类) — 对"对端是谁"无要求, 任何真主站均可互连。
3.2 为什么"同一块网卡双侧"不可行
- 无物理回环: 网卡发出的帧从 PHY 上到线缆, 不会进入自己的接收路径; 以太网没有发送帧内回环 (IP 层软件 loopback 只对发往本机 IP 的报文有效, 裸 0x8892 帧不适用)。
- RJ45 环回插头也救不了: 外部环回插头 (TX→RX 短接) 虽能让网卡收到自己发的帧, 但: ① 设备与主站必须 MAC 不同 (PROFINET 邻居/帧寻址语义), 同一网卡只有一个 MAC; ② 本仓驱动
RequireExclusiveBinding=1独占绑定该 NIC (NDIS 协议层), 主站软件 (Npcap/CODESYS) 再绑同一网卡会产生抢帧/句柄冲突; ③ 两侧应用在同一物理口互相看见对方和自己的帧, 收发语义混乱。 - 结论: 单 NIC 双侧 = 不可行; 双物理 NIC 是唯一正确拓扑 (这也是所有 PROFINET 主站软件自身的要求 — 每个角色独占一个网络接口)。
3.3 开发机现有网卡盘点 (2026-08-14 Get-NetAdapter 实测)
| 网卡 | 类型/状态 | 能否当主站口 | 说明 |
|---|---|---|---|
| 以太网 2 (USB, 100 Mbps, Up, MAC 70-19-88-73-6E-DF) | 真以太 / Up | ✅ 能 (唯一可用主站口) | 注意: 此卡历史上用于 EtherCAT 测试绑卡; 当 PNET 主站口时需空闲 (必要时另插一块 USB 网卡) |
| WLAN 2 (1.2 Gbps, Up) | 无线 / Up | ❌ 不能 | 802.11 帧不承载 PROFINET RT 裸以太网帧 (需专用 PROFINET over WLAN/iPCF 扩展, 不在范围) |
| VMware VMnet1 / VMnet8 | 虚拟 / Up | ❌ 不能直接当主站口 | 只通 主机↔VM, 帧出不了物理线; 仅可作"VM 跑主站 + 桥接到物理卡"中转, 不推荐 |
| Mihomo TUN | 虚拟 / Up | ❌ 不能 | 纯虚拟隧道 |
| 本地连接 / 以太网 3~7 (若干 Disconnected) | 真以太 / 断开 | 备用 | 可尝试启用其中一块真以太网卡作主站口 (省一块 USB 网卡) |
结论: 开发机当前只有 1 块 Up 的真以太网卡 — 当主站够用 (主站只需 1 块); 但开发机不装从站驱动 (项目铁律), 所以"开发机自己连自己"的完整闭环 (驱动从站) 只能在测试机做: 测试机双网卡自连 (方案甲), 或开发机主站 ↔ 测试机从站 (方案乙)。
4. 推荐路径 (按成本/速度排序)
| # | 路径 | 成本 | 速度 | 说明 |
|---|---|---|---|---|
| 1 | 测试机双网卡 + profinet-py | 一块 USB 网卡 (~几十元) + Npcap 免费 | 当天 | 在已装驱动/服务的测试机上, 插第二块 USB 网卡当主站口, 两卡交叉线直连; pip install profinet-py → CLI profinet -i <卡B名> discover → --gsdml <仓内 GSDML> cyclic <设备名>; 判据同 TEST_Pnet_Sim |
| 2 | 开发机主站 + 测试机从站 (profinet-py 或 CODESYS Win demo) | 0 硬件 (开发机以太网 2 空闲时) / 软件免费 | 当天~1 天 | 两机网卡同段直连; 开发机只跑主站软件, 不违反"开发机不装驱动"铁律; CODESYS 路径 = 注册免费账号装 IDE + Control Win, 组态 PROFINET Controller, demo 2h 窗口内完成测试 |
| 3 | CODESYS Control Win 全功能主站 | PROFINET Controller SL 付费 add-on | 2~3 天 | 若 profinet-py 与仓内栈互操作不理想, 升 CODESYS; demo 模式先验证再决定购买 |
| 4 | PLCSIM Advanced (试用) | TIA + PLCSIM Advanced 试用授权, GB 级安装 | 数天 | 最贴近真西门子 PLC 行为; 适合发布前终态验证 |
| 5 | 真西门子 PLC | 硬件 | — | 终态 (TEST_Pnet_Sim 方式 C), 已有 PLC 时优先级提至 2 |
4.1 关键风险与应对
| 风险 | 应对 |
|---|---|
| Windows 主站软实时抖动 → 周期帧超时触发从站看门狗 (从站 3 周期判掉线, 进 SAFE 态) | profinet-py 默认 32ms 周期, 可调 (--cycle-ms); 从站侧看门狗 factor 放宽 (周期范围 1ms~1s, IOCTL_PNET_CONFIGURE_DEVICE); 开发/测试用途软实时即可, 不做硬实时判定 (项目简化级口径) |
| profinet-py (0.6.1) 与仓内 p-net 栈互操作未验证 | 先跑 DCP discover → 最小 GSDML (basic-slave) cyclic 冒烟; 失败再切 CODESYS demo 交叉验证 (定位是谁的问题) |
| Npcap 装错模式 (未开 WinPcap 兼容模式) 发不了帧 | 安装时勾选 "WinPcap API-compatible Mode"; 以管理员运行主站 |
| 从站网卡被其他协议占用 (NIC 独占铁律) | 主站/从站两块卡分开; 卡 B 上不绑 DarraRT_Pnet, 卡 A 上不装主站软件 |
| profinet-py GPL-3.0 | 仅内部测试使用, 不进产品/不随发布链分发 (发布链已有独立约束) |
5. 需要用户决策项
- 硬件: 是否同意采购/挪用第二块 USB 以太网卡 (约几十元); 或启用开发机一块 Disconnected 真以太网卡作主站口 (省硬件, 需确认网口物理可用)。
- 第三方软件安装授权 (均在测试机或开发机装):
- Npcap (免费, WinPcap 兼容模式) — profinet-py 与 CODESYS Windows 版共同前置;
- profinet-py (
pip install) — 免费, GPL-3.0 测试用途; - CODESYS IDE + Control Win V3 — 免费注册账号下载 (store.codesys.com), 运行时 demo 模式;
- (可选) PLCSIM Advanced + TIA Portal 试用 — 体积大、授权门槛高。
- 主站放哪台机器: 测试机双网卡自连 (方案甲, 最贴近"自己连自己") 还是 开发机主站 ↔ 测试机从站 (方案乙, 复用开发机现网卡)。
- 是否已有真西门子 PLC 可用 — 有则真 PLC 路径可直接并行。
- 范围确认: 本方案目标是基础互操作 (Connected + IO 双向交换), 不做 72h soak / 核隔离 / 硬实时判定 (沿用测试项目简化级口径)。
6. 资料来源
- 仓内:
Darra_Pnet_Core/ThirdParty/p-net/README.md(device stack 定性),测试项目/TEST_Pnet_Sim/README.md,测试项目/TEST_Driver/README.md(BIND_ADAPTER 独占绑定),Darra_Pnet_Kernel/Windows/Pnet/DarraRT_Pnet.inf/DarraRT_Pnet_Frame.c(0x8892/0x88CC 帧路径),测试项目/README.md(测试口径)。 - 外部:
- profinet-py (f0rw4rd) — IO Controller 库/CLI, GSDML + Npcap 支持
- CODESYS PROFINET Controller SL 官方 Store + RN Embedded 产品页 — 平台/授权
- CODESYS Forge: Control Win V3 as Profinet device — Windows Npcap 前置
- CODESYS 下载指南 + Control Win 定价/限制 — IDE 免费 / demo 2h
- S7-PLCSIM Advanced V6.0 授权信息 + 中文介绍 — 浮动授权/试用
- OpenPLC 协议支持 (无 PROFINET)
- rt-labs p-net (纯从站)