1、概述
UMAS (Unified Messaging Application Services) 统一消息传递应用程序服务,它是用于交换应用程序数据的平台独立协议,通信数据使用标准的Modbus协议。Modbus是Modicon公司在1979年开发的基于消息结构的协议,最早是为Modicon公司的PLC中使用,后为施耐德电气公司所有。Modbus协议是现今使用的最早和应用最广泛的工业控制系统协议之一,主要是用于和现场控制器通信的应用层协议,共有三种工作模式:Modbus/ASCII,Modbus/RTU,和Modbus/TCP。
Modbus协议标准是公开的,其众多功能码早已广为人知,在此不做赘述。但其标准文档中也提到了一些未公开、且为占用状态的功能码,90功能码(0x5A)即为其中一个,UMAS协议即为90功能码的Modbus。
UMAS协议为施耐德电气私有的、用于对其PLC产品进行配置和监控等操作,通过查阅,发现未有相关详细描述文档,因此,本文的主要目的即是对UMAS进行基本研究和归纳,不当之处望指正。UMAS协议的基本结构如下图所示:
2、UMAS协议功能码
UMAS协议即为0x5A功能码的Modbus协议,其通信数据在Wireshark中的识别情况如下图:
功能码全部显示为Unity(Schneider)(90),那么,UMAS有功能码吗?进一步观察Data部分,在Wireshark中其隶属于Modbus部分且未能被详细解析,而恰好此部分即为UMAS所特有的,本节内容所讨论的UMAS功能码并非Modbus协议中的功能码,而是指UMAS特有部分中的功能码,其与PLC的各种配置,包括:PLC读、写、运行/停止、数据上传/下载等操作密切相关。
UMAS协议功能码的梳理与总结,源于对相关DLL文件的分析和对与PLC通信数据分析总结而来,测试中使用了Schneider M340 PLC,在没有PLC的情况下,可使用上位机软件Unity Pro XL(后来软件更名为EcoStruxure Control Expert)自带的仿真器代替PLC进行通信。
安装Unity Pro软件后,通过对特定DLL文件进行分析,可以发现逆向源码中即对协议的名称描述即为UMAS,相关的对PLC特定操作亦可以快速定位到:
结合代码分析和通信数据,UMAS相关功能码和基本含义总结如下:
UMAS功能码 |
|||
序号 |
功能码 |
含义 |
|
1 |
0x01 |
INIT_COMM |
建立UMAS通信 |
2 |
0x02 |
READ_ID |
请求PLC ID |
3 |
0x03 |
READ_PROJECT_INFO |
读取PLC中工程信息 |
4 |
0x04 |
READ_PLC_INFO |
读取PLC内部信息 |
5 |
0x06 |
READ_CARD_INFO |
读取PLC SD卡信息 |
6 |
0x0A |
REPEAT |
回传发送给PLC的数据 |
7 |
0x10 |
TAKE_PLC_RESERVATION |
独占PLC |
8 |
0x11 |
RELEASE_PLC_RESERVATION |
释放PLC |
9 |
0x12 |
KEEP_ALIVE |
保持连接 |
10 |
0x20 |
READ_MEMORY_BLOCK |
准备读取PLC内存块 |
11 |
0x22 |
READ_VARIABLES |
以bit/word方式读系统变量 |
12 |
0x23 |
WRITE_VARIABLES |
以bit/word方式写系统变量 |
13 |
0x24 |
READ_COILS_REGISTERS |
读PLC的线圈/寄存器值 |
14 |
0x25 |
WRITE_COILS_REGISTERS |
写PLC的线圈/寄存器值 |
15 |
0x26 |
ENABLE/DISABLE DATA DICTIONARY |
启用/关闭数据字典功能 |
16 |
0x30 |
INITIALIZE_UPLOAD |
初始化数据上传(From PLC) |
17 |
0x31 |
UPLOAD_BLOCK |
上传PLC数据 |
18 |
0x32 |
END_STRATEGY_UPLOAD |
完成数据上传 |
19 |
0x33 |
INITIALIZE_DOWNLOAD |
初始化数据下装(To PLC) |
20 |
0x34 |
DOWNLOAD_BLOCK |
下载数据到PLC |
21 |
0x35 |
END_DOWNLOAD |
完成数据下载 |
22 |
0x36 |
CREATE/RESTORE/REMOVE BACKUP |
创建/恢复/删除内存卡中的数据备份 |
23 |
0x39 |
READ_ETH_MASTER_DATA |
Read Ethernet Master Data |
24 |
0x40 |
START_PLC |
运行PLC |
25 |
0x41 |
STOP_PLC |
停止PLC |
26 |
0x50 |
MONITOR_PLC |
监视PLC变量 |
27 |
0x58 |
CHECK_PLC |
检查PLC连接状态 |
28 |
0x70 |
READ_IO_OBJECT |
读IO目标 |
29 |
0x71 |
WRITE_IO_OBJECT |
写IO目标 |
30 |
0x73 |
GET_STATUS_MODULE |
获取状态模块 |
3、UMAS协议数据分析
使用Unity Pro连接M340 PLC进行一些列操作,抓取通信过程数据,可对功能码进行对照分析。对于UMAS协议,有一点需要明确的是它是一种应/答式的通信协议:包含某种功能码的数据发送到PLC,PLC对请求解析后按照固定格式回应数据。UMAS的请求与响应数据基本格式如下所示:
请求:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ UMAS CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]
响应:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ RETURN CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]
[RETURN CODE]即为状态码部分,存在两种可能性:0x01 0xFE–意味着OK;
0x01 0xFD–意味着Error。
功能码0x01:建立通信,抓取的实际建立通信的数据将为:
响应数据包为:
功能码0x03:读取PLC中工程信息,抓取的实际建立通信的数据将为:
响应数据包为:
响应数据包的基本格式为:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ Response Code (16) ] – [ Unknown (9 bytes) ] – [ Unknown 2 (9 bytes) ] –
[ Modification date (8 bytes) ] – [ Modification date Rep (8 bytes) ] – [ Project Version (16) ] – [ Unknown (16) ] –
[ Project Name length (8) – [ Project name (variable) ]
状态码之后连续两个9字节数据意义不明确,df 07按照小端数据换算过来即为2015,即工程修改时间为2015年;工程版本为0.0.01
功能码0x40/0x41:启动/停止PLC
启动PLC的请求数据为:
UMAS CODE部分为00 40,不同情况下使用01 40亦可以启动PLC运行(与PLC固件版本相关)。
相应的停止PLC的UMAS CODE部分为00 41或01 41均可。尝试对Schneider M340 PLC发送启/停数据包,验证数据格式及功能的可行性,如下所示:PLC被停止后,其run灯变为闪烁状态(并非熄灭):
结合对UMAS功能码的理解,尝试编写数据解析插件并对数据包解析,可得到如下效果:
请求数据包:
回复数据包:
4、总结
本文基于对施耐德组态软件Unity Pro的关键DLL分析和对上位机与PLC通信数据分析,梳理总结了UMAS协议基本功能码,同时尝试编写Wireshark解析插件以方便数据包分析,验证了插件的可用性和数据的正确性。
参考资料:
[1] https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
[3] https://www.lshack.cn/827/
[4] https://www.cnblogs.com/zzqcn/p/4840589.html