在 S7-200 CPU 通信口上實現的是 RS485 半雙工通信,使用的是 S7-200 的自由口功能。對於(yu) Modbus-RTU協議,西門子提供現成的指令庫,對於(yu) Modbus-ASCII協議,則沒有指令庫,需要用戶根據自由口工作模式自行進行程序開發。
西門子在 Micro/WIN V4.0 SP5 中正式推出 Modbus RTU 主站協議庫(西門子標準庫指令),如下圖所示。

1. Modbus RTU 主站指令庫的功能是通過在用戶程序中調用預先編好的程序功能塊實現的,該庫對 Port 0 和 Port 1 有效。該指令庫將設置通信口工作在自由口模式下。
2. Modbus RTU 主站指令庫使用了一些用戶中斷功能,編其他程序時不能在用戶程序中禁止中斷。
3. Modbus RTU 主站庫對CPU的版本有要求。CPU 的版本必須為(wei) 2.00 或者 2.01(即訂貨號為(wei) 6ES721*-***23-0BA*),1.22版本之前(包括1.22版本)的 S7-200 CPU 不支持。
使用 Modbus RTU 主站指令庫,可以讀寫(xie) Modbus RTU 從(cong) 站的數字量、模擬量 I/O 以及保持寄存器。
要使用 Modbus RTU 主站指令庫,須遵循下列步驟:
1.安裝西門子標準指令庫
2.按照要求編寫(xie) 用戶程序調用 Modubs RTU 主站指令庫
-------------------------Modbus RTU 主站功能編程-------------------
1. 調用 Modbus RTU 主站初始化和控製子程序
使用 SM0.0 調用 MBUS_CTRL 完成主站的初始化,並啟動其功能控製:
各參數意義(yi) 如下:
2. 調用 Modbus RTU 主站讀寫(xie) 子程序MBUS_MSG,發送一個(ge) Modbus 請求;
各參數意義(yi) 如下:
常見的錯誤:
如果多個(ge) MBUS_MSG 指令同時使能會(hui) 造成 6 號錯誤
庫存儲(chu) 區被程序其它地方複用,有時也會(hui) 造成6 號錯誤
從(cong) 站 delay 參數設的時間過長會(hui) 造成主站 3 號錯誤
從(cong) 站掉電或不運行,網絡故障都會(hui) 造成主站 3 號錯誤
3. 在 CPU 的 V 數據區中為(wei) 庫指令分配存儲(chu) 區(Library Memory)
Modbus Master 指令庫需要一個(ge) 284個(ge) 字節的全局 V 存儲(chu) 區。
-------------------------Modbus RTU 主站協議與(yu) 地址-------------------
此為(wei) 西門子正式推出的標準庫指令說明資料。
在 Modbus RTU Master 協議和 PPI 協議之間切換:
Modbus RTU Master 協議指令庫使通信口工作在自由口模式下,此時不能與(yu) Micro/WIN 軟件通信。要在切換回 PPI 協議,可以:
將 MBUS_CTRL 指令的 Mode 輸入端設置為(wei) 邏輯"0"
將 CPU 的允許模式選擇開關(guan) 置為(wei) STOP 位置
Modbus RTU Master 協議庫的執行時間:
Modbus RTU Master 協議庫的 MBUS_CTRL 指令不需要很長的執行時間。MBUS_需要 1.11 ms 用於(yu) 初始化,在後續的每個(ge) 掃描周期中隻占用 0.41 ms。
調用 MBUS_MSG 子程序會(hui) 加長處理時間。大部分時間都用於(yu) CRC 校驗的計算。每讀、寫(xie) 一個(ge) 字的數據就需要 1.85 ms 掃描時間。數據最多的情況下(讀、寫(xie) 120 字的數據),掃描時間大概會(hui) 擴增加 222 ms。讀操作的時間主要消耗在接收數據上;寫(xie) 操作的時間主要消耗在發送數據上。
Modbus 地址
通常 Modbus 地址由 5 位數字組成,包括起始的數據類型代號,以及後麵的偏移地址。Modbus Master 協議庫把標準的 Modbus 地址映射為(wei) 所謂 Modbus 功能號,讀寫(xie) 從(cong) 站的數據。Modbus Master 協議庫支持如下地址:
00001 - 09999:數字量輸出( 線圈)
10001 - 19999:數字量輸入(觸點)
30001 - 39999:輸入數據寄存器(通常為(wei) 模擬量輸入)
40001 - 49999:數據保持寄存器
Modbus Master 協議庫支持的功能
為(wei) 了支持上述 Modbus 地址的讀寫(xie) ,Modbus Master 協議庫需要從(cong) 站支持下列功能:
表 1. 需要從(cong) 站支持的功能
Modbus 地址和 S7-200 存儲(chu) 區地址的映射
S7-200 通過 Modbus Master 和 Slave 協議庫通信時,Modbus 地址和 S7-200 內(nei) 存儲(chu) 區地址的 映射關(guan) 係都類似。
Modbus 保持寄存器地址映射舉(ju) 例:
Modbus 數字量地址映射舉(ju) 例:
位地址(0xxxx 和 1xxxx)數據總是以字節為(wei) 單位打包讀寫(xie) 。第一個(ge) 字節中的最低有效位對應 Modbus 地址的起始地址。如下圖所示:

