3. MMS协议原理:MMS核心服务、VMD模型、命名规则
好,咱们进入MMS协议这部分。说实话,MMS是IEC61850里最绕、也最核心的一块。很多工程师学到这里就开始犯困——一堆抽象概念,什么VMD、命名域、对象引用……我当年刚接触时也懵了好一阵。
但你别怕。MMS说白了就是一套「变电站设备怎么互相打招呼、怎么要数据、怎么下命令」的规矩。咱们把它拆开揉碎了讲,你就能明白。
3.1 MMS是什么?为什么用它?
MMS的全称是Manufacturing Message Specification,制造报文规范。它最早不是给电力用的,是工业自动化领域的东西。后来IEC61850把它拿过来,作为变电站通信的应用层协议。
我个人习惯把MMS理解成「变电站的HTTP协议」。你想想看,HTTP定义了浏览器和服务器之间怎么传网页,MMS定义了IED(智能电子设备)之间怎么传数据、怎么控制、怎么报告事件。
MMS的核心价值在于:它提供了一套统一的服务接口。不管你是哪家厂商的设备,只要支持MMS,就能互相通信。我在项目中遇到过不同品牌的保护装置和测控装置对接,用的就是MMS,省了不少事。
应用层:MMS + ACSI(抽象通信服务接口)
表示层:ASN.1 BER编码
传输层:TCP/IP
网络层:IP
链路层:以太网
3.2 VMD模型——虚拟制造设备
VMD,全称Virtual Manufacturing Device,虚拟制造设备。这是MMS里最核心的概念。
你想想看,一个真实的保护装置,里面有CPU、内存、继电器、采样电路……这些东西千差万别。MMS怎么统一描述它们?
答案就是VMD。VMD把真实的物理设备抽象成一个虚拟的模型。这个模型里包含:
- 命名域(Domain):相当于一个容器,装着一组相关的对象
- 程序调用(Program Invocation):代表设备上运行的程序
- 变量(Variable):设备里的数据点,比如电流值、开关状态
- 日志(Journal):事件记录
- 事件(Event):设备状态变化通知
- 操作员站(Operator Station):人机接口
嗯,这里要注意:IEC61850并没有直接用VMD的概念,而是通过ACSI(抽象通信服务接口)做了二次抽象。但底层走的还是MMS的VMD模型。
3.3 MMS核心服务
MMS定义了一大堆服务,但咱们做风电保护通信,常用的就那么几个。我帮你梳理一下:
| 服务类别 | 服务名称 | 用途 | 对应IEC61850服务 |
|---|---|---|---|
| 环境管理 | Initiate、Conclude、Abort | 建立/关闭/异常终止MMS连接 | 关联(Association) |
| 变量访问 | Read、Write | 读取/写入数据值 | GetDataValues、SetDataValues |
| 变量信息 | GetVariableAccessAttributes | 获取变量的属性(类型、结构等) | GetDataDefinition |
| 命名域管理 | GetNameList | 获取命名域中的对象列表 | GetLogicalDeviceDirectory、GetLogicalNodeDirectory |
| 事件管理 | EventNotification、AcknowledgeEventNotification | 事件通知与确认 | 报告(Report) |
| 日志管理 | ReadJournal、WriteJournal | 读写日志记录 | GetBRCBValues、SetBRCBValues |
| 文件管理 | FileOpen、FileRead、FileClose | 读写设备中的文件(如故障录波) | 文件传输 |
你看,MMS的服务其实很「底层」。它不关心你读的是电流还是电压,它只提供「读变量」这个动作。至于变量叫什么、是什么类型,那是上层IEC61850模型的事。
我建议你重点掌握三个服务:Read、Write、GetNameList。这三个在调试中用的最多。我曾经在现场排查一个保护装置不上送数据的问题,就是用GetNameList去遍历它的命名域,发现有个逻辑节点根本没实例化——厂商固件版本不对。
3.4 命名规则——MMS的对象怎么找?
MMS里的对象不是随便命名的。它有严格的层次结构。咱们先看一个完整的MMS对象引用例子:
MMS对象引用格式:
DomainName$ItemName$VariableName
实际例子:
WIND1$PROT$GGIO1$Ind1$stVal
分解:
- DomainName: WIND1(逻辑设备名)
- ItemName: PROT$GGIO1$Ind1(逻辑节点+数据对象+数据属性路径)
- VariableName: stVal(具体的数据属性)
这里有个容易混淆的地方:MMS的命名域(Domain)对应IEC61850的逻辑设备(Logical Device)。ItemName对应逻辑节点(Logical Node)下的数据对象路径。VariableName对应具体的数据属性。
MMS的命名规则还有几个要点:
- 命名域名称:通常与逻辑设备名一致,长度不超过32字符
- ItemName:用$符号分隔层次,每个层次名称不超过32字符
- VariableName:数据属性名,如stVal、q、t等
- 通配符:MMS支持用*做通配符查询,比如"WIND1$PROT$*"可以列出PROT下的所有对象
说到通配符,我在调试时经常用这个功能。比如我想知道某个保护装置有哪些遥测数据,直接发一个GetNameList请求,DomainName填"WIND1",ItemName填"*$*$MX$*",就能把所有测量值列出来。比翻ICD文件快多了。
3.5 MMS与IEC61850的映射关系
咱们用一张图来理清MMS和IEC61850的对应关系。这张图我画了很多次,每次培训都拿出来讲。
这张图你看懂了吗?从上往下看:
- IEC61850定义了一套抽象的、与具体协议无关的模型(LD、LN、DO、DA)
- MMS把这些抽象模型映射到自己的具体对象(Domain、ItemName、VariableName)
- MMS对象再通过ASN.1 BER编码成二进制流
- 最后通过TCP/IP网络传输
说白了,MMS就是IEC61850的「翻译官」。它把IEC61850那些高大上的抽象概念,翻译成实实在在的、能在网络上传输的报文。
1.
confirmed-RequestPDU:请求报文,里面包含服务类型和参数2.
confirmed-ResponsePDU:响应报文,里面包含返回数据看懂了这两个,MMS通信你就掌握了八成。
3.6 实际项目中的MMS调试经验
最后,我分享几个实际调试中的经验,希望能帮你少走弯路。
经验一:连接建立阶段
MMS通信的第一步是Initiate服务。客户端发Initiate请求,服务端回Initiate响应。这里面有个参数叫「最大PDU大小」,我遇到过双方这个参数不匹配导致通信失败的情况。建议统一设为65000字节。
经验二:对象发现阶段
用GetNameList服务遍历设备的所有对象。先获取命名域列表,再获取每个命名域下的ItemName列表。这个过程在设备启动后做一次就够了,把结果缓存起来,后续读写直接引用。
经验三:读写操作
Read和Write服务支持一次读写多个变量。我建议尽量批量操作,减少网络交互次数。比如要读三相电流,一次Read三个变量,比三次Read效率高得多。
好了,MMS协议的核心内容就这些。你掌握了VMD模型、核心服务、命名规则这三块,再配合抓包工具练练手,很快就能上手。记住,MMS没那么神秘,它就是一套「设备间怎么要数据、怎么下命令」的规矩。规矩搞清楚了,剩下的就是熟练度的问题。