IEC 61850 ICD文件解析

一、IEC 61850

IEC 61850是电力系统自动化领域的国际通信标准,由国际电工委员会第57技术委员会于2004年颁布。该标准通过定义变电站三层通信架构(站控层、间隔层、过程层)实现智能变电站工程标准化,其核心特点包括面向对象建模、数据自描述、网络独立性和抽象通信服务接口(ACSI)。

1.1 解决什么问题

我们以在变电站进行断路器远方遥控操作为例,运行人员通过监控主机对断路器进行远方控制,监控主机(在IEC 61850中被建模为客户端)首先向断路器发送一份控制命令(例如合闸),断路器收到命令后进行相应操作,操作完成之后再向监控主机发送一个报告,说明断路器位置已经发生改变。在这个过程中,断路器和监控主机一起协同工作,称为“互操作”。

为了实现断路器和监控主机之间的互操作;

  • 第一监控主机首先要知道断路器的名称是什么,以及如何在变电站通信网络中正确找到该断路器(寻址);
  • 第二它要知道需要向断路器发送什么信息。

第一个问题在于,实际工程中不同的用户或制造商可能会用不同的名字来命名断路器,有的可能用"CircuitBreaker1",有的可能用“CBK-2”。

第二个问题是究竟以何种方式传达操作命令,才能使通信双方都能正确理解并执行该命令。

这个简单的操作过程揭示了实现互操作的关键,即信息模型和信息交换方法要达到统一,这也正是IEC 61850标准所要解决的主要问题。

IEC 61850标准做了两个方面的标准化工作:

  • 第一是对网络上传递的信息内容进行了标准化,例如统一采用“XCBR”作为断路器的标准命名;
  • 第二是对这些信息交换的机制进行了标准化。

在IEC 61850标准中,这一套标准的信息交换机制就是抽象通信服务接口(ACSI)。

上面的断路器远方控制只是变电站自动化系统执行的诸多任务中的一种。 类似的任务还有很多,如操作员在远方切换保护装置的定值区号,装置向后台主机上传测量值、事故顺序记录SOE信号等。这些由变电站自动化系统执行的任务,如控制、监视、继电保护等,在IEC 61850标准中被称为功能(function)。

1.2 信息模型

信息模型和信息交换机制的统一是实现设备间互操作的关键,而信息交换机制在很大程度依赖于标准化的信息模型,因此信息模型及其建模方法是IEC 61850标准的核心。

信息模型用于描述现实世界中对象的某些特征、参数。IEC 61850标准中的信息模型是对变电站实际物理设备及其功能的一种抽象描述,用于解决通信双方对网络上传递的信息的相互理解问题,是实现互操作的基础之一。变电站设备信息模型的构建在有的文献中也被称为设备建模或数据建模。

不同于以前的通信标准,IEC 61850标准采用了面向对象的建模方法,从整个变电站到变电站内的各种设备、各个IED均被看作对象。IEC61850标准为每类对象建立了相应的信息模型。

在软件工程领域,面向对象建模的基本思想是利用计算机逻辑来模拟现实世界中的物理存在,IEC 61850标准的建模思想与之类似。

以现实世界中的实际断路器为例,我们使用IEC 61850标准为之建立的抽象信息模型--逻辑节点XCBR,XCBR就是断路器的虚拟模型。在面向对象建模中,每个对象均应该包含属性和服务。XCBR作为一个代表断路器的对象类,同样也包含这两个要素;

  • 包含Pos(断路器位置,合位/分位)、BlkOpn(跳闸闭锁)等属性;
  • 包含合闸、分闸、位置上送等服务。
1.2.1 逻辑节点

逻辑节点LN(Logical Node)是IEC 61850标准面向对象建模的关键部件,也是面向对象概念的集中体现。变电站自动化系统的各种功能和信息模型的表达式都归结到逻辑节点上实现。

逻辑节点的概念体现了将变电站自动化功能进行模块化分解的一种建模思想。IEC 61850标准建模的思路就是将变电站自动化系统的功能进行分解,分解的过程就是模块化处理,形成一个一个小的模块。每个逻辑节点就是一个模块,代表一个具体的功能。多个逻辑节点协同工作,共同完成变电站内的控制、保护、测量以及其他功能。

