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 图展示了完整的层级关系与数据流向:

Stream 4 协议层级结构 应用层(第7层) Function 1(读参数) | Function 2(写参数) | 对象字典访问 数据编码:Little-Endian,数据类型标记 传输层(第4层) TCP 端口 502(可靠) / UDP(实时) 事务 ID + 协议标识符 + 长度字段 数据链路层(第2层) 帧头(目标地址 + 源地址 + 长度) | 数据载荷 | CRC32 最大帧长 256 字节,广播地址 0xFF 物理层(第1层) RS-485(双绞线,半双工) / 以太网 100BASE-TX 波特率:9600 / 19200 / 38400 / 115200 bps 数据封装方向
层级交互规则:应用层生成的 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 流程图展示了完整的封装与解封装过程:

Function 1 请求封装与解封装流程 发送端(上位机) 应用层:Function 1 传输层:添加头部 数据链路层:帧封装 物理层:比特流发送 网络传输 TCP / UDP / RS-485 接收端(设备) 物理层:比特流接收 数据链路层:帧解析 传输层:头部剥离 应用层:Function 1

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 响应?

3.6 协议栈映射总结

下表汇总了 OSI 模型、Stream 4 层级与 Function 1 功能码之间的对应关系,作为本章的快速参考:

OSI 层 Stream 4 层级 Function 1 相关要素 典型问题
应用层 Function 码 + 对象字典 0x01 读参数,参数索引与数量 参数地址越界
传输层 TCP/UDP 头部 事务 ID 匹配请求与响应 超时重传丢失
数据链路层 帧头 + CRC 目标地址确认,CRC 校验 CRC 计算错误
物理层 RS-485 / 以太网 波特率 / 双工模式匹配 电气噪声干扰

掌握协议栈映射关系后,下一阶段将进入 Function 1 的请求帧与响应帧结构详解,包括字节填充规则、异常码定义以及多参数连续读取的地址计算方式。