状态机与邮箱协议
ESM(EtherCAT State Machine):Init → PreOp → SafeOp → Op(+ Bootstrap)
邮箱 = 非周期通道(SM0/SM1 握手),最常用协议 CoE(CANopen over EtherCAT)
排错核心:AL Status Code(寄存器 0x0134)
1. ESM 状态机
1.1 状态与允许的通信
stateDiagram-v2 [*] --> Init Init --> PreOp : IP(配地址+邮箱SM) PreOp --> SafeOp : PS(配PDO映射+FMMU+DC) SafeOp --> Op : SO(输出使能) Op --> SafeOp SafeOp --> PreOp PreOp --> Init Op --> Init : 可直接降级 Init --> Bootstrap : 仅固件升级 Bootstrap --> Init
| 状态 | 邮箱(SDO 等) | 过程数据输入(TxPDO) | 过程数据输出(RxPDO) | 典型工作 |
|---|---|---|---|---|
| Init | ✗ | ✗ | ✗ | 主站写站地址、配置 SM0/SM1 邮箱 |
| PreOp | ✓ | ✗ | ✗ | CoE 参数配置、PDO 映射修改 |
| SafeOp | ✓ | ✓(输入有效) | ✗(输出不生效,从站保持安全值) | 主站校验输入、启动 DC 同步 |
| Op | ✓ | ✓ | ✓ | 正常运行 |
| Bootstrap | 仅 FoE | ✗ | ✗ | 固件升级(只能从 Init 进入) |
规则:升级必须逐级(Init→PreOp→SafeOp→Op),降级可跳级(Op→Init 合法)。
1.2 迁移机制:AL Control / AL Status
状态迁移全部由主站发起:
1 | 主站 FPWR 0x0120 (AL Control) = 目标状态 |
| 寄存器 | 含义 |
|---|---|
0x0120 AL Control |
主站写:目标状态(低 4 位)+ Error Ack(bit 4) |
0x0130 AL Status |
从站写:当前状态 + Error 标志(bit 4) |
0x0134 AL Status Code |
从站写:失败原因码 |
状态编码:Init=1、PreOp=2、Bootstrap=3、SafeOp=4、Op=8。
1.3 常见 AL Status Code(排错表)
| 代码 | 含义 | 常见根因 |
|---|---|---|
0x0000 |
无错误 | — |
0x0011 |
请求的状态迁移非法 | 跳级升 Op、从站不支持该迁移 |
0x0012 |
未知的请求状态 | AL Control 写了非法值 |
0x0013 |
Bootstrap 不支持 | 该从站无固件升级功能 |
0x0014 |
无有效固件 | 升级中断/固件损坏 |
0x0016 |
邮箱配置无效(→PreOp) | SM0/SM1 起始地址或长度与 SII 不符 |
0x0017 |
SyncManager 配置无效 | SM2/SM3 长度 ≠ PDO 映射实际字节数(改映射后最常见) |
0x0018 |
无有效输入 | 从站应用尚未提供输入数据 |
0x0019 |
无有效输出 | 主站过程数据没发或长度不对 |
0x001A |
同步错误 | DC 模式下从站没等到 SYNC 信号、主站发帧抖动过大、Shift time 配错 |
0x001B |
SyncManager 看门狗超时 | 主站周期帧中断(>watchdog 时间没收到输出数据),Op 掉回 SafeOp |
0x001C |
SyncManager 类型无效 | SM 方向/模式配置错 |
0x001D |
输出配置无效 | RxPDO 映射/0x1C12 分配与 SM2 不一致 |
0x001E |
输入配置无效 | TxPDO 映射/0x1C13 分配与 SM3 不一致 |
0x001F |
看门狗配置无效 | 看门狗分频/超时寄存器非法 |
0x0030 |
DC 无效同步配置 | SYNC0/SYNC1 周期与主站周期不匹配 |
完整代码表见 ETG.1000.6 / ETG.1020 规范。上表为工程中最常遇到的子集。
注意各家文档对个别码的措辞略有差异,以从站手册为准。
2. 邮箱协议框架
邮箱走 SM0(主→从)/ SM1(从→主),1-buffer 握手模式(见 01 篇 §5):
写满即锁定、读走才释放,保证请求/应答不丢失、不撕裂。
2.1 邮箱头(6 字节,所有邮箱协议共用)
1 | ┌──────────┬──────────┬────────────────┬──────────────────────┐ |
| Type 值 | 协议 | 一句话 |
|---|---|---|
| 0x1 | AoE | ADS over EtherCAT(Beckhoff 私有路由协议) |
| 0x2 | EoE | 隧道标准以太网帧——通过 EtherCAT 给从站”上网”(配置页面、诊断),非实时 |
| 0x3 | CoE | CANopen over EtherCAT,绝对主流,本篇重点 |
| 0x4 | FoE | File over EtherCAT——固件升级(Bootstrap 状态下用) |
| 0x5 | SoE | Servodrive over EtherCAT——SERCOS 行规(IDN 参数),部分伺服厂商用 |
| 0xF | VoE | Vendor specific——厂商私有协议 |
Cnt(3 bit 计数器)用于检测邮箱报文丢失/重复:从站回环计数,主站校验。
2.2 邮箱读的轮询
从站不能主动发帧,所以”从→主”邮箱靠主站轮询 SM1 状态位(FPRD 0x080D 一带的
SM1 状态寄存器)发现”有数据”,再 FPRD 读走。主站栈通常把这个轮询合并进周期帧。
3. CoE 详解
CoE 把 CANopen(CiA 301)的对象字典 + SDO + PDO 概念原样搬到 EtherCAT 邮箱上,
CANopen 设备行规(如伺服的 CiA 402)可直接复用。
3.1 对象字典布局
| 索引范围 | 内容 | 例子 |
|---|---|---|
0x1000 |
设备类型 | bit0-15 行规号(402=伺服) |
0x1008–0x100A |
设备名/硬件/软件版本 | 字符串 |
0x1018 |
Identity | 子索引 1-4:Vendor ID / Product Code / Revision / Serial(与 SII 一致) |
0x1600–0x17FF |
RxPDO 映射(主→从,输出) | 0x1600:01 = 0x6040:00, 16bit |
0x1A00–0x1BFF |
TxPDO 映射(从→主,输入) | 0x1A00:01 = 0x6041:00, 16bit |
0x1C00 |
SM 通信类型 | SM0=邮箱出、SM1=邮箱入、SM2=输出、SM3=输入 |
0x1C12 |
SM2 的 PDO 分配(挂哪些 RxPDO) | 0x1C12:01 = 0x1600 |
0x1C13 |
SM3 的 PDO 分配(挂哪些 TxPDO) | 0x1C13:01 = 0x1A00 |
0x1C32 / 0x1C33 |
SM2/SM3 同步参数 | 同步模式(FreeRun/SM 事件/DC)、周期、Shift |
0x6000 起 |
行规区 | CiA 402:0x6040 控制字、0x6041 状态字、0x607A 目标位置、0x6064 实际位置、0x6060 运行模式 |
PDO 映射条目为 32 位:索引(16b) | 子索引(8b) | 位长(8b),
如 0x60400010 = 对象 0x6040:00、16 bit。
3.2 SDO 服务
| 服务 | 用途 |
|---|---|
| SDO Download | 主站写对象(参数下发) |
| SDO Upload | 主站读对象 |
| Expedited(快速) | 数据 ≤4 字节,塞在请求/应答头里,一来一回搞定——最常见 |
| Normal + Segmented | 数据超过邮箱容量时分段传输(如字符串、大数组) |
| Complete Access | 一次读/写整个对象的所有子索引(子索引 0 起),配 PDO 映射时省很多来回 |
| SDO Information | 枚举对象字典(在线读出对象列表和描述) |
3.3 PDO 映射配置完整流程(示例)
目标:把 RxPDO 0x1600 改为映射 0x6040 控制字(16bit) + 0x607A 目标位置(32bit)。
全部操作必须在 PreOp 状态下,步骤有严格顺序(先禁用再改再启用):
1 | ① SDO 写 0x1C12:00 = 0 ← 断开 SM2 的 PDO 分配 |
常见坑:
- 跳过 ①② 直接写条目 → 从站拒绝(SDO Abort);
- 改了映射但主站没重配 SM 长度 → 迁移 SafeOp 时报
0x0017/0x001D; - 从站是否支持改映射看 ESI/手册(很多设备映射固定,只能选预置 PDO)。
3.4 紧急报文 Emergency
从站异常时通过邮箱(CoE 服务号 1)主动上报(主站轮询邮箱时取到),
格式与 CANopen EMCY 相同,共 8 字节:
1 | ┌──────────────┬──────────────┬──────────────────────┐ |
例:伺服过流 0x2310、编码器故障 0x7305(错误码沿用 CiA 301/402 定义)。
主站栈通常把 Emergency 转成日志/回调——调伺服时务必打印它,比 AL Status Code 信息量大。
4. 状态机 × 邮箱:主站启动全流程
1 | Init: APWR 写站地址 → FPWR 配 SM0/SM1(按 SII 邮箱字段) |
下一篇
03-分布式时钟与同步.md —— DC 分布式时钟:传播延迟测量、系统时间分发(ARMW/FRMW)、SYNC0/SYNC1 信号与 <1 µs 同步的实现。
正在加载留言…