前面我們對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
目标TSAP Destination TSAP:0x0201(擷取資料加VX:xiketang777)
7、S7第一次驗證傳回封包
該層總共占18個位元組:
PDU類型(CC Connect Confirm 連接配接确認):0x0D
目标引用:0x0001
源引用:0x0006
Source TSAP:0x0201
Destination TSAP:0x0201
8、S7第二次驗證發送封包
長度: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
最大AmQ(Calling):0x0001
最大AmQ(Called):0x0001
PDU長度:0x03C0
9、S7第二次驗證傳回封包
該層總用占20個位元組,并且分兩部分:
Ack_Data:0x03
錯誤等級:0x00
錯誤代碼:0x00
PDU長度:0x00F0
10、讀取資料發送封包:讀取DB1.DBX0.0 開始的4個位元組
長度:0x001F
該層總用占24個位元組,并且分兩部分:
Header:(擷取資料加VX:xiketang777)
Ack_Data:0x01
協定資料單元引用:0x037D
參數長度:0x000E
功能碼 Read Var:0x04
通信項數:0x01
通信項1:
通信項Header
變量指定:0x12
位址長度:0x0A
Syntax ID:0x10
傳輸資料類型 byte:0x02
通信項Param
讀取長度:0x04
DB号:0x01
存儲區類型 DB存儲區:0x84
開始位元組:0x000000
11、 讀取資料傳回封包
長度:0x001D
該層總用占22個位元組,并且分兩部分:
參數長度:0x0002
資料長度:0x0008
傳回結果Success:0xFF
傳輸資料類型 Byte/Word/DWord:0x04
長度:0x0020
資料:0x00000000
END