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功能包。
- COTP連線包:COTP連線包主要用於建立、維護和斷開COTP協議層的連線。這一過程包括連線請求(CR-Connect Request)、連線確認(CC-Connect Confirm)、斷開請求(DR-Disconnect Request)和斷開確認(DC-Disconnect Confirm)等步驟。透過這些連線包,COTP能夠在通訊雙方之間建立一個穩定的、可靠的會話,保證資料的順序傳輸和完整性。
- 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 |