西門子S7協議底層原理分析


前言

前面我們對ModbusRTU協議、ModbusTCP協議、歐姆龍FinsTCP協議、三菱SLMP協議都做了說明:今天我們來分享一下關於西門子S7協議的通信分析。西門子作為一個老牌工控企業,在中國市場擁有很高的市場占有率。如果要說起西門子的通信協議,相信大家多多少少能說出一些,比如MPI、PPI、USS、Profibus、Profinet、S7等,但是西門子在協議的開放性方面還是相對要封閉一些,所以很多協議都是不開放的。在這里,我主要是結合Wireshark抓包工具,跟大家去分享一下,如何是一步一步抓取西門子S7通信協議底層通信報文的,希望通過我一步一步地分析,讓大家都能夠對西門子S7協議有所了解的同時,也學會基本的抓包操作與報文分析。

值得說明一下,西門子S7協議非開放協議,以下內容,僅供學習參考。

環境搭建

1、首先我們要准備要准備一個西門子的PLC,並保證PLC與PC之間的網絡連接正常。

PS:對於手頭沒有PLC的小伙伴,可以查看這篇文章:基於S7-PLCSIM Advanced搭建S7通信仿真環境

2、為了抓取到通信的報文,需要實現PC與PLC之間的通信,這里我采用的方式是通過KepServer V6.4來實現,dotNET工控上位機 公眾號后台回復 關鍵詞:OPC學習套裝

3、安裝Wireshark抓包軟件,dotNET工控上位機 公眾號后台回復關鍵詞:Wireshark。(獲取資料加VX:xiketang777)

4、認識S7協議的網絡模型。

 

操作步驟

1、首先將KepServer與PLC之間的通信連接配置好;

2、將Wireshark軟件打開,並處於監控報文狀態;

3、將KepServer進行連接PLC,此時Wireshark軟件中會出現報文的數據,將KepServer連接停止並關閉軟件,同時將Wireshark的監控停止,以便進行后續的報文分析;

協議分析

1、我們發現西門子的S7通信並不是簡簡單單的TCP通信,在TCP執行三次握手之后,還需要發送兩次連接驗證,在兩次連接驗證之后,才進行真正的數據交互。

2、三次握手過程,如下圖所示:(獲取資料加VX:xiketang777)

 

3、S7連接第一次驗證,如下圖所示:

 

 4、S7連接第二次驗證,如下圖所示:

 

 5、四次揮手過程,如下圖所示:

 

 6、S7第一次驗證發送報文分析:

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x0016

COTP(第六層:表示層)

該層總共占用18個字節:

長度:0x11

PDU類型(CR Connect Request 連接請求):0x0E

目標引用:0x0000

源引用:0x0001

擴展格式/流控制:0x00

參數代碼 TPDU-Size:0xC0

參數長度:0x01

TPDU大小:0x0A

參數代碼 SRC-TASP:0xC1

參數長度:0x02

源TSAP Source TSAP:0x0201

參數代碼 DST-TASP:0xC2

參數長度:0x02

目標TSAP Destination TSAP:0x0201(獲取資料加VX:xiketang777)

7、S7第一次驗證返回報文

 

 

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x0016

COTP(第六層:表示層)

該層總共占18個字節:

長度:0x11

PDU類型(CC Connect Confirm 連接確認):0x0D

目標引用:0x0001

源引用:0x0006

擴展格式/流控制:0x00

參數代碼 TPDU-Size:0xC0

參數長度:0x01

TPDU大小:0x0A

參數代碼 SRC-TASP:0xC1

參數長度:0x02

Source TSAP:0x0201

參數代碼 DST-TASP:0xC2

參數長度:0x02

Destination TSAP:0x0201

8、S7第二次驗證發送報文

 

 

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x0019

COTP(第六層:表示層)(獲取資料加VX:xiketang777)

該層總共占3個字節:

長度:0x02

PDU類型(DT Data):0XF0

目標引用:0x80

S7 Communication(第七層:應用層)

該層總用占18個字節,並且分兩部分:

Header:

協議ID(Protocol ID):0x32

ROSCTR:0x01

預留:0x0000

協議數據單元引用:0x037C

參數長度:0x0008

數據長度:0x0000

Parameter:

功能碼:0xF0

預留:0x00

最大AmQ(Calling):0x0001

最大AmQ(Called):0x0001

PDU長度:0x03C0

9、S7第二次驗證返回報文

 

 

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x0019

COTP(第六層:表示層)

該層總共占3個字節:

長度:0x02

PDU類型(DT Data):0XF0

目標引用:0x80

S7 Communication(第七層:應用層)

該層總用占20個字節,並且分兩部分:

Header:

協議ID(Protocol ID):0x32

Ack_Data:0x03

預留:0x0000

協議數據單元引用:0x037C

參數長度:0x0008

數據長度:0x0000

錯誤等級:0x00

錯誤代碼:0x00

Parameter:

功能碼:0xF0

預留:0x00

最大AmQ(Calling):0x0001

最大AmQ(Called):0x0001

PDU長度:0x00F0

10、讀取數據發送報文:讀取DB1.DBX0.0 開始的4個字節

 

 

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x001F

COTP(第六層:表示層)

該層總共占3個字節:

長度:0x02

PDU類型(DT Data):0XF0

目標引用:0x80

S7 Communication(第七層:應用層)

該層總用占24個字節,並且分兩部分:

Header:(獲取資料加VX:xiketang777)

協議ID(Protocol ID):0x32

Ack_Data:0x01

預留:0x0000

協議數據單元引用:0x037D

參數長度:0x000E

數據長度:0x0000

Parameter:

功能碼 Read Var:0x04

通信項數:0x01

通信項1:

通信項Header

變量指定:0x12

地址長度:0x0A

Syntax ID:0x10

傳輸數據類型 byte:0x02

通信項Param

讀取長度:0x04

DB號:0x01

存儲區類型 DB存儲區:0x84

開始字節:0x000000

11、 讀取數據返回報文

 

 

 

TPKT(第五層:會話層)

該層總共占4個字節:

版本號:0x03

預留:0x00

長度:0x001D

COTP(第六層:表示層)

該層總共占3個字節:

長度:0x02

PDU類型(DT Data):0XF0

目標引用:0x80

S7 Communication(第七層:應用層)

該層總用占22個字節,並且分兩部分:

Header:(獲取資料加VX:xiketang777)

協議ID(Protocol ID):0x32

Ack_Data:0x03

預留:0x0000

協議數據單元引用:0x037D

參數長度:0x0002

數據長度:0x0008

錯誤等級:0x00

錯誤代碼:0x00

Parameter:

功能碼 Read Var:0x04

通信項數:0x01

通信項1:

返回結果Success:0xFF

傳輸數據類型 Byte/Word/DWord:0x04

長度:0x0020

數據:0x00000000

 

            END

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM