2. EDS文件格式详解:INI文件格式、节与键、数据类型定义
EDS文件,说白了就是一个结构化的文本文件。它遵循的是INI文件格式——Windows时代的老朋友。你打开一个EDS文件,看到的全是[Section]和Key=Value这种结构。
我第一次接触EDS时,心想:这不就是个配置文件吗?后来踩了几个坑才明白——它比普通INI严格得多。每个节、每个键、每个数据类型都有明确的规定。写错了,设备就识别不了。
2.1 INI文件格式基础
INI格式的核心规则其实很简单:
- 节(Section):用方括号包裹,如
[File] - 键(Key):等号左边是键名,右边是值
- 注释:分号
;开头,整行都是注释 - 空行:允许存在,用于分隔不同逻辑块
来看一个最简的EDS文件片段:
; EDS文件示例 - 简单伺服驱动器
[File]
DescText = "Simple Servo Drive"
CreateDate = 03-15-2024
CreateTime = 14:30:00
Version = 1
[Device]
VendorName = "MyCompany"
ProductName = "ServoDrive-100"
ProductCode = 100
Revision = 1
嗯,这里要注意:字符串值必须用双引号包裹。整数值直接写数字,不需要引号。我见过有人把数字也加引号,结果设备死活不认——这就是个典型的低级错误。
2.2 节(Section)详解
EDS文件中的节,每个都有特定用途。我把它分成三类:
| 节名称 | 用途 | 是否必选 |
|---|---|---|
[File] |
文件本身的信息,如版本、日期 | 必选 |
[Device] |
设备标识,如厂商、产品码 | 必选 |
[DummyUsage] |
虚拟主站配置 | 可选 |
[Comments] |
设备描述文本 | 可选 |
[MandatoryObjects] |
强制对象字典条目 | 必选 |
[OptionalObjects] |
可选对象字典条目 | 可选 |
[ManufacturerObjects] |
厂商自定义对象 | 可选 |
你想想看,如果少了[File]节,主站连这个EDS文件是谁写的都不知道。我遇到过一台设备,厂商把[Device]节里的ProductCode写错了,结果主站识别成另一款设备,通讯参数全乱套。
2.3 键(Key)与值类型
每个节下面都有对应的键。键名是大小写敏感的——这是个大坑。CIP规范里,VendorName和Vendorname是两个不同的键。
常见的键值类型有:
- 整型(Integer):如
ProductCode = 100 - 字符串(String):如
DescText = "My Device" - 十六进制(Hex):如
IdentityObject = 0x01 - 布尔型(Boolean):如
Polled = 1(1=启用,0=禁用)
0x1 而不是 0x01。虽然数值一样,但某些严格的主站解析器会报错。建议所有十六进制值都补齐两位。
2.4 数据类型定义
EDS里定义对象时,必须指定数据类型。CIP协议定义了一套标准数据类型:
| 类型名称 | 描述 | 字节数 |
|---|---|---|
| BOOL | 布尔值 | 1 |
| SINT | 有符号8位整数 | 1 |
| INT | 有符号16位整数 | 2 |
| DINT | 有符号32位整数 | 4 |
| REAL | 32位浮点数 | 4 |
| STRING | 字符串 | 可变 |
| BYTE | 8位无符号整数 | 1 |
| WORD | 16位无符号整数 | 2 |
| DWORD | 32位无符号整数 | 4 |
我个人习惯把数据类型和实际物理量对应起来。比如速度值用INT(-32768到32767),位置值用DINT(范围更大)。选错了类型,轻则精度不够,重则数据溢出。
2.5 知识结构总览
下面这张图,把EDS文件格式的核心脉络画出来了:
2.6 实战:写一个完整的节
光说不练假把式。我们写一个完整的[MandatoryObjects]节:
[MandatoryObjects]
SupportedObjects = 3
[Object0]
ObjectType = 0x07 ; 对象类型:变量
ObjectAddress = 0x1000
ObjectName = "Device Type"
DataType = 0x0007 ; DWORD
LowLimit = 0
HighLimit = 65535
AccessType = RO ; 只读
DefaultValue = 0x00000012
[Object1]
ObjectType = 0x07
ObjectAddress = 0x1001
ObjectName = "Error Register"
DataType = 0x0003 ; BYTE
LowLimit = 0
HighLimit = 255
AccessType = RO
DefaultValue = 0
[Object2]
ObjectType = 0x07
ObjectAddress = 0x1002
ObjectName = "Manufacturer Status Register"
DataType = 0x0003 ; BYTE
LowLimit = 0
HighLimit = 255
AccessType = RO
DefaultValue = 0
关键点:
SupportedObjects必须与实际对象数量一致。我见过有人写了3个对象,但这里写的是2——主站只读到2个,第三个永远访问不到。ObjectAddress是16位地址,范围0x0000到0xFFFF。别写超出范围的值。DataType用的是CIP标准类型码,不是随便写的数字。
2.7 避坑指南
做EDS这么多年,我总结了几条血泪教训:
- 字符串引号:所有字符串值必须用双引号。少一个引号,整行失效。
- 十六进制前缀:必须写
0x,不能写0X或直接写数字。 - 节顺序:虽然规范没强制,但主流工具都按
[File] → [Device] → [MandatoryObjects] → [OptionalObjects]的顺序解析。打乱顺序可能出警告。 - 空节:如果一个节没有任何键,干脆别写。空节会让某些解析器崩溃。
[Device]节写了两个同名的键 ProductCode。解析器只认最后一个,导致产品识别错误。后来排查了整整两天才找到原因。所以——同一个节内,键名不能重复。
好了,EDS文件格式的核心内容就这些。你掌握了INI结构、节与键的规则、数据类型的定义,就已经能看懂大部分EDS文件了。下一块内容,我们会在实战中反复用到这些知识。