當前位置:
首頁 > 最新 > Siemens MPI協議解析

Siemens MPI協議解析

SiemensMPI協議解析

摘要:在使用上位機和西門子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 49 FCS 16

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 DSAP SSAP FS各佔據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 DSAP SSAP 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()=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()=68

pc_request_frame_write(1)pc_request_frame_write(2)寫入一個位元組時為24,寫入兩個位元組時為25…

pc_request_frame_write(3)=68

DA SA FC DSAP 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()=68

plc_ack_frame_write(1)=08

plc_ack_frame_write(2)=08

plc_ack_frame_write(3)=68

DA SA FC DSAP 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()=68

plc_return_frame_write(1)=16

plc_return_frame_write(2)=16

plc_return_frame_write(3)=68

DA SA FC DSAP 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()=68

pc_ack_frame_write(1)=08

pc_ack_frame_write(2)=08

pc_ack_frame_write(3)=68

DA SA FC DSAP 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的工作狀態。

參考文獻

STEP 7V5.4編程手冊

Siemens s7300系列硬體手冊

Visual C++串口編程實踐

http://www.serial-port-communication.com/serial-monitor/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

《瑞克和莫蒂》第一季 豆瓣9.9分燒腦科幻神劇
無聊的人都在幹啥

TAG:全球大搜羅 |