逻辑节点可以看做是变电站IED模型的基本组成部件,多个逻辑节点组合在一起形成一个IED,共同完成IED所要实现的各种功能。

为了满足变电站自动化系统的应用需求,IEC 61850-7-4标准定义了涵盖变电站一次设备、继电保护、测量控制、计量等领域近90个逻辑节点,覆盖了变电站内的各种设备和各种自动化功能。比如LN类名:

  • 控制类:XCBR(断路器), CSWI(断路器控制), CILO;
  • 测量类:MMXU(测量), MMXN;
  • 保护类:PTOC, PTUV, PDIF;
  • 通用类:GGIO, GGSK;
  • 其他类:RDRE, MHAI, YTWC。
1.2.2 数据集

数据集(DataSet)是IEC 61850标准的核心概念之一,顾名思义,它是一系列数据的集合。按照IEC 61850标准的定义,数据集是有序的数据引用和数据属性引用的集合。

IEC 61850标准引入数据集的目的是利用数据集对数据进行分组,以方便数据传送。变电站IED中存在各种数据,有的需要实时传送(如电流值、电压值、频率值等),有的可以慢些传送(如电度值、功率)。由于高压变电站中存在上百个IED,而网络通信带宽是有限的,如果这些数据不进行分组而一起发送,有可能会影响数据传输的实时性,甚至会造成通信阻塞。

引入数据集的概念后,利用数据集可以方便的对数据进行分组和打包。例如可以将需要实时传输的数据组成一个数据集,将对传输时间要求不苛刻的数据分成另一个数据集,分别传送。

1.2.3 逻辑设备

逻辑设备(Logical Device)可以看做是一个包含若干个逻辑节点的容器。按照IEC 61850标准的规定,所有逻辑设备都必须包含LLN0和LPHD两个逻辑节点。

  • LLN0:它用于管理整个逻辑设备,例如包含数据集、报告控制块、日志控制块等;
  • LPHD:它用于描述设备本身状态的相关信息,如一次设备的铭牌信息,反应物理装置运行状况的上电次数、失电告警等信息;

一般情况下,IEC 61850把那些具有公用特性或共同特征的逻辑节点划分到一个逻辑设备里。

1.2.4 IED

IEC 61850标准引入了智能电子设备IED(Intelligent Electronic Device)的概念,即包含一个或多个处理器的物理装置,能够接收来自外部的请求(如数据或控制指令),也能向外部发送数据和控制指令。

IED通常用来代表变电站中实际的物理装置,如常见的微机保护装置、测控装置、互感器合并单元、变压器有载分接开关控制器、断路器智能终端、电能表等。

二、SCL介绍

2.1 SCL

SCL(Substation Configuration Language):变电站配置描述语言,这是IEC 61850标准系列中专门用于描述变电站自动化系统配置的XML语言,统一了不同厂商设备的配置规范,包含IED能力描述文件(ICD)、系统规格描述文件(SSD)等核心组件。

ICD: IED能力描述文件,它本质上是一个遵循SCL语言的XML文件。它是由IED设备制造商提供的,描述了单个IED设备的功能和能力。你可以把它理解为这个设备的“简历”或“产品说明书”

2.2 ICD文件总体结构

一个ICD文件是一个结构良好的XML文件,其根元素是 。主要包含以下几个核心部分:

<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B">
    <!-- 以下是文件的主要部分 -->
    <Header id="..." version="..." revision="...">
        <!-- 历史版本信息 -->
    </Header>
    <Communication>
        <!-- 通信信息 -->
    </Communication>
    <IED name="IED1" type="MyTransformerProtection" manufacturer="XXX" configVersion="1.0">
        <!-- 这里详细描述了这个IED的所有能力 -->
    </IED>
    <DataTypeTemplates>
        <!--  -->
    </DataTypeTemplates>
</SCL>

三、Header(文件头)

包含文件的元数据。 主要包含文件ID、版本号、修订号、工具标识、是谁在什么时间创建或修改了这个文件等。具体案例如下:

