首页/目录/全部文章

全部文章

八个专题的源码、算法与协议笔记都在这里。

笔记列表

开源协议栈对比

开源协议栈对比

本目录克隆的源码见:../开源项目/
选型看:主站/从站、语言、平台、许可证、与 ROS 2 关系


1. 总览对比

项目 语言 典型角色 许可证(以仓库为准) 适合
CANopenNode C 设备/从站为主,亦可扩展 Apache-2.0 MCU / 嵌入式设备端
lely-core C Master + Slave Apache-2.0 Linux 主站、机器人、高可靠场景
CanFestival C + Python 工具 Master/Slave LGPL(常见发行) 经典教学、ObjDict 编辑器
python-canopen Python 主站/脚本/测试 MIT 快速联调、产测、原型
ros2_canopen C++/Python ROS 2 主站集成 Apache-2.0 机器人 ros2_control 接入

许可证以各仓库 LICENSE 文件为准,集成前务必复核。


2. CANopenNode

目录对应(克隆后):../开源项目/CANopenNode


3. Lely CANopen(lely-core)

目录:../开源项目/lely-core


4. CanFestival

  • 活跃分支示例:https://github.com/embox/canfestival
  • 特点:
    • 老牌开源栈
    • objdictgen:Python 对象字典/网络编辑与代码生成
    • 多 CAN 驱动(SocketCAN、厂商卡等)
    • 适合学习 OD 生成流程

目录:../开源项目/CanFestival


5. python-canopen

  • 仓库:https://github.com/christiansandberg/canopen
  • 特点:
    • 纯 Python,基于 python-can
    • 读 EDS、SDO、PDO、NMT、402 辅助
    • 非常适合:扫节点、改参数、写产测脚本
    • 不适合硬实时多轴闭环(GIL/调度限制)

目录:../开源项目/python-canopen


6. ros2_canopen

目录:../开源项目/ros2_canopen
详见:06-ROS2与CANopen集成.md


7. 选型建议(实用)

需求 建议
自己做从站固件 CANopenNode
Linux 上做可靠主站 lely-core
几天内把驱动器点亮 python-canopen + SocketCAN
接入 ROS 2 控制栈 ros2_canopen
教学 / OD 可视化生成 CanFestival objdictgen
高动态多轴机器人 优先评估 EtherCAT;CANopen 适合作业机构/外设

下一篇:06-ROS2与CANopen集成.md

ROS 2 与 CANopen 集成

ROS 2 与 CANopen 集成

目标:把 CANopen 驱动器接到 ros2_control,成为可被控制器管理的硬件接口
主仓库:https://github.com/ros-industrial/ros2_canopen


1. 在机器人软件栈中的位置

1
2
3
4
5
6
7
8
9
10
11
MoveIt / 自定义上层

ros2_control Controller Manager

Hardware Interface(SystemInterface 等)

CANopen Master(如 lely / 栈封装)

SocketCAN(can0)

驱动器(CiA 402)

对比 EtherCAT 路径:

CANopen EtherCAT
传输 CAN 以太网 + ESC
典型周期 数 ms ~ 数十 ms 0.25~2 ms 常见
同步 SYNC / 软件 DC 硬件同步更强
ROS 集成 ros2_canopen ethercat_driver_ros2 等
适用 外设、低轴数、成本敏感 多轴高动态本体

2. ros2_canopen 能做什么

(以 upstream README/包说明为准,克隆后请再核对版本)

  • 管理 CANopen 总线与节点生命周期
  • 通过配置(常 YAML + EDS/DCF)描述网络
  • 提供与 ros2_control 对接的硬件插件
  • 支持驱动器(402)与通用设备代理模式

本地源码:../开源项目/ros2_canopen


3. 典型集成步骤(概念)

  1. 系统准备

    • 启用 can0ip link set can0 up type can bitrate 1000000
    • 确认 candump can0 能看到心跳
  2. 准备设备描述

    • 厂商 EDS
    • 生成/填写 DCF 或 ros2_canopen 配置中的节点参数
  3. 编写 ros2_control URDF/xacro

    • <ros2_control> 插件指向 CANopen 硬件接口
    • joint 与 Node-ID / 对象映射对应
  4. Launch

    • 启动 controller_manager + 硬件
    • 加载 joint_state_broadcaster / joint_trajectory_controller
  5. 使能验证

    • 先只读状态
    • 再小范围位置命令
    • 确认 Fault / Following error 处理

4. 与 python-canopen 的分工

工具 用途
python-canopen 开发前期:探活、改 OD、验证 PDO 映射
ros2_canopen 运行期:纳入 ROS 2 控制循环

建议:先用 Python 把单轴 402 使能跑通,再迁到 ros2_control。


5. 常见坑

  • 把 CANopen 当 EtherCAT 用:周期过短导致总线过载
  • Node-ID/波特率与配置文件不一致
  • 未处理 Heartbeat 丢失 → 控制器仍在发轨迹
  • 单位换算(编码器计数 ↔ rad)错误
  • 多节点 COB-ID 冲突
  • 在 Operational 热改 PDO 映射

6. 相关阅读

  • 协议基础:本目录 00~04
  • 开源栈:05-开源协议栈对比.md
  • EtherCAT 对照:../../EtherCAT/协议/06-ROS2与EtherCAT集成.md

下一篇:07-组网调试与排障.md

组网调试与排障

组网调试与排障

口诀:先物理层,再 NMT/Heartbeat,再 SDO,最后 PDO/402
不要一上来就怀疑算法——大多数现场问题是线、电阻、波特率、Node-ID。


