西門子S7comm協議解析 —— 利用Wireshark對報文逐字節進行解析詳細解析S7comm所含功能碼以及UserData功能(path1)


又一次成為懶蛋了,標題就這么改了改又是一篇新文章。

網上也有很多S7comm協議的解析,但還是如同我上一篇一樣我只是做報文的解析對於S7comm的原理並進行闡述。

有些地方有錯誤的地方盡請大家指出,共同進步。

好了,言歸正題。我們開始吧。

我還是按照功能碼的順序進行介紹吧。

s7抓包分析

 TPKT層和COTP層我也不多做介紹了,有興趣的可以自己去了解。今天我們主要是解析S7comm這一層。

功能碼附錄:

0x00       CPU services CPU服務

0xf0        Setup communication  建立通信

0x04       Read Var      讀取值

0x05       Write Var     寫入值

0x1a       Request download 請求下載

0x1b       Download block   下載塊

0x1c       Download ended   下載結束

0x1d       Start upload  開始上傳

0x1e       Upload   上傳

0x1f        End upload   上傳結束

0x28       PI-Service     程序調用服務

0x29       PLC Stop      關閉PLC

1、0xF0建立通信

發包

 

我們來先看Header頭部分。

Byte[0] 32 為協議ID   一般指定為0x32

Byte[1] 01 為 PDU類型  一般有0x01 Job 主設備發起請求 0x02 Ack 確認響應 0x03 Ack_data 確認數據響應一般作為確認0x01的請求 0x07 USERDATA     協議的擴展,參數字段包含請求/響應ID

Byte[2]Byte[3] 00 00冗余數據,通常為0×0000

Byte[4]Byte[5] 3e 02協議數據單元的參考、通過請求事件增加

Byte[6]Byte[7] 00 08參數的總長度也就是parameter的長度

Byte[8]Byte[9] 00 00數據的長度、也就是data部分數據的長度如果無即為0

繼續看Parmeter部分。

根據上面的length得知,我們的Parameter部分應該是8個位,數一數看看是不是8位

Byte[0] f0 為PDU的類型也就是功能碼

Byte[1] 00 冗余數據,通常為0×0000

Byte[2] Byte[3]  發送連接請求

Byte[4] Byte[5]  發送通信請求

Byte[6] Byte[7]  協商的PDU長度

回包

 

紅框內跟發包是一樣的,就不再描述了。

從Error Class開始。

Byte[10] 00 為錯誤類型 、錯誤類型也有很多種、以下是錯誤類型附錄。

0x00       No error 沒有錯誤

0x81       Application relationship     應用關系

0x82       Object definition  對象定義

0x83       No resources available 沒有可用資源

0x84       Error on service processing 服務處理中錯誤

0x85       Error on supplies 請求錯誤

0x87       Access error  訪問錯誤

Byte[11] 00 為錯誤碼   文章最后會附錄一下全部錯誤碼(很長不貼在這里了,搜索 附錄一)

這里可以理解為 錯誤類型規定錯誤的大體方向而錯誤碼規定錯誤的具體事件。

接下來我們看Parameter這一部分

可以看出跟發包是完全一樣的,還是那句話百變不離其宗,協議嘛逃脫不了一發一收對吧。

Byte[0] f0 為PDU的類型也就是功能碼

Byte[1] 00 冗余數據,通常為0×0000

Byte[2] Byte[3]  確認連接請求

Byte[4] Byte[5]  確認通信請求

Byte[6] Byte[7]  協商的PDU長度

2、0x04 讀取數據

發包

Header頭部與之前都一樣的不再描述了

我們直接看Parameter部分吧。

Byte[0]  04 功能碼

Byte[1]  01 代表了Item的個數  為1 即為 一個

再繼續往下扒。

Item部分

Byte[0] 12 結構標識通常都為0x12,代表變量規范

Byte[1] 0a 長度規范、自此往后的長度

Byte[2] 10  IDS的地址規范的格式類型常見值如下表

0x10        S7ANY  Address data S7-Any pointer-like DB1.DBX10.2

0x13        PBC-R_ID    R_ID for PBC

0x15        ALARM_LOCKFREE Alarm lock/free dataset