<Header id="S61850.ICD" nameStructu	re="IEDName" revision="1.3" toolID="ICDCFG" version="0.0">
    <History>
        <Hitem revision="1.3" version="0.0" what="" when="2023-08-14 18:12:30" who="匿名" why=""/>
    </History>
</Header>

四、Communication(通信系统)

在ICD文件中,这个部分通常是空的或非常简单。 因为ICD只描述单个IED的能力,它还不知道自己在整个变电站网络中会如何与其他IED连接。具体的网络配置(子网、IP地址)会在后期集成时,在SCD文件中定义。

具体案例如下:

<Communication>
    <SubNetwork name="W01" type="8-MMS">
        <ConnectedAP apName="S1" iedName="TEMPLATE">
            <Address>
                <P type="IP">127.0.0.1</P>
            </Address>
        </ConnectedAP>
    </SubNetwork>
</Communication>

五、IED(智能电子设备)

IED节点详细描述了IED本身。关键属性:

  • name:IED名称 ,如IED1;
  • type:设备型号;
  • manufacturer:制造商。

IED内部是分层结构,像一个公司的组织架构。具体案例如下:

<IED configVersion="1.0" desc="61850IED" manufacturer="......" name="TEMPLATE" type="S61850">
      <!--  -->
</IED>
5.1 AccessPoint(访问点)

AccessPoint相当于IED的网络接口(如"M1"用于MMS,"S1"用于GOOSE/SV),每个IED节点下最多只能有一个AccessPoint节点。关键属性:

  • name:访问点名称,用于唯一标识IED的通信访问点;
  • desc:描述信息,对访问点的文字描述;
  • clock:时钟同步支持,表示是否支持时钟同步功能;
  • router:路由功能,表示是否具有路由功能。

每个访问点下有一个 Server(服务器)。具体案例如下:

<AccessPoint clock="false" name="S1" router="false">
    <Server desc="servers" timeout="60">
        <!--  -->
    </Server>
</AccessPoint>
5.2 Server(服务器)

对外提供数据访问服务的逻辑实体,访问点下可以包含若干个 LDevice(逻辑设备)。关键属性:

  • timeout:客户端连接超时时间(秒);
  • desc:对Server功能的文字描述;

具体案例如下:

<Server desc="servers" timeout="60">
    <Authentication/>
    <LDevice desc="DEV-LD_Device0" inst="LD_Device0">
        <!--  -->
    </LDevice>
</Server>
5.3 LDevice(逻辑设备)

在IEC 61850标准中,LDevice是IED内部的一个功能单元,每个LDevice代表一个功能单元或物理设备,它包含多个逻辑节点(LN)。

LDevice的子节点主要包括以下几种:

  • LN0(逻辑节点零):每个LDevice必须有一个LN0,它用于管理整个逻辑设备,例如包含数据集、报告控制块、日志控制块等;
  • LN(逻辑节点):这是LDevice中最主要的子节点,每个LN代表一个特定的功能。例如,MMXU代表测量单元,XCBR代表断路器,等等;
  • Private(私有元素):一些厂商可能会使用私有扩展,这些扩展不在IEC 61850标准中定义,但为了兼容性,允许在LDevice中包含私有元素。

这里提一下LN0和LN的区别:

特性LN0 (逻辑节点零)LN (普通逻辑节点)
角色定位逻辑设备的管理者/协调者具体功能的执行者
LN类名固定为 LLN0可变,如 XCBR, MMXU, PTOC
实例号固定为空或 "0"有实例号,如 1, 2, 3...
数量每个逻辑设备有且只有1个每个逻辑设备可以有多个
主要职责设备级管理、数据组织具体功能实现

LDevice通过inst属性标识,具体案例如下:

<LDevice desc="DEV-LD_Device0" inst="LD_Device0">
    <LN0 inst="" lnClass="LLN0" lnType="LLN01">
        <!-- ...... -->
  	</LN0>
    <LN inst="1" lnClass="LPHD" lnType="LPHD1">
        <!-- ...... -->
    </LN>
</LDevice>
5.4 LN0(逻辑节点零)

