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 里定义的 LNodeTypeid 一致。我曾经见过有人把 lnType 写成了 LNodeTypename,结果工具解析直接报错。嗯,这种低级错误,检查一遍就能避免。

我的习惯: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(整定点),而 stValST(状态)。FC 错了,数据就传不上去。
  • DA 的数据类型必须匹配。比如 setMagAnalogueValue 类型,你给它配个字符串,那肯定不行。
  • 可选性(Optionality):标准里有些 DA 是 M(必选),有些是 O(可选)。必选的必须配,可选的可配可不配。我建议把必选的都配全,否则工具校验会报错。

避坑指南:我曾经在一个项目里,把 Mod 这个 DO 的 stVal 配成了 off,结果设备启动后一直处于离线模式。后来查了半天才发现,Mod.stVal 的初始值应该是 on,否则设备不会正常工作。嗯,这种细节,标准里其实有写,但很容易忽略。

3.4 CDC 数据类型选择:选对类型,事半功倍

CDC(公用数据类)是 IEC 61850 里最核心的概念之一。它定义了 DO 的结构和行为。比如 StrVal 这个 DO,它的 CDC 是 ASG(模拟定值组)。ASG 规定了它必须有 setMagunitsdb 等 DA,以及每个 DA 的数据类型。

常用的 CDC 类型有这些:

CDC 名称 典型用途
SPS 单点状态 断路器位置、隔离开关状态
DPC 可控双点 断路器控制(合/分)
MV 测量值 电流、电压、功率
ASG 模拟定值组 保护定值、阈值
INC 整数状态 档位、计数器
ENS 枚举状态 设备模式、告警等级

选择 CDC 时,我有个简单的判断方法:

  • 如果是状态量(开/关、正常/异常),用 SPSENS
  • 如果是控制量(需要下发命令的),用 DPCSPC
  • 如果是测量量(连续数值),用 MVSAV
  • 如果是定值(可整定的参数),用 ASGING

举个例子,我要定义一个「过流保护启动值」这个 DO。它是个定值,可以整定,所以选 ASG。然后 ASG 下必须有 setMag(模拟值)和 units(单位)。这样定义出来的 DO,任何支持 IEC 61850 的客户端都能正确解析。

核心原则:CDC 类型一旦选定,DO 的结构就固定了。你不能在 ASG 下面加一个 stVal,因为标准不允许。所以选 CDC 时要想清楚,这个 DO 到底要表达什么语义。选错了,后面改起来很麻烦。

3.5 知识体系总览

说了这么多,我画个图帮你理清思路。ICD 文件制作的核心逻辑,就是从整体到局部,逐层细化:

ICD 文件制作知识体系 ICD 文件 Header Communication IED LN 实例化 DO / DA 配置 CDC 数据类型选择 关键属性 • lnType → 引用模板 • inst → 实例编号 • prefix → 前缀区分 • lnClass → LN 类别 • FC → 功能约束 • CDC → 公用数据类

从图上你能看到,ICD 制作是一个自上而下的过程。先搭好文件骨架,再实例化 LN,然后配置每个 LN 下的 DO/DA,最后为每个 DO 选择合适的 CDC 类型。每一步都依赖上一步的成果。

嗯,到这里,ICD 文件制作的核心内容就讲完了。你可能会问,这些配置在实际工具里怎么操作?别急,后面我们会用具体工具演示一遍。记住,理论是基础,动手才是关键。

最后提醒一句:ICD 文件做好后,一定要用标准的 SCL 校验工具跑一遍。我见过太多人手工写 ICD,结果漏了标签闭合、属性拼写错误。工具校验能帮你省下大量调试时间。别问我怎么知道的——嗯,都是泪的教训。


公众号:蓝海资料掘金营,微信deep3321