1. 上电前检查清单

  • 总线两端各 120Ω(或确认板载终端开关)
  • 双绞、屏蔽、接法符合厂商建议
  • 所有节点同一波特率
  • Node-ID 无冲突(1~127)
  • 供电足够(多驱动器上电浪涌)
  • USB-CAN / PCI-CAN 驱动正常

2. Linux SocketCAN 快速命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置并启动(示例 1M)
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

# 看状态
ip -details link show can0

# 抓包
candump can0
candump -td can0 # 带时间戳

# 发一帧(示例)
cansend can0 000#0100 # 谨慎:确认含义后再发 NMT

# 统计错误
ip -s link show can0

安装工具包(Debian/Ubuntu 常见):

1
sudo apt install can-utils

3. 分层排障

L0 物理 / 驱动

现象 处理
can0 起不来 驱动、设备树、USB 线、dmesg
大量 error frames 终端电阻、波特率、接触不良、干扰
bus-off 复位接口、查短路/错线

L1 网络管理

现象 处理
无 Heartbeat 节点未上电、波特率错、ID 错、线断
有 Heartbeat 但状态不对 卡在 Pre-Op/Stopped;查 NMT
间歇掉线 电源、接地、线长 vs 波特率

L2 SDO

现象 处理
SDO 超时 节点非 Pre-Op/Op、ID 错、栈未跑
Abort 只读、长度错、对象不支持
读值离谱 字节序/子索引/缩放理解错

L3 PDO / 402

现象 处理
Operational 无 PDO 映射未使能、COB-ID 无效、传输类型
使能失败 Controlword 序列、Fault、限位、模式
抖动大 总线负载、SYNC 周期、USB-CAN 延迟

4. 用 python-canopen 做最小验证(示意)

1
2
3
4
5
6
7
8
9
10
11
12
import canopen

network = canopen.Network()
network.connect(channel='can0', bustype='socketcan')

node = network.add_node(3, 'device.eds') # Node-ID=3
print(node.sdo['Identity']['Vendor-ID'].raw)

node.nmt.state = 'PRE-OPERATIONAL'
# 配置...
node.nmt.state = 'OPERATIONAL'
network.disconnect()

(API 细节以 python-canopen 文档与版本为准。)


5. Wireshark / 逻辑分析

  • Wireshark 可抓 SocketCAN
  • 对照预定义连接集解码 NMT/SDO/PDO
  • 若有厂商 DBC/EDS 插件更好

解码口诀见 03-SDO与PDO通信.md 第 7 节。


6. 性能与负载经验

  • 计算每周期 PDO 字节数 × 节点数,留余量
  • Heartbeat 周期不要过密(常 100~1000 ms)
  • 调试期减少无关 TPDO
  • USB-CAN 不适合硬实时高周期;优先 PCI/ eth-CAN 或板载

7. 与开源项目联调入口

目的 入口
设备端栈 ../开源项目/CANopenNode
Linux 主站 ../开源项目/lely-core
脚本联调 ../开源项目/python-canopen
ROS 2 ../开源项目/ros2_canopen
栈对比 05-开源协议栈对比.md

8. 官方与参考链接

CiA 正式规范 PDF 多数需登录下载;本文整理公开概述与工程实践,不替代正式标准文本。

CiA 规范与公开资料索引

CiA 规范与公开资料索引

整理日期:2026-09-03
目的:快速定位官方规范、公开概述页与本仓库文档的对应关系
获取规则依据:CiA Technical documents / development process


0. 正式 PDF 获取规则

状态 含义
PAS / TR 网站注册登录后可免费下载
DS / DSP 通常仅 CiA 会员

公开知识概述(无需 PDF):https://www.can-cia.org/can-knowledge/


1. 核心规范

规范 内容 公开概述 正式 PDF
CiA 301 v4.2.0 应用层与通信行规:OD、NMT、SDO、PDO、SYNC、EMCY、预定义连接集 CANopen PAS(注册免费);亦对应 EN 50325-4
CiA 302(系列) 301 之外的附加能力:NMT 扩展、配置下载、网络变量、SDO 管理、冗余等 技术文档中心 多为 DSP(会员)
CiA 303 设备/网络设计(物理层、单位、指示器等) 技术文档中心 TR 多为注册免费
CiA 305 v3.0.0 LSS:Node-ID / 波特率 / LSS 地址(1018h);Fastscan LSS DSP
CiA 306 EDS / DCF / 设备描述 EDD 旧版 EDS 曾列 PAS;现行 306-1/2/3 多为 DSP
CiA 401 通用 I/O / 手柄等 技术文档中心 PAS(401-1/2,注册免费)
CiA 402(系列) 驱动与运动:FSA、模式、PDO、安全(402-4)、FD 映射(402-6) 402 DSP;402-2/3 部分对应 IEC 61800-7-201/301(IEC 需另购)
CiA 309 从其它网络访问 CANopen(如 ASCII 网关) 技术文档中心 / CANopenNode 实现 视具体部分
CiA 1301 CANopen FD 应用层 CANopen 知识页 DSP

技术文档总入口:https://www.can-cia.org/cia-groups/technical-documents/

1.1 概念公开页(CiA Knowledge)

概念 URL
内部设备架构 / OD https://www.can-cia.org/can-knowledge/canopen-internal-device-architecture/
NMT https://www.can-cia.org/can-knowledge/network-management/
SDO https://www.can-cia.org/can-knowledge/sdo-protocol/
PDO https://www.can-cia.org/can-knowledge/pdo-protocol/
Error control / Heartbeat https://www.can-cia.org/can-knowledge/error-control-protocols

2. 与本仓库中文文档映射

