SCL语言基础:SCL文件结构与XML语法

各位同学好,我是老张。今天咱们来聊聊SCL文件的结构和XML语法。说实话,我刚接触IEC61850那会儿,看到SCL文件第一反应是——这玩意儿怎么这么长?后来干的项目多了,才发现它其实很有规律。

SCL文件,全称是Substation Configuration description Language。说白了,它就是用来描述变电站配置的一种XML文件。你想想看,一个变电站里那么多设备、那么多通信链路,总得有个统一的方式把它们说清楚吧?SCL就是干这个的。

SCL文件五大核心结构 SCL Header 文件头信息 Substation 变电站描述 IED 智能设备 Communication 通信配置 DataTypeTemplates 数据类型模板 版本、修订、工具信息 电压等级、间隔、设备 服务器、逻辑设备 子网、访问点 LNodeType、DOType SCL文件 = 变电站描述 + 设备描述 + 通信描述 + 数据类型定义

1. SCL文件的五大核心结构

一个完整的SCL文件,由五个主要部分组成。我习惯把它们叫做「五块积木」。每一块都有自己的职责,拼在一起就是一个完整的变电站配置。

结构名称 作用 包含内容
Header 文件头,描述SCL文件本身 版本号、修订号、创建工具、名称映射等
Substation 描述变电站的一次拓扑 电压等级、间隔、断路器、刀闸等
IED 描述智能电子设备 服务器、逻辑设备、逻辑节点、数据对象
Communication 描述通信网络配置 子网、IP地址、访问点、MAC地址
DataTypeTemplates 定义数据类型模板 LNodeType、DOType、DAType、EnumType
💡 核心要点: 这五个部分缺一不可。我见过有人为了省事,把Substation部分删掉,结果工具死活不认。记住,SCL文件是一个整体,每个部分都有它的意义。

2. Header — 文件的身份证

Header部分,说白了就是这张SCL文件的「身份证」。它告诉别人:我是谁、谁生了我、我是什么版本。

<Header id="DemoSubstation" 
        version="1.0" 
        revision="1" 
        toolID="IEDConfigTool" 
        nameStructure="IEDName">
    <Text>这是一个示例变电站配置</Text>
    <History>
        <Hitem version="1.0" revision="1" when="2024-01-15T10:00:00" who="ZhangSan" what="初始创建"/>
    </History>
</Header>

这里有几个属性需要注意:

  • id:唯一标识,不能重复。我习惯用项目名+日期来命名。
  • versionrevision:版本管理用。有一次我在现场发现两个版本不一致,折腾了半天才发现是版本号没更新。
  • nameStructure:这个很关键。它决定了设备引用的方式。一般用"IEDName"。
  • History:记录修改历史。建议每次修改都加一条记录,方便追溯。
🔧 我的小技巧: 在Header里加一个Text元素,写上项目名称和用途。虽然不强制,但后期维护时能省不少事。

3. Substation — 变电站的骨架

Substation部分描述的是变电站的一次系统。说白了,就是断路器、刀闸、变压器这些一次设备长什么样、怎么连接的。

<Substation name="DemoSubstation" desc="示例变电站">
    <VoltageLevel name="E1" nomFreq="50" numPhases="3">
        <Voltage unit="V" multiplier="k">110</Voltage>
        <Bay name="Bay1" desc="线路间隔1">
            <ConductingEquipment name="CB1" type="CBR" desc="断路器1"/>
            <ConductingEquipment name="DS1" type="DIS" desc="刀闸1"/>
        </Bay>
    </VoltageLevel>
</Substation>

这里要注意层级关系:

  • SubstationVoltageLevel(电压等级)→ Bay(间隔)→ ConductingEquipment(一次设备)
  • 每个设备都有type属性,比如CBR表示断路器、DIS表示刀闸、PTR表示变压器。
⚠️ 避坑指南: 我曾经遇到一个项目,Substation里的设备名称和图纸对不上。原因是有人把断路器写成了刀闸的类型。这种低级错误,在调试阶段会让你抓狂。所以,写完一定要和一次接线图核对一遍。

4. IED — 智能设备的核心

IED部分,是整个SCL文件里最复杂的一块。它描述的是保护装置、测控装置这些智能设备。每个IED下面有服务器、逻辑设备、逻辑节点、数据对象,一层套一层。

<IED name="PROT1" type="PCS-931" manufacturer="NR" configVersion="1.0">
    <Services>
        <DynAssociation />
        <GetDirectory />
    </Services>
    <AccessPoint name="S1">
        <Server>
            <Authentication none="true"/>
            <LDevice inst="LD0">
                <LN0 lnClass="LLN0" inst="" lnType="LLN0_Example"/>
                <LN lnClass="PDIF" inst="1" lnType="PDIF_Example"/>
            </LDevice>
        </Server>
    </AccessPoint>
</IED>

关键点:

  • AccessPoint:访问点,相当于设备的通信接口。一个设备可以有多个访问点。
  • LDevice:逻辑设备,可以理解成设备里的一个功能模块。
  • LN:逻辑节点,比如PDIF(差动保护)、PTOC(过流保护)。
  • lnType:这个属性指向DataTypeTemplates里定义的类型。
