通过简单易行的操作解析出siemens MPI协议的报文格式

摘要:在使用上位机和西门子s7300系列plc实现自动化过程控制当中,选择mpi协议进行通信时,plc可以不用编程,而且可读写所有数据区,快捷方便。但是西门子公司没有公布mpi协议的格式,用户如果想使用mpi协议监控,就必须购买其监控产品或第三方厂家的组态软件。这样给用户自主开发带来一定困难,特别是自行开发的现场设备就不能通过mpi协议接入plc。而采用其它通讯方式也存在编程复杂,需要购买软件和授权等局限性。本文通过数据监视、采集、分析的方法,解析出了mpi协议的关键报文格式,可用于实现上位机、现场设备与支持mpi协议的cpu之间通讯,从而提供了一种高效率低成本的通信方式。
前言
工业的现代化,很大程度体现在工业生产过程的自动化,其中信息的传输,数据的交换也成为评价工业自动化水平高低的标准。网络通迅方式的多样化和通迅速率的高速化,使信息交换领域从设备控制层延伸到企业管理层。信息技术的飞速发展,促进了自动化系统结构的变革,以网络为主干的分布式控制系统已成为当今自动化系统的主流趋势。因此,网络通迅的实时性和可靠性,以及网络故障的诊断和排除都成为工业网络通信关注的焦点。mpi网络是西门子工业控制系统中经常用到的一种通迅方式,使用rs485物理接口进行数据传输。下面主要阐述西门子mpi协议的解析方法以及关键报文格式。
mpi协议概述
mpi协议,其英文全名为multi-point-interface。在plc之间可组态为主/主协议或主/从协议.如何操作依赖于设备类型:如果控制站都是s7—300/400系列plc,那么就建立主/主连接关系,因为mpi协议支持多主站通讯,所有的s7—300cpu都可配置为网络主站,通过主/主协议可以实现plc之间的数据交换。如果某些控制站是s7—200系列plc,则可以建立主/从连接关系,因为s7—200 cpu是从站,用户可以通过网络指令实现s7—300 cpu对s7200 cpu的数据读写操作。
分析思路
西门子step 7 v5.4软件是s7-300系列plc(包括et200s)的开发工具,上位机通过其pci插槽上的通讯卡(cp5613a2)接口以及通讯电缆连接到plc的编程口上,并且通讯卡接口和plc编程口都是rs485接口标准。这说明,pc机实际上是可以通过rs485串口同et200 cpu(im151-7)通讯,只是我们不知道通讯协议而已。因此,在上位机上运用西门子提供的prodave s7软件读写plc时,通过监视通讯口上的数据,我们就有可能分析出通信报文格式。然后,撤掉西门子通讯卡,直接通过rs485串口向plc发送报文来验证其正确性,并作进一步的操作。本着这一思想,采用以下步骤获得这些报文。
步骤
硬软件需求
硬件:串口分支器及通讯电缆,西门子cp5613a2通讯卡,advantech公司pci-1601a通讯卡,西门子et200s(im151-7cpu以及相关模块)。
软件:step7 v5.4 , simatic net 2006edition, prodave s7 , serial portmonitor,pci1601a driver,visualc++。
硬件连接如图1-0
安装完相关软件及驱动程序以后,进行硬件测试以及软件平台搭建
(1)串口分支器制作及通讯电缆的连接(附录a)
(2)运用step 7 v5.4对et200s组态以及相关初始化设置(附录b)
(3)pci1601a通讯卡的测试(附录c)
(4)串口监视软件设置和测试(附录d)
(5)prodaves7调试运行(附录e)
完成设置和调试后,打开串口监视软件,并将plc上电,运行prodaves7并在其中进行各种操作(load、unload、read、write等)时启动数据监视,通过比较分析发现:
(1)与s7-200不同,et200s不管出于何种状态(run或stop),一经上电,就不断发出数据查找设备,在读写数据过程中也不间断。
(2)连接、读出、写入和断开时检测到一系列有规律的数据。经过多次监测比较分析,可得到相关操作的数据帧格式,初始化设定plc与上位机的地址分别为02和00;为描述方便,现在对数据帧格式做以下符号约定
sd:(start delimiter)开始定界符
le:(length)报文长度
ler:(repeated length)重复数据长度
sd: (startdelimiter)开始定界符
da:(destinationaddress)目标地址
sa:(source address)源地址
fc:(function code)功能码
dsap:(destinationservice access point)目的服务存取点
ssap:(source serviceaccess point)源服务存取点
fs:(frame sequence)帧序列号
uu:(unkown unit)未知操作单元,其数值通常为固定值
gu:(group unit)分组单元
du:(data unit)数据单元
fcs:(frame checksequence)校验码
end:(end delimiter)结束分界符
分析结果
连接(load)过程
(1)设备查找
在plc(et200s)上电启动进入run状态后,开始不断发出数据查找设备,数据帧格式如下。da从00到1f共32个站号,令牌帧和总线访问帧按照严格的帧时序(15帧/s),交替发出。
令牌帧:dc da sa
dc da 02
总线访问帧: sd da sa fc fcs end
10 da 02 49 fcs 16
在prodave s7中运行load命令后,上位机也开始不断发出数据查找设备,数据帧格式如下。da从00到1f共32个站号,令牌帧和总线访问帧按照严格的帧时序(19帧/s),交替发出。
令牌帧: dc da sa
dc da 00
总线访问帧: sd da sa fc fcs end
10 da 00 49fcs16
sd、dc、fc、end均占据一个字节长度,为固定数值,分别等于10、dc 49、16,fcs采用求和校验,等于da+sa+fc。
(2)握手
上位机在收到et200s发出的令牌帧(dc 02 02)后以其令牌帧(dc 00 00)作为回复,等待et200s应答,如果收到dc 00 02,pc机立即回复dc 02 00,令牌握手成功。总线访问握手方式与令牌握手一致。在读写操作过程中,应答握手也不间断。
读取操作
一次读操作的步骤包括上位机发出读命令帧(pc_request_frame_read),plc作出正确的响应,并将确认信息帧(plc_ack_frame_read)返回给上位机,接着反馈回正确的数据信息帧(plc_return_frame_read)给上位机,上位机接到此帧数据,校验确定后对plc做出确认信息帧(pc_ack_frame_read),这样完成一个读取数据的过程。在读取操作过程中,上位机和plc共进行两次应答。
读取命令
读取数据时上位机的请求帧格式如下,该帧占据38字节长度,记作pc_request_frame_read(38)。
sd le ler sd占据4字节长度,为固定值。
pc_request_frame_read(0)=68
pc_request_frame_read(1)= 1f,帧长度校验,为da+sa+fc+dsap+ssap+fs+gu+du的字节个数。
pc_request_frame_read(2)=1f重复帧长度,与帧长度校验记法相同。
pc_request_frame_read(3)=68
da sa fc dsapssapfs各占据7字节。
pc_request_frame_read(4)=82数值上等于目标站地址加上80
pc_request_frame_read(5)=80数值上等于源站地址加上80
pc_request_frame_read(6)=5c、7c
pc_request_frame_read(7)=16、15
pc_request_frame_read(8)=02、01
pc_request_frame_read(9)=f1为分界符,其值不变。
pc_request_frame_read(10)=00~ff,帧序号,对相同操作时自加计数。在应答握手时用来判断当前应答帧是否为本请求的应答。
uu占据6字节长度,均为固定值
pc_request_frame_read(11)=32
pc_request_frame_read(12)=01
pc_request_frame_read(13)=00
pc_request_frame_read(14)=00
pc_request_frame_read(15) =33
pc_request_frame_read(16)=02、01
gu占据6字节长度,混合读写时可以进行操作
pc_request_frame_read(17)=00
pc_request_frame_read(18)=0e
pc_request_frame_read(19)=00
pc_request_frame_read(20)=00
pc_request_frame_read(21)=04
pc_request_frame_read(22)
单一读写时pc_request_frame_read(22)=01,其他不变化;
混合读写时pc_request_frame_read(22)为其他值。
du单元占据12字节长度从pc_request_frame_read(23)到pc_request_frame_read(26)这4字节为固定数值
pc_request_frame_read(23)=12
pc_request_frame_read(24)=0a
pc_request_frame_read(25)=10
pc_request_frame_read(26)=02
pc_request_frame_read(27)和pc_request_frame_read(28)这2字节共同表示读取的数据个数,当读取的存储区是i、q、m、db时表示字节个数,当存储区是c、t时表示读取的计数器或定时器的个数。
如果读取两个字节,则为:
pc_request_frame_read(27)=00
pc_request_frame_read(28)=02
如果读取一个计数器或者定时器,则为:
pc_request_frame_read(27)=00
pc_request_frame_read(28)=01
pc_request_frame_read(29)、pc_request_frame_read(30)共同表示要操作的db号,如果读取其他区,则二者分别为00 00。
pc_request_frame_read(31)表示存储区类型,具体参考表1-1
pc_request_frame_read(32)
pc_request_frame_read(33)
pc_request_frame_read(34)共同表示操作的起始地址,对于i、q、m、db存储区按照bit计算,对c、t存储区按照其个数计算。
若读取db1b1时则依次为
pc_request_frame_read(32)=00
pc_request_frame_read(33)=00
pc_request_frame_read(34)=08
若读取c1或t1时则为
pc_request_frame_read(32)=00
pc_request_frame_read(33)=00
pc_request_frame_read(34)=01
pc_request_frame_read(35)是帧校验码,采用和取余算法:
(da+sa+fc+dsap+ssap+fc+uu+gu+du)mod 16#100
pc_request_frame_read(36)、pc_request_frame_read(37)是结束符,为固定值,分别等于16 e5。
plc接收到请求命令(pc_request_frame_read)时,确认后返回一个数据帧表示回应,占据15字节长度,记作plc_ack_frame_read(15),格式如下:
sd le ler sd
plc_ack_frame_read(0)=68
plc_ack_frame_read(1)=08
plc_ack_frame_read(2)=08
plc_ack_frame_read(3)=68
da、sa
plc_ack_frame_read(4)=80
plc_ack_frame_read(5)=82
fc
plc_ack_frame_read(6)=7c 5c
dsap、ssap
plc_ack_frame_read(7)=02
plc_ack_frame_read(8)=16
uu
plc_ack_frame_read(9)=b0
plc_ack_frame_read(10)=01
fs
plc_ack_frame_read(11)
帧序号,和pc_request_frame_read(10)保持一致。
fcs
plc_ack_frame_read(12)
帧校验,等于(da+sa+fc+dssap+ssap+uu+fs+fcs)mod 16#100
end
plc_ack_frame_read(13)=16
plc_ack_frame_read(14)=e5
在发送完响应数据帧(plc_ack_frame_read)后plc接着给上位机反馈其所要读取的数据信息帧(plc_return_frame_read),其长度因读取字节个数而长短不定,格式如下:
sd le ler sd
plc_return_frame_read(0)=68
plc_return_frame_read(1)
plc_return_frame_read(2)
plc_return_frame_read(3)=68
da sa fc dsapssap fs各占一个字节
plc_return_frame_read(4)=80
plc_return_frame_read(5)=82
plc_return_frame_read(6)=5c
plc_return_frame_read(7)=16
plc_return_frame_read(8)=02
plc_return_frame_read(9)分界符,为固定值f1
plc_return_frame_read(10),与plc_ack_frame(11)保持一致。
uu占据8个字节长度,均为固定值
plc_return_frame_read(11)=32
plc_return_frame_read(12)=03
plc_return_frame_read(13)=00
plc_return_frame_read(14)=00
plc_return_frame_read(15)=33
plc_return_frame_read(16)=02
plc_return_frame_read(17)=00
plc_return_frame_read(18)=02
gu占据6字节长度
plc_return_frame_read(19)=00
plc_return_frame_read(20)
等于读取的自己个数加4,如果读取一个字节时为05
plc_return_frame_read(21)=00
plc_return_frame_read(22)=00
plc_return_frame_read(23)=04
plc_return_frame_read(24)
单一读取时为01,分组读取时为其他值。
du占据(4+pc_request_frame_read(27)+pc_request_frame_read(28))字节长度
plc_return_frame_read(25)=ff
plc_return_frame_read(26)=04
plc_return_frame_read(27)、plc_return_frame_read(28)共同表示返回所读取的数据位数,按照bit计算;如果读取了一个字节,则他们分别为00、08。
plc返回所要读取的数据,按照从低地址到高地址的顺序依次存放。
plc_return_frame_read(29)
plc_return_frame_read(30)
.
.
plc_return_frame_read(n)
n=28+读取的字节数
plc_return_frame_read(n+1)为fcs,采用和取余校验。
end
plc_return_frame_read(n+2)=16
plc_return_frame_read(n+3)=e5
上位机在接收到数据经过确认以后向plc发送一个确认帧(pc_ack_frame_read),一共15字节长度,记作pc_ack_frame_read(15)。
格式如下:
sd le ler sd
pc_ack_frame_read(0)=68
pc_ack_frame_read(1)=08
pc_ack_frame_read(2)=08
pc_ack_frame_read(3)=68
da sa
pc_ack_frame_read(4)=82
pc_ack_frame_read(5)=80
fc
pc_ack_frame_read(6)=5c
dsap ssap
pc_ack_frame_read(7)=16
pc_ack_frame_read(8)=02
uu
pc_ack_frame_read(9)=b0
pc_ack_frame_read(10)=07
fs
pc_ack_frame_read(11)和plc_return_frame(10)保持一致
fcs
pc_ack_frame_read(12)
采用求和取余校验算法,等于(da+sa+fc+dssap+ssap+uu+fs)mod 16#100
end
pc_ack_frame_read(13)=16
pc_ack_frame_read(14)=e5
读数据过程完成。
写入操作
一次完整的写入操作步骤包括:首先上位机发出写命令信息帧(pc_request_frame_write),plc接收以后判断,若正确,则做出响应,并将确认信息(plc_ack_frame_write)帧返回给上位机,并反馈回正确的数据(plc_return_frame_write)帧给上位机,上位机接到此帧数据,校验正确后对plc做出确认信息(pc_ack_frame_write),这样就完成一个读取数据的过程。在读取操作过程中,上位机和plc共进行两次应答。
写入时上位机的请求帧(pc_request_frame_write)所占据字节长度不确定,跟写入的数据个数有关。记作pc_request_frame_write(),格式如下:
sd le ler sd
pc_request_frame_write(0)=68
pc_request_frame_write(1)pc_request_frame_write(2)写入一个字节时为24,写入两个字节时为25…
pc_request_frame_write(3)=68
da sa fcdsap ssap fs
pc_request_frame_write(4)=82
pc_request_frame_write(5)=80
pc_request_frame_write(6)=5c
pc_request_frame_write(7)=16
pc_request_frame_write(8)=02
pc_request_frame_write(9)=f1
pc_request_frame_write(10)为帧序号,从00到ff
uu占据6字节长度
pc_request_frame_write(11)= 32
pc_request_frame_write(12)=01
pc_request_frame_write(13)=00
pc_request_frame_write(14)=00
pc_request_frame_write(15)=43
pc_request_frame_write(16)=02
gu占据6字节长度
pc_request_frame_write(17)=00
pc_request_frame_write(18)=0e
pc_request_frame_write(19)、pc_request_frame_write(20)共同表示写入的字节个数加4。如果要写入2个字节,则依次为00、06。
pc_request_frame_write(21)=05
pc_request_frame_write(22)=01
du占据的长度和要写入的字节个数有关,其长度为
(16+ pc_request_frame_write(21)+pc_request_frame_write(22)- 4)个字节,置复位操作按照一个字节计算。
pc_request_frame_write(23)=12
pc_request_frame_write(24)=0a
pc_request_frame_write(25)=10
pc_request_frame_write(26)与存储区有关,当写c区时,为1c, m区置复位时为01,写其他存储区为02
pc_request_frame_write(27)=00
pc_request_frame_write(28)=01
pc_request_frame_write(29)、pc_request_frame_write(30)共同表示所要写入的db号,写其他存储区时,为00 00,注意i区和t区不能进行写操作。
pc_request_frame_write(31)表示存储区类型,参考表1-2
pc_request_frame_write(32)
pc_request_frame_write(33)
pc_request_frame_write(34)
以上三个字节表示要写入的起始地址。对于c区,则为起始计数器的编号,若对c2写入,则依次为00 00 02。对其他区写操作时则表示起始位地址,如果要写db1b1,则依次为00、00、08。
pc_request_frame_write(35)、pc_request_frame_write(36)与存储区有关,写入c区时依次为00 09,置复位操作时依次为00 03,写入其他区(包括对m区写入字节)是依次为00、04。
pc_request_frame_write(37)、pc_request_frame_write(38)共同表示写入的数据量,与存储区类型有关。写c区时表示写入的字节个数,例如对一个计数器进行写操作,则其值依次为00、02;写其他存储区区时表示要写入的数据位数,按照bit计算,若写db1b0,则依次为00、08。
pc_request_frame_write(39)
pc_request_frame_write(40)
pc_request_frame_write(41)
.
.
pc_request_frame_write(n)
以上若干字节表示要写入的数据,按照低地址到高地址的顺序排列,其中对c区进行写操作时,数据表示为bcd码,对其他其他存储区写入时,数据均为十六进制格式表示。
n=38+ pc_request_frame_write(19)+pc_request_frame_write(20)- 4)。
pc_request_frame_write(n+1)为fcs,采用求和取余算法,等于
(da+sa+fc+dsap+ssap+fs+uu+gu+du)mod 16#100
end
pc_request_frame_write(n+2)=16
pc_request_frame_write(n+3)=e5
plc在接收到请求数据帧确认后,返回确认信息帧(plc_ack_frame_write)
占据15字节长度,格式如下:
sd le ler sd
plc_ack_frame_write(0)=68
plc_ack_frame_write(1)=08
plc_ack_frame_write(2)=08
plc_ack_frame_write(3)=68
da sa fcdsap ssap
plc_ack_frame_write(4)=80
plc_ack_frame_write(5)=82
plc_ack_frame_write(6)=5c
plc_ack_frame_write(7)=02
plc_ack_frame_write(8)=16
uu
plc_ack_frame_write(9)=b0
plc_ack_frame_write(10)=01
fs
plc_ack_frame_write(11)与pc_request_frame_write(10)保持一致。
fcs
plc_ack_frame_write(12),采用求和取余校验算法。
end
plc_ack_frame_write(13)=16
plc_ack_frame_write(14)=e5
plc_return_frame_write帧格式
记作plc_return_frame_write(29)
sd le ler sd
plc_return_frame_write(0)=68
plc_return_frame_write(1)=16
plc_return_frame_write(2)=16
plc_return_frame_write(3)=68
da sa fcdsap ssap fs
plc_return_frame_write(4)=80
plc_return_frame_write(5)=82
plc_return_frame_write(6)=7c
plc_return_frame_write(7)=02
plc_return_frame_write(8)=16
plc_return_frame_write(9)=f1
plc_return_frame_write(10),fs,同plc_ack_frame_write(11)保持一致。
uu占据15字节长度
plc_return_frame_write(11)=32
plc_return_frame_write(12)=03
plc_return_frame_write(13)=00
plc_return_frame_write(14)=00
plc_return_frame_write(15)=43
plc_return_frame_write(16),和pc_request_frame_write(16)保持一致。
plc_return_frame_write(17)=00
plc_return_frame_write(18)=02
plc_return_frame_write(19)=00
plc_return_frame_write(20)=01
plc_return_frame_write(21)=00
plc_return_frame_write(22)=00
plc_return_frame_write(23)=05
plc_return_frame_write(24)=01
plc_return_frame_write(25)=ff
fcs
plc_return_frame_write(26),采用求和取余校验算法。
end
plc_return_frame_write(27)=16
plc_return_frame_write(28)=e5
pc_ack_frame_write帧格式
记作pc_ack_frame_write(15)
sd le ler sd
pc_ack_frame_write(0)=68
pc_ack_frame_write(1)=08
pc_ack_frame_write(2)=08
pc_ack_frame_write(3)=68
da sa fcdsap ssap
pc_ack_frame_write(4)=82
pc_ack_frame_write(5)=80
pc_ack_frame_write(6)=7c
pc_ack_frame_write(7)=16
pc_ack_frame_write(8)=02
uu
pc_ack_frame_write(9)=b0
pc_ack_frame_write(10)=07
fs
pc_ack_frame_write(11)plc_return_frame_write(29)保持一致。
fcs
pc_ack_frame_write(12)采用求和取余校验算法。
end
pc_ack_frame_write(13)=16
pc_ack_frame_write(14)=e5
写数据过程完成。
对于读写数据帧的fc以及dsap和ssap做以说明
测试源码见附录f。
结束语
本文运用串口监视的方法,通过简单易行的操作解析出siemens mpi协议的报文格式,其结果具有很大的使用价值(1)使用户不用购买西门子专用的通讯处理卡就可以让上位机和plc的通信,从而实现所需控制功能,节约成本。(2)降低了用户自主开发的难度,使通讯编程变得简单明了,无需购买软件和授权等就可以使用mpi协议监控plc的工作状态。

活体叶面积仪功能特点和技术参数
自恢复保险丝参数
联发科p30处理器的性能参数及跑分
iPhone7缝隙太大,网友:你可能买到假的iPhone7了
大功率LED驱动电源解决方案
通过简单易行的操作解析出siemens MPI协议的报文格式
高密度光纤链路在数据中心的布线设计
新技术:激光蚀刻超级毛细为液冷计算机研发扫清障碍
你学习,我买单 | 第4期《EMC特训营》推出“打卡免费学”活动
小米推出首款电子阅读器,采用6英寸212ppi高清电子墨水屏设计
智慧酒店会带来什么服务
EDA工具的难点分析
RMC301B-3000-0000
微软外壳可折叠显示器新专利,与三星Galaxy Fold类似
国产工控主板注入坚固硬件支持
LG的智能手机业务处于亏损状态,但该公司不会放弃这项业务
MLPerf:边缘AI推理的新行业基准
moxa推出22+2G口千兆非网管以太网交换机--IKS-6
跨阻放大器的输入阻抗:无穷大还是为零?究竟是多少?
具有正负22V过压和极性反接保护的直接连接开关模式充电器