状态机与邮箱协议

状态机与邮箱协议

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
2
3
4
5
6
7
8
9
10
11
12
主站 FPWR 0x0120 (AL Control) = 目标状态


从站应用检查前置条件(SM 配置对不对、DC 是否同步…)

┌────┴─────┐
成功 失败
│ │
▼ ▼
0x0130 0x0130 = 原状态 + Error 位(bit4)
= 新状态 0x0134 (AL Status Code) = 错误码
主站须写 AL Control 的 Error Ack 位清错后重试
寄存器 含义
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
2
3
┌──────────┬──────────┬────────────────┬──────────────────────┐
│ Length 2B│ Address 2B│ Channel/Prio 1B│ Type(4b)+Cnt(3b)+保留 │
└──────────┴──────────┴────────────────┴──────────────────────┘
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=伺服)
0x10080x100A 设备名/硬件/软件版本 字符串
0x1018 Identity 子索引 1-4:Vendor ID / Product Code / Revision / Serial(与 SII 一致)
0x16000x17FF RxPDO 映射(主→从,输出) 0x1600:01 = 0x6040:00, 16bit
0x1A000x1BFF 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
2
3
4
5
6
7
8
9
10
① SDO 写 0x1C12:00 = 0          ← 断开 SM2 的 PDO 分配
② SDO 写 0x1600:00 = 0 ← 清空映射表(子索引数=0)
③ SDO 写 0x1600:01 = 0x60400010 ← 条目1:0x6040:00, 16 bit
④ SDO 写 0x1600:02 = 0x607A0020 ← 条目2:0x607A:00, 32 bit
⑤ SDO 写 0x1600:00 = 2 ← 生效:映射条目数=2
⑥ SDO 写 0x1C12:01 = 0x1600 ← 把 0x1600 挂到 SM2
⑦ SDO 写 0x1C12:00 = 1 ← 生效:分配 1 个 PDO
⑧ (TxPDO 同理改 0x1A00 + 0x1C13)
⑨ 主站按新映射重算过程映像大小 → 重配 SM2/SM3 长度和 FMMU
⑩ AL Control → SafeOp → Op

常见坑:

  • 跳过 ①② 直接写条目 → 从站拒绝(SDO Abort);
  • 改了映射但主站没重配 SM 长度 → 迁移 SafeOp 时报 0x0017 / 0x001D
  • 从站是否支持改映射看 ESI/手册(很多设备映射固定,只能选预置 PDO)。

3.4 紧急报文 Emergency

从站异常时通过邮箱(CoE 服务号 1)主动上报(主站轮询邮箱时取到),
格式与 CANopen EMCY 相同,共 8 字节:

1
2
3
┌──────────────┬──────────────┬──────────────────────┐
│ Error Code 2B│ Error Reg 1B │ 厂商自定义数据 5B │
└──────────────┴──────────────┴──────────────────────┘

例:伺服过流 0x2310、编码器故障 0x7305(错误码沿用 CiA 301/402 定义)。
主站栈通常把 Emergency 转成日志/回调——调伺服时务必打印它,比 AL Status Code 信息量大。


4. 状态机 × 邮箱:主站启动全流程

1
2
3
4
5
6
7
Init:    APWR 写站地址 → FPWR 配 SM0/SM1(按 SII 邮箱字段)
│ AL Control = PreOp
PreOp: CoE SDO 配置参数、PDO 映射(§3.3)→ 配 SM2/SM3、FMMU、DC
│ AL Control = SafeOp
SafeOp: 周期帧开始跑(LRW),输入有效、输出不生效 → 校验 WKC 与 DC 收敛
│ AL Control = Op
Op: 输出使能,正常控制;WKC/AL Status 持续监控

下一篇

03-分布式时钟与同步.md —— DC 分布式时钟:传播延迟测量、系统时间分发(ARMW/FRMW)、SYNC0/SYNC1 信号与 <1 µs 同步的实现。

文章互动

阅读 --

留言

0 条留言

正在加载留言…