想查…
301 总览 协议/00协议/01协议/02协议/03
报文字节格式 协议/0913(NMT/SDO/PDO/LSS 等)
402 伺服 协议/04(并对照 EtherCAT/协议/04
LSS 协议/02 第 7 节 + 协议/13
EDS/DCF 协议/01 第 2 节
开源实现 协议/05开源项目/README.md
ROS 2 协议/06

3. 开源项目与规范覆盖(经验)

项目 常见覆盖
CANopenNode 301 主体 + 305 LSS + 部分 309 网关
lely-core 301 Master/Slave + DCF 工具链
python-canopen 301 主站侧常用子集 + 402 辅助
ros2_canopen 基于 lely,面向机器人主站与 402 驱动
CanFestival 301 经典实现 + OD 代码生成

具体功能宏/编译选项以各仓库源码与 README 为准。


4. 相关国际标准

  • EN 50325-4:CANopen(与 CiA 301 对应关系见 CiA 说明)
  • ISO 11898-1/2:CAN 数据链路 / 高速物理层
  • IEC 61800-7-201 / 61800-7-301:与 CiA 402-2 / 402-3 密切相关

通信报文总览与 CAN 帧

通信报文总览与 CAN 帧

依据 CiA 301(CANopen 应用层与通信行规)公开知识与工程惯例整理
正式 PDF:CiA 会员/PAS 注册后自 技术文档中心 获取
公开概述:CiA — CANopen

本篇之后的 10~13 按对象给出字节级报文格式与抓包示例。


1. 报文在协议栈中的位置

1
2
3
4
5
6
7
应用 / 对象字典 (OD)

通信对象 COB(NMT/SDO/PDO/SYNC/EMCY/…)
│ 映射为 CAN 数据帧
CAN 2.0A/B(ISO 11898-1)

物理层(常 ISO 11898-2,差分双绞)

CANopen 不发明新物理层:每个通信对象最终是一帧(或一组)标准 CAN 数据帧


2. CAN 数据帧(承载 CANopen 时)

经典 CANopen CC 多用 11-bit CAN-ID

1
2
3
4
┌────────────┬──────┬──────────────┬─────┐
│ CAN-ID │ RTR │ DLC (0..8) │ Data│
│ (COB-ID) │ 0/1 │ │ 0-8B│
└────────────┴──────┴──────────────┴─────┘
字段 CANopen 中的含义
CAN-ID 即通信对象的 COB-ID(可配置;预定义连接集给出默认值)
RTR 远程帧;PDO 的远程请求属遗留用法,新设计少用
DLC 数据长度;PDO/SDO/EMCY 等各有规定长度
Data 协议净荷(见后续各篇)

约束(继承自经典 CAN):

  • 单帧数据场最多 8 字节 → 单 PDO 映射总长通常 ≤ 8 字节
  • 仲裁:CAN-ID 数值越小优先级越高 → NMT 用 0x000 最高优先

3. 预定义连接集(Pre-defined Connection Set)

CiA 301 为降低配置成本,定义基于 Node-ID(1~127) 的默认 COB-ID。
公开说明亦见 CiA 对通信对象的概述页。

3.1 功能码 + Node-ID 结构(11-bit)

许多教程将 11-bit COB-ID 理解为:

1
2
3
4
5
 10 … 7        6 … 0
┌──────────┬──────────┐
│ Function │ Node-ID │
│ (4 bit) │ (7 bit) │
└──────────┴──────────┘
功能 基址(示意) 默认 COB-ID DLC(典型)
NMT 0x000 2
SYNC 0x080 0 或 1
TIME 0x100 6
EMCY 0x080 0x080 + Node-ID 8
TPDO1 0x180 0x180 + Node-ID ≤8
RPDO1 0x200 0x200 + Node-ID ≤8
TPDO2 0x280 0x280 + Node-ID ≤8
RPDO2 0x300 0x300 + Node-ID ≤8
TPDO3 0x380 0x380 + Node-ID ≤8
RPDO3 0x400 0x400 + Node-ID ≤8
TPDO4 0x480 0x480 + Node-ID ≤8
RPDO4 0x500 0x500 + Node-ID ≤8
SDO TX(Server→Client) 0x580 0x580 + Node-ID 8
SDO RX(Client→Server) 0x600 0x600 + Node-ID 8
Heartbeat / Boot-up / Node Guard 0x700 0x700 + Node-ID 1(HB/Boot)
LSS 响应 / 请求 0x7E4 / 0x7E5 8

以设备 EDS 与 CiA 301 正式文本为准;上表用于抓包心算与联调。

3.2 Node-ID = 5 时的速查

COB-ID 含义
0x000 NMT
0x080 SYNC
0x085 EMCY(5)
0x185 TPDO1(5)
0x205 RPDO1(5)
0x585 SDO Server→Client(5)
0x605 SDO Client→Server(5)
0x705 Heartbeat/Boot-up(5)

4. 通信对象一览(报文族)

对象 确认? 实时性 详解文档
NMT 命令型(无应用层 ACK) 最高 10
SYNC / TIME 广播 10
EMCY 生产者广播 10
Heartbeat / Boot-up 生产者周期/事件 10
SDO 确认服务(请求-响应) 11
PDO 无协议确认(纯过程数据) 12
LSS 主从问答 配置期 13

官方概念页:


5. 字节序约定(读报文必备)

SDO 多路复用器(Index)Abort 码、多数多字节 OD 值中:

  • 小端(Little-Endian):低字节先出现在 CAN Data 中
  • 例:Index 0x6040 → 线上字节序列 40 60

PDO 映射净荷中的多字节对象同样按对象字典规定的端序(通常小端)拼接。


6. 抓包入口命令

1
2
3
candump -td can0
# 或
candump can0,000:7FF # 视工具语法过滤

解码顺序建议:先认 COB-ID 族 → 再拆 Data 字节 → 再对 OD/映射表。

下一篇:10-NMT-SYNC-TIME-EMCY-Heartbeat报文格式.md

NMT / SYNC / TIME / EMCY / Heartbeat 报文格式

NMT / SYNC / TIME / EMCY / Heartbeat 报文格式

官方概念来源:


1. NMT(Network Management)报文

1.1 帧头

COB-ID 0x000(全网最高优先级)
DLC 2
发送方 NMT Manager(主站)
接收方 指定从站或全部从站

CiA 说明:NMT 协议为 单帧 2 字节;第 1 字节为命令说明符(CS),第 2 字节为 Node-ID;Node-ID = 0 表示全体节点执行该命令

1.2 数据场

1
2
3
4
5
 Byte0        Byte1
┌───────────┬──────────┐
│ CS │ Node-ID │
│ (命令) │ 0=广播 │
└───────────┴──────────┘

1.3 命令说明符(CS)常用值

CS 含义 目标状态/动作
0x01 Start Remote Node Operational
0x02 Stop Remote Node Stopped
0x80 Enter Pre-Operational Pre-Operational
0x81 Reset Node 复位应用(进 Initialization 流程)
0x82 Reset Communication 复位通信参数

1.4 抓包示例

1
2
3
can0  000   [2]  01 05     # Start 节点 5
can0 000 [2] 80 00 # 全网进入 Pre-Operational
can0 000 [2] 81 03 # Reset 节点 3

1.5 与状态机关系(报文视角)

  • 上电后设备自行完成 Initialization,发 Boot-up,进入 Pre-Operational(见 §5)
  • 主站用 NMT 报文强制迁移;PDO 仅在 Operational 允许
  • Stopped 时设备仍应响应 NMT,并可通过错误控制指示状态

详见概念篇:02-NMT与错误控制.md


2. SYNC(同步)报文

2.1 帧头

默认 COB-ID 0x080(对象 1005h 可改)
DLC 0(无计数器)或 1(带 1 字节计数器,可选)
方向 通常由同步生产者(常为主站)广播

作用:触发 同步传输类型 的 PDO(见 12-PDO)。

2.2 数据场

1
2
3
4
5
6
7
无计数器:DLC=0,无 Data

有计数器:
Byte0
┌─────────┐
│ Counter │ 每次 SYNC 递增(实现/配置相关)
└─────────┘

相关 OD:1005h COB-ID SYNC、1006h Communication cycle period、1007h Synchronous window length(若支持)。

2.3 抓包示例

1
2
can0  080   [0]
can0 080 [1] 2A # 带计数器的 SYNC

3. TIME(时间戳)报文

3.1 帧头

典型值
默认 COB-ID 0x100
DLC 6

3.2 数据场(概念)

1
2
3
4
5
 Byte0 …… Byte3   Byte4 Byte5
┌────────────────┬────────────┐
│ ms of day │ days │
│ (无秒,自当日0点)│ (自1984-01-01)│
└────────────────┴────────────┘

具体编码以 CiA 301 / 设备手册为准;工程上 TIME 为可选功能。


4. EMCY(Emergency)报文

4.1 帧头

默认 COB-ID 0x080 + Node-ID1014h 可改)
DLC 恒为 8
方向 错误生产者 → 网络