💡 经验之谈: 我刚开始做配置时,总搞不清lnType和实际数据的关系。后来明白了,lnType就像是一个「模板」,真正的数据实例是在IED里定义的。模板在DataTypeTemplates里,实例在IED里。

5. Communication — 通信的桥梁

Communication部分,描述的是设备之间怎么通信。说白了,就是IP地址、子网掩码、MAC地址这些东西。

<Communication>
    <SubNetwork name="StationBus" type="8-MMS">
        <BitRate unit="b/s" multiplier="M">100</BitRate>
        <ConnectedAP iedName="PROT1" apName="S1">
            <Address>
                <P type="IP">192.168.1.10</P>
                <P type="IP-SUBNET">255.255.255.0</P>
                <P type="MAC-Address">00-1A-2B-3C-4D-5E</P>
            </Address>
        </ConnectedAP>
    </SubNetwork>
</Communication>

这里要注意:

  • SubNetwork:子网,可以理解成一个网段。站控层和过程层一般用不同的子网。
  • ConnectedAP:连接点,把IED的访问点和实际的IP地址关联起来。
  • Address:地址信息,包括IP、子网掩码、MAC地址等。
🔧 避坑指南: 我曾经遇到一个通信不通的问题,查了半天发现是MAC地址写错了。MAC地址的格式一定要用连字符分隔,而且不能有空格。这种细节,不注意就会踩坑。

6. DataTypeTemplates — 数据类型的仓库

DataTypeTemplates,是整个SCL文件的「仓库」。它定义了所有用到的数据类型,包括逻辑节点类型、数据对象类型、数据属性类型和枚举类型。

<DataTypeTemplates>
    <LNodeType id="LLN0_Example" lnClass="LLN0">
        <DO name="Mod" type="INC_Mod"/>
        <DO name="Beh" type="INS_Beh"/>
    </LNodeType>
    
    <DOType id="INC_Mod" cdc="INC">
        <DA name="stVal" bType="INT32" fc="ST"/>
        <DA name="q" bType="Quality" fc="ST"/>
        <DA name="t" bType="Timestamp" fc="ST"/>
    </DOType>
    
    <EnumType id="BehEnum">
        <EnumVal ord="1">on</EnumVal>
        <EnumVal ord="2">blocked</EnumVal>
        <EnumVal ord="3">test</EnumVal>
        <EnumVal ord="4">test/blocked</EnumVal>
        <EnumVal ord="5">off</EnumVal>
    </EnumType>
</DataTypeTemplates>

四种类型模板:

  • LNodeType:逻辑节点类型,定义了一个逻辑节点包含哪些数据对象。
  • DOType:数据对象类型,定义了数据对象包含哪些数据属性。
  • DAType:数据属性类型,定义了复杂数据属性的内部结构。
  • EnumType:枚举类型,定义了枚举值的含义。
💡 我的理解: DataTypeTemplates就像是一本字典。IED部分引用这本字典里的词条,告诉别人「我这个设备支持哪些功能」。字典写得越规范,设备之间的互操作性就越好。

7. XML语法基础 — 写SCL的必备技能

SCL文件本质上是XML文件。所以,你得懂一点XML语法。别担心,没那么复杂。

XML的核心规则:

  • 标签必须成对出现<tag></tag>,或者自闭合 <tag/>
  • 属性值必须用引号:单引号双引号都行,但建议统一用双引号
  • 大小写敏感<IED><ied> 是两个不同的标签
  • 必须有根元素:SCL文件的根元素就是 <SCL>
  • 注释用 <!-- 注释内容 -->
<!-- 这是一个正确的XML示例 -->
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
    <Header id="MyProject" version="1.0" revision="1"/>
    <!-- 其他内容 -->
</SCL>

<!-- 这是一个错误的XML示例 -->
<SCL>
    <Header id=MyProject version=1.0>  <!-- 属性值没加引号,错误! -->
</SCL>  <!-- 缺少命名空间,但工具可能能容忍 -->
⚠️ 避坑指南: 我曾经犯过一个低级错误——在SCL文件里用了中文标点。XML解析器直接报错,我找了半天才发现是冒号用了中文的。记住,XML里所有符号都必须是英文半角。

8. 实战中的小建议

说了这么多,最后给大家几个实战建议:

  1. 用专业的SCL编辑器:别用记事本。我推荐用Sublime Text或者VS Code,加上XML插件,语法高亮能帮你省不少时间。
  2. 养成验证的习惯:写完SCL文件,用工具验证一下。很多IED厂商都提供免费的验证工具。
  3. 保持文件整洁:适当缩进、加注释。你想想看,半年后你自己回头看这个文件,没有注释的话,你可能都忘了当初为什么这么写。
  4. 版本控制:用Git管理SCL文件。我见过太多人因为版本混乱,把错误的配置下装到现场设备里。
📌 总结一下: SCL文件就是五个部分——Header、Substation、IED、Communication、DataTypeTemplates。它们各司其职,共同描述了一个完整的变电站自动化系统。XML语法是基础,写的时候注意规范,养成好习惯。
专注资料整理