SCL语言基础:SCL文件结构与XML语法
各位同学好,我是老张。今天咱们来聊聊SCL文件的结构和XML语法。说实话,我刚接触IEC61850那会儿,看到SCL文件第一反应是——这玩意儿怎么这么长?后来干的项目多了,才发现它其实很有规律。
SCL文件,全称是Substation Configuration description Language。说白了,它就是用来描述变电站配置的一种XML文件。你想想看,一个变电站里那么多设备、那么多通信链路,总得有个统一的方式把它们说清楚吧?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:唯一标识,不能重复。我习惯用项目名+日期来命名。
- version 和 revision:版本管理用。有一次我在现场发现两个版本不一致,折腾了半天才发现是版本号没更新。
- 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>
这里要注意层级关系:
- Substation → VoltageLevel(电压等级)→ 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. 实战中的小建议
说了这么多,最后给大家几个实战建议:
- 用专业的SCL编辑器:别用记事本。我推荐用Sublime Text或者VS Code,加上XML插件,语法高亮能帮你省不少时间。
- 养成验证的习惯:写完SCL文件,用工具验证一下。很多IED厂商都提供免费的验证工具。
- 保持文件整洁:适当缩进、加注释。你想想看,半年后你自己回头看这个文件,没有注释的话,你可能都忘了当初为什么这么写。
- 版本控制:用Git管理SCL文件。我见过太多人因为版本混乱,把错误的配置下装到现场设备里。
📌 总结一下: SCL文件就是五个部分——Header、Substation、IED、Communication、DataTypeTemplates。它们各司其职,共同描述了一个完整的变电站自动化系统。XML语法是基础,写的时候注意规范,养成好习惯。