3. ICD 文件制作:IED能力描述文件的结构、LN实例化、DO/DA配置、CDC数据类型选择
好,咱们进入实操环节。ICD 文件,说白了就是 IED 的「身份证」。它告诉系统:我这个设备能干什么,有哪些数据,数据长什么样。我刚开始接触时,觉得这玩意儿就是个 XML 文件,没啥大不了。结果第一次配置就栽了跟头——漏了一个 DO,整个系统联调时数据出不来。嗯,从那以后,我再也不敢小看 ICD 了。
3.1 ICD 文件的结构骨架
ICD 文件遵循 IEC 61850-6 标准,本质是一个 XML 文档。它的顶层结构其实不复杂,我习惯把它拆成三块:
- Header:文件头,包含版本、工具信息、修改记录。我个人习惯在这里写清楚版本号和修改日期,方便后期追溯。
- Communication:通信参数,比如子网、IP 地址、访问点。这部分在 ICD 阶段可以先留空,等系统配置时再填。
- IED:核心部分,描述设备本身的能力。包括
Services(支持的服务)、AccessPoint(访问点)、以及最重要的LDevice(逻辑设备)下的LN(逻辑节点)。
核心要点:ICD 文件描述的是「能力」,不是「实例」。它告诉别人我最多能做什么,而不是我现在做了什么。这个区别很重要,我在项目评审时经常看到有人把 ICD 和 CID 搞混。
来看一个简化的结构示例:
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="MyRelay_ICD" version="1.0" revision="1"/>
<Communication>
<SubNetwork name="StationBus">
<ConnectedAP iedName="MyRelay" apName="S1"/>
</SubNetwork>
</Communication>
<IED name="MyRelay">
<Services>
<DynAssociation />
<GetDirectory />
</Services>
<AccessPoint name="S1">
<Server>
<LDevice inst="1">
<!-- LN 实例化在这里 -->
</LDevice>
</Server>
</AccessPoint>
</IED>
</SCL>
你想想看,这个结构是不是很像一个树?根是 SCL,主干是 IED,分支是 AccessPoint 和 LDevice,叶子就是 LN 和它的数据。嗯,理解了这个树形结构,后面就好办了。
3.2 LN 实例化:把模板变成实例
LN(逻辑节点)是功能的最小单元。比如一个过流保护功能,对应 PTOC 这个 LN。但标准只定义了 LN 的类,具体用几个、怎么用,得你自己实例化。
LN 实例化时,有几个属性必须填:
| 属性 | 含义 | 示例 |
|---|---|---|
lnType |
引用的 LN 类型定义(在 DataTypeTemplates 中) | LN_OverCurrent_1 |
inst |
实例编号,从 1 开始 | 1 |
prefix |
前缀,用于区分同类 LN | OC1 |
lnClass |
LN 的类,如 PTOC、GGIO、XCBR | PTOC |
举个例子,我要实例化一个过流保护 LN:
<LN lnType="LN_OverCurrent_1" inst="1" prefix="OC1" lnClass="PTOC">
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
</DAI>
</DOI>
<DOI name="StrVal">
<DAI name="setMag">
<Val>1.2</Val>
</DAI>
</DOI>
</LN>
这里要注意 lnType 的值。它必须和 DataTypeTemplates 里定义的 LNodeType 的 id 一致。我曾经见过有人把 lnType 写成了 LNodeType 的 name,结果工具解析直接报错。嗯,这种低级错误,检查一遍就能避免。
我的习惯:LN 实例化时,我会先画一个功能列表,把每个保护功能对应的 LN 类、实例号、前缀列出来。这样写 ICD 时就不会漏,也不会重复。比如过流保护用 PTOC,重合闸用 RREC,断路器用 XCBR,每个都分配唯一的 inst 和 prefix。
3.3 DO/DA 配置:数据对象的精细化控制
LN 实例化之后,下一步就是配置它的数据对象(DO)和数据属性(DA)。DO 是 LN 下的数据容器,比如 Mod(模式)、Beh(行为)、StrVal(启动值)。DA 是 DO 下的具体数据点,比如 stVal(状态值)、setMag(整定值)。
配置 DO/DA 时,我一般遵循这个原则:只配需要的,不配全部的。标准里每个 LN 类都定义了一大堆 DO,但实际工程中很多用不上。配多了不仅文件臃肿,还可能引起兼容性问题。
来看一个 DO 配置的例子:
<DOI name="StrVal">
<DAI name="setMag">
<Val>1.2</Val>
</DAI>
<DAI name="units">
<Val>A</Val>
</DAI>
<DAI name="db">
<Val>0.01</Val>
</DAI>
</DOI>
这里 StrVal 是 DO,它下面有三个 DA:setMag(整定值)、units(单位)、db(死区)。每个 DA 都通过 <Val> 赋予了初始值。
配置 DA 时,有几个坑要注意:
- DA 的 FC(功能约束)必须正确。比如
setMag通常是SG(整定组)或SP(整定点),而stVal是ST(状态)。FC 错了,数据就传不上去。 - DA 的数据类型必须匹配。比如
setMag是AnalogueValue类型,你给它配个字符串,那肯定不行。 - 可选性(Optionality):标准里有些 DA 是 M(必选),有些是 O(可选)。必选的必须配,可选的可配可不配。我建议把必选的都配全,否则工具校验会报错。
避坑指南:我曾经在一个项目里,把 Mod 这个 DO 的 stVal 配成了 off,结果设备启动后一直处于离线模式。后来查了半天才发现,Mod.stVal 的初始值应该是 on,否则设备不会正常工作。嗯,这种细节,标准里其实有写,但很容易忽略。
3.4 CDC 数据类型选择:选对类型,事半功倍
CDC(公用数据类)是 IEC 61850 里最核心的概念之一。它定义了 DO 的结构和行为。比如 StrVal 这个 DO,它的 CDC 是 ASG(模拟定值组)。ASG 规定了它必须有 setMag、units、db 等 DA,以及每个 DA 的数据类型。
常用的 CDC 类型有这些:
| CDC | 名称 | 典型用途 |
|---|---|---|
| SPS | 单点状态 | 断路器位置、隔离开关状态 |
| DPC | 可控双点 | 断路器控制(合/分) |
| MV | 测量值 | 电流、电压、功率 |
| ASG | 模拟定值组 | 保护定值、阈值 |
| INC | 整数状态 | 档位、计数器 |
| ENS | 枚举状态 | 设备模式、告警等级 |
选择 CDC 时,我有个简单的判断方法:
- 如果是状态量(开/关、正常/异常),用
SPS或ENS。 - 如果是控制量(需要下发命令的),用
DPC或SPC。 - 如果是测量量(连续数值),用
MV或SAV。 - 如果是定值(可整定的参数),用
ASG或ING。
举个例子,我要定义一个「过流保护启动值」这个 DO。它是个定值,可以整定,所以选 ASG。然后 ASG 下必须有 setMag(模拟值)和 units(单位)。这样定义出来的 DO,任何支持 IEC 61850 的客户端都能正确解析。
核心原则:CDC 类型一旦选定,DO 的结构就固定了。你不能在 ASG 下面加一个 stVal,因为标准不允许。所以选 CDC 时要想清楚,这个 DO 到底要表达什么语义。选错了,后面改起来很麻烦。
3.5 知识体系总览
说了这么多,我画个图帮你理清思路。ICD 文件制作的核心逻辑,就是从整体到局部,逐层细化:
从图上你能看到,ICD 制作是一个自上而下的过程。先搭好文件骨架,再实例化 LN,然后配置每个 LN 下的 DO/DA,最后为每个 DO 选择合适的 CDC 类型。每一步都依赖上一步的成果。
嗯,到这里,ICD 文件制作的核心内容就讲完了。你可能会问,这些配置在实际工具里怎么操作?别急,后面我们会用具体工具演示一遍。记住,理论是基础,动手才是关键。
最后提醒一句:ICD 文件做好后,一定要用标准的 SCL 校验工具跑一遍。我见过太多人手工写 ICD,结果漏了标签闭合、属性拼写错误。工具校验能帮你省下大量调试时间。别问我怎么知道的——嗯,都是泪的教训。
公众号:蓝海资料掘金营,微信deep3321