3. IO-Link协议分层与报文结构
IO-Link 虽然物理上只用一根 C/Q 线,但它并不是“一根线随便传点数据”的简单接口,而是一套严格分层的串行通信协议。理解它的分层结构,是后续开发设备固件、调试通信故障、设计参数化流程的基础。IO-Link 协议在逻辑上划分为三层:物理层(Physical Layer)、数据链路层(Data Link Layer)和应用层(Application Layer)。每一层各司其职,层与层之间通过明确的接口交互,这种划分让设备开发者可以聚焦于某一层的问题,而不必每次都从电气信号一路查到应用语义。
三层结构的分工
物理层负责电气与信号层面的定义:采用 24V 供电、C/Q 单线双向传输、符合 IEC 61131-2 的数字输入输出电平特性,并规定了 UART 的波特率(COM1 为 4.8 kbit/s、COM2 为 38.4 kbit/s、COM3 为 230.4 kbit/s)。物理层还定义了唤醒信号(Wake-up)的时序,以及 C/Q 线在 SIO 模式与 SDCI 模式之间的切换条件。
数据链路层负责帧的封装、寻址、差错检测与重传。它把上层要发送的数据打包成 M 序列(M-sequence),加上校验字段,通过 UART 帧格式发送出去,并在接收端完成校验与应答。数据链路层还管理通信的启动、周期数据交换的节奏以及通信超时后的恢复。
应用层则定义设备参数、过程数据、事件、诊断信息以及 ISDU(Indexed Service Data Unit)的读写语义。应用层不关心信号怎么翻转,只关心“读哪个索引”“写什么参数”“过程数据代表什么物理量”。
M 序列与 UART 帧格式
数据链路层最核心的概念是 M 序列(M-sequence)。一次 IO-Link 报文交换由主站发起,M 序列就是主站发出的请求帧结构。它通常包含:MC(Master Command),指明本次操作类型(读、写、周期数据交换等);CKT(Checksum Type),指明校验类型;数据字段,承载过程数据或 ISDU 内容;以及 CKS(Checksum),用于差错检测。设备收到 M 序列后,返回对应的应答帧,主站据此判断通信是否成功。
M 序列最终要通过 UART 帧发送。IO-Link 的 UART 帧是标准异步串行格式:1 个起始位、8 个数据位、1 个停止位,无奇偶校验(校验由 CKS 承担)。这意味着开发者用普通 UART 外设即可实现物理层收发,但必须严格遵守波特率与位时序,否则会出现帧错误。下面是一段典型的帧参数配置示例:
UART 配置(IO-Link 设备侧)
波特率 : 38400 bps (COM2)
数据位 : 8
停止位 : 1
校验位 : None
流控 : None
电平 : 24V C/Q,经收发器转换为 MCU 的 3.3V TTL
C/Q 与 DI/DO 信号复用
IO-Link 最巧妙的设计之一,是让 C/Q 线同时兼容传统数字输入/输出和 IO-Link 通信。上电后,主站端口默认处于 SIO 模式,此时 C/Q 表现为普通 DI/DO:设备可以像标准传感器一样输出开关量,主站也可以读取其电平。当主站需要进入 IO-Link 通信时,会先发送 唤醒信号(Wake-up),设备检测到该信号后切换到 SDCI 模式,双方开始 UART 通信。通信结束后,端口可退回 SIO 模式。这种复用让 IO-Link 设备能向下兼容传统布线,降低改造成本。
校验、错误处理与周期/非周期通信
IO-Link 的差错检测主要依靠 CKS 校验和。主站与设备各自计算校验值并比对,不一致则判定该帧无效。数据链路层还定义了超时机制:若设备在规定时间内未应答,主站会重试或报通信错误。常见错误包括校验失败、帧错误、超时、设备未就绪等,设备端应通过事件机制上报诊断信息。
通信在时间上分为两类:周期通信用于过程数据交换,主站按固定周期读取设备的过程数据(如测量值、状态字),保证实时性;非周期通信用于参数读写、ISDU 访问、事件上报等,按需发起,不占用固定时隙。两者复用同一条 C/Q 链路,由数据链路层调度。
| 对比项 | 周期通信 | 非周期通信 |
|---|---|---|
| 典型用途 | 过程数据(PD)交换 | 参数读写、ISDU、事件 |
| 触发方式 | 主站按固定周期轮询 | 按需发起 |
| 实时性 | 高,周期稳定 | 较低,可容忍延迟 |
| 数据方向 | 设备→主站为主,可双向 | 双向读写 |
| 典型帧 | 过程数据 M 序列 | ISDU 读写 M 序列 |
案例与常见误区
假设一个 IO-Link 温度变送器,周期通信每 2 ms 上报一次温度过程数据,同时主站偶尔通过 ISDU 读取其量程参数。若开发者把 ISDU 读写也塞进周期时隙,会导致过程数据抖动甚至超时。正确做法是让数据链路层区分两类服务,周期数据优先,非周期服务在空闲时隙插入。
复盘来看,掌握三层划分后,排障可以分层进行:先确认物理层波特率与电平是否正常,再检查数据链路层 M 序列与 CKS 是否正确,最后核对应用层索引与数据类型是否匹配。这种分层思路能显著缩短设备开发与现场调试的时间。