PROFINET 从站概念
本文档按「简化级」口径说明从站产品涉及的 PROFINET 核心概念,理解这些概念后即可正确使用 SDK 与 GUI。
1. PROFINET IO 角色
PROFINET IO 网络中有三类角色:
| 角色 | 说明 | 本产品 |
|---|---|---|
| IO Controller(IO 控制器) | 通常是 PLC,发起组态与周期通信 | 对方(西门子 PLC / TIA 组态) |
| IO Device(IO 设备) | 现场设备,执行控制器下发的组态 | 本产品(从站) |
| IO Supervisor(IO 监视器) | 工程组态 / 诊断站点 | 可选,TIA 在线诊断 |
IO 数据方向(PROFINET 标准口径):
- Input(输入):从站 → 控制器。从站把现场数据(传感器等)放入输入区,控制器周期读取。
- Output(输出):控制器 → 从站。控制器周期写入输出区,从站执行(驱动执行器等)。
注意:此处的 Input/Output 以 IO 控制器视角命名,与 SDK 地址语义一一对应:I 区(
I0.0/IB0/IW2/ID4,输入面,设备 → 控制器,Write*发送)、Q 区(Q0.0/QB0/QW2/QD4,输出面,控制器 → 设备,Read*读取)。
2. 槽位(Slot)与子模块(Submodule)
PROFINET 设备模型是「设备 → 槽位 → 子模块」三层:
IO Device
├── Slot 0 # 固定:DAP(Device Access Point,设备访问点)
├── Slot 1 ─ Submodule 0x01 # 模块 1(如 8 DI)
│ └── Submodule 0x8001 # 诊断子模块(可选)
├── Slot 2 ─ Submodule 0x01 # 模块 2(如 8 DO)
└── ...
| 概念 | 说明 | 在 SDK / GUI 中 |
|---|---|---|
| Slot(槽位) | 模块安装位置,编号从 0 开始 | 运行配置 XML SlotLayout(SDK 不暴露配置) |
| Module(模块) | 逻辑功能单元(DI / DO / AI / AO / 混合) | GUI SlotView 添加模块 |
| Submodule(子模块) | 模块内可插拔单元,有子槽号与标识 | SubslotNumber / SubmoduleIdent(运行配置 XML) |
| DAP(Slot 0) | 设备访问点,承载设备级诊断与参数 | GUI 固定存在,不可删除 |
GSDML 中每个模块/子模块都有 ModuleIdentNumber / SubmoduleIdentNumber,TIA 组态时据此识别。
3. 过程映像(Process Image)
过程映像 = 输入/输出数据区在从站侧的内存副本,由 PnetProcessImage 维护,是过程数据的唯一数据源:
★ 口径归一(audit-2026-08-14 P0 跨层方向反转修复):全文档以 GSDML 标准语义为准 —
<Input>= 从站 → 控制器(设备发送,PPM 0x0100);<Output>= 控制器 → 从站(设备接收, CPM 0x0200)。实现内部(PnetProcessImage区名 //api/io字段名 / 驱动共享内存区名) 采用应用视角反转命名:内部“Input 区” = 应用从 PDI 收(控制器 → 设备,GSDML 输出方向, 区尺寸 = ΣOutputLength);内部“Output 区” = 应用给 PDI 发(设备 → 控制器,GSDML 输入方向, 区尺寸 = ΣInputLength)。SDK 按标准命名做补偿映射:SDK I 区 ↔ 服务 Output 区(PPM), SDK Q/DB 区 ↔ 服务 Input 区(CPM)。
控制器 ──周期帧(0x8892)──▶ 驱动数据面
│
PPM/CPM 帧解包/封包
│ 共享内存
PnetProcessImage(服务,唯一数据源)
├── Input 区(内部命名):控制器 → 从站 数据(GSDML <Output>,驱动从 CPM 解包后落盘,
│ SDK 地址化 Read*(Q 区)经补偿映射读取)
└── Output 区(内部命名):从站 → 控制器 数据(GSDML <Input>,SDK 地址化
Write*(I 区)经补偿映射写入,由驱动封装进 PPM)
- 应用(SDK / 上位机)只与
PnetProcessImage交互,不直接碰网卡。 - 输入数据(GSDML
<Input>,从站 → 控制器)由应用生产(地址化WriteBool/WriteInt16等 I 区写入),驱动按周期自动发出。 - 输出数据(GSDML
<Output>,控制器 → 从站)由驱动按周期接收落盘,应用通过地址化ReadBool/ReadInt16等(Q 区)消费。
4. 数据一致性(IOPS / IOCS)
PROFINET 用两套状态标志保证周期数据可信:
| 标志 | 全称 | 含义 |
|---|---|---|
| IOPS | IO Provider Status | 数据生产者侧状态:Good / Bad。数据无效时必须标 Bad(如输入区尚无有效数据) |
| IOCS | IO Consumer Status | 数据消费者侧状态:Good / Bad。消费方检查后回写 |
周期帧中每个数据块都带状态字节(PPM/CPM 的 Data Status 与 IOPS/IOCS 字段):
- 发送输入区数据(从站是 Provider)→ 驱动写入 IOPS=Good(数据有效)或 IOPS=Bad(数据无效)。
- 接收输出区数据(从站是 Consumer)→ 驱动记录 IOCS 供应用查询;应用可主动上报输出区 IOCS。
实际影响:若应用长期不写输入区,控制器侧会看到 IOPS=Bad,可能触发控制器诊断「数据无效」。正确做法是启动后持续周期写输入区(可复用上次数据),保证 IOPS=Good。
5. IOCR(IO Connection Resource)
IOCR 描述一条周期通信连接的资源与方向:
| IOCR 类型 | 方向 | 数据内容(GSDML 标准口径;内部区名见 §3 注) | 周期 |
|---|---|---|---|
| PPM(Provider) | 从站 → 控制器 | GSDML <Input> 数据(ΣInputLength)+ IOPS | RT Class 1 常规周期(1 ms 起) |
| CPM(Consumer) | 控制器 → 从站 | GSDML <Output> 数据(ΣOutputLength)+ IOCS | 同上 |
IOCR 生命周期由 P-Net 栈管理(P-Net 栈内部实现),驱动侧维护已建立的 IOCR 收发状态;未建立 IOCR 时周期帧不处理。
6. 通信流程(简化)
1. DCP 发现/配置 控制器经 DCP 发现从站、写 IP/设备名
2. LLDP 邻居发现 从站上报链路邻居(可选)
3. PNIO-CM 连接 控制器发起 AR(Application Relation),协商 IOCR
4. 数据交换 PPM/CPM 周期帧持续收发(含 IOPS/IOCS)
5. 报警/诊断 Alarm 报文(拉模式/推模式)、诊断条目
6. 断开 控制器释放 AR,从站回到待连接状态
运行态语义(服务模式,GET /api/status):state 为设备运行态字符串(Stopped / Initialized / Connecting / Parameterized / Ready / DataExchange / Aborted),connected 表示是否已与 IO 控制器建立周期数据交换(进入 DataExchange 即 true),errorCode 为最近一次 pnet 栈错误码(0 = 无错误;非零语义见各语言 SDK 的 PnetRuntimeErrorCode 枚举:-1 初始化失败 / -2 配置无效 / -3 周期线程失败 / -4 状态非法 / -5 PDI 交换失败)。6 语言 SDK 的服务模式状态查询均透出 connected / errorCode(用户裁定 2026-08-10:错误码是调用契约的一部分,SDK 必须透出服务端 errorCode)。
7. 实时等级边界(R81 真规格口径)
| 能力 | 本产品 | 对比 |
|---|---|---|
| RT Class 1 常规周期 | ✅ 支持(1 ms 起,可配) | 大多数标准从站 |
| IRT / RTC3 | ❌ 不支持 | 运动控制级从站才有 |
| 抖动保障 | 普通线程,常规 DPC 定时器,无硬实时承诺 | 区别于 DarraRT 硬实时线(核隔离 + TSC + soak) |