S7Comm報文詳解

杜衡老师發表於2024-03-28

S7協議是西門子公司為其S7系列PLC(可程式設計邏輯控制器)通訊而設計的一種專用協議。S7協議主要用於西門子PLC之間的通訊,以及PLC與其他裝置的通訊。該協議支援多種通訊方式,如MPI(多點介面)、PROFIBUS和Industrial Ethernet等。S7協議的報文結構相對複雜,可分為多個層次。

1. 簡介

對比OSI參考模型的話,一層到四層(即物理層、資料鏈路層、網路層、傳輸層)與常規的TCP/IP通訊相同,這裡不在贅述。第五層(會話層)透過S7的TPKT實現,六層(表示層)透過COTP實現,S7Comm則於第七層(應用層)。

整個S7協議結構如下圖(不含TCP/IP部分,下同)

TPKT頭 COTP頭 S7Comm頭 S7Comm引數 資料

2.TPKT

TPKT頭報文格式如下:

用途 版本 保留 長度
長度 1byte 1byte 1byte
描述 版本資訊 保留(值為0x00) TPKT、COTP、S7三層協議的總長度(單位位元組)

3.COTP

COTP分為兩類,一類是COTP連線包,一類是COTP功能包。

  1. COTP連線包:COTP連線包主要用於建立、維護和斷開COTP協議層的連線。這一過程包括連線請求(CR-Connect Request)、連線確認(CC-Connect Confirm)、斷開請求(DR-Disconnect Request)和斷開確認(DC-Disconnect Confirm)等步驟。透過這些連線包,COTP能夠在通訊雙方之間建立一個穩定的、可靠的會話,保證資料的順序傳輸和完整性。
  2. COTP功能包:COTP功能包用於在已建立的COTP連線上進行資料傳輸和控制資訊交換。這包括資料傳輸(DT-Data Transfer)功能,透過它傳送使用者資料;以及一些控制功能,如流量控制、復位、錯誤報告等。功能包使得COTP能夠在連線的基礎上提供高效、可靠的資料交換服務。

簡而言之,COTP連線包主要用於建立和管理連線,而COTP功能包則用於在這些連線上進行實際的資料傳輸和控制操作。

3.1 COTP連線包

用途 長度 PDU型別 目的地參考 源地址參考 選項 引數
長度 1byte 1byte 2byte 2byte 1byte 不定
描述 除長度部分外COTP後續長度 指示PDU(Protocol Data Unit,協議資料單元)的型別 在建立連線時由接收方提供,用於標識目標或會話的唯一參考號。在連線建立後的通訊中,這個欄位用來確保資料包被送達到正確的會話。 在連線請求時由發起方提供,用於標識源或會話的唯一參考號。這同樣用於確保通訊雙方在正確的會話中交換資料。 根據PDU型別不同,可能包含額外的控制資訊 額外的引數或控制資訊,這些資訊的存在和格式依據PDU型別和選項欄位而定。

其中PDU型別有以下選項:

  • 0x1: ED Expedited Data,加急資料
  • 0x2: EA Expedited Data Acknowledgement,加急資料確認
  • 0x4: UD,使用者資料
  • 0x5: RJ Reject,拒絕
  • 0x6: AK Data Acknowledgement,資料確認
  • 0x7: ER TPDU Error,TPDU錯誤
  • 0x8: DR Disconnect Request,斷開請求
  • 0xC: DC Disconnect Confirm,斷開確認
  • 0xD: CC Connect Confirm,連線確認
  • 0xE: CR Connect Request,連線請求
  • 0xF: DT Data,資料傳輸

3.1 COTP功能包

用途 長度 PDU型別 選項
長度 1byte 1byte 1byte
描述 除長度部分外COTP後續長度 指示PDU(Protocol Data Unit,協議資料單元)的型別 根據PDU型別不同,可能包含額外的控制資訊

4.S7Comm

報文結構如下

用途 S7頭 引數 資料
長度 10或12byte 不定 不定
描述 報文頭 包含了執行特定操作所必需的控制資訊 資料部分是可選的,具體取決於執行的操作型別。

4.1 S7頭

報文結構如下:

用途 協議ID 訊息型別 冗餘識別 議資料單元參考 引數長度 資料長度 錯誤型別 錯誤程式碼
長度 1byte 1byte 2byte 2byte 2byte 2byte 1byte 1byte
描述 通常為0x32 指示訊息型別 用於冗餘管理,幫助識別和管理通訊過程中可能出現的重複資料包,確保資料的一致性和準確性。通常為0x0000 這是一個識別符號,用來將請求和相應的響應匹配起來。在複雜的通訊過程中,這個欄位確保了每個請求都能得到正確的響應。= 引數欄位的長度 資料部分的長度 可選,僅存在於Ack-Data訊息中,如果傳輸過程中出現錯誤,這個欄位將標識錯誤的型別 可選,僅存在於Ack-Data訊息中,每個錯誤型別下可能有多個錯誤程式碼,指明瞭發生錯誤的具體原因