0x16        ALARM_IND      Alarm indication dataset

0x19        ALARM_ACK     Alarm acknowledge message dataset

0x1a        ALARM_QUERYREQ      Alarm query request dataset

0x1c        NOTIFY_IND      Notify indication dataset

0xa2        DRIVEESANY    seen on Drive ES Starter with routing over S7

0xb2        1200SYM      Symbolic address mode of S7-1200

0xb0        DBREAD      Kind of DB block read, seen only at an S7-400

0x82        NCK      Sinumerik NCK HMI access

Byte[3] 02 為數據傳輸的大小、常見值如下表

0 NULL

3  BIT  bit access, len is in bits

4  BYTE/WORD/DWORD  byte/word/dword access, len is in bits

5  INTEGER  integer access, len is in bits

6  DINTEGER  integer access, len is in bytes

7  REAL  real access, len is in bytes

9  OCTET STRING  octet string, len is in bytes

Byte[4]Byte[5] 00 01 即數據的長度

Byte[6]byte[7] 00 01  即 DB 編號,如果訪問的不是DB區域,此處為0x0000

Byte[8] 84 即數據的區域常用的如下表

Byte[9] Byte[10]Byte[11]    要讀取數據的地址

圖示整體標注一下

 回包

 Header部分

除了紅框內的其他都與發包一致

Error class 即錯誤類型

Error code 即具體錯誤碼這兩個在上面已經介紹了都有哪些錯誤類型,沒有錯誤即0x00

Parameter部分

Byte[0] 04 功能碼 Byte[1] 01 代表一個Item

Data部分

Byte[0] FF 為返回碼  返回碼常用值如下表

0x00       Reserved 未定義,預留

0x01       Hardware error   硬件錯誤

0x03       Accessing the object not allowed 對象不允許訪問

0x05       Invalid address     無效地址,所需的地址超出此PLC的極限

0x06       Data type not supported     數據類型不支持

0x07       Data type inconsistent 日期類型不一致

0x0a       Object does not exist    對象不存在

0xff         Success  成功

Byte[1] 04  為數據傳輸大小 data數據傳輸大小值如下表

0     NULL

3     BIT bit access, len is in bits

4     BYTE/WORD/DWORD     byte/word/dword access, len is in bits

5     INTEGER    integer access, len is in bits

6     DINTEGER  integer access, len is in bytes

7     REAL    real access, len is in bytes

9     OCTET STRING octet string, len is in bytes

Byte[2]Byte[3]  為data數據的長度

Byte[4] 即數據

有時候會有填充數據即在byte[4]之后、如果數據長度不滿足length的話會填充0x00

列如 byte[2]byte[3] 的長度值為3 就會在byte[4]后填充兩個0x00

還是整體在圖示一遍吧

 好了,這個功能算是啃完了,其他的功能也大致都一樣,所以呢剩下的時候我可能會比較懶了哈哈。

3、0x05 寫入數據

這就很好理解了吧,有讀必有寫。那寫我們去推斷一下,是不是在發包的時候比讀數據會多一個Data段作為寫入的值呢。答案是肯定的!

發包

Header  都與讀取值一樣的就不在說了

Parameter也一樣圖示一次吧

 叮叮叮,Data段來了

 

Byte[0]  00 返回碼未定義就為00

Byte[1]  04 數據傳輸的大小

Byte[2]Byte[3] 數據的長度

Byte[4] 數據

是不是感覺這些都差不多一樣,

計算機跟人類也是一樣的。

我對你說“你好帥啊” 你是不是也會回我一句“你也好帥”,假設說你回了一句“我很帥,你很丑” 

這是不是不符合常理了,有可能你還要挨罵對吧。

那計算機也是啊,服務端發送數值,客戶端不但不接受還罵服務端一句,那是不是服務端這邊要報錯呢。

可能例子不太恰當,意思到了就闊儀了。

言歸正傳,別愛我,沒結果。

回包

引用上面我舉的例子,那完全可以推斷出來回包會會什么對吧。

發包寫入了數據,那我回包是不是要回復寫入成功或者失敗呢。

