1. EDS概述:什么是EDS文件、EDS在CANopen协议中的作用、EDS文件的基本结构
各位同学好,我是老周。做CANopen开发十几年了,今天咱们聊聊EDS文件。说白了,EDS就是设备的“身份证”加“说明书”。
我记得刚入行那会儿,第一次拿到一个伺服驱动器的EDS文件,打开一看全是数字和缩写,头都大了。后来踩了不少坑,才真正搞明白这东西到底在说什么。
1.1 什么是EDS文件
EDS,全称是Electronic Data Sheet,电子数据表。它是一个纯文本文件,用ASCII码写成。你拿记事本就能打开看。
它的作用很简单:描述一个CANopen设备的所有通信特征。比如:
- 这个设备支持哪些对象字典条目
- 每个条目的数据类型、访问权限、默认值
- 设备支持哪些PDO、SDO、心跳等通信机制
- 设备的制造商信息、版本号、波特率范围
我习惯把EDS比作“设备驱动”。没有它,主站就不知道从站长什么样、能干什么。你想想看,一个主站要控制10个不同的从站,如果没有EDS,它怎么知道每个从站的对象字典里0x6001是什么含义?
核心要点:EDS文件是CANopen设备与配置工具之间的“契约”。设备厂商提供EDS,用户用配置工具加载EDS,然后完成网络组态。
1.2 EDS在CANopen协议中的作用
CANopen协议本身只定义了通信机制和对象字典的框架。但具体到某个设备,它的对象字典里到底有哪些条目?每个条目的取值范围是多少?这些信息协议本身不规定。
EDS就是来填补这个空白的。它的作用可以归纳为三点:
| 作用 | 说明 | 我见过的坑 |
|---|---|---|
| 设备描述 | 告诉主站“我是谁、我能做什么” | 有一次EDS里写支持4个PDO,实际固件只支持2个,结果配置完一运行就报错 |
| 配置依据 | 配置工具根据EDS生成SDO下载序列 | EDS里默认值写错了,导致设备上电后参数全乱 |
| 互操作性 | 不同厂商的设备通过EDS实现“即插即用” | 西门子和倍福的主站加载EDS的方式不一样,但EDS本身格式是统一的 |
嗯,这里要注意:EDS不是固件,它只是描述文件。设备实际的行为由固件决定,EDS必须和固件严格一致。我曾经见过一个项目,固件升级了但EDS没更新,结果配置工具读出来的对象字典和实际设备对不上,排查了整整两天。
避坑指南:EDS文件必须与设备固件版本一一对应。每次固件变更,都要同步更新EDS。我建议在EDS的[FileInfo]段里加上固件版本号,方便追溯。
1.3 EDS文件的基本结构
EDS文件的结构其实不复杂。它由若干个“段”组成,每个段用方括号括起来的段名开头。我画了一张结构图,你看完就明白了:
每个段里都是键值对,格式是 Key = Value。我挑几个重点段说说:
[FileInfo] 文件信息段
这个段描述EDS文件本身。比如:
[FileInfo]
FileName = MyDevice.eds
FileVersion = 1
FileRevision = 0
Description = "My CANopen Device EDS"
CreationTime = 12:00:00
CreationDate = 01-01-2024
CreatedBy = "Zhou"
我个人习惯在这里加上 ModificationDate 和 ModifiedBy,方便多人协作时追溯变更。
[DeviceInfo] 设备信息段
这个段描述设备本身的属性。关键字段有:
| 字段名 | 含义 | 取值范围 |
|---|---|---|
| VendorName | 制造商名称 | 字符串 |
| ProductNumber | 产品编号 | 字符串 |
| RevisionNumber | 固件版本号 | 4字节十六进制 |
| BaudRate | 支持的波特率 | 位掩码(bit0=10k, bit1=20k...) |
| SimpleBootUpMaster | 是否支持简单启动 | 0/1 |
小技巧:RevisionNumber 通常写成 0x00010001 这样的格式,高16位是主版本,低16位是次版本。我习惯把固件编译日期编码到次版本里,比如 0x00010315 表示2024年3月15日编译的固件。
[MandatoryObjects] 和 [OptionalObjects]
这两个段列出设备支持的所有对象字典索引。强制对象是CANopen协议要求必须实现的,比如:
- 0x1000 — 设备类型
- 0x1001 — 错误寄存器
- 0x1017 — 心跳生产者时间
- 0x1018 — 身份标识对象
可选对象则是厂商自定义的功能。每个索引下面还有子索引,用 [0x索引号_sub0] 这样的格式描述。
[Communication] 和 [PDOMapping]
这两个段描述设备的通信参数和PDO映射关系。比如:
[Communication]
NrOfRxPDO = 4
NrOfTxPDO = 4
[PDOMapping]
PDO1 = 0x1800, 0x1A00
PDO2 = 0x1801, 0x1A01
嗯,这里要注意:PDO映射的配置必须和对象字典里的实际条目一致。我曾经遇到一个案例,EDS里写了4个PDO映射,但实际设备只实现了2个,结果配置工具一加载就崩溃。
重要提醒:EDS文件里每个段和键值对的顺序是有讲究的。虽然CANopen协议没有强制规定顺序,但大多数配置工具(比如Vector的CANeds、Peak的PCAN-EDS)都期望按特定顺序解析。我建议严格按照CiA 306规范里的示例顺序来写。