其中,PDU型別有以下值:

  • 0x01- Job Request:主站傳送的請求(例如讀/寫儲存器,讀/寫塊,啟動/停止裝置,通訊設定)
  • 0x02- Ack:從站傳送的簡單確認沒有資料欄位(從未見過它由S300 / S400裝置傳送)
  • 0x03- Ack-Data:帶有可選資料欄位的確認,包含對作業請求的回覆
  • 0x07- Userdata:原始協議的擴充套件,引數欄位包含請求/響應id,(用於程式設計/除錯,SZL讀取,安全功能,時間設定,迴圈讀取..)

4.2 引數、資料

引數取決於訊息型別,引數報文的第1個byte是功能碼(此處僅介紹建立通訊、讀取資料、寫入資料三類報文格式)

4.2.1 建立通訊

在每個會話開始時會傳送握手訊息。它用於協商Ack佇列的大小和最大PDU長度,雙方都宣告其支援的值以確保資料已成功傳輸。PDU和Ack佇列長度欄位都遵循大端的資料表示法。

傳送請求的報文格式:
S7頭訊息型別 0x01- Job Request,是功能碼為0xF0

用途 功能碼 冗餘資料 Ack佇列的大小(主叫) Ack佇列的大小(被叫) 協商PDU長度
長度 1byte 1byte 2byte 2byte 2byte
描述 0xF0 0x00

響應請求的報文格式與傳送請求的報文格式相同,但S7頭訊息型別0x03- Ack-Data。

4.2.2 讀取資料

4.2.2.1請求報文

S7頭訊息型別 0x01- Job Request,是功能碼為0x04。請求部分只有引數部分,沒有資料部分。

用途 功能碼 專案計數 專案1 專案2 …… 專案n
長度 1byte 1byte
描述 0x04

每個專案的報文格式如下:

用途 變數規範 長度規範 地址規範 資料規範 資料長度 DB編號 區域 地址
長度 1byte 1byte 1byte 1byte 2byte 2byte 1byte 3byte
描述 通常為0x12 本專案剩餘部分的長度 IDS的地址規範的格式 資料傳輸的大小和變數型別 請求資料長度 如果訪問的不是DB區域,此處為0x0000 資料的區域型別 要讀取資料的地址
  • 地址規範的常見值如下所示:
十六進位制程式碼 標識 描述
0x10 S7ANY S7-Any指標類似地址資料,例如DB1.DBX10.2
0x13 PBC-R_ID PBC的R_ID
0x15 ALARM_LOCKFREE 報警鎖定/釋放資料集
0x16 ALARM_IND 報警指示資料集
0x19 ALARM_ACK 報警確認訊息資料集
0x1a ALARM_QUERYREQ 報警查詢請求資料集
0x1c NOTIFY_IND 通知指示資料集
0xa2 DRIVEESANY 見於Drive ES Starter,透過S7進行路由
0xb2 1200SYM S7-1200的符號地址模式
0xb0 DBREAD DB塊讀取,僅在S7-400上見到
0x82 NCK Sinumerik NCK HMI訪問

資料規範常見值如下:

型別 描述 長度單位
0 NULL -
3 BIT 位訪問
4 BYTE/WORD/DWORD 位元組/字/雙字訪問
5 INTEGER 整數訪問
6 DINTEGER 雙整數訪問 位元組
7 REAL 實數訪問 位元組
9 OCTET STRING 八位位元組字串 位元組

資料區域常見值如下:

十六進位制程式碼 描述
0x03 200系列系統資訊
0x05 200系列系統標誌
0x06 200系列模擬量輸入
0x07 200系列模擬量輸出
0x80 直接訪問外設
0x81 輸入(I)
0x82 輸出(Q)
0x83 內部標誌(M)
0x84 資料塊(DB)
0x85 例項資料塊(DI)
0x86 區域性變數(L)
0x87 未知(V)
0x1c S7計數器
0x1d S7定時器(T)
0x1e 描述不明
0x1f IEC計數器(200系列)
0x20 IEC定時器(200系列)

4.2.2.2 響應報文

響應報文S7頭訊息型別0x03- Ack-Data。響應報文既有引數部分,又有資料部分。

引數部分:

用途 功能碼 專案計數
長度 1byte 1byte
描述 0x04 後續資料部分有幾個

資料部分:

用途 返回碼 資料規範 資料長度 返回資料 填充資料
長度 1byte 1byte 2byte 不定 不定
描述 表示返回資訊型別 資料傳輸的大小和變數型別 後續資料長度 讀取到的資料 如返回資料不到資料長度的長度,則填充一部分00至此

常見返回碼型別:

十六進位制程式碼 英文描述 中文描述
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 成功

4.2.3寫入資料

4.2.3.1 請求報文

S7頭訊息型別 0x01- Job Request,請求報文格式中引數部分和讀取資料的相同,但功能碼為0x05,且多了資料部分:

用途 返回碼 資料規範 資料長度 寫入資料 填充資料
長度 1byte 1byte 2byte 不定 不定
描述 通常為0x00 資料傳輸的大小和變數型別 後續資料長度 要寫入的乳山市 如寫入資料不到資料長度的長度,則填充一部分00至此

4.2.3.2 響應報文

引數部分請求報文,資料部分為:

用途 返回碼
長度 1byte
描述 通常為0xff

相關文章