4.2 数据场(CiA 301 结构)

1
2
3
4
5
6
 Byte0  Byte1  Byte2     Byte3 …… Byte7
┌──────┬──────┬─────────┬──────────────────┐
│ Error Code │ Error │ Manufacturer │
│ (低) │ (高) │ Register│ Specific Field │
│ │ (1001h) │ (5 bytes) │
└──────┴──────┴─────────┴──────────────────┘
字段 长度 含义
Emergency Error Code 2 B 错误码(小端);0000h 常表示错误清除/无错误
Error Register 1 B 对应 OD 1001h 当前值
Manufacturer Specific 5 B 厂商自定义附加信息

可选:1015h EMCY Inhibit Time(抑制过密 EMCY);1003h 预定义错误场(历史)。

4.3 抓包示例(Node-ID=5)

1
2
can0  085   [8]  00 10 81 00 00 00 00 00
# Error Code = 0x1000,Error Register = 0x81,其余厂商字段

5. Boot-up 与 Heartbeat 报文

二者共用错误控制 CAN-ID 族(CiA:Error control):

COB-ID 0x700 + Node-ID
DLC 1

5.1 Boot-up

  • 在 Initialization 结束、进入 Pre-Operational 之前作为最后动作发送
  • Data[0] 固定为 0x00
  • 运行中意外再收到 Boot-up → 可能节点复位/掉电重启
1
can0  705   [1]  00          # 节点 5 Boot-up

5.2 Heartbeat(Producer)

Data[0] NMT 状态
0x00 Boot-up(仅 boot-up 协议使用该值语义)
0x04 Stopped
0x05 Operational
0x7F Pre-Operational

周期由 1017h Producer Heartbeat Time(ms;0=关闭)配置。
消费者用 1016h 监视超时。

1
2
can0  705   [1]  05          # 节点 5 声明 Operational
can0 705 [1] 7F # 节点 5 声明 Pre-Operational

5.3 Node Guarding(遗留)

  • 同 COB-ID 族,主站以 RTR 轮询,从站数据帧应答并含 toggle 位
  • CiA 不再推荐 基于远程帧的 guarding;新设计用 Heartbeat

6. 主站启动时序(报文级)

1
2
3
4
5
6
7
从站:  ... → Boot-up (700+ID, 00)
主站: SDO 配置 …
主站: NMT Start (000, 01, ID)
从站: Heartbeat (700+ID, 05)
主站: SYNC (080) 循环
双方: PDO …
从站异常: EMCY (080+ID, 8 bytes)

