跳到主要内容

本地主站 (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 帧 (帧尾 0xDA55 Magic) — 证明帧路径通, 但不做 IO 数据往返。
    • 方式 B — 外部模拟器: README 明说 "p-net 本身是从站协议栈, 模拟器侧需要独立的 PROFINET 控制器实现", 具体工具未落地。
    • 方式 C — 真西门子 PLC: 终态对测 (TIA 组态 + GSDML 导入)。
  • 测试/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 生成的 GSDMLWindows (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 双向交换"):

  1. profinet-py — 免费、轻量、直接吃仓内 GSDML、当天可跑; 风险 = 0.6.1 早期版本 + Windows 软实时抖动 (见 §4.3 应对)。
  2. CODESYS Control Win V3 — 免费注册即可装, demo 2h 窗口够单次测试; PROFINET Controller add-on 若要全功能需付费 (可先用 demo 验证互操作再决定买不买)。
  3. PLCSIM Advanced (试用) — 最贴近真西门子 PLC 行为, 但安装重、授权/试用门槛高。
  4. 真 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 为什么"同一块网卡双侧"不可行

  1. 无物理回环: 网卡发出的帧从 PHY 上到线缆, 不会进入自己的接收路径; 以太网没有发送帧内回环 (IP 层软件 loopback 只对发往本机 IP 的报文有效, 裸 0x8892 帧不适用)。
  2. RJ45 环回插头也救不了: 外部环回插头 (TX→RX 短接) 虽能让网卡收到自己发的帧, 但: ① 设备与主站必须 MAC 不同 (PROFINET 邻居/帧寻址语义), 同一网卡只有一个 MAC; ② 本仓驱动 RequireExclusiveBinding=1 独占绑定该 NIC (NDIS 协议层), 主站软件 (Npcap/CODESYS) 再绑同一网卡会产生抢帧/句柄冲突; ③ 两侧应用在同一物理口互相看见对方和自己的帧, 收发语义混乱。
  3. 结论: 单 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 窗口内完成测试
3CODESYS Control Win 全功能主站PROFINET Controller SL 付费 add-on2~3 天若 profinet-py 与仓内栈互操作不理想, 升 CODESYS; demo 模式先验证再决定购买
4PLCSIM 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. 需要用户决策项

  1. 硬件: 是否同意采购/挪用第二块 USB 以太网卡 (约几十元); 或启用开发机一块 Disconnected 真以太网卡作主站口 (省硬件, 需确认网口物理可用)。
  2. 第三方软件安装授权 (均在测试机或开发机装):
    • 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 试用 — 体积大、授权门槛高。
  3. 主站放哪台机器: 测试机双网卡自连 (方案甲, 最贴近"自己连自己") 还是 开发机主站 ↔ 测试机从站 (方案乙, 复用开发机现网卡)。
  4. 是否已有真西门子 PLC 可用 — 有则真 PLC 路径可直接并行。
  5. 范围确认: 本方案目标是基础互操作 (Connected + IO 双向交换), 不做 72h soak / 核隔离 / 硬实时判定 (沿用测试项目简化级口径)。

6. 资料来源