5、制造报文规范(MMS):TCP/IP之上的应用层协议、报文结构
好,咱们继续往下走。前面聊了那么多层,从物理层一路爬到应用层,今天终于要碰这个最核心的家伙——制造报文规范(MMS)。
说实话,我刚开始接触IEC 61850的时候,最头疼的就是MMS。你想想看,一个协议栈里,它藏在最上面,看不见摸不着,但所有智能电子设备(IED)之间的正经通信,几乎都靠它。嗯,咱们今天就把这层窗户纸捅破。
5.1 MMS是什么?为什么非它不可?
MMS的全称是Manufacturing Message Specification,中文叫制造报文规范。它不是一个新东西,早在IEC 61850之前,它就在工业自动化领域混了。IEC 61850把它请过来,作为变电站自动化系统的应用层协议。
说白了,MMS就是一套客户端-服务器模式的通信规则。一个IED(比如保护装置)作为服务器,把它的数据(电压、电流、状态)暴露出来;另一个IED(比如监控后台)作为客户端,去读这些数据,或者写一些控制命令。
我个人习惯把MMS理解成「变电站里的HTTP」。你访问网页用HTTP,IED之间交换数据就用MMS。只不过MMS比HTTP更讲究实时性,也更严谨。
核心要点:MMS运行在TCP/IP之上,使用TCP端口102。它负责把IEC 61850抽象出来的逻辑节点、数据对象,变成可以在网络上传输的字节流。
5.2 MMS报文结构:拆开看看里面长啥样
咱们直接看干货。一个MMS报文,从外到内,大致分这么几层:
- TPKT(Transport Packet)头部:4个字节,用来标识这是ISO 8073的TPKT包。说白了就是告诉接收方:「嘿,我是MMS,不是别的乱七八糟的东西。」
- COTP(Connection-Oriented Transport Protocol)头部:负责传输层的连接管理。嗯,这里细节比较多,咱们先记住它存在就行。
- Session/表示层头部:处理会话和数据的编码方式。MMS用的是ASN.1的BER编码。
- MMS PDU(协议数据单元):这才是真正的肉。里面装着你要读的数据、写的命令,或者错误信息。
我给大家画个简化的报文结构图(用文字表示):
+------------------+
| TPKT头部 | (4字节,包含总长度)
+------------------+
| COTP头部 | (传输层控制)
+------------------+
| 表示层/会话层头部 | (ASN.1编码标识)
+------------------+
| MMS PDU | (真正的数据)
+------------------+
你可能会问:「为什么搞这么多层?」 嗯,这其实是历史原因。MMS最初是为OSI七层模型设计的,后来为了跑在TCP/IP上,就套了这么几层壳。我在项目中遇到过,有些工程师抓包分析时,看到这么多头部就懵了。其实你只要关注最里面的MMS PDU就行,外面的都是「包装纸」。
5.3 MMS PDU的常见类型
MMS PDU有很多种,但咱们日常打交道最多的,就这几种:
| PDU类型 | 功能 | 我常用的场景 |
|---|---|---|
| confirmed-Request | 客户端发起的请求(读/写/控制) | 读取某个遥测值 |
| confirmed-Response | 服务器对请求的应答 | 返回读取到的数据 |
| confirmed-Error | 服务器返回错误信息 | 权限不足、对象不存在 |
| unconfirmed-PDU | 服务器主动推送的信息 | 报告(Report) |
| initiate-Request/Response | 建立MMS连接时的握手 | 协商最大PDU大小等参数 |
你看,其实不复杂。客户端问,服务器答,答不了就报错。就这么简单。
5.4 一个实际的MMS读数据流程
咱们来走一遍流程。假设监控后台(客户端)想读保护装置(服务器)的A相电流值。
- 建立TCP连接:客户端向服务器的102端口发起TCP三次握手。
- 建立MMS连接:客户端发送
initiate-Request,服务器回复initiate-Response。这一步会协商一些参数,比如最大PDU大小。我记得有一次调试,就是因为双方协商的PDU大小不一致,导致大报文被截断,查了好久才找到原因。 - 发送读请求:客户端构造一个
confirmed-Request,里面包含要读的对象路径(比如PROT1/MMXU1.A.phsA.cVal.mag.f)。 - 服务器处理:服务器找到这个数据对象,把当前值打包成
confirmed-Response发回来。 - 关闭连接:通信结束,双方挥手再见。
这个流程,说白了跟你去数据库查一条记录差不多。只不过MMS的对象路径是IEC 61850定义好的,不能乱写。
5.5 避坑指南:我踩过的MMS的坑
做MMS开发,有几个地方特别容易出问题。我给大家列一下:
我曾经犯过的错:
- 对象路径写错:IEC 61850的对象路径是大小写敏感的。我有一回把
MMXU1写成了mmxu1,结果服务器一直返回object-access-denied。嗯,这种低级错误,排查起来最浪费时间。- PDU大小没协商好:默认的MMS最大PDU大小是64KB。但如果你的数据量特别大(比如录波文件),一定要在initiate阶段把
maxServOutstanding和maxPduSize调大。否则,数据会被截断,而且不会报错。- 报告(Report)的触发条件:MMS的报告机制很灵活,可以按周期、按变化触发。但如果你配置错了触发条件,要么收不到报告,要么报告刷屏。我建议刚开始做的时候,先用
polling(轮询)方式调试,稳定了再切到报告模式。
5.6 MMS与IEC 61850的映射关系
最后,咱们聊聊MMS和IEC 61850模型的关系。你想想看,IEC 61850定义了那么多逻辑节点、数据对象,它们怎么变成MMS报文里的字节?
答案是:映射。
IEC 61850-8-1标准规定了如何把ACSI(抽象通信服务接口)映射到MMS。比如:
- 逻辑设备(LD) → MMS的域(Domain)
- 逻辑节点(LN) → MMS的命名变量(Named Variable)
- 数据对象(DO) → MMS的变量访问路径
- 报告(Report) → MMS的信息报告(InformationReport)
说白了,IEC 61850是「概念层」,MMS是「实现层」。你写SCL文件时定义的那些逻辑节点,最终都会被编译成MMS能识别的对象。我在项目中见过有人直接拿MMS的抓包工具去分析SCL配置是否正确,这其实是个很高效的调试方法。
一个小技巧:如果你手头有Wireshark,可以抓个MMS报文看看。过滤条件写
tcp.port == 102,然后展开MMS部分。你会看到完整的对象路径、数据类型、值。嗯,比看SCL文件直观多了。
5.7 小结
MMS是IEC 61850通信的「最后一公里」。它把抽象的变电站模型,变成了实实在在的字节流。你只要记住:
- 它跑在TCP 102端口上
- 报文结构是TPKT + COTP + 表示层 + MMS PDU
- 核心操作就是读、写、报告、控制
- 对象路径一定要写对,大小写敏感
下一章,咱们聊聊GOOSE——那个比MMS更「暴躁」的协议。嗯,它不建立连接,直接往网络上扔数据包,想想就刺激。

浙公网安备 33010602011771号