odbus TCP 服務器指令 MB_SERVER V5.0 新功能概述
如下圖1所示服務器指令 MB_SERVER 從 V5.0 以后增加了三個新功能,分別為:
- 訪問數據塊中的數據區域,而不是直接訪問 MODBUS 地址
- 過程映像區的讀訪問限制
- 統計變量 NDR_immediate 和 DR_immediate
圖1. MB_SERVER 指令
SIMATIC S7-1200 使用要求
- TIA Portal V15 及以上版本
- CPU 固件 V4.2 及以上版本
新功能實驗環境和內容
在本應用實例中,通過以下產品進行Modbus TCP服務器V5.0新功能編程,實現了訪問1217C CPU 中數據塊的數據區域以及限制對1217 CPU過程映像區的讀訪問。
軟件:
TIA Professional V16
Modbus Poll
硬件:
CPU1217C DC/DC/DC V4.4
新功能通信程序
1、指令調用及參數分配
1.1、打開 TIA Portal V16軟件,新建一個項目命名為 "ModbusTCP V5.0",在項目中添加CPU1217C DC/DC/DC V4.4,為以太網接口新建一個子網并設置 IP地址為 "192.168.0.1",如下圖 3 所示。
圖2. 分配IP地址
1.2、在 OB1組織塊中添加Modbus TCP Server功能塊 "MB_SERVER",軟件將提示會為該 FB塊增加一個背景數據塊,本例中為 DB1"MB_SERVER_DB",如下圖3所示。
圖3. 指令創建
2、訪問數據塊中的數據區域
用戶可訪問數據塊中的數據區域,而不用直接訪問過程映像和保持性寄存器。在此情況下,必須禁用數據塊的“優化塊訪問”(Optimized block access) 屬性,并且該屬性不得單獨存在于裝載存儲器中。
2.1、創建標準數據塊,DB10(Area 1 for Input)、DB11(Area 2 for Input Register)、DB12(Area 3 for Holding Register)、DB13(Area 4 for Holding Register)如下圖 4 所示。并修改數據塊屬性為標準訪問數據塊,如下圖5所示。
圖4. 創建數據塊
圖5. 數據塊屬性
2.2、分配數據區域及注意事項
- 用戶最多可在不同數據塊中定義八個數據區域,每個數據塊只能包含一個數據區域。單個MODBUS 請求只能對恰好一個數據區域進行讀寫操作。每個數據區域對應于一個 MODBUS 地址區域。可以在MB_SERVER背景數據塊的靜態變量中"Data_Area_Array"中定義數據區域。
- 如果要使用的數據區域不到八個,則所需數據區域必須緊密相連,沒有間隙。在處理過程中,數據區域中的第一個空白條目會終止數據區域搜索。例如,如果已定義字段元素 1、2、4 和 5,由于字段元素 3 留空,則"Data_Area_Array"只會識別字段元素 1 和 2。
- 如果 MODBUS 請求到達時尚未定義相應功能代碼的 MODBUS 數據類型的數據區域,請求會按之前的指令版本處理,即直接訪問過程映像和保持性寄存器。如果已為功能代碼的 MODBUS 數據類型定義了數據區域,則指令 MB_SERVER 可對該數據區域進行讀寫操作。具體是讀操作還是寫操作取決于作業類型。如果有兩個區域都是03呢,是否會讀寫搞混了?測試一下功能碼1和15可以放在2個功能區嗎,并且起始地址和長度一樣
- 單個 MODBUS 請求只能對一個數據區域進行讀寫操作。如果要讀取覆蓋多個數據區域的保持性寄存器,則需要多個 MODBUS 請求。
Data_Area_Array 字段包含八個元素:Data_Area_Array[1] 到 Data_Area_Array[8],每個字段元素 Data_Area_Array[x](其中 1 <= x <= 8)都是 MB_DataArea 類型的 UDT,結構如下表1。
表1:Data_Area_Array結構
參數 | 數據類型 | 含義 |
data_type | UInt | 映射到此數據區域的 MODBUS 數據類型的標識符: ? 0:空字段元素或未使用數據區域的標識符。此時,db、start和length的值無效。 ? 1:過程映像輸出(與功能代碼 1、5 和 15 一起使用) ? 2:過程映像輸入(與功能代碼 2 一起使用) ? 3:保持寄存器(與功能代碼 3、6 和 16 一起使用) ? 4:輸入寄存器(與功能代碼 4 一起使用) |
db | UInt | 映射的數據區編號,該DB必須是非優化DB |
start | UInt | 映射到數據塊中的首個 MODBUS 地址,從0開始 |
length | UInt | Bool數(對于data_type 1或者2),Word數(data_type 3或者4) |
本例中使用了4個區域,進入MB_SERVER背景數據塊DB1“MB_SERVER_DB”的靜態變量中Data_Area_Arry,分別為區域1訪問輸入位、區域2訪問輸入字、區域3訪問保持寄存器、區域4訪問保持寄存器、區域5~8保持默認為0,如下圖6所示。
圖6. 數據區域
2.3、仿真軟件設置,如下圖7-8所示。
圖7. 通信配置
圖8. 讀寫配置
2.4、測試結果,如下圖9所示。
圖9. 測試結果
3、過程映像區的讀訪問限制
對于 MB_SERVER 指令V5.0及以上版本,用戶可在過程映像輸入中定義一個區域,在過程映像輸出中定義一個區域,方便遠程 MODBUS 設備 進行讀訪問。隨后,遠程 MODBUS 設備便不能對超出這些過程映像區域的地址進行讀訪問。
背景數據塊的以下靜態變量定義了過程映像中的讀取區域:
- QB_Read_Start:可由遠程 MODBUS 設備讀取的過程映像輸出中的第一個字節的地址(應用于功能代碼 1)
- QB_Read_Count:可由遠程 MODBUS 設備讀取的過程映像輸出中的字節數(應用于功能代碼 1)
- IB_Read_Start:可由遠程 MODBUS 設備讀取的過程映像輸入中的第一個字節的地址(應用于功能代碼 2 和 4)
- IB_Read_Count:可由遠程 MODBUS 設備讀取的過程映像輸入中的字節數(應用于功能代碼 2 和 4)
下表2介紹了指令 MB_SERVER 背景數據塊中的上述靜態變量,可用于定義過程映像中的讀區域。為確保完整性,表格中還列出了自版本 V4.2 起,用于定義過程映像中的寫區域的靜態變量(QB_Start 和 QB_Count)。
表2 讀訪問限制變量
變量 | 數據類型 | 默認值 | 說明 | 版本 |
QB_Start | UInt | 0 | CPU 可寫入的輸出字節的起始地址 | V4 |
QB_Count | UInt | 65535 | CPU 可寫入的輸出字節的字節數。 如果 QB_Count = 0,則CPU 的輸出字節均無法寫入。 | V4 |
QB_Read_Start | UInt | 0 | CPU 可讀取的輸出字節的起始地址 | V5 |
QB_Read_Count | UInt | 65535 | CPU 可讀取的輸出字節的字節數。 如果 QB_Read_Count = 0,則CPU 的輸出字節均無法讀取。 | V5 |
IB_Read_Start | UInt | 0 | CPU 可讀取的輸入字節的起始地址 | V5 |
IB_Read_Count | UInt | 65535 | CPU 可讀取的輸入字節的字節數。 如果 IB_Read_Count = 0,CPU 的輸入字節均無法讀取。 | V5 |
3.1、本例中定義過程映像中讀取區域如下圖9所示,輸出過程映像寫訪問權限QB0~QB9,輸出過程映像讀訪問權限QB10~QB19,輸入過程映像讀訪問權限IB20~IB29。
圖9. 過程映像區域設定
3.2、仿真軟件設置,如下圖10所示。
圖10. 通信設置
3.3、測試結果
圖11. 讀取Q區數據
圖12. 讀取I區數據
4、統計變量 NDR_immediate 和 DR_immediate
指令 MB_SERVER(自指令版本 V5.0 起)的背景數據塊中含有統計變量 NDR_immediate 和 DR_immediate。
表3:NDR_immediate 和 DR_immediate。
變量 | 數據類型 | 默認值 | 說明 |
NDR_immediate | Bool | False | 與參數 NDR(新數據就緒)含義相同。MB_SERVER 在處理 Modbus TCP 寫請求的同一調用中更新"NDR_immediate"。 |
DR_immediate | Bool | False | 與參數 DR(數據讀取)含義相同。MB_SERVER 在處理 Modbus TCP 寫請求的同一調用中更新"DR_immediate"。 |