LN0逻辑设备的管理节点,包含设备级的公共信息和功能,主要子节点:

  • DataSet:数据集定义;
  • ReportControl:报告控制;
  • LogControl:日志控制;
  • SettingControl:定值组控制;
  • DOI;

具体案例如下:

<LN0 inst="" lnClass="LLN0" lnType="LLN01">
    <!-- 数据集定义 -->
    <DataSet desc="遥测数据集1" name="dsAin1">
         <!-- ...... -->
    </DataSet>
    <DataSet desc="遥信数据集1" name="dsDin1">
         <!-- ...... -->
    </DataSet>
    
    <!-- 报告控制 -->
     <ReportControl bufTime="0" buffered="false" confRev="1" datSet="dsAin1" desc="" indexed="true" intgPd="60000" name="urcbAin1p" rptID="TEMPLATE_LD_Device0/LLN0$RP$urcbAin1p">
         <!-- ...... -->
    </ReportControl>
    <ReportControl bufTime="100" buffered="true" confRev="1" datSet="dsDin1" desc="" indexed="true" intgPd="120000" name="brcbDin1p" rptID="TEMPLATE_LD_Device0/LLN0$BR$brcbDin1p">
         <!-- ...... -->
    </ReportControl>
    
    <!-- DOI -->
    <DOI desc="模式" name="Mod">
        <DAI name="ctlModel">
            <Val>status-only</Val>
        </DAI>
        <DAI name="stVal">
            <Val>on</Val>
        </DAI>
    </DOI>
    <DOI desc="行为状态" name="Beh">
        <DAI name="stVal">
            <Val>on</Val>
        </DAI>
    </DOI>
    <DOI desc="健康状态" name="Health">
        <DAI name="stVal">
            <Val>Ok</Val>
        </DAI>
    </DOI>
    <DOI desc="铭牌" name="NamPlt">
</LN0>
5.4.1 DataSet

DataSet节点是 IEC 61850 中数据组织的核心,它与ReportControl紧密配合工作。它定义了:

  • 要收集哪些数据(测点);
  • 这些数据的组织方式;
  • 作为一个整体进行传输的数据包;

关键属性说明:

  • name:数据集名称,在LN0内唯一;
  • desc:描述信息(可选);

子节点FCDA ,它精确指向一个具体的数据点:

  • ldInst:逻辑设备实例名;
  • lnClass:逻辑节点类;
  • lnInst:逻辑节点实例名;
  • doName:数据对象名;
  • daName:数据属性名;
  • fc:功能约束(可选)。

例如名字为dsAin1的DataSet,包含了若干个数据项(FCDA节点):

<DataSet desc="遥测数据集1" name="dsAin1">
    <FCDA doName="AnIn1" fc="MX" ldInst="LD_Device0" lnClass="GGIO" lnInst="1"/>
    <FCDA doName="AnIn2" fc="MX" ldInst="LD_Device0" lnClass="GGIO" lnInst="1"/>
    <FCDA doName="AnIn3" fc="MX" ldInst="LD_Device0" lnClass="GGIO" lnInst="1"/>
     <!-- ...... -->
</DataSet>

名字为dsDin1的DataSet,包含了若干个数据项(FCDA节点):

<DataSet desc="遥信数据集1" name="dsDin1">
    <FCDA doName="Ind1" fc="ST" ldInst="LD_Device0" lnClass="GGIO" lnInst="100"/>
    <FCDA doName="Ind2" fc="ST" ldInst="LD_Device0" lnClass="GGIO" lnInst="100"/>
    <FCDA doName="Ind3" fc="ST" ldInst="LD_Device0" lnClass="GGIO" lnInst="100"/>
     <!-- ...... -->
</DataSet>
5.4.2 ReportControl

在IEC 61850中,ReportControl节点位于LN0下,用于配置报告控制块。ReportControl定义了IED如何主动向客户端(如监控系统)报告数据。它就像是数据的快递服务,规定了:

  • 什么时候发送数据(触发条件);
  • 发送什么数据(关联的数据集);
  • 如何发送数据(缓冲、选项等);