下一篇:11-SDO报文格式详解.md

SDO 报文格式详解

SDO 报文格式详解

官方概念:SDO protocol (CiA)
细节对齐 CiA 301(PAS 正式文本)与公开协议描述
SDO = 确认的 点对点对象字典访问:Client 发起,Server 拥有 OD


1. 通道与 COB-ID

一个 SDO 通道 = 两帧不同 CAN-ID 的配对:

方向 预定义 COB-ID 含义
Client → Server 0x600 + Node-ID 请求(常称 SDO RX,相对从站)
Server → Client 0x580 + Node-ID 响应(SDO TX)
  • 第一路 SDO Server 通道强制预定义,所有 CANopen CC 设备必须支持
  • 参数对象:1200h…(Server)、1280h…(Client)
  • DLC 恒为 8(不足补 0)

术语(从 Client 视角):

术语 含义
Upload Client Server 的 OD
Download Client Server 的 OD

2. 通用 8 字节布局

1
2
3
4
5
6
 Byte0     Byte1 Byte2   Byte3      Byte4 Byte5 Byte6 Byte7
┌────────┬────────────────┬────────┬────────────────────────┐
│ Command│ Index (LE) │ SubIdx │ Data / Size / Abort │
│ Spec │ low high │ │ │
└────────┴────────────────┴────────┴────────────────────────┘
└──── Multiplexer ─────┘
字段 说明
Command Specifier 命令字节:高 3 bit 为 ccs/scs,其余为标志
Index 16-bit OD 索引,小端
Subindex 8-bit
Data Expedited 数据,或 Size,或 Abort 码等

3. 命令字节:Client(ccs)与 Server(scs)

3.1 高 3 位命令说明符

Bits 7–5 Client 发送 (ccs) Server 发送 (scs)
0 Download segment Upload segment
1 Initiate download Download segment 应答
2 Initiate upload Initiate upload 响应
3 Upload segment Initiate download 应答
4 Abort transfer Abort transfer
5 Initiate block upload Block download 响应
6 Initiate block download Block upload 响应

3.2 Initiate 阶段其余标志(常见)

Initiate download/upload 请求:

Bit 含义
4 保留,写 0
3–2 n Data 域中非数据字节数(仅当 e=1 且 s=1 时有效)
1 e 1=Expedited(数据在本帧);0=Normal(分段)
0 s 1=给出大小;0=未指示大小

数据有效长度(expedited 且 s=1):4 - n 字节,落在 Byte4… 中。


4. Expedited Download(写 ≤4 字节)

4.1 Client 请求(ccs=1, e=1, s=1)

例:向节点 5 写 0x6040:00 = 0x000F(2 字节)

计算:n = 4−2 = 2;命令字节 = (1<<5) | (2<<2) | (1<<1) | 1 = 0x2B

1
2
3
4
5
6
COB-ID: 0x605
Data: 2B 40 60 00 0F 00 00 00
│ │ │ │ └─ 数据(小端)
│ │ │ └─ SubIndex
│ └── Index 0x6040
└─ Command

4.2 Server 应答(scs=3,Initiate download response)

典型成功应答(无数据):

1
2
3
4
COB-ID: 0x585
Data: 60 40 60 00 00 00 00 00
│ └── 回显 Multiplexer
└─ scs=3 → 0x60

5. Expedited Upload(读 ≤4 字节)

5.1 Client 请求(ccs=2, e/s 依实现,常 e=0 s=0 发起)

0x6041:00

1
2
3
4
COB-ID: 0x605
Data: 40 41 60 00 00 00 00 00

└─ ccs=2 → 0x40

5.2 Server 响应(含数据)

若返回 2 字节状态字 0x0237

1
2
3
4
COB-ID: 0x585
Data: 4B 41 60 00 37 02 00 00
│ └─ 数据
└─ scs=2, e=1,s=1,n=2 → 常见 0x4B

6. Segmented(Normal)传输(>4 字节)

流程概要(CiA / 公开描述一致):

  1. Initiate:协商 Index/SubIndex,e=0;Data 域可带总长度(若 s=1)
  2. 随后多帧 Segment:每段最多 7 字节应用数据(1 字节协议头)
  3. Segment 命令字节含 togglec(最后一段) 等标志

分段适合长字符串、大参数块;实现时必须正确交替 toggle,否则 Abort 05030000h


7. Block Transfer(可选加速)

  • (最多约 127 segment)确认,减少每段握手
  • 适合固件/大批量;设备双方都需支持
  • 细节见 CiA 301;公开概述见 CiA SDO

8. Abort Transfer

任一方可中止:

1
2
3
Command = 0x80
Multiplexer = 被访问的 Index/SubIndex(回显)
Byte4..7 = Abort Code(32-bit,小端)

8.1 常用 Abort Code(节选)

Abort Code 含义
05030000h Toggle 未交替
05040000h SDO 协议超时
05040001h 命令说明符无效/未知
06010000h 不支持的对象访问
06010001h 读只写对象
06010002h 写只读对象
06020000h 对象不存在
06090011h 子索引不存在
08000000h 一般错误

线上字节例:02 00 01 06 → 码 06010002h


9. 完整读写时序(报文级)

1
2
3
4
5
Client 605: 40 41 60 00 00 00 00 00     # initiate upload 6041h
Server 585: 4B 41 60 00 37 02 00 00 # expedited data

Client 605: 2B 40 60 00 0F 00 00 00 # expedited download 6040h
Server 585: 60 40 60 00 00 00 00 00 # ack

10. 与概念篇关系

工程用法、超时、配置顺序见:03-SDO与PDO通信.md
对象字典寻址见:01-对象字典与预定义连接集.md

