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文件的结构其实不复杂。它由若干个“段”组成,每个段用方括号括起来的段名开头。我画了一张结构图,你看完就明白了:

EDS文件基本结构 [FileInfo] — 文件信息段 [DeviceInfo] — 设备信息段 [MandatoryObjects] — 强制对象段 [OptionalObjects] — 可选对象段 [Communication] — 通信参数 [PDOMapping] — PDO映射段 每个段包含若干键值对,格式为:Key = Value

每个段里都是键值对,格式是 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规范里的示例顺序来写。