主要属性:

  • name:报告控制块的名称,在同一逻辑设备内必须唯一;
  • datSet:引用的数据集名称(可选)。该数据集定义了报告中包含的数据;
  • rptID:报告标识符,用于在报告报文中标识此报告;
  • confRev:配置版本号,从1开始,当配置发生变化时应递增;
  • buffered:布尔值,表示是否缓冲报告(如果为true,则报告在通信中断时会缓冲,恢复后发送);
  • bufTime:缓冲时间(可选,单位毫秒),表示报告在发送前可以缓冲的时间;
  • intgPd:完整性周期(可选,单位毫秒),触发周期性报告的时间间隔;
  • trgOps:触发选项,定义哪些事件会触发报告。它是多个触发条件的组合,例如数据变化(dchg)、品质变化(qchg)、数据更新(dupd)等;
  • options:报告选项,例如包括序列号、时间戳等。

比如对于名字为dsAin1的DataSet,ReportControl定义如下:

<ReportControl bufTime="0" buffered="false" confRev="1" datSet="dsAin1" desc="" indexed="true" intgPd="60000" name="urcbAin1p" rptID="TEMPLATE_LD_Device0/LLN0$RP$urcbAin1p">
    <TrgOps dchg="true" dupd="false" period="true" qchg="false"/>
    <OptFields bufOvfl="true" configRef="true" dataRef="true" dataSet="true" entryID="true" reasonCode="true" seqNum="true" timeStamp="true"/>
    <RptEnabled max="16"/>
</ReportControl>

对于名字为dsDin1的DataSet,ReportControl定义如下:

<ReportControl bufTime="100" buffered="true" confRev="1" datSet="dsDin1" desc="" indexed="true" intgPd="120000" name="brcbDin1p" rptID="TEMPLATE_LD_Device0/LLN0$BR$brcbDin1p">
    <TrgOps dchg="true" dupd="false" period="true" qchg="false"/>
    <OptFields bufOvfl="true" configRef="true" dataRef="true" dataSet="true" entryID="true" reasonCode="true" seqNum="true" timeStamp="true"/>
    <RptEnabled max="16"/>
</ReportControl>

其子节点:

  • TrgOps:触发选项,子元素包括dchg(测点数值发生变化时触发)、qchg(数据品质位发生变化时触发)、dupd(数据被更新时触发(即使值未变))、period(按完整性周期定时触发)等,每个子元素为布尔值;
  • OptFields:可选字段,定义报告中包含哪些附加信息,如序列号、报告时间、原因码等;
  • RptEnabled:使能报告,可以设置最大客户端数量等。
5.5 LN(逻辑节点)

每个LN代表一个具体功能实现节点,为了方便理解,可以将其当做为LNodeType的实例。关键属性:

  • lnClass:LN类名;
  • inst:LN实例名;
  • lnType:根据该属性可以找到该LN所属的LNodeType;

LN 通过lnClass 和inst组合标识,如下:

<!-- 物理设备信息 --> 
<LN inst="1" lnClass="LPHD" lnType="LPHD1">
    <!-- ...... -->
</LN>
<LN inst="1" lnClass="GGIO" lnType="GGIO1_Device0">
    <!-- ...... -->
</LN>
<LN inst="2" lnClass="GGIO" lnType="GGIO2_Device0">        
    <!-- ...... -->
</LN>
3.5.1 DO(数据对象)和 DA(数据属性)

在IEC 61850中,一个LN实例(例如下面例子中的LPHD)包含多个数据(Data),这些数据在SCL中表示为DOI(Data Object Instance,数据对象实例)。每个DOI对应一个DO(数据对象),而DO的类型由CDC(公共数据类)定义,规定了该DO应包含哪些数据属性(DA);

  • DOI(Data Object Instance):表示一个数据对象实例。它对应一个DO,通过name属性指定DO的名称(例如PhyNam、PhyHealth)。DOI可以包含DAI和SDI;

  • DAI(Data Attribute Instance):表示一个数据属性实例。它对应一个DA,通过name属性指定DA的名称(例如stVal、q、t等)。DAI可以包含一个值(Val)或者多个值(对于数组类型);

  • SDI(SubData Instance):当某个DA是结构类型时,使用SDI来表示这个结构的成员。SDI可以包含DAI和下一级的SDI。