下一篇:12-PDO报文与映射编码.md

PDO 报文与映射编码

PDO 报文与映射编码

官方概念:PDO protocol (CiA)
PDO = 单帧 CAN,最多 8 字节纯应用数据(无 SDO 式命令字节)


1. 帧结构

1
2
3
4
┌─────────────┬─────┬──────────────────────────┐
│ COB-ID │ DLC │ Data[0..DLC-1] │
│ (可配置) │≤8 │ = 映射对象按序拼接的位串 │
└─────────────┴─────┴──────────────────────────┘
类型 相对节点 预定义 COB-ID(1~4)
TPDO 节点发送 0x180/280/380/480 + Node-ID
RPDO 节点接收 0x200/300/400/500 + Node-ID

无应用层 ACK:可靠性靠 CAN ACK、Heartbeat、应用层状态机(如 402 Fault)。


2. 通信参数 vs 映射参数(OD)

TPDO1 为例(RPDO1 对称:1400h/1600h):

对象 名称 作用
1800h TPDO1 communication parameter COB-ID、传输类型、Inhibit、Event timer…
1A00h TPDO1 mapping parameter 映射表

2.1 通信参数记录(典型子索引)

Sub 含义(常见)
00h 最高子索引
01h COB-ID(含有效位等)
02h Transmission type
03h Inhibit time(×100 µs 量级,以实现为准)
05h Event timer(ms)

COB-ID Bit31:常表示 PDO 无效/有效(1=invalid)。改映射前须先置无效——见 CiA 映射步骤。

2.2 Transmission Type(传输类型)

行为
0 同步,无环计数:由 SYNC 触发,但需配合事件(acyclic sync)
1~240 同步循环:每收到 n 次 SYNC 发一次
254 异步:厂商特定事件
255 异步:设备行规定义的事件;常配合 Event timer

(具体枚举以 CiA 301 / EDS 为准。)


3. 映射参数编码

3.1 子索引布局

Sub 含义
00h 已映射对象个数 N
01h…Nh 第 i 个映射项(32-bit)

3.2 单个映射项(32-bit,小端存于 OD)

1
2
3
4
5
 31────────────16 15─────8 7──────0
