3. MMS协议详解:制造报文规范

MMS协议,全称是制造报文规范。说实话,我刚接触变电站通信时,觉得这名字挺唬人的。后来做项目多了才发现,它其实就是一套让智能电子设备(IED)之间能「好好说话」的规则。

为什么变电站要用MMS?我个人的理解是:变电站里的设备五花八门,有保护装置、测控装置、智能终端……每个厂家都有自己的通信方式。MMS就像个翻译官,让这些设备能互相理解。嗯,这里要注意,MMS可不是什么新协议,它在工业自动化领域已经用了三十多年了。

3.1 MMS的原理

MMS的核心思想其实很简单——虚拟制造设备(VMD)。你想想看,每个IED内部都有各种功能,比如遥测、遥信、遥控。MMS把这些功能抽象成标准化的对象,然后通过读写这些对象来实现通信。

我举个例子。你在变电站里看到一个保护装置,它内部有测量值、定值、状态量。MMS就把这些抽象成:

  • 命名变量:比如电流值、电压值
  • 命名变量列表:一组相关的变量,比如三相电流
  • 日志:事件记录、故障录波
  • 文件:配置文件、录波文件

说白了,MMS就是定义了一套「对象模型」和「服务」。客户端(比如后台监控系统)通过调用服务来操作这些对象。服务包括读、写、报告、订阅等等。

核心要点:MMS是C/S架构,客户端发起请求,服务器响应。但变电站里很多设备既是客户端又是服务器,比如保护装置既要响应后台的查询,也要主动上送告警。

我在项目中遇到过一个问题:两个不同厂家的保护装置,都声称支持MMS,但就是通不上。后来发现,一个用的是MMS的「读」服务,另一个用的是「读后响应」服务。虽然功能一样,但服务名称不同。这就是MMS的灵活性带来的坑。

3.2 MMS在变电站中的应用

在IEC 61850标准里,MMS被用来承载大部分通信。具体来说:

应用场景 MMS服务 说明
遥测上送 读/报告 电流、电压、功率等模拟量
遥信上送 报告 开关位置、告警信号等状态量
遥控操作 分合闸命令、档位调节
定值读写 读/写 保护定值、参数设置
文件传输 文件服务 故障录波、事件记录
日志查询 日志服务 SOE、操作记录

我建议你重点关注「报告」服务。为什么?因为变电站里大部分数据都是通过报告上送的。报告有两种模式:

  • 缓存报告:数据变化时先存起来,等客户端来取。适合不要求实时性的数据。
  • 非缓存报告:数据变化立即发送。适合保护动作、开关变位等实时性要求高的数据。

记得有一次,一个变电站的遥信老是延迟。我排查了半天,发现是报告配置错了——把非缓存报告配成了缓存报告。改过来后,延迟从秒级降到了毫秒级。嗯,配置细节真的很重要。

3.3 MMS报文结构与编码

MMS报文长什么样?我直接给你看个实际抓包的例子。这是从变电站现场抓的一个MMS读请求报文:

MMS: invokeID: 12345
MMS: confirmedRequestPDU
MMS:   read
MMS:     variableAccessSpecification
MMS:       listOfVariable
MMS:         [0] objectName
MMS:           domainSpecific
MMS:             domainName: "PROT1"
MMS:             itemName: "GGIO1.AnIn1.mag.f"

这个报文在说:客户端请求读取PROT1设备里GGIO1逻辑节点的AnIn1数据对象的mag属性(幅值),f表示浮点数。

MMS的编码用的是ASN.1的BER编码。说白了,就是TLV格式——Tag(标签)、Length(长度)、Value(值)。每个数据都打上标签,告诉接收方这是什么类型的数据。

小技巧:抓包分析MMS报文时,重点关注invokeID。这个ID是请求和响应的配对标识。如果发现响应超时,先看看invokeID对不对得上。

我曾经调试过一个MMS通信问题,客户端一直报超时。抓包一看,客户端发的invokeID是1,服务器回的也是1,但客户端期望的是2。原来是客户端的ID生成逻辑有bug,每次请求后没递增。这种问题,不看报文根本发现不了。

MMS报文结构分三层:

  1. MMS PDU:协议数据单元,包含服务类型(读、写、报告等)
  2. 调用参数:具体服务的参数,比如读哪个变量
  3. 数据内容:实际的数据值

下面这张图展示了MMS报文在TCP/IP协议栈中的位置:

MMS报文协议栈 应用层:MMS PDU 表示层:ASN.1 BER编码 会话层:ISO 8327(可选) 传输层:TCP 网络层:IP MMS报文封装在TCP/IP之上,通过ASN.1编码

实际项目中,MMS报文大小一般在几百字节到几KB。遥测数据小一些,文件传输可能到MB级别。我建议你在配置网络时,把MTU设成1500字节以上,避免MMS报文被分片。

注意:MMS报文如果太大,会被TCP分片。分片后如果某个分片丢了,整个报文都得重传。所以对于大文件传输,建议用MMS的文件服务,而不是用变量读写。

最后说个经验。调试MMS通信时,我习惯先用Wireshark抓包,过滤条件设成mms。然后看三个东西:

  • invokeID是否连续
  • 响应时间是否在合理范围内(一般<100ms)
  • 有没有重传包

这三个指标基本能判断MMS通信是否健康。如果发现重传多,先检查网络,再检查设备负载。我曾经遇到一个情况,设备CPU负载到90%了,MMS响应时间从20ms飙到500ms。后来发现是设备在同时处理多个MMS连接,线程池不够用了。

嗯,MMS协议就讲这么多。记住它的核心:对象模型+服务调用。理解了这两点,MMS就不难了。


公众号:蓝海资料掘金营,微信deep3321