3. 协议栈概览:OSI模型映射、Stream 4 协议层级、Function 1 功能码定位
在深入读写操作之前,必须建立清晰的协议栈认知。Stream 4 协议并非凭空设计,而是严格映射到 OSI 七层模型中的特定层级。本章将拆解这一映射关系,并精确定位 Function 1 功能码在协议栈中的位置。
3.1 OSI 模型与 Stream 4 协议层级映射
Stream 4 协议栈采用精简分层设计,主要覆盖 OSI 模型的第 1、2、7 层,并依赖 TCP/IP 传输层(第 4 层)作为通信载体。下表展示了完整的映射关系:
| OSI 层 | Stream 4 对应组件 | 职责说明 |
|---|---|---|
| 7 - 应用层 | Function 码 + 对象字典 | 定义操作语义(读/写/诊断),参数寻址 |
| 6 - 表示层 | 数据编码规则 | Little-Endian 字节序,数据类型标记 |
| 5 - 会话层 | 请求-应答事务模型 | 单次事务,超时重传机制 |
| 4 - 传输层 | TCP 或 UDP(端口 502) | 可靠传输或实时传输选择 |
| 3 - 网络层 | IP 路由 | 设备 IP 寻址与路由 |
| 2 - 数据链路层 | Stream 4 帧头 + CRC | 帧定界、错误检测、设备寻址 |
| 1 - 物理层 | RS-485 / 以太网 PHY | 电气特性、连接器、波特率 |
关键认知:Stream 4 协议栈将 OSI 第 5、6 层功能合并到应用层实现,减少协议开销,适合工业实时控制场景。Function 1 位于第 7 层,但依赖第 2 层的帧结构完成数据封装。
3.2 Stream 4 协议层级结构
Stream 4 协议栈从下至上分为四个逻辑层级,每一层都有明确的输入输出接口。下面的 SVG 图展示了完整的层级关系与数据流向:
层级交互规则:应用层生成的 Function 1 请求向下传递时,传输层添加事务头部,数据链路层添加帧头和 CRC,物理层负责比特流传输。接收端逆向解封装,逐层剥离头部,最终将 Function 1 响应交付给应用层。
3.3 Function 1 功能码定位
Function 1 功能码在 Stream 4 协议栈中具有明确的语义和位置。它属于应用层协议数据单元(APDU)的核心组成部分,紧跟在传输层头部之后。下面是 Function 1 在协议帧中的精确偏移位置:
| 字节偏移 | 字段名称 | 长度(字节) | 值 / 说明 |
|---|---|---|---|
| 0 | 事务 ID 高字节 | 1 | 0x00 |
| 1 | 事务 ID 低字节 | 1 | 0x01 ~ 0xFF |
| 2 | 协议标识符 | 2 | 0x0000(Stream 4) |
| 4 | 数据长度 | 2 | 后续字节数 |
| 6 | 功能码 | 1 | 0x01(Function 1) |
| 7 | 起始地址高字节 | 1 | 参数索引高 8 位 |
| 8 | 起始地址低字节 | 1 | 参数索引低 8 位 |
| 9 | 读取数量高字节 | 1 | 连续参数个数 |
| 10 | 读取数量低字节 | 1 | 连续参数个数 |
常见错误:初学者容易将功能码位置误认为字节偏移 0。实际 Stream 4 协议中,功能码位于传输层头部之后(偏移 6),且必须为 0x01 才能触发读参数操作。如果设备返回异常码 0x81(功能码 + 0x80),表示 Function 1 请求不被支持或参数地址越界。
3.4 协议栈数据封装流程
当上位机发起一次 Function 1 读参数请求时,数据经过以下封装步骤。下面的 SVG 流程图展示了完整的封装与解封装过程:
3.5 功能码定位的实践意义
理解 Function 1 在协议栈中的精确位置,对以下开发场景至关重要:
- 抓包分析:使用 Wireshark 或串口监视器时,直接定位字节偏移 6 即可确认操作类型,无需逐字节猜测。
- 异常诊断:当设备返回 0x81 时,说明 Function 1 请求被识别但执行失败,问题出在参数地址或数量字段,而非协议栈下层。
- 跨平台移植:从 RS-485 迁移到以太网时,只需更换物理层和传输层实现,应用层的 Function 1 逻辑完全复用。
- 性能优化:批量读参数时,Function 1 的“读取数量”字段允许一次读取多个连续参数,减少协议栈往返次数。
实践检查清单:在编写 Function 1 读写代码前,请确认以下三点:
1. 功能码 0x01 是否位于发送缓冲区的第 6 字节?
2. 数据链路层 CRC 是否覆盖从功能码到数据载荷的完整区间?
3. 接收端解封装时,是否先验证 CRC 再解析 Function 1 响应?
1. 功能码 0x01 是否位于发送缓冲区的第 6 字节?
2. 数据链路层 CRC 是否覆盖从功能码到数据载荷的完整区间?
3. 接收端解封装时,是否先验证 CRC 再解析 Function 1 响应?
3.6 协议栈映射总结
下表汇总了 OSI 模型、Stream 4 层级与 Function 1 功能码之间的对应关系,作为本章的快速参考:
| OSI 层 | Stream 4 层级 | Function 1 相关要素 | 典型问题 |
|---|---|---|---|
| 应用层 | Function 码 + 对象字典 | 0x01 读参数,参数索引与数量 | 参数地址越界 |
| 传输层 | TCP/UDP 头部 | 事务 ID 匹配请求与响应 | 超时重传丢失 |
| 数据链路层 | 帧头 + CRC | 目标地址确认,CRC 校验 | CRC 计算错误 |
| 物理层 | RS-485 / 以太网 | 波特率 / 双工模式匹配 | 电气噪声干扰 |
掌握协议栈映射关系后,下一阶段将进入 Function 1 的请求帧与响应帧结构详解,包括字节填充规则、异常码定义以及多参数连续读取的地址计算方式。