Header部分和parameter部分都一樣還是懶了些就不在描述了。

來看Data部分吧

Byte[0] FF 即為返回碼

上面介紹有返回碼的類型 整段的意思就是向0x000000地址寫入成功

還有好多個功能碼沒有寫,我會放到下一篇文章里。

原因:懶了懶了懶了

未完待續....

相關文件文檔下載:https://download.csdn.net/download/Db2k_/12887086

 

附錄一:錯誤碼具體含義

0x0000

沒有錯誤

0x0110

塊號無效

0x0111

請求長度無效

0x0112

參數無效

0x0113

塊類型無效

0x0114

找不到塊

0x0115

塊已存在

0x0116

塊被寫保護

0x0117

塊/操作系統更新太大

0x0118

塊號無效

0x0119

輸入的密碼不正確

0x011A

PG資源錯誤

0x011B

PLC資源錯誤

0x011C

協議錯誤

0x011D

塊太多(與模塊相關的限制)

0x011E

不再與數據庫建立連接,或者S7DOS句柄無效

0x011F

結果緩沖區太小

0x0120

塊結束列表

0x0140

可用內存不足

0x0141

由於缺少資源,無法處理作業

0x8001

當塊處於當前狀態時,無法執行請求的服務

0x8003

S7協議錯誤:傳輸塊時發生錯誤

0x8100

應用程序,一般錯誤:遠程模塊未知的服務

0x8104

未在模塊上實現此服務或報告了幀錯誤

0x8204

對象的類型規范不一致

0x8205

復制的塊已存在且未鏈接

0x8301

模塊上的內存空間或工作內存不足,或者指定的存儲介質不可訪問

0x8302

可用資源太少或處理器資源不可用

0x8304

無法進一步並行上傳。存在資源瓶頸

0x8305

功能不可用

0x8306

工作內存不足(用於復制,鏈接,加載AWP)

0x8307

保持性工作記憶不夠(用於復制,鏈接,加載AWP)

0x8401

S7協議錯誤:無效的服務序列(例如,加載或上載塊)

0x8402

由於尋址對象的狀態,服務無法執行

0x8404

S7協議:無法執行該功能

0x8405

遠程塊處於DISABLE狀態(CFB)。該功能無法執行

0x8500

S7協議錯誤:幀錯誤

0x8503

來自模塊的警報:服務過早取消

0x8701

尋址通信伙伴上的對象時出錯(例如,區域長度錯誤)

0x8702

模塊不支持所請求的服務

0x8703

拒絕訪問對象

0x8704

訪問錯誤:對象已損壞

0xD001

協議錯誤:非法的作業號

0xD002

參數錯誤:非法的作業變體

0xD003

參數錯誤:模塊不支持調試功能

0xD004

參數錯誤:作業狀態非法

0xD005

參數錯誤:作業終止非法

0xD006

參數錯誤:非法鏈路斷開ID

0xD007

參數錯誤:緩沖區元素數量非法

0xD008

參數錯誤:掃描速率非法

0xD009

參數錯誤:執行次數非法

0xD00A

參數錯誤:非法觸發事件

0xD00B

參數錯誤:非法觸發條件

0xD011

調用環境路徑中的參數錯誤:塊不存在

0xD012

參數錯誤:塊中的地址錯誤

0xD014

參數錯誤:正在刪除/覆蓋塊

0xD015

參數錯誤:標簽地址非法

0xD016

參數錯誤:由於用戶程序錯誤,無法測試作業

0xD017

參數錯誤:非法觸發號

0xD025

參數錯誤:路徑無效

0xD026

參數錯誤:非法訪問類型

0xD027

參數錯誤:不允許此數據塊數

0xD031

內部協議錯誤

0xD032

參數錯誤:結果緩沖區長度錯誤

0xD033

協議錯誤:作業長度錯誤

0xD03F

編碼錯誤:參數部分出錯(例如,保留字節不等於0)

0xD041

數據錯誤:非法狀態列表ID

0xD042

數據錯誤:標簽地址非法

0xD043

數據錯誤:找不到引用的作業,檢查作業數據

0xD044

數據錯誤:標簽值非法,檢查作業數據

0xD045