┌────────────────┬────────┬────────┐
│ Index │ SubIdx │ Length │
│ (被映射对象) │ │ (bits) │
└────────────────┴────────┴────────┘
字段 说明
Index 应用对象索引(如 6041h
SubIndex 子索引
Length 位长度(如 16、32;不是字节)

例:映射 Statusword 6041h:00 共 16 bit → 映射字 0x60410010

3.3 净荷拼接规则

  • 按映射表 01h → Nh 顺序,把各对象的位串紧密排列进 PDO Data
  • 多字节对象内部一般为 小端
  • 总位数 ≤ 64(8 字节)

4. 完整示例(402 常见教学映射)

RPDO1(主站→节点 5)映射:

  1. 6040h:00 Controlword 16 bit
  2. 607Ah:00 Target position 32 bit

总长 48 bit = 6 字节 → DLC=6

1
2
COB-ID 0x205:
Data: cw_lo cw_hi pos0 pos1 pos2 pos3

TPDO1(节点 5→主站):

  1. 6041h:00 Statusword 16
  2. 6064h:00 Position actual 32
1
2
COB-ID 0x185:
Data: sw_lo sw_hi p0 p1 p2 p3

5. 触发方式(与 SYNC 的关系)

CiA 定义的触发包括:

类型 说明
Event / timer-driven 内部事件或事件定时器
Remotely-requested RTR 请求(遗留)
Synchronous cyclic 每 n 次 SYNC
Synchronous acyclic 事件置位,遇下一 SYNC 再发

运动控制常用:同步 TPDO/RPDO + 周期 SYNC


6. 修改映射的官方步骤(Variable/Dynamic)

CiA 公开步骤(PDO protocol):

  1. 将对应 COB-ID 的 Bit31 置 1,使 PDO 无效
  2. 写映射参数 Sub00 = 00h,使映射无效
  3. 写入各映射项 Sub01…
  4. 写 Sub00 = 映射对象个数
  5. 清 COB-ID Bit31,使 PDO 重新有效
映射类型 何时可改
Static 出厂固定,不可经 CANopen 改
Variable Pre-Operational 可改
Dynamic Operational 亦可改(设备需声明支持)

7. 抓包对照清单

  • COB-ID 是否仍为预定义,或已被 SDO 改写
  • DLC 是否等于映射总字节数
  • 字节序/多对象边界是否与 EDS 一致
  • 节点是否已 NMT Start(否则不应有 PDO)
  • Transmission type 与 SYNC 是否匹配

下一篇:13-LSS报文格式.md

LSS 报文格式(CiA 305)

LSS 报文格式(CiA 305)

官方概述:CiA 305 — Layer Setting Services
用途:在总线上配置 Node-ID波特率,并查询 LSS 地址(Identity 1018h
正式文本多为 DSP(会员);本篇给出公开描述与工程通用帧格式


1. 固定 COB-ID

方向 COB-ID 说明
LSS Master → Slave(s) 0x7E5 请求 / 命令
LSS Slave → Master 0x7E4 响应
  • DLC 通常为 8
  • 仅使用这两帧 CAN-ID,与 Node-ID 无关(方便未配置节点)

2. 通用数据布局(概念)

1
2
3
4
5
 Byte0      Byte1 …… Byte7
┌─────────┬────────────────────────┐
│ CS │ 命令参数 │
│(命令码) │ │
└─────────┴────────────────────────┘

具体 CS 与参数域以 CiA 305 为准。工程上常见服务类别:

类别 作用
Switch Mode Global / Selective 进入/退出配置模式
Configure Node-ID 设置 Node-ID
Configure Bit Timing 设置波特率相关参数
Activate Bit Timing 激活新波特率
Store Configuration 存盘
Inquire Identity 查询 Vendor-ID / Product / Revision / Serial
Identify Remote Slave / Fastscan 扫描未配置节点

3. 模式:Configuration vs Operation

  • Operation Mode:通常仅允许切换模式类服务
  • Configuration Mode:允许改 Node-ID / 波特率等

Switch Mode Selective:按 Identity(1018h 四元组)精确选中一台从站进入配置模式——产线多台未配 ID 设备时必需。

Switch Mode Global:全网切换。


4. 与 Identity Object 的关系

1018h 典型子索引:

Sub 内容
01h Vendor-ID
02h Product code
03h Revision number
04h Serial number

LSS 选择性寻址依赖这些值在出厂时唯一或可区分。


5. 典型工程流程(报文级叙事)

1
2
3
4
5
6
7
1. 未配置从站上电(Node-ID=0xFF 等非法/无效值,以厂商为准)
2. Master @7E5: Switch Mode Selective(带 1018h 匹配)
3. Slave @7E4: 确认进入 Configuration
4. Master @7E5: Configure Node-ID = 5
5. Master @7E5: Store Configuration(若支持)
6. Master @7E5: Switch Mode Operation
7. 之后使用标准 NMT/SDO/PDO(COB-ID 按新 Node-ID)

改波特率需全网协调:配置 → Activate → 主从同时切速率,否则总线失步。


6. 抓包提示

1
candump can0 | rg '7E[45]'
  • 只见 7E57E4:从站未进 LSS、线断、或 Identity 不匹配
  • 配置后仍用旧 COB-ID 通信:未存盘/未复位/未按新 ID 寻址

7. 文档边界声明

本篇基于 CiA 公开 Knowledge 与通用实现习惯,用于学习与联调。
命令码数值表、状态机细节以 CiA 305 正式 PDF 为准(见 08-CiA规范与资料索引.md)。

返回报文总览:09-通信报文总览与CAN帧.md

EtherCAT 总览与工作原理

EtherCAT 总览与工作原理

EtherCAT = Ethernet for Control Automation Technology
Beckhoff 2003 年发布 · 国际标准 IEC 61158(Type 12)/ IEC 61784-2 / ISO 15745-4
ETG(EtherCAT Technology Group)维护,是目前成员数最多的工业现场总线组织


1. EtherCAT 是什么

EtherCAT 是一种实时工业以太网总线:物理层复用标准以太网(100 Mbit/s 全双工),
但从站不跑 TCP/IP 协议栈,而是用专用硬件(ESC 芯片)在帧穿过的瞬间读写数据。

设计目标一句话:用一根网线、一帧报文,以微秒级周期同步成百上千个 IO 与伺服轴

属性
发布者 / 年份 Beckhoff(倍福)/ 2003
标准 IEC 61158 Type 12、IEC 61784-2 CPF 12、SEMI E54.20
物理层 100BASE-TX(标准网线 ≤100 m)、EBUS(背板 LVDS)、100BASE-FX 光纤
速率 100 Mbit/s 全双工(数据路径上等效利用率 >90%)
最大节点数 65535 个从站
主站硬件 普通以太网卡即可,无需专用板卡
从站硬件 必须有 ESC(EtherCAT Slave Controller)芯片

2. 核心思想:on-the-fly(飞行中处理)

普通以太网交换机是存储转发:整帧收完 → 查表 → 再发出去,每跳都引入排队延迟。
EtherCAT 从站则是穿透式处理:帧一边从端口流过,ESC 硬件一边在指定字节位置
边收边读、边收边写,每个从站只引入固定的硬件转发延迟(EBUS 约百纳秒量级,
100BASE-TX 端口含 PHY 约 1 µs 量级)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
─── 普通以太网(存储转发,每个节点一问一答)───────────────

主站 ──帧A──▶ 交换机 [收完整帧→查表→转发] ──▶ 节点1
主站 ──帧B──▶ 交换机 [收完整帧→查表→转发] ──▶ 节点2
N 个节点 = N 个帧 + N 次协议栈处理 + 交换机排队延迟

─── EtherCAT(一帧穿过所有从站,硬件即时读写)─────────────

主站 ══▶ [从站1] ══▶ [从站2] ══▶ [从站3] ══▶ ...
│读/写│ │读/写│ │读/写│
▼ ▲ ▼ ▲ ▼ ▲
输入 输出 输入 输出 输入 输出
帧走到链路末端后由最后一个从站折返,沿原路回到主站
N 个节点 = 1 个帧(或少数几帧),无软件协议栈参与

关键点:

  • 数据”顺路捎带”:每个从站从帧中属于自己的字段取走输出数据、塞入输入数据;
  • 读写发生在帧仍在传输时,不是收完再处理;
  • 主站收到返回帧时,全网 IO 已经完成一次交换

3. 为什么快

机制 说明
单帧多从站 一个以太网帧携带全网过程数据,带宽利用率远高于”一节点一帧”
全双工环路 物理上是线形接线,逻辑上是环:帧去程处理、回程沿另一对线返回,收发同时进行
纯硬件处理 从站 ESC 无软件协议栈,转发延迟固定且极小 → 抖动可控
无碰撞/无排队 主站是唯一的帧发起者,链路上不存在竞争
逻辑寻址 + FMMU 主站按”过程映像”整块读写,从站硬件自己认领字节(见 01-帧结构与寻址.md

性能量级(ETG 官方典型数据)

场景 周期/耗时
1000 个分布式数字 IO 30 µs
100 个伺服轴(每轴 8 字节输入+8 字节输出) 100 µs
同步抖动(配合分布式时钟 DC) ≪ 1 µs(典型 <100 ns,见 03 篇)

4. 拓扑与物理层

4.1 拓扑

物理接线支持线形、树形、星形及任意组合;加冗余口可组环形(线缆冗余)。
无论怎么接,逻辑上永远是一个环——帧按固定顺序穿过每个从站再折返。

主站<br/>普通网卡从站1从站2从站3<br/>分支耦合器从站4从站5从站6

4.2 端口自动闭环

每个 ESC 有 2~4 个端口。端口若检测不到链路(没接线),硬件自动内部短接
帧原路折返——这就是”接成一条线、逻辑成一个环”的原理,也意味着:

  • 末端从站不需要终端电阻或特殊配置;
  • 拔掉中间网线,环在断点前自动闭合,主站仍能与断点前的从站通信(可用于定位断点)。

4.3 物理层

物理层 用途 距离
100BASE-TX 设备间联网(标准 Cat5 网线、RJ45/M8) 节点间 ≤100 m
EBUS(LVDS) 模块化 IO 站内背板(如 Beckhoff EL 系列端子) 站内短距
100BASE-FX 光纤长距/抗干扰 ≥2 km(取决于光模块)

5. 主站与从站角色

主站 Master 从站 Slave
硬件 任意标准以太网 MAC/网卡,不需要专用芯片 必须有 ESC 芯片
软件 主站协议栈(周期调度、配置、诊断) 帧处理全在 ESC 硬件;本地 MCU 只管应用(可选,纯 IO 可无 MCU)
角色 唯一的帧发起者;网络配置、状态机控制、DC 同步的组织者 被动处理帧;执行 IO / 伺服控制
典型实现 TwinCAT、IgH EtherCAT Master(EtherLab,Linux 内核态)、SOEM(用户态开源)、Acontis EC-Master

常见 ESC 芯片

芯片 厂商 特点
ET1100 / ET1200 Beckhoff 经典 ASIC,4 口 / 3 口
LAN9252 / LAN9253 Microchip 集成 2 个 PHY,SPI/并口 PDI,低成本从站常用
Sitara PRU-ICSS TI 处理器内可编程实时单元实现 ESC
FPGA IP 核 Beckhoff(授权) ET18xx IP,用于 Xilinx/Intel FPGA 自研从站

记忆点:主站便宜(软件),从站专用(硬件)——与 PROFINET IRT 正好相反
(IRT 要求交换机/网卡侧有专用硬件支持)。


6. 与其他工业总线对比

EtherCAT PROFINET IRT EtherNet/IP (CIP Sync) CANopen
物理层 标准以太网 以太网 + 专用交换硬件 标准以太网 + 交换机 CAN(≤1 Mbit/s)
转发方式 on-the-fly 穿透 时间调度存储转发 标准交换 总线仲裁
典型周期 ≤100 µs(可至 ~30 µs 级) 250 µs~1 ms 级 ≥1 ms 级 ≥1 ms 级(节点少时)
同步精度 <1 µs(DC) ~1 µs(IRT 调度) µs~ms(依赖 CIP Sync/PTP) ms 级(SYNC 报文)
主站成本 低(普通网卡) 中~高 低~中
从站成本 需 ESC 芯片 需支持 IRT 的 PHY/交换 普通以太网即可 CAN 收发器,极低
应用层 CoE/SoE/FoE/EoE PROFINET 服务 CIP CANopen(CiA 301/402)
备注 CoE 直接复用 CANopen 对象字典/行规,CANopen 设备迁移成本低 EtherCAT 的”精神前辈”之一

各家总线的周期/精度与配置强相关,上表为常见工程量级,仅作选型参考。


7. 典型应用

场景 用法
多轴伺服 CoE + CiA 402 行规(CSP/CSV/CST 模式),DC 同步插补,机床/包装机
分布式 IO EL/EP 系列端子模块,数字/模拟量采集,周期 µs 级
机器人关节 力控/协作机器人每关节一个 EtherCAT 伺服节点,1 kHz~8 kHz 控制环(ROS 2 侧常配 ros2_control + SOEM/IgH)
液压/注塑、半导体、风电变桨、测试台架 高速闭环 + 大量模拟量

8. 术语表(后续各篇通用)

缩写 全称 一句话
ESC EtherCAT Slave Controller 从站帧处理硬件芯片,on-the-fly 的执行者
PDO Process Data Object 周期性过程数据(IO、目标位置/实际位置等)
SDO Service Data Object 非周期参数读写(走邮箱,CoE 服务)
DC Distributed Clocks 分布式时钟,全网 <1 µs 同步(见 03 篇)
ESM EtherCAT State Machine 从站状态机 Init→PreOp→SafeOp→Op(见 02 篇)
ESI EtherCAT Slave Information 从站描述 XML 文件(厂商提供)
ENI EtherCAT Network Information 整网配置 XML(组态工具导出,主站加载)
SII Slave Information Interface 从站 EEPROM 中的身份/初始配置数据
FMMU Fieldbus Memory Management Unit 逻辑地址→从站物理内存映射单元
SM SyncManager ESC 内存访问协调单元(缓冲/邮箱两种模式)
WKC Working Counter 工作计数器,每被从站处理一次递增,主站校验用
CoE CANopen over EtherCAT 最常用的邮箱应用层协议
PDI Process Data Interface ESC 与从站本地 MCU 之间的接口(SPI/并口等)

下一篇

01-帧结构与寻址.md —— 0x88A4 帧格式、datagram 布局、四种寻址方式、WKC/FMMU/SyncManager 详解。