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

嗯,这里要注意:字符串值必须用双引号包裹。整数值直接写数字,不需要引号。我见过有人把数字也加引号,结果设备死活不认——这就是个典型的低级错误。

我的习惯:写EDS文件时,我会先用一个文本编辑器把骨架搭好,再用专用工具校验。别直接上手就写几百行,容易漏掉关键节。

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文件格式的核心脉络画出来了:

EDS文件格式知识结构图 EDS文件格式知识结构 EDS文件 INI文件格式 节(Section)与键(Key) 数据类型定义 [Section] 与 Key=Value 注释用 ; 开头 字符串用双引号包裹 [File] [Device] 必选 [MandatoryObjects] 必选 键名大小写敏感 BOOL / SINT / INT / DINT REAL / STRING BYTE / WORD / DWORD 核心要点 INI结构是骨架,节与键是血肉,数据类型是灵魂

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] 的顺序解析。打乱顺序可能出警告。
  • 空节:如果一个节没有任何键,干脆别写。空节会让某些解析器崩溃。
我曾经遇到过一个案例:某厂商的EDS文件里,[Device]节写了两个同名的键 ProductCode。解析器只认最后一个,导致产品识别错误。后来排查了整整两天才找到原因。所以——同一个节内,键名不能重复。

好了,EDS文件格式的核心内容就这些。你掌握了INI结构、节与键的规则、数据类型的定义,就已经能看懂大部分EDS文件了。下一块内容,我们会在实战中反复用到这些知识。