數據錯誤:HOLD中不允許退出ODIS控制

0xD046

數據錯誤:運行時測量期間非法測量階段

0xD047

數據錯誤:“讀取作業列表”中的非法層次結構

0xD048

數據錯誤:“刪除作業”中的非法刪除ID

0xD049

“替換作業”中的替換ID無效

0xD04A

執行'程序狀態'時出錯

0xD05F

編碼錯誤:數據部分出錯(例如,保留字節不等於0,...)

0xD061

資源錯誤:沒有作業的內存空間

0xD062

資源錯誤:作業列表已滿

0xD063

資源錯誤:觸發事件占用

0xD064

資源錯誤:沒有足夠的內存空間用於一個結果緩沖區元素

0xD065

資源錯誤:沒有足夠的內存空間用於多個結果緩沖區元素

0xD066

資源錯誤:可用於運行時測量的計時器被另一個作業占用

0xD067

資源錯誤:“修改標記”作業過多(特別是多處理器操作)

0xD081

當前模式下不允許使用的功能

0xD082

模式錯誤:無法退出HOLD模式

0xD0A1

當前保護級別不允許使用的功能

0xD0A2

目前無法運行,因為正在運行的函數會修改內存

0xD0A3

I / O上活動的“修改標記”作業太多(特別是多處理器操作)

0xD0A4

'強制'已經建立

0xD0A5

找不到引用的作業

0xD0A6

無法禁用/啟用作業

0xD0A7

無法刪除作業,例如因為當前正在讀取作業

0xD0A8

無法替換作業,例如因為當前正在讀取或刪除作業

0xD0A9

無法讀取作業,例如因為當前正在刪除作業

0xD0AA

處理操作超出時間限制

0xD0AB

進程操作中的作業參數無效

0xD0AC

進程操作中的作業數據無效

0xD0AD

已設置操作模式

0xD0AE

作業是通過不同的連接設置的,只能通過此連接進行處理

0xD0C1

訪問標簽時至少檢測到一個錯誤

0xD0C2

切換到STOP / HOLD模式

0xD0C3

訪問標記時至少檢測到一個錯誤。模式更改為STOP / HOLD

0xD0C4

運行時測量期間超時

0xD0C5

塊堆棧的顯示不一致,因為塊被刪除/重新加載

0xD0C6

作業已被刪除,因為它所引用的作業已被刪除

0xD0C7

由於退出了STOP模式,因此作業被自動刪除

0xD0C8

由於測試作業和正在運行的程序之間不一致,“塊狀態”中止

0xD0C9

通過復位OB90退出狀態區域

0xD0CA

通過在退出前重置OB90並訪問錯誤讀取標簽退出狀態范圍

0xD0CB

外設輸出的輸出禁用再次激活

0xD0CC

調試功能的數據量受時間限制

0xD201

塊名稱中的語法錯誤

0xD202

函數參數中的語法錯誤

0xD205

RAM中已存在鏈接塊:無法進行條件復制

0xD206

EPROM中已存在鏈接塊:無法進行條件復制

0xD208

超出模塊的最大復制(未鏈接)塊數

0xD209

(至少)模塊上找不到給定塊之一

0xD20A

超出了可以與一個作業鏈接的最大塊數

0xD20B

超出了一個作業可以刪除的最大塊數

0xD20C

OB無法復制,因為關聯的優先級不存在

0xD20D

SDB無法解釋(例如,未知數)

0xD20E

沒有(進一步)阻止可用

0xD20F

超出模塊特定的最大塊大小

0xD210

塊號無效

0xD212

標頭屬性不正確(與運行時相關)

0xD213

SDB太多。請注意對正在使用的模塊的限制

0xD216

無效的用戶程序 - 重置模塊

0xD217

不允許在模塊屬性中指定的保護級別

0xD218

屬性不正確(主動/被動)

0xD219

塊長度不正確(例如,第一部分或整個塊的長度不正確)

0xD21A

本地數據長度不正確或寫保護錯誤

0xD21B

模塊無法壓縮或壓縮早期中斷

0xD21D

傳輸的動態項目數據量是非法的

0xD21E