在ICD文件中,DO和DA的定义是在DataTypeTemplates部分中通过LNodeType、DOType和DAType来定义的。

具体案例如下:

<LN inst="1" lnClass="LPHD" lnType="LPHD1">
    <DOI desc="S61850导出设备" name="PhyNam">
        <DAI name="dU">
            <Val>S61850导出设备</Val>
        </DAI>
    </DOI>
    <DOI desc="Ok" name="PhyHealth">
        <DAI name="stVal">
            <Val>Ok</Val>
        </DAI>
    </DOI>
</LN>
<LN inst="1" lnClass="GGIO" lnType="GGIO1_Device0">
    <DOI desc="模式" name="Mod">
        <DAI name="ctlModel">
            <Val>status-only</Val>
        </DAI>
        <DAI name="stVal">
            <Val>on</Val>
        </DAI>
    </DOI>
    <DOI desc="行为状态" name="Beh">
        <DAI name="stVal">
            <Val>on</Val>
        </DAI>
    </DOI>
    <DOI desc="健康状态" name="Health">
        <DAI name="stVal">
            <Val>Ok</Val>
        </DAI>
    </DOI>
    <DOI desc="铭牌" name="NamPlt">
        <DAI name="dU">
            <Val>IEC 61850-7-4:2003</Val>
        </DAI>
    </DOI>
    <DOI desc="有功功率" name="AnIn1">
        <DAI name="dU">
            <Val>有功功率</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="无功功率" name="AnIn2">
        <DAI name="dU">
            <Val>无功功率</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="直流侧总功率" name="AnIn3">
        <DAI name="dU">
            <Val>直流侧总功率</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="Uab电压" name="AnIn4">
        <DAI name="dU">
            <Val>Uab电压</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="Ubc电压" name="AnIn5">
        <DAI name="dU">
            <Val>Ubc电压</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="Uca电压" name="AnIn6">
        <DAI name="dU">
            <Val>Uca电压</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="A相电流" name="AnIn7">
        <DAI name="dU">
            <Val>A相电流</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="B相电流" name="AnIn8">
        <DAI name="dU">
            <Val>B相电流</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
    <DOI desc="C相电流" name="AnIn9">
        <DAI name="dU">
            <Val>C相电流</Val>
        </DAI>
        <SDI name="sVC">
            <DAI name="scaleFactor">
                <Val>1</Val>
            </DAI>
            <DAI name="offset">
                <Val>0</Val>
            </DAI>
        </SDI>
    </DOI>
	<!-- ... 更多定义 ... -->
</LN>

六、DataTypeTemplates(数据类型模板)

DataTypeTemplates是ICD文件中的一个重要部分,它定义了文件中使用的数据类型模板,包括逻辑节点类型(LNodeType)、数据对象类型(DOType)、数据属性类型(DAType)和枚举类型(EnumType)。这些模板被文件中的实际逻辑节点(LN)实例引用,以确保数据模型的一致性和标准化。

  • LNodeType(逻辑节点类型):定义了一个逻辑节点类(如LPHD)所包含的数据对象(DO)及其类型;
  • DOType(数据对象类型):定义了一个数据对象所包含的数据属性(DA)及其类型,以及可能的功能约束(FC)和结构;
  • DAType(数据属性类型):定义了结构化的数据属性,包含多个基本数据属性(BDA);
  • EnumType(枚举类型): 定义枚举类型的可能取值(如断路器位置 on, off, bad)。

格式如下:

<!-- 数据类型模板:定义数据结构 -->
<DataTypeTemplates>
    <!-- 这里定义所有数据类型 -->
</DataTypeTemplates>
6.1 LNodeType(逻辑节点类型定义)

定义每个LN类包含哪些DO,具体案例如下:

<LNodeType id="GGIO1_Device0" lnClass="GGIO">
    <DO desc="Mod专用" name="Mod" type="ENC1_Mod"/>
    <DO desc="Beh专用" name="Beh" type="ENS1_Beh"/>
    <DO desc="Health专用" name="Health" type="ENS1_Health"/>
    <DO desc="NamPlt专用" name="NamPlt" type="LPL1_NamPlt"/>
    <DO desc="有功功率" name="AnIn1" type="MV1"/>
    <DO desc="无功功率" name="AnIn2" type="MV1"/>
    <DO desc="直流侧总功率" name="AnIn3" type="MV1"/>
    <DO desc="Uab电压" name="AnIn4" type="MV1"/>
    <DO desc="Ubc电压" name="AnIn5" type="MV1"/>
    <DO desc="Uca电压" name="AnIn6" type="MV1"/>
    <DO desc="A相电流" name="AnIn7" type="MV1"/>
    <DO desc="B相电流" name="AnIn8" type="MV1"/>
    <DO desc="C相电流" name="AnIn9" type="MV1"/>
    <DO desc="电网频率" name="AnIn10" type="MV1"/>
    <DO desc="功率因数" name="AnIn11" type="MV1"/>
    <DO desc="PCS额定功率" name="AnIn12" type="MV1"/>
	<!-- ... 更多定义 ... -->
</LNodeType>

关键属性:

  • id:类型标识符,在文件中唯一;
  • lnClass:对应的LN类名;
  • desc:描述信息。

子节点DO属性:

  • type:类型标识符,根据该属性可以找到该DO所属的DOType;
6.2 DOType(数据对象类型)

定义每个DO的结构(包含哪些 DA),具体案例如下:

<DOType cdc="INC" desc="Mod专用" id="ENC1_Mod">
    <DA bType="Enum" dchg="true" fc="ST" name="stVal" type="Mod"/>
    <DA bType="Quality" fc="ST" name="q" qchg="true"/>
    <DA bType="Timestamp" fc="ST" name="t"/>
    <DA bType="Enum" dchg="true" fc="CF" name="ctlModel" type="ctlModel"/>
</DOType>

关键属性:

  • id:类型标识符;
  • cdc:公共数据类(CDC),定义标准结构;
  • desc:描述信息。

子节点DA属性:

  • type:类型标识符,根据该属性可以找到该DA所属的DAType/EnumType;
6.3 DAType(数据属性类型定义)

定义复杂的数据结构,具体案例如下:

<DAType id="Originator1">
    <BDA bType="Enum" name="orCat" type="orCategory"/>
    <BDA bType="Octet64" name="orIdent"/>
</DAType>

BDA表示基本数据属性。

6.4 EnumType(枚举类型)

具体案例如下:

<EnumType desc="ctlModel" id="ctlModel">
    <EnumVal ord="0">status-only</EnumVal>
    <EnumVal ord="1">direct-with-normal-security</EnumVal>
    <EnumVal ord="2">sbo-with-normal-security</EnumVal>
    <EnumVal ord="3">direct-with-enhanced-security</EnumVal>
    <EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
6.5 与实际LN实例的关联

在IED部分引用这些类型,以如下节点为例:

<!-- 对应的LNodeType为GGIO1_Device0 -->
<LN inst="1" lnClass="GGIO" lnType="GGIO1_Device0">    
    <!-- 对应的DOType为ENC1_Mod -->
    <DOI desc="模式" name="Mod">
        <!-- 对应的EnumType为ctlModel -->
        <DAI name="ctlModel">
            <Val>status-only</Val>
        </DAI>
        <DAI name="stVal">
            <Val>on</Val>
        </DAI>
    </DOI>
</LN>

关联关系:

1. LN[lnType="GGIO1_Device0"]  查找id="GGIO1_Device0"的LNodeType节点
   <LNodeType id="GGIO1_Device0" lnClass="GGIO"> 
       
2. LNodeType[id="GGIO1_Device0"] 在LN子节点查找name="Mod"的DOI子节点
   <DOI desc="模式" name="Mod">......</DOI> 
       
3. 在LNodeType子节点中查找name="Mod"的DO子节点
   <DO desc="Mod专用" name="Mod" type="ENC1_Mod"/>
			
4. 到DOType节点中查找id="ENC1_Mod"的节点
   <DOType cdc="INC" desc="Mod专用" id="ENC1_Mod">......</DOType>

5. 在DOI子节点中查找子节点 
   <DAI name="ctlModel">
			
6. 在DOType子节点中查找name="ctlModel"的节点
   <DA bType="Enum" dchg="true" fc="CF" name="ctlModel" type="ctlModel"/>
				
7. 到DAType/EnumType节点中查找id="ctlModel"的节点
   <EnumType desc="ctlModel" id="ctlModel">......</EnumType>
在Linux环境下使用C语言解析IEC 61850 ICD(IED Configuration Description)文件,需要理解ICD文件的结构和内容,并利用合适的XML解析库来实现。ICD文件是基于XML格式的,描述了智能电子设备(IED)的功能配置和通信参数。以下是实现解析的基本方法和步骤: ### 1. 熟悉IEC 61850标准与ICD文件结构 IEC 61850标准定义了变电站自动化系统的通信协议,其中ICD文件用于描述单个IED的配置信息,包括逻辑节点(LN)、数据对象(DO)、数据属性(DA)等[^1]。ICD文件通常包含以下关键部分: - `<Header>`:文件头信息,如版本号、时间戳。 - `<IED>`:IED的配置信息,包括设备名称、逻辑节点类(LNClass)、通信参数等。 - `<DataTypeTemplates>`:数据类型模板定义,用于标准化数据模型。 ### 2. 选择合适的XML解析库 由于ICD文件是XML格式,可以使用C语言中成熟的XML解析库进行处理。常用的库包括: - **libxml2**:功能强大且广泛使用的XML解析库,支持XPath查询和SAX/DOM解析模式。 - **Expat**:轻量级的SAX解析器,适合内存受限的环境。 ### 3. 实现解析流程 解析ICD文件的基本流程如下: - **读取文件内容**:使用标准C文件操作函数(如`fopen`、`fread`)读取ICD文件内容到内存缓冲区。 - **初始化XML解析器**:根据所选库初始化解析器,并注册回调函数处理XML元素的开始标签、结束标签和文本内容。 - **提取关键信息**:在回调函数中,根据ICD文件的结构提取所需信息,如IED名称、逻辑节点、数据对象等。 #### 示例代码(使用libxml2解析ICD文件) ```c #include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> // 解析XML文档的函数 void parse_icd_file(const char *filename) { xmlDocPtr doc; // 文档指针 xmlNodePtr cur; // 当前节点指针 // 解析文件 doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "Failed to parse file %s\n", filename); return; } // 获取根节点 cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr, "Empty document\n"); xmlFreeDoc(doc); return; } // 遍历XML节点 cur = cur->xmlChildrenNode; while (cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"IED")) { xmlChar *name = xmlGetProp(cur, (const xmlChar *)"name"); if (name != NULL) { printf("IED Name: %s\n", name); xmlFree(name); } } cur = cur->next; } // 释放文档 xmlFreeDoc(doc); } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <ICD file>\n", argv[0]); return 1; } // 初始化libxml2 xmlInitParser(); parse_icd_file(argv[1]); xmlCleanupParser(); return 0; } ``` ### 4. 编译与运行 使用`libxml2`时,需要在编译时链接该库。例如,使用`gcc`编译上述代码: ```bash gcc -o parse_icd parse_icd.c `xml2-config --cflags --libs` ``` 运行程序时,传入ICD文件路径作为参数: ```bash ./parse_icd example.icd ``` ### 5. 扩展功能 - **XPath查询**:使用`libxml2`的XPath功能可以更灵活地定位特定节点。 - **错误处理**:增加详细的错误处理逻辑,确保程序在面对不规范的ICD文件时仍能稳定运行。 - **数据模型构建**:将解析后的信息存储为结构化的数据模型,便于后续处理和使用。 ### 6. 注意事项 - **内存管理**:在使用`libxml2`时,注意及时释放不再使用的XML节点和属性,避免内存泄漏。 - **字符编码**:ICD文件可能使用不同的字符编码(如UTF-8),需确保解析器正确处理编码问题。 - **性能优化**:对于大型ICD文件,考虑使用流式解析(如SAX)以减少内存占用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值