Parameter 状态在 FSoE 连接建立过程中紧随 Connection 状态。其目的是将安全相关通信参数(FSoE watchdog 值)和设备特定的安全相关应用参数从 Master 传输到 Slave。Slave 通过回显安全数据来确认每个 Parameter PDU。由于应用参数可以是任意长度,传输可能跨越多个 FSoE 周期。CRC 继承确保参数传输在所有周期中的安全性和一致性(参见 FSoE:CRC继承是如何工作的?)。
本文依据 ETG.5100 S (D) V1.2.0, §8.2.2.5,使用规范中 4 个字节安全数据和 2 个字节安全相关应用参数的标准示例,该示例需要两个 FSoE 周期。
注意——每个方向的安全数据字节数是固定的。 每个 FSoE 连接具有固定的安全数据长度(Master→Slave 和 Slave→Master),在两端配置相同。允许的长度为 1、2、4、6 或 8 个字节。特定连接的实际长度取决于 FSoE slave 设备,必须从 slave 的文档或设备描述文件(ESI/EEPROM)中获取。下文示例使用规范中的 4 个字节;其他长度的字节布局遵循相同模式(SafeData 字节按顺序填充,最后一个周期中未使用的字节设置为 0)。
何时进入和退出 Parameter 状态?
当 Master 通过发送带有 Parameter 命令的 Safety Master PDU 离开 Connection 状态时,即进入 Parameter 状态。状态转换为:
| 方向 | 条件 |
|---|---|
| Master 退出 Parameter | 已传输完整的通信参数和应用参数集并收到 Slave 的相应确认,随后发送带有 日期 命令的 Safety PDU(进入周期性数据交换)。 |
| Slave 退出 Parameter | 收到来自 Master 的带有 日期 命令的 Safety PDU。 |
如果两端检测到 FSoE 通信错误,也会立即退出 Parameter 状态——此时它们回退到 Reset 状态。
Parameter 状态中传输的安全数据
Parameter 状态中的安全数据结构与之前状态不同。它不使用固定字段集,而是携带一个变长负载,以三个 16 位头部字段开头。ETG.5100 S (D) V1.2.0 的 Table 18 定义了该布局:
| SafetyData 字节 | 描述 |
|---|---|
| 0 | 通信参数长度的低字节(位 0–7),以字节为单位(= 2) |
| 1 | 通信参数长度的高字节(位 8–15),以字节为单位(= 0) |
| 2 | FSoE watchdog 的低字节(位 0–7),以 ms 为单位 |
| 3 | FSoE watchdog 的高字节(位 8–15),以 ms 为单位 |
| 4 | 应用参数长度的低字节(位 0–7),以字节为单位 |
| 5 | 应用参数长度的高字节(位 8–15),以字节为单位 |
| 6 | 安全相关应用参数的第 1 个字节 |
| … | |
| n+5 | 安全相关应用参数的第 n 个字节 |
前两个 16 位字段是通信参数长度(始终为 2,即仅 watchdog 值)和以毫秒为单位的 FSoE watchdog 值。下一个 16 位字段是应用参数长度,后跟应用参数字节本身。FSoE watchdog 和安全相关应用参数通过 FSoE Master 的安全配置器配置。
需要多少个 FSoE 周期?
由于应用参数可以是任意长度,FSoE 周期总数取决于应用参数长度和 Safety PDU 的固定安全数据长度:
$$ \text{cycles} = \left\lceil \frac{6 + \text{appParamLen}}{\text{safetyDataLen}} \right\rceil $$其中 6 对应三个 16 位头部字段(通信参数长度、watchdog、应用参数长度)。如果最后一个 FSoE 周期中不需要所有安全数据字节,未使用的字节应以 0 传输。
对于规范示例(4 个字节安全数据,2 个字节应用参数),总负载为 6 + 2 = 8 个字节,可放入 ⌈8/4⌉ = 2 个 FSoE 周期。第一个周期携带通信参数长度、watchdog,以及本应是应用参数长度的前两个字节——但在本示例中,应用参数长度(2)在第二个周期中与两个应用参数字节一起发送,如下所示。
第一个周期——通信参数
第一个 Safety Master PDU(FSoE Master → Slave)
Master 发送此 PDU 以传输通信参数长度和 FSoE watchdog 值。这是 ETG.5100 S (D) V1.2.0 的 Table 19。
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Parameter 字节 0 | comm. param. len, lo 字节 1 — = 2 | comm. param. len, hi 字节 2 — = 0 | CRC_0_Lo 字节 3 | CRC_0_Hi 字节 4 | watchdog, lo 字节 5 — 单位 ms | watchdog, hi 字节 6 — 单位 ms | CRC_1_Lo 字节 7 | CRC_1_Hi 字节 8 | Connection Id, lo 字节 9 | Connection Id, hi 字节 10 |
要点:
- Command(字节 0)为
Parameter。 - SafeData[0..1](字节 1 和 2)携带以字节为单位的 16 位通信参数长度。始终为 2(小端序:
0x02, 0x00),因为唯一的通信参数是 16 位 watchdog 值。 - SafeData[2..3](字节 5 和 6)携带以毫秒为单位的 16 位 FSoE watchdog 值(小端序)。
- Conn_Id(字节 9 和 10)携带 Connection ID——与 Connection 状态中一样,现在在每个 Safety PDU 中都被填充。
- CRC_0 和 CRC_1 以 16 位小端序值传输。CRC 继承在所有 Parameter 状态周期中保持激活。
第一个 Safety Slave PDU(FSoE Slave → Master,确认)
Slave 通过回显相同的安全数据来确认第一个 Parameter PDU。这是 ETG.5100 S (D) V1.2.0 的 Table 20。
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Parameter 字节 0 | comm. param. len, lo 字节 1 — = 2 | comm. param. len, hi 字节 2 — = 0 | CRC_0_Lo 字节 3 | CRC_0_Hi 字节 4 | watchdog, lo 字节 5 — 单位 ms | watchdog, hi 字节 6 — 单位 ms | CRC_1_Lo 字节 7 | CRC_1_Hi 字节 8 | Connection Id, lo 字节 9 | Connection Id, hi 字节 10 |
第二个周期——应用参数
FSoE Master 在正确收到第一个 Safety Slave PDU 后发送第二个 Safety Master PDU。
第二个 Safety Master PDU(FSoE Master → Slave)
Master 发送此 PDU 以传输应用参数长度和应用参数字节本身。这是 ETG.5100 S (D) V1.2.0 的 Table 21。
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Parameter 字节 0 | app. param. len, lo 字节 1 — = 2 | app. param. len, hi 字节 2 — = 0 | CRC_0_Lo 字节 3 | CRC_0_Hi 字节 4 | app. param. 字节 1 字节 5 | app. param. 字节 2 字节 6 | CRC_1_Lo 字节 7 | CRC_1_Hi 字节 8 | Connection Id, lo 字节 9 | Connection Id, hi 字节 10 |
要点:
- SafeData[0..1](字节 1 和 2)携带以字节为单位的 16 位应用参数长度(小端序)。本例中为 2。
- SafeData[2..3](字节 5 和 6)携带应用参数字节。本例中正好有 2 个字节,填满两个可用位置。
- 如果应用参数长于一个周期中可用的 SafeData 字节,传输将在额外周期中继续,剩余字节放在相同的 SafeData 位置(从下一个周期的 SafeData[0] 开始,在任何剩余头部之后)。最后一个周期中未使用的字节设置为 0。
第二个 Safety Slave PDU(FSoE Slave → Master,确认)
Slave 通过回显相同的安全数据来确认第二个 Parameter PDU。这是 ETG.5100 S (D) V1.2.0 的 Table 22。
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Parameter 字节 0 | app. param. len, lo 字节 1 — = 2 | app. param. len, hi 字节 2 — = 0 | CRC_0_Lo 字节 3 | CRC_0_Hi 字节 4 | app. param. 字节 1 字节 5 | app. param. 字节 2 字节 6 | CRC_1_Lo 字节 7 | CRC_1_Hi 字节 8 | Connection Id, lo 字节 9 | Connection Id, hi 字节 10 |
综合起来:Parameter 状态交换
Parameter 状态是一个多周期回显握手。每个周期遵循相同模式:
- Master → Slave: Safety Master PDU,
Command = Parameter,在 SafeData 字段中携带参数负载的下一个分块。 - Slave → Master: Safety Slave PDU,
Command = Parameter,回显相同的安全数据。
Master 仅在正确收到 Slave 对前一周期的确认后才发送下一个周期。传输持续,直到所有通信参数和应用参数发送完毕。一旦 Master 传输完完整参数集并收到最终确认,它就通过发送带有 日期 命令的 Safety PDU 离开 Parameter 状态——这将连接转入周期性数据交换。如果任一端在交换期间检测到 FSoE 通信错误,双方都回退到 Reset 状态。
为什么 CRC 继承在 Parameter 状态中很重要?
由于参数传输跨越多个 FSoE 周期,CRC 继承将各个 PDU 绑定为单一安全相关传输。每个周期的 CRC 不仅基于当前 PDU 的字节计算,还基于前一 PDU 的 CRC 计算——形成一条接收方可以端到端验证的链。如果序列中任何 PDU 被损坏、丢失或重排序,CRC 链断裂,接收方检测到错误。这就是规范指出"CRC 继承确保安全且一致的参数传输"的原因。算法细节参见 FSoE:CRC继承是如何工作的?。
总结
在 Parameter 状态下,FSoE Safety PDU 携带一个变长参数负载,以三个 16 位字段开头:通信参数长度(始终为 2)、以毫秒为单位的 FSoE watchdog 值、应用参数长度。应用参数字节紧随其后。由于负载可能超过 PDU 的固定安全数据长度,传输可能跨越多个 FSoE 周期,最后一个周期中未使用的字节设置为 0。Slave 通过回显安全数据来确认每个周期。所有周期的 CRC 继承确保完整参数传输的安全性和一致性。当 Master 发送 日期 命令时,连接离开 Parameter 状态,进入周期性数据交换。
参考文献
- ETG.5100 S (D) V1.2.0, §8.2.2.5 Parameter state, Tables 18–22.
相关文章
概述与基础
- FSoE 这个缩写究竟是什么意思? — FSoE 缩写的含义
- 通过示例解析 FSoE 帧结构 — 通用 Safety PDU 布局
- FSoE 状态机的所有状态 — FSoE 的五个状态及其转换
- FSoE:安全 PDU 命令表 — FSoE 命令完整列表
按状态划分的 PDU 结构
- FSoE Reset State PDU:Master 与 Slave 结构 — Reset 状态的 PDU 布局和错误代码
- FSoE Session PDU:Master 与 Slave 结构 — Session 状态的 PDU 布局
- FSoE Connection PDU:Master 与 Slave 结构 — Connection 状态的 PDU 布局
- FSoE 日期 PDU:Master 与 Slave 结构 — 日期 状态的 PDU 布局
- FSoE Reset PDU:Master 与 Slave 结构 — 所有安全数据长度的字节布局
CRC
- FSoE CRC:使用哪个多项式? — FSoE CRC 背后的 17 位多项式
- FSoE:CRC 表是如何构造的? — CRC 查找表的生成方式
- FSoE:CRC继承是如何工作的? — CRC 链如何链接连续的 PDU
- 如何计算FSoE PDU的CRC校验和? — 逐字节 CRC 计算算法
错误代码与数据格式
- FSoE:所有通信错误代码列表 — 所有 FSoE 通信错误代码
- FSoE:数据以小端序还是大端序传输? — 多字节字段的字节序