無法為模塊(例如FM,CP)分配參數。系統數據無法鏈接

0xD220

編程語言無效。請注意對正在使用的模塊的限制

0xD221

連接或路由的系統數據無效

0xD222

全局數據定義的系統數據包含無效參數

0xD223

通信功能塊的實例數據塊錯誤或超出最大背景數據塊數

0xD224

SCAN系統數據塊包含無效參數

0xD225

DP系統數據塊包含無效參數

0xD226

塊中發生結構錯誤

0xD230

塊中發生結構錯誤

0xD231

至少有一個已加載的OB無法復制,因為關聯的優先級不存在

0xD232

加載塊的至少一個塊編號是非法的

0xD234

塊在指定的內存介質或作業中存在兩次

0xD235

該塊包含不正確的校驗和

0xD236

該塊不包含校驗和

0xD237

您將要加載塊兩次,即CPU上已存在具有相同時間戳的塊

0xD238

指定的塊中至少有一個不是DB

0xD239

至少有一個指定的DB在裝載存儲器中不可用作鏈接變量

0xD23A

至少有一個指定的DB與復制和鏈接的變體有很大不同

0xD240

違反了協調規則

0xD241

當前保護級別不允許該功能

0xD242

處理F塊時的保護沖突

0xD250

更新和模塊ID或版本不匹配

0xD251

操作系統組件序列不正確

0xD252

校驗和錯誤

0xD253

沒有可用的可執行加載程序; 只能使用存儲卡進行更新

0xD254

操作系統中的存儲錯誤

0xD280

在S7-300 CPU中編譯塊時出錯

0xD2A1

塊上的另一個塊功能或觸發器處於活動狀態

0xD2A2

塊上的觸發器處於活動狀態。首先完成調試功能

0xD2A3

塊未激活(鏈接),塊被占用或塊當前被標記為刪除

0xD2A4

該塊已被另一個塊函數處理

0xD2A6

無法同時保存和更改用戶程序

0xD2A7

塊具有“未鏈接”屬性或未處理

0xD2A8

激活的調試功能阻止將參數分配給CPU

0xD2A9

正在為CPU分配新參數

0xD2AA

當前正在為模塊分配新參數

0xD2AB

當前正在更改動態配置限制

0xD2AC

正在運行的激活或取消激活分配(SFC 12)暫時阻止R-KiR過程

0xD2B0

在RUN(CiR)中配置時發生錯誤

0xD2C0

已超出最大工藝對象數

0xD2C1

模塊上已存在相同的技術數據塊

0xD2C2

無法下載用戶程序或下載硬件配置

0xD401

信息功能不可用

0xD402

信息功能不可用

0xD403

服務已登錄/注銷(診斷/ PMC)

0xD404

達到的最大節點數。不再需要登錄診斷/ PMC

0xD405

不支持服務或函數參數中的語法錯誤

0xD406

當前不可用的必需信息

0xD407

發生診斷錯誤

0xD408

更新已中止

0xD409

DP總線錯誤

0xD601

函數參數中的語法錯誤

0xD602

輸入的密碼不正確

0xD603

連接已合法化

0xD604

已啟用連接

0xD605

由於密碼不存在,因此無法進行合法化

0xD801

至少有一個標記地址無效

0xD802

指定的作業不存在

0xD803

非法的工作狀態

0xD804

非法循環時間(非法時基或多個)

0xD805

不能再設置循環讀取作業

0xD806

引用的作業處於無法執行請求的功能的狀態

0xD807

功能因過載而中止,這意味着執行讀取周期所需的時間比設置的掃描周期時間長

0xDC01

日期和/或時間無效

0xE201

CPU已經是主設備

0xE202

由於閃存模塊中的用戶程序不同,無法進行連接和更新

0xE203

由於固件不同,無法連接和更新

0xE204

由於內存配置不同,無法連接和更新

0xE205

由於同步錯誤導致連接/更新中止

0xE206

由於協調違規而拒絕連接/更新

0xEF01

S7協議錯誤:ID2錯誤; 工作中只允許00H

0xEF02

S7協議錯誤:ID2錯誤; 資源集不存在


免責聲明!

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



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