2.3.3 功能碼和MB_MODE、MB_DATA_ADDR的對應關系 2.4.1 MB_CLIENT背景數據塊中的"MB_Unit_ID"是什么?
2.4.2 如何處理多個MODBUS TCP請求?
1 案例概述
本文案例以某擴展模塊(下文簡稱模塊)為例,介紹西門子PLC如何通過博圖軟件進行Modbus TCP通通信。模塊是一個第三方擴展IO模塊。
模式:服務器
2 Modbus TCP編程案例詳解
欲知Modbus詳細信息,請訪問官網:http://www.modbus.org/
2.1 Modbus TCP簡介
S7-1200 CPU本體集成PROFINET通信口,支持以太網和基于TCP/IP和UDP的通信協議。表2.1- 1 S7-1200 CPU硬件V4.4的連接資源

2.2 ModbusTCP庫指令
S7-1200的Modbus TCP通過集成的PN口進行TCP/IP通信,無需增加通信模塊。Modbus TCP使用開放式用戶通信連接,從上圖可以看出,其支持的混合客戶機和服務器連接數最大為8個。
直接調用博圖軟件中的Modbus TCP的庫指令“MB_CLIENT”和“MB_SERVER”實現 Modbus TCP通信功能,博圖庫指令中有多個版本的Modbus指令,具體指令信息可參閱博圖軟件幫助文檔,本文不做詳細介紹。

2.3 ModbusTCP客戶端指令編程
“MB_CLIENT”指令作為 Modbus TCP 客戶端通過 PROFINET 連接進行通信。通過“MB_CLIENT”指令,可以在客戶端和服務器之間建立連接、發送 Modbus 請求、接收響應并控制 Modbus TCP 客戶端的連接終端。
2.3.1 調用通信指令MB_CLIENT
進入“程序塊”>“MAIN[OB1]”主程序中,調用MB_CLIENT指令。

表2.3-1 功能塊參數意義表(參閱博圖軟件幫助文檔)

2.3.2 訪問數據塊的創建
通過“程序塊”>“添加新快”,選擇“DB”塊,新建一個DB塊。


塊中添加一個長度20元素類型WORD的數組arrData。

2.3.3 功能碼和MB_MODE、MB_DATA_ADDR的對應關系
參數 MB_MODE、MB_DATA_ADDR 和 DATA_LEN 的組合定義了 MB_MODE 值為 0、1 和 2 時,當前 Modbus 消息中所用的 Modbus 功能代碼。

使用功能碼FC04讀取模塊的AI1模擬輸入通道的兩個字,起始地址30001,接收數據存放于DB3.DBX0.0開始的區域,參數設置為:MB_MODE=0,MB_DATA_ADDR=30001,MB_DATA_LEN=2,最終的數據對應關系為:30001->DB3.DBW0,30002->DB3.DBW2。
2.3.4 通訊結果

請求成功后,可從arrData[0]和arrData[1]中查看相應數據。
MB_CLIENT參數STATUS錯誤代碼請參閱博圖幫助文檔。
2.4 Modbus TCP常問問題
2.4.1 MB_CLIENT背景數據塊中的"MB_Unit_ID"是什么?
Slave ID是模塊的站地址(或叫從站地址),和客戶端中“MB_CLIENT”中的“CONNECT_ID”不是一個概念。Slave ID與客戶端“MB_CLIENT”的背景數據塊中的STAT變量“MB_UNIT_ID”需要一致,在博圖中該地址默認為16#00FF,實際使用時可以與模塊的站號保持一致,本例為1。當S7-1200連接多個模塊時,該值可以按序編號,也可以全部使用 1,因為Modbus TCP仍能根據IP和Port發送數據。

2.4.2 如何處理多個Modbus TCP請求?
- 每個“MB_CLIENT”連接需要使用一個不同的背景數據塊。
- 每個“MB_CLIENT”連接必須指定一個服務器IP地址。
- 每個“MB_CLIENT”連接必須指定一個唯一的連接ID。
是否需要唯一的IP端口號取決于服務器組態。
連接ID和背景數據塊組合成對,對每個連接來說,組合對都是唯一的。對于多請求處理,有兩種方法:
方法一:若TCP連接資源足夠,可建立多個不同的獨立連接請求,調用獨立的“MB_CLIENT”功能塊,具體操作參考上述“Modbus TCP獨立連接案例”部分。通過不同的連接發送不同請求,多次調用“MB_CLIENT”功能塊,使用不同的背景數據塊、不同的ID以及不同的Port。
方法二:使用同一連接發送多個請求,多次調用“MB_CLIENT”功能塊,使用相同的背景數據塊、連接ID、IP地址以及Port。任意時刻,僅允許存在一個MB_CLIENT請求處于激活狀態。當一請求完成后,執行下一請求,輪循處理。
本文以方法二為例,展示S7-1200如何通過輪詢獲取模塊即服務器的內部寄存器的數據。
(1)設置PLC的IP地址為192.168.0.218,將系統存儲器字節設置為MB1。

(2)新建數據塊,訪問指向模塊即服務器的IP地址和端口號。
新建DB,添加類型TCON_IP_V4的變量,此變量用于通信配置,設置InterfaceId、ID、ActiveEstablished、RemoteAddress、RemotePort等參數。此處使用的指令比前文單連接請求中使用的指令版本更高,所以指令引腳略有不同。筆者建議使用高版本指令,因為高版本更加可靠,功能也更加豐富。

在DB中建立結構類型數組,用于輪詢控制位以及數據存儲,其中數組元素0用于第一次讀取,數組元素1用于第二次讀取。Init用于初始標志位。

(3)編寫輪詢功能
程序段1,用“FirstScan”在第一次掃描中將初始標志位置位。

程序段2,第二步(存儲在數組元素1)訪問的完成位或錯誤位去置位第一步(存儲在數組元素0)訪問的使能位、復位第二步的使能位以及復位第二步的完成位、錯誤位、觸發的邊沿變量。程序段3,通過第一步的使能位使能EN,通過使能位的上升沿觸發REQ,設置模式、讀取數據地址、長度、存儲地址、連接數據、完成、錯誤位等。首次觸發輪詢,可用手動觸發。此處使用初始化標志位實現指令的首次使能,去進行連接,使用Connected標志位首次觸發REQ。

程序段4,第一步的完成位或者錯誤位去置位第二步的使能位、復位第一步的使能位以及復位第一步的完成位、錯誤位、觸發的邊沿變量,最后復位初始化標志位,以免第一個MB_CLIENT一直接通。程序段5,通過第二步的使能位使能EN,通過使能位的上升沿觸發REQ,設置模式、讀取數據地址、長度、存儲地址、連接數據、完成、錯誤位等。

(4)通訊結果
兩個請求輪詢的結果如下。若要更多請求可按照案例進行程序段添加。