-------------------------Modbus RTU 主站常見問題-------------------
Modbus RTU 主站庫對 CPU 的版本是否有要求,為(wei) 什麽(me) 編譯例子程序時,會(hui) 遇到 4 個(ge) 錯誤?
Modbus RTU 主站庫對 CPU 的版本確實有要求,CPU 的版本必須為(wei) 2.00 或者 2.01(即訂貨號為(wei) 6ES721*-***23-0BA*),1.22 版本之前(包括 1.22 版本)的 S7-200 CPU 不支持。
Modbus 指令庫啟動後,如何通過同一個(ge) 通信端口進行 CPU 監控?
Modbus 指令庫使用的是 CPU 的自由口通信功能,工作在自由口模式下的通訊口不能使用 Micro/WIN 的 PPI 編程通信監控。如果通信口都已經被占用,可以考慮:
加一個(ge) 通信模塊(如 EM 277、CP 243-1、EM 241 等)擴展出一個(ge) 編程通信口
中止自由口模式,可以將 CPU 上的模式開關(guan) 從(cong) RUN 撥到 STOP;或者保持處於(yu) RUN 狀態,用程序停止指令庫的 Modbus 模式(參見指令庫應用)
如何理解 Modbus 地址與(yu) 功能碼的區別?
Modbus 地址與(yu) Modbus 的功能碼是兩(liang) 個(ge) 層次的概念。
根據 Modbus 通信協議,Modbus 數據的地址使用 0xxxx、1xxxx、3xxxx 和 4xxxx 的形式,分別表示數字量輸出、數字量輸入、模擬量輸入等數據地址。在使用 S7-200 的指令庫時,Modbus 數據地址與(yu) S7-200 的 I/O 和數據存儲(chu) 區地址間有特定的對應關(guan) 係。
有些設備表明它支持 Modbus RTU 通信協議,但也詳細提供了讀寫(xie) 數據的詳細通信幀格式,其中包括如何指定 Modbus 站的地址,需要讀寫(xie) 數據類型、長度等等。數據幀有特定字節指出此指令讀寫(xie) 的數據類型和地址,此字節的數據內(nei) 容即所謂"功能碼",如功能 1 指定讀取單個(ge) /多個(ge) 數字量輸出點的值。
支持 Modbus 協議的設備或軟件,使用時用戶直接設置或看到的應當是 Modbus 數據地址。Modbus 地址所訪問的數據,是通過各種"功能"讀寫(xie) 而來。功能碼是 Modbus 地址的底層。如果 Modbus 通信的一方提供的所謂 Modbus 協議隻有功能碼,則需要注意了解此功能號與(yu) Modbus 地址間的對應關(guan) 係。
如何訪問大於(yu) 9999 的保持寄存器地址?
通常 Modbus 協議的保持寄存器地址範圍在 40001 - 49999 之間。對於(yu) 多數應用來說已經夠了。但有些 Modbus 從(cong) 站把地址映射到保持寄存器區的地址超過 9999 的部分。
Modbus Master 協議庫支持超過 9999 的保持寄存器地址。地址範圍為(wei) 400001 - 465536。隻需在調用 MBUS_MSG 子程序時給 Addr 參數賦相應的值即可,如 416768。
Modubs Master 擴展地址模式僅(jin) 支持保持寄存器區,不支持其他地址類型。
S7-200 作為(wei) Modbus 主站方接收上來的數據格式與(yu) 第三方設備不一樣怎麽(me) 辦?
西門子PLC數據的存儲(chu) 格式為(wei) 高位低存方式。舉(ju) 例:VD200中包含VW200和VW202,其中VW202是低字,VW200是高字。若第三方設備與(yu) 西門子數據存儲(chu) 格式不同,是低位低存的方式,那麽(me) 通信上來的數據就會(hui) 存在錯誤,需要進行轉換才能使用。編程的方式比較多樣,針對雙字中高低字的交換可以使用SWAP(字交換)指令,若是字節交換可以考慮循環移位指令。
S7-200 是否支持如 Modbus TCP 等其它協議?
不支持。S7-200自身的通信端口或其通信擴展模塊均不支持 Modbus TCP、CANopen、DeviceNet 以及 BACnet 通信協議。
為(wei) 什麽(me) S7-200 作 Modbus 主站時 MBUS_MSG 指令報6號錯誤?
引起6號錯誤主要有兩(liang) 方麵的原因:1.多個(ge) MBUS_MSG 指令同時使能執行;2. Modbus庫存儲(chu) 區中分配的建議地址區與(yu) 編程中已使用的V存儲(chu) 區有重疊。