Reset 状态是每个 FSoE(Fail Safe over EtherCAT)连接的入口点。连接在上电后、重启(reset connection)后,或检测到 FSoE 通信错误后进入此状态。连接处于此状态期间,不交换任何用户安全数据——Safety PDU 被重新用于携带 Reset 命令以及一个单字节错误代码,告知对端为什么连接被复位。
本文依据 ETG.5100 S (D) V1.2.0, §8.2.2.2,使用规范中 4 个字节安全数据的标准示例,讲解三种 Reset 状态 PDU。完整的 2/4/6/8 字节布局见 FSoE Reset PDU:Master 与 Slave 结构。
注意——每个方向的安全数据字节数是固定的。 每个 FSoE 连接具有固定的安全数据长度(Master→Slave 和 Slave→Master),在两端配置相同。允许的长度为 1、2、4、6 或 8 个字节。特定连接的实际长度取决于 FSoE slave 设备,必须从 slave 的文档或设备描述文件(ESI/EEPROM)中获取。下文示例使用规范中的 4 个字节;其他长度的字节布局见 FSoE Reset PDU:Master 与 Slave 结构。
注意——唯一相关的数据字节是错误代码。 在每个 Reset 状态 PDU 中,
SafeData[0](字节 1)是唯一携带任何含义的安全数据字节:
0x00——有意的复位(上电、重启 / reset connection),或 Slave 对 Master Reset 的确认。- 非零——触发复位的 FSoE 通信错误代码(参见下文 Table 28)。
所有其他 SafeData 字节未使用,必须设置为 0。 Conn_Id 字段同样未使用(设置为 0)——它仅在连接建立后才被检查。CRC 字段仍然传输且仍必须校验通过,但它们从复位初始状态计算,因为序列号和继承的 CRC 在进入 Reset 时被清零(参见 FSoE:CRC继承是如何工作的? 和 如何计算 FSoE PDU 的 CRC 校验和?)。
何时进入和退出 Reset 状态?
Reset 状态在上电或通信错误后重新初始化 FSoE 连接。进入时复位两项内容:
- 序列号,以及
- 用于 CRC 计算的上一电报的 CRC(即 CRC 继承链被中断)。
状态转换是非对称的,反映了 Master/Slave 角色:
| 方向 | 条件 |
|---|---|
| Master 退出 Reset | 它发送带有 Session 命令的 Safety Master PDU 给 Slave。 |
| Slave 退出 Reset | 它接收带有 Session 命令的有效 Safety Master PDU。 |
换言之,Master 通过发出 Session 命令离开 Reset,Slave 在接受该 Session PDU 后即离开 Reset。当双方都仍在 Reset 时,它们交换携带 Reset 命令的 Safety PDU,如下所示。
Master Reset PDU(FSoE Master → Slave)
Master 在重启后或检测到 FSoE 通信错误后发送此 PDU。下例为 ETG.5100 S (D) V1.2.0 中针对 4 个字节安全数据的 Table 10。
| 命令 | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Reset 字节0 | 错误代码 字节1 — 重启时为 0 | 0 字节2 — 未使用 | CRC_0_Lo 字节3 | CRC_0_Hi 字节4 | 0 字节5 — 未使用 | 0 字节6 — 未使用 | CRC_1_Lo 字节7 | CRC_1_Hi 字节8 | 0 字节9 — 未使用 | 0 字节10 — 未使用 |
要点:
- Command(字节 0)为
Reset。 - SafeData[0](字节 1)携带错误代码(位 0–7)。值
0x00表示普通重启 / reset connection;任何非零值标识触发复位的通信错误(参见下表)。 - 所有其他 SafeData 字节未使用且设置为 0。
- CRC_0 和 CRC_1 仍以 16 位小端序值传输,但由于序列号和继承的 CRC 在进入时已复位,它们从复位初始状态计算——而非从前一帧链接。
- Conn_Id 在 Reset 状态中未使用且设置为 0。连接 ID 仅在连接建立后才被检查。
Slave Reset PDU——确认 Master Reset(FSoE Slave → Master)
当 Slave 收到 Master 的有效 Reset 命令时,它通过发送带有 Reset 命令且所有 SafeData 字节设置为 0的 Safety Slave PDU 来确认——包括错误代码位置。这是 ETG.5100 S (D) V1.2.0 的 Table 11。
| 命令 | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Reset 字节0 | 0 字节1 — 确认 | 0 字节2 | CRC_0_Lo 字节3 | CRC_0_Hi 字节4 | 0 字节5 | 0 字节6 | CRC_1_Lo 字节7 | CRC_1_Hi 字节8 | 0 字节9 — 未使用 | 0 字节10 — 未使用 |
与 Master Reset PDU 的唯一区别是 SafeData[0] 始终为 0——Slave 在确认时不回显错误代码。此位置上的零错误代码正是 Master 用来识别确认的标志。
Slave Reset PDU——Slave 发起的复位(FSoE Slave → Master)
Slave 本身也可以发起 Reset,无论是在重启(reset connection)期间,还是在检测到本地错误时。此时它发送一个结构与 Master Reset PDU 相同的 Safety Slave PDU:设置 Reset 命令,SafeData[0] 携带 Slave 自己的错误代码(普通重启时为 0x00)。这是 ETG.5100 S (D) V1.2.0 的 Table 12。
| 命令 | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Reset 字节0 | 错误代码 字节1 — 重启时为 0 | 0 字节2 — 未使用 | CRC_0_Lo 字节3 | CRC_0_Hi 字节4 | 0 字节5 — 未使用 | 0 字节6 — 未使用 | CRC_1_Lo 字节7 | CRC_1_Hi 字节8 | 0 字节9 — 未使用 | 0 字节10 — 未使用 |
Master 确认此 Slave 发起的 Reset 不是通过发送另一个 Reset PDU,而是通过离开 Reset 状态:它发送带有 Session 命令的 Safety Master PDU,这是双方转换出 Reset 的信号。
综合起来:Reset 状态交换
上述三种 PDU 构成一个小型握手,取决于谁发起了复位:
- Master 发起的复位: Master 发送 Reset(带错误代码)→ Slave 以 Reset 确认(SafeData = 0)→ Master 发送 Session 离开 Reset。
- Slave 发起的复位: Slave 发送 Reset(带错误代码)→ Master 发送 Session 离开 Reset(这是 Master 的确认)。
在两种情况下,连接仅在 Master 发出 Session 命令时才离开 Reset 状态;在此之前,线上每个 PDU 都携带 Reset 命令,Conn_Id 字段为 0,唯一有意义的负载是 SafeData[0] 中的单字节错误代码。
FSoE 通信错误代码(Table 28)
Reset PDU 中 SafeData[0] 携带的错误代码取自下表。值 0x00 表示"无错误"——即本地复位或 Reset 命令的确认。代码 1–11 由标准定义;0x80–0xFF 保留给设备特定的 SafePara 错误。
| 错误代码 | 描述 |
|---|---|
| 0 | 本地复位或 RESET 命令的确认 |
| 1 | 意外命令 (INVALID_CMD) |
| 2 | 未知命令 (UNKNOWN_CMD) |
| 3 | 无效连接 ID (INVALID_CONNID) |
| 4 | CRC 错误 (INVALID_CRC) |
| 5 | Watchdog 超时 (WD_EXPIRED) |
| 6 | 无效 FSoE Slave Address (INVALID_ADDRESS) |
| 7 | 无效安全数据 (INVALID_DATA) |
| 8 | 无效通信参数长度 (INVALID_COMMPARALEN) |
| 9 | 无效通信参数数据 (INVALID_COMPARA) |
| 10 | 无效应用参数长度 (INVALID_USERPARALEN) |
| 11 | 无效应用参数数据 (INVALID_USERPARA) |
| 0x80–0xFF | 无效 SafePara(设备特定) |
总结
在 Reset 状态下,FSoE Safety PDU 实际上是一个单字节诊断信封:Command 字段为 Reset,SafeData[0] 携带错误代码(确认时为 0),所有其他 SafeData 字节和 Conn_Id 字段为 0,CRC 从复位初始状态重新计算,因为序列号和继承的 CRC 在进入时都已清零。连接仅在 Master 发送 Session 命令时离开 Reset——Slave 从不发送 Session,它仅通过将 SafeData 清零来确认 Reset。
参考文献
- ETG.5100 S (D) V1.2.0, §8.2.2.2 Reset state, Tables 10–12 and Table 28.
相关文章
概述与基础
- FSoE 这个缩写究竟是什么意思? — FSoE 缩写的含义
- 通过示例解析 FSoE 帧结构 — Safety PDU 总体结构
- FSoE 状态机的所有状态 — FSoE 的五个状态及其转换
- FSoE:安全 PDU 命令表 — FSoE 命令完整列表
按状态划分的 PDU 结构
- FSoE Session PDU:Master 与 Slave 结构 — Session 状态的 PDU 结构
- FSoE Connection PDU:Master 与 Slave 结构 — Connection 状态的 PDU 结构
- FSoE Parameter PDU:Master 与 Slave 结构 — Parameter 状态的 PDU 结构
- FSoE 数据 PDU:Master 与 Slave 结构 — Data 状态的 PDU 结构
- FSoE Reset PDU:Master 与 Slave 结构 — 所有 Safety 数据长度的字节结构
CRC
- FSoE CRC:使用哪个多项式? — FSoE CRC 的 17 位多项式
- FSoE:CRC 表是如何构造的? — CRC 查找表的生成方法
- FSoE:CRC继承是如何工作的? — CRC 链如何连接连续的 PDU
错误代码与数据格式
- FSoE:所有通信错误代码列表 — 所有 FSoE 通信错误代码
- FSoE:数据以小端序还是大端序传输? — 多字节字段的字节序