S7-1200 Modbus TCP 通信指令塊
STEP 7 V13 SP1 軟件版本中的 Modbus TCP 庫指令目前最新的版本已升至V4.0,該版本的使用需要具備以下兩個條件:
1. 軟件版本: STEP 7 V13 SP1及其以上
2. 固件版本: S7-1200 CPU 的固件版本V4.1
圖1. Modbus TCP V4.0 版本指令塊
S7-1200 Modbus TCP 實驗環(huán)境
下面以兩臺S7-1200之間進行 Modbus TCP 通信為例,詳細闡述客戶端與服務(wù)器側(cè)如何編程及通信的過程。表格列出了具體的實驗環(huán)境:
操作系統(tǒng)
|
WIN7 SP1 專業(yè)版 64位
|
編程軟件
|
STEP 7 Professional V13 SP1 Update 5
|
系統(tǒng)硬件
|
1.CPU1215C 6ES7 215-1AG40-0XB0 V4.1
2.CPU1212C 6ES7 212-1AE40-0XB0 V4.1
3.CSM 1277 6GK7 277-1aa10-0aa0
|
表1. Modbus TCP 通信的實驗環(huán)境
|
CPU類型
|
IP地址
|
端口號
|
硬件標識符
|
客戶端
|
CPU 1212C
|
192.168.0.6
|
0
|
64
|
服務(wù)器
|
CPU 1215C
|
192.168.0.4
|
502
|
64
|
表2. Modbus TCP 通信雙方的基本配置
硬件標識符是在“設(shè)備組態(tài)”中,雙擊 PROFINET 接口,然后在“屬性”中的“硬件標識符”中查看。
圖2. S7-1200設(shè)備的PROFINET接口硬件標識符
S7-1200 Modbus TCP 客戶端編程
S7-1200 客戶端側(cè)需要調(diào)用MB_CLIENT指令塊,該指令塊主要完成客戶機和服務(wù)器的TCP連接、發(fā)送命令消息、接收響應(yīng)以及控制服務(wù)器斷開的工作任務(wù)。
1. 將MB_CLIENT 指令塊在“ 程序塊 -> OB1 ”中的程序段里調(diào)用,調(diào)用時會自動生成背景DB ,點擊確定即可。
圖3. Modbus TCP 客戶端側(cè)指令塊
該功能塊各個引腳定義如下:
REQ
|
與服務(wù)器之間的通信請求,上升沿有效。
|
DISCONNECT
|
通過該參數(shù),可以控制與 Modbus TCP服務(wù)器建立和終止連接。 0(默認):建立連接;1:斷開連接。
|
MB_MODE
|
選擇 Modbus 請求模式(讀取、寫入或診斷)。0:讀;1:寫。
|
MB_DATA_ADDR
|
由“MB_CLIENT”指令所訪問數(shù)據(jù)的起始地址。
|
MB_DATA_LEN
|
數(shù)據(jù)長度: 數(shù)據(jù)訪問的位或字的個數(shù)。
|
MB_DATA_PTR
|
指向 Modbus 數(shù)據(jù)寄存器的指針。
|
CONNECT
|
指向連接描述結(jié)構(gòu)的指針。TCON_IP_v4(S7-1200)
|
DONE
|
最后一個作業(yè)成功完成,立即將輸出參數(shù) DONE 置位為“1”。
|
BUSY
|
作業(yè)狀態(tài)位:0:無正在處理的“MB_CLIENT”作業(yè);1:“MB_CLIENT”作業(yè)正在處理。
|
ERROR
|
錯誤位:0:無錯誤;1:出現(xiàn)錯誤,錯誤原因查看STATUS。
|
STATUS
|
指令的詳細狀態(tài)信息。
|
表4. MB_CLIENT 各引腳定義說明
2. CONNECT 引腳的指針類型
第一步,先創(chuàng)建一個新的全局數(shù)據(jù)塊 DB2:
圖4. 創(chuàng)建全局數(shù)據(jù)塊
第二步,雙擊打開新生成的DB塊,定義變量名稱為“aa",數(shù)據(jù)類型為“TCON_IP_v4”(可以將 TCON_IP_v4 拷貝到該對話框中),然后點擊“回車”按鍵。該數(shù)據(jù)類型結(jié)構(gòu)創(chuàng)建完畢。如圖5所示:
圖5. 創(chuàng)建 MB_CLIENT 中的TCP連接結(jié)構(gòu)的數(shù)據(jù)類型
各個引腳定義說明如下:
InterfaceId
|
硬件標識符。
|
ID
|
連接ID,取值范圍1~4095
|
Connection Type
|
連接類型。TCP連接默認為:16#0B
|
ActiveEstablished
|
建立連接。主動為1(客戶端),被動為0(服務(wù)器)。
|
ADDR
|
服務(wù)器側(cè)的IP地址
|
RemotePort
|
遠程端口號
|
LocalPort
|
本地端口號
|
表4. TCON_IP_v4 數(shù)據(jù)結(jié)構(gòu)的引腳定義
本文遠程服務(wù)器的IP地址為192.168.0.4,遠程端口號設(shè)為502。所以客戶端側(cè)該數(shù)據(jù)結(jié)構(gòu)的各項值為:
圖6. MB_CLIENT 側(cè) CONNECT 引腳數(shù)據(jù)定義
注意: CONNECT引腳的填寫需要用符號尋址的方式。
3. 創(chuàng)建 MB_DATA_PTR 數(shù)據(jù)緩沖區(qū)
第一步,創(chuàng)建一個全局數(shù)據(jù)塊 DB3,創(chuàng)建方法可以參考上面的圖3,數(shù)據(jù)塊的名稱如圖7所示:
圖7. 生成的兩個DB塊名稱
第二步,建議一個數(shù)組的數(shù)據(jù)類型,以便通信中存放數(shù)據(jù),請參考圖8所示:
圖8. MB_DATA_PTR 數(shù)據(jù)緩沖區(qū)結(jié)構(gòu)
注意: MB_DATA_PTR指定的數(shù)據(jù)緩沖區(qū)可以為DB塊或M存儲區(qū)地址中。DB塊可以為優(yōu)化的數(shù)據(jù)塊,也可以為標準的數(shù)據(jù)塊結(jié)構(gòu)。若為優(yōu)化的數(shù)據(jù)塊結(jié)構(gòu),編程時需要以符號尋址的方式填寫該引腳;若為標準的數(shù)據(jù)塊結(jié)構(gòu)(可以右鍵單擊DB塊,“屬性”中將“優(yōu)化的塊訪問”前面的勾去掉,如下圖9所示),需要以絕對地址的方式填寫該引腳。本文以標準的數(shù)據(jù)塊(默認)為例進行編程。
圖9. 修改 DB 塊屬性為標準的塊結(jié)構(gòu)
4. 客戶端側(cè)完成指令塊編程
調(diào)用 MB_CLIENT 指令塊,實現(xiàn)從 Modbus TCP 通信服務(wù)器中讀取2個保持寄存器的值,如圖10所示:
圖10. MB_CLIENT 指令塊編程
5. 將整個項目下載到S7-1200
待Modbus TCP 服務(wù)器側(cè)準備就緒,給MB_CLIENT指令塊的REQ引腳一個上升沿,將讀取到的數(shù)據(jù)放入 MB_DATA_PTR引腳指定的DB 塊中。具體的實驗結(jié)果可以查看S7-1200 服務(wù)器側(cè)編程。
常見問題
MB_CLIENT 指令的背景數(shù)據(jù)塊中的 "MB_Unit_ID" 有什么功能?
S7-1200 CPU 作為 Modbus TCP 客戶端與 Modbus TCP 服務(wù)器通信,當嘗試訪問比 Modbus TCP 服務(wù)器更低端的串行子網(wǎng)中的設(shè)備,會有報錯 "無法建立連接"。
這種情況下, Modbus TCP 服務(wù)器作為 Modbus RTU 協(xié)議中的網(wǎng)關(guān),"MB_Unit_ID" 參數(shù)相當于 Modbus RTU 協(xié)議中的從站地址。
Modbus TCP 客戶端直接向 Modbus TCP 服務(wù)器發(fā)送請求,Modbus TCP 服務(wù)器通過識別 "MB_UNIT_ID" 參數(shù),將請求轉(zhuǎn)發(fā)到從站設(shè)備。
在 S7-1200 項目中,選擇系統(tǒng)塊,雙擊打開 MB_CLIENT 指令的背景數(shù)據(jù)塊“MB_CLIENT_DB”, 在靜態(tài)變量Static下可以找到 MB_Unit_ID (默認起始值16#FF,等于十進制 255)。如下圖 11 所示:
圖 11. MB_Unit_ID
例如,當 S7-1200 做客戶端與電腦上的 Modbus TCP 調(diào)試軟件 Modsim 通信時,會遇到如上“無法建立連接”的問題。
這時,修改調(diào)試軟件 Modsim 中Device Id 為255,使之等于 MB_Unit_ID 的值,即可建立聯(lián)系。如下圖 12 所示:
圖 12. Device Id
注意:如果 Modbus TCP 服務(wù)器無法更改 Device Id 的值, 則修改S7-1200 項目中MB_Unit_ID數(shù)值, 使雙方的參數(shù)一致。
更多關(guān)于 MB_Unit_ID 功能的說明,請參考以下鏈接:
Modbus 塊 "MB_CLIENT" 的背景數(shù)據(jù)塊中的 "MB_UNIT_ID" 有什么功能?
S7-1200 Modbus TCP 通信指令塊
STEP 7 V13 SP1 軟件版本中的Modbus TCP庫指令目前最新的版本已升至V4.0,該版本的使用需要具備以下兩個條件:
1. 軟件版本: STEP 7 V13 SP1及其以上
2. 固件版本: S7-1200 CPU 的固件版本V4.1
圖1. Modbus TCP V4.0 版本指令塊
S7-1200 Modbus TCP 實驗環(huán)境
下面以兩臺S7-1200之間進行Modbus TCP 通信為例,詳細闡述客戶端與服務(wù)器側(cè)如何編程及通信的過程。表格列出了具體的實驗環(huán)境:
操作系統(tǒng)
|
WIN7 SP1 專業(yè)版 64位
|
編程軟件
|
STEP 7 Professional V13 SP1 Update 5
|
系統(tǒng)硬件
|
1.CPU1215C 6ES7 215-1AG40-0XB0 V4.1
2.CPU1212C 6ES7 212-1AE40-0XB0 V4.1
3.CSM 1277 6GK7 277-1aa10-0aa0
|
表1. Modbus TCP 通信的實驗環(huán)境
|
CPU類型
|
IP地址
|
端口號
|
硬件標識符
|
客戶端
|
CPU 1212C
|
192.168.0.6
|
0
|
64
|
服務(wù)器
|
CPU 1215C
|
192.168.0.4
|
502
|
64
|
表2. Modbus TCP 通信雙方的基本配置
硬件標識符是在“設(shè)備組態(tài)”中,雙擊 PROFINET 接口,然后在“屬性”中的“硬件標識符”中查看。
圖2. S7-1200設(shè)備的PROFINET接口硬件標識符
S7-1200 Modbus TCP 服務(wù)器編程
“MB_SERVER”指令將處理 Modbus TCP 客戶端的連接請求、接收并處理 Modbus 請求并發(fā)送響應(yīng)。
1. 在“ 程序塊-> OB 1"中調(diào)用“MB_SERVER”指令塊,然后會生成相應(yīng)的背景DB塊,點擊確定,如圖3所示。
圖3. 調(diào)用MB_SERVER指令塊
該功能塊的各個引腳定義如下:
DISCONNET
|
為0代表被動建立與客戶端的通信連接;為1代表終止連接。
|
MB_HOLD_REG
|
指向 Modbus 保持寄存器的指針。
|
CONNECT
|
指向連接描述結(jié)構(gòu)的指針。TCON_IP_v4(S7-1200)
|
NDR
|
為0代表無數(shù)據(jù);為1代表從 Modbus 客戶端寫入新的數(shù)據(jù)。
|
DR
|
為0代表無讀取的數(shù)據(jù);為1代表從 Modbus 客戶端讀取的數(shù)據(jù)
|
ERROR
|
錯誤位:0:無錯誤;1:出現(xiàn)錯誤,錯誤原因查看STATUS。
|
STATUS
|
指令的詳細狀態(tài)信息。
|
表3. MB_SERVER 各個引腳定義說明
2. CONNECT 引腳的指針類型
第一步,先創(chuàng)建一個新的全局數(shù)據(jù)塊 DB2,如圖4所示:
圖4. 創(chuàng)建全局數(shù)據(jù)塊
第二步,雙擊打開新生成的 DB2 數(shù)據(jù)塊,定義變量名稱為“ss",數(shù)據(jù)類型為“TCON_IP_v4”(可以將 TCON_IP_v4 拷貝到該對話框中),然后點擊“回車”按鍵。該數(shù)據(jù)類型結(jié)構(gòu)創(chuàng)建完畢。如圖5所示:
圖5. 創(chuàng)建 MB_SERVER 中的 TCP 連接結(jié)構(gòu)的數(shù)據(jù)類型
各個引腳定義說明如下:
InterfaceId
|
硬件標識符。(設(shè)備組態(tài)中查詢)
|
ID
|
連接ID,取值范圍1~4095
|
Connection Type
|
連接類型。TCP連接默認為:16#0B
|
ActiveEstablished
|
建立連接。主動為1(客戶端),被動為0(服務(wù)器)。
|
ADDR
|
服務(wù)器側(cè)的IP地址
|
RemotePort
|
遠程端口號
|
LocalPort
|
本地端口號
|
表4. TCON_IP_v4 數(shù)據(jù)結(jié)構(gòu)的引腳定義
客戶端側(cè)的IP地址為192.168.0.6,端口號為0,所以 MB_SERVER 服務(wù)器側(cè)該數(shù)據(jù)結(jié)構(gòu)的各項值如圖6所示。
圖6. MB_SERVER 服務(wù)器側(cè)的 CONNECT 數(shù)據(jù)結(jié)構(gòu)定義
3. S7-1200 服務(wù)器側(cè) MB_SERVER 編程
調(diào)用MB_SERVER指令塊,實現(xiàn)被客戶端讀取2個保持寄存器的值,如圖7所示。
圖7. MB_SERVER 服務(wù)器側(cè)編程
注意:MB_HOLD_REG 指定的數(shù)據(jù)緩沖區(qū)可以設(shè)為 DB 塊或 M 存儲區(qū)地址。DB 塊可以為優(yōu)化的數(shù)據(jù)塊,也可以為標準的數(shù)據(jù)塊結(jié)構(gòu)。
S7-1200 MODBUS TCP 通信調(diào)試
S7-1200 MODBUS TCP 服務(wù)器側(cè)準備數(shù)據(jù),用于客戶端讀訪問,如圖8所示。
圖8. 服務(wù)器側(cè)監(jiān)控表
S7-1200 MODBUS TCP 客戶端側(cè),給 MB_CLIENT 指令塊中 REQ 引腳一個上升沿,監(jiān)控數(shù)據(jù)讀取成功。如圖9所示。
圖9. 客戶端側(cè)監(jiān)控表