第四节:数据对象与数据属性——CDC、DO、DA与FC

好,咱们今天聊点实在的。IEC 61850里最绕不开的概念,就是数据对象(DO)和数据属性(DA)。很多初学者一上来就被这些缩写搞晕了——CDC、DO、DA、FC……说实话,我当年刚接触这个协议时,也花了整整一周才理清楚它们之间的关系。

别急,咱们一个一个拆开讲。

4.1 公用数据类(CDC)——数据对象的“模板”

CDC,全称是Common Data Class,中文叫公用数据类。你可以把它理解成一种“模板”或“蓝图”。

举个例子。变电站里有个断路器,它的位置状态是“分”还是“合”。这个状态信息,在IEC 61850里怎么描述?总不能每个厂家自己定义一套吧?那不同设备之间就没法互操作了。

所以,标准定义了一些通用的数据类。比如:

  • SPS(Single Point Status):单点状态,比如断路器位置
  • MV(Measured Value):测量值,比如电流、电压
  • CMV(Complex Measured Value):复数测量值,比如相量
  • ACT(Actuator):控制输出,比如遥控分合
  • BCR(Binary Counter Reading):二进制计数器读数

每个CDC都定义了一组固定的数据属性(DA)。比如SPS这个类,它必须包含:

  • stVal(状态值)
  • q(品质)
  • t(时标)

嗯,这里要注意:CDC是抽象的,你不能直接用它。你得先实例化成一个具体的数据对象(DO),才能放到逻辑节点里用。

我个人的习惯是:把CDC想象成C++里的类,DO就是类的实例。你定义一个“断路器位置”的DO,它的类型就是SPS。这样不同厂家的IED都能理解这个DO里有哪些DA。

4.2 DO与DA的命名规则——别乱起名字

IEC 61850对命名有严格的规定。为什么?因为要保证互操作性。你想想看,如果A厂把断路器位置叫“Pos”,B厂叫“Position”,C厂叫“SwitchStatus”,那SCADA系统怎么统一处理?

所以,标准里规定了:

  • DO名称:必须来自标准定义的“数据对象名称列表”。比如断路器位置只能用Pos,不能用别的。
  • DA名称:必须来自CDC里定义的属性名。比如SPS类的状态值只能用stVal

命名规则其实很简单:

  • DO名:首字母大写,驼峰式。例如:PosMMXUCSWI
  • DA名:首字母小写,驼峰式。例如:stValqtctlVal

举个例子,一个完整的路径可能是这样的:

XCBR1.Pos.stVal

这表示:逻辑节点XCBR1(断路器)里的数据对象Pos(位置)的数据属性stVal(状态值)。

我曾经踩过一个坑:有个项目里,某厂家把“控制使能”这个DA写成了“CtrlEnb”,但标准里定义的是“CtlEnb”。结果SCADA系统死活读不到这个属性,排查了两天才发现是命名不规范。所以,命名一定要严格对照标准文档,别自己发明缩写。

4.3 功能约束(FC)——数据属性的“访问权限”

FC,全称是Functional Constraint,功能约束。它决定了:

  • 这个DA是干什么用的
  • 谁可以读它
  • 谁可以写它
  • 它属于哪个服务(报告、控制、定值等)

常见的FC有:

FC代码 全称 用途 举例
ST Status 状态信息(只读) stVal, q, t
MX Measurand 测量值(只读) mag, instMag
CO Control 控制输出(可写) ctlVal, origin
CF Configuration 配置参数(可读可写) units, db
DC Description 描述信息(只读) dU, d
SG Setting Group 定值组(可读可写) setVal

为什么要区分FC?说白了,就是为了安全。你不能让一个操作员随便修改保护定值(那是CF或SG的事),也不能让一个工程师误操作去遥控断路器(那是CO的事)。

举个例子,同样是“位置”这个DO:

  • Pos.stVal 的FC是ST,表示这是状态值,只读
  • Pos.ctlVal 的FC是CO,表示这是控制值,可写

你看,同一个DO,不同的DA有不同的FC,访问权限完全不同。

我建议:在配置SCADA系统时,一定要搞清楚每个DA的FC。比如你要读取断路器位置,应该用ST下的stVal;你要下发分闸命令,应该用CO下的ctlVal。搞混了,轻则读不到数据,重则误操作。

4.4 三者之间的关系——一张图说清楚

咱们用个实际例子串起来:

假设有一个断路器,逻辑节点是XCBR1。它有一个数据对象叫Pos(位置)。Pos的类型是SPS(单点状态)。SPS这个CDC里定义了三个DA:stVal、q、t。

那么,在SCADA系统里,你看到的是:

XCBR1.Pos.stVal  (FC=ST)  → 状态值,只读
XCBR1.Pos.q      (FC=ST)  → 品质,只读
XCBR1.Pos.t      (FC=ST)  → 时标,只读

如果你要控制这个断路器,那还得有另一个DO,比如CSWI1.Pos:

CSWI1.Pos.ctlVal (FC=CO)  → 控制值,可写
CSWI1.Pos.origin (FC=CO)  → 控制源,只读

你看,CDC(SPS)定义了“有哪些DA”,DO(Pos)是“具体哪个数据”,FC(ST/CO)决定了“怎么用”。

嗯,说白了就是三层结构:

  • CDC:模板,定义属性集合
  • DO:实例,具体的数据对象
  • DA:属性,具体的数据值
  • FC:标签,说明属性的用途和访问权限

我记得有一次做变电站调试,一个同事问我:“为什么我读不到断路器的位置?”我一看他的配置,他把FC写成了MX(测量值),但Pos的stVal是ST(状态值)。改过来就好了。所以,FC搞错了,数据就读不到。

4.5 避坑指南

最后,分享几个我实际项目中遇到的坑:

  1. 命名大小写敏感:IEC 61850是大小写敏感的。Pos和pos是两个不同的东西。我曾经见过一个项目,因为大小写不一致,导致SCADA和IED之间通信失败。
  2. FC不能乱用:每个DA的FC是标准定义好的,你不能自己改。比如stVal只能是ST,你不能把它改成MX。
  3. CDC不能自己发明:除非你写私有扩展,否则必须用标准定义的CDC。我见过有人自己定义了一个“MySPS”,结果别的IED根本不认识。
  4. DO名称要查标准:每个逻辑节点能用的DO是有限制的。比如XCBR里可以有Pos,但不能有MMXU(那是测量节点的)。

好了,这一节的内容就这些。CDC、DO、DA、FC这四个概念,你只要记住:CDC是模板,DO是实例,DA是属性,FC是权限。搞清楚了,后面学报告、控制、定值就轻松多了。

下一节,咱们聊聊逻辑设备(LD)和逻辑节点(LN)的建模,那才是真正搭积木的时候。