第四节:数据对象与数据属性——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名:首字母大写,驼峰式。例如:
Pos、MMXU、CSWI - DA名:首字母小写,驼峰式。例如:
stVal、q、t、ctlVal
举个例子,一个完整的路径可能是这样的:
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 避坑指南
最后,分享几个我实际项目中遇到的坑:
- 命名大小写敏感:IEC 61850是大小写敏感的。Pos和pos是两个不同的东西。我曾经见过一个项目,因为大小写不一致,导致SCADA和IED之间通信失败。
- FC不能乱用:每个DA的FC是标准定义好的,你不能自己改。比如stVal只能是ST,你不能把它改成MX。
- CDC不能自己发明:除非你写私有扩展,否则必须用标准定义的CDC。我见过有人自己定义了一个“MySPS”,结果别的IED根本不认识。
- DO名称要查标准:每个逻辑节点能用的DO是有限制的。比如XCBR里可以有Pos,但不能有MMXU(那是测量节点的)。
好了,这一节的内容就这些。CDC、DO、DA、FC这四个概念,你只要记住:CDC是模板,DO是实例,DA是属性,FC是权限。搞清楚了,后面学报告、控制、定值就轻松多了。
下一节,咱们聊聊逻辑设备(LD)和逻辑节点(LN)的建模,那才是真正搭积木的时候。