首頁 >> 案例中心 >> Modbus協(xié)議IO模塊應用案例
S7-200通過自由口連接MODBUS設備
軟件安裝
首先安裝STEP7 Micro/WIN V4.0 SP5及以上版本軟件,然后安裝S7-200 MODBUS指令集,名稱為Inst_Library_V11。
硬件要求
Modbus RTU 主站庫對CPU的版本有要求。CPU 的版本必須為 2.00 或者 2.01(即訂貨號為 6ES721*-***23-0BA*),1.22版本之前(包括1.22版本)的 S7-200 CPU 不支持。
S7-200通過自由口MODBUS連接
接線方法如下
西門子在 Micro/WIN V4.0 SP5 中正式推出 Modbus RTU 主站協(xié)議庫(西門子標準庫指令)。
圖 1. 西門子標準指令庫(Micro/WIN V4.0 SP5)
注意:
1. Modbus RTU 主站指令庫的功能是通過在用戶程序中調用預先編好的程序功能塊實現(xiàn)的,該庫對 Port 0 和 Port 1 有效。該指令庫將設置通信口工作在自由口模式下。
2. Modbus RTU 主站指令庫使用了一些用戶中斷功能,編其他程序時不能在用戶程序中禁止中斷。
3. Modbus RTU 主站庫對CPU的版本有要求。CPU 的版本必須為 2.00 或者 2.01(即訂貨號為 6ES721*-***23-0BA*),1.22版本之前(包括1.22版本)的 S7-200 CPU 不支持。
使用 Modbus RTU 主站指令庫,可以讀寫 Modbus RTU 從站的數(shù)字量、模擬量 I/O 以及保持寄存器。
要使用 Modbus RTU 主站指令庫,須遵循下列步驟:
1. 安裝西門子標準指令庫
2. 按照要求編寫用戶程序調用 Modubs RTU 主站指令庫
Modbus RTU 主站功能編程
1. 調用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 調用 MBUS_CTRL 完成主站的初始化,并啟動其功能控制:
圖 2. 用 SM0.0 調用 Modbus RTU 主站初始化與控制子程序
各參數(shù)意義如下:
a) EN 使能: 必須保證每一掃描周期都被使能(使用 SM0.0)
b) Mode 模式: 為 1 時,使能 Modbus 協(xié)議功能;為 0 時恢復為系統(tǒng) PPI 協(xié)議
c) Baud 波特率: 支持的通訊波特率為1200,2400,4800,9600,19200,38400,57600,115200。
d) Parity 校驗: 校驗方式選擇 0=無校驗 1=奇較驗 2=偶較驗
e) Timeout 超時: 主站等待從站響應的時間,以毫秒為單位,典型的設置值為 1000 毫秒(1 秒),允許設置的范圍為 1 - 32767。
注意: 這個值必須設置足夠大以保證從站有時間響應。
f) Done完成位: 初始化完成,此位會自動置1??梢杂迷撐粏?MBUS_MSG 讀寫操作
g) Error 初始化錯誤代碼(只有在 Done 位為1時有效):
0= 無錯誤
1= 校驗選擇非法
2= 波特率選擇非法
3= 模式選擇非法
2. 調用 Modbus RTU 主站讀寫子程序MBUS_MSG,發(fā)送一個Modbus 請求;
圖 3. 調用Modbus RTU 主站讀寫子程序
各參數(shù)意義如下:
a) EN 使能: 同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能
注意:建議每一個讀寫功能(即 MBUS_MSG)都用上一個 MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環(huán)進行(見例程)。
b) First 讀寫請求位: 每一個新的讀寫請求必須使用脈沖觸發(fā)
c) Slave 從站地址: 可選擇的范圍 1 – 247
d) RW 從站地址: 0 = 讀, 1 = 寫
注意: 開關量輸出和保持寄存器支持讀和寫功能
輸入和模擬量輸入只支持讀功能
e) Addr 讀寫從站的 選擇讀寫的數(shù)據(jù)類型
數(shù)據(jù)地址: 00001 至 0xxxx - 開關量輸出
10001 至 1xxxx - 開關量輸入
30001 至 3xxxx - 模擬量輸入
40001 至 4xxxx - 保持寄存器
f) Count 數(shù)據(jù)個數(shù) 通訊的數(shù)據(jù)個數(shù)(位或字的個數(shù))
注意: Modbus主站可讀/寫的最大數(shù)據(jù)量為120個字(是指每一個 MBUS_MSG 指令)
g) g. DataPtr 數(shù)據(jù)指針: 如果是讀指令,讀回的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中
如果是寫指令,要寫出的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中
h) Done 完成位 讀寫功能完成位
i) Error 錯誤代碼: 只有在 Done 位為1時,錯誤代碼才有效
0 = 無錯誤
1 = 響應校驗錯誤
2 = 未用
3 = 接收超時(從站無響應)
4 = 請求參數(shù)錯誤(slave address, Modbus address, count, RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它請求
7 = 響應錯誤(響應不是請求的操作)
8 = 響應CRC校驗和錯誤
-
101 = 從站不支持請求的功能
102 = 從站不支持數(shù)據(jù)地址
103 = 從站不支持此種數(shù)據(jù)類型
104 = 從站設備故障
105 = 從站接受了信息,但是響應被延遲
106 = 從站忙,拒絕了該信息
107 = 從站拒絕了信息
108 = 從站存儲器奇偶錯誤
常見的錯誤:
· 如果多個 MBUS_MSG 指令同時使能會造成 6 號錯誤
· 從站 delay 參數(shù)設的時間過長會造成主站 3 號錯誤
· 從站掉電或不運行,網(wǎng)絡故障都會造成主站 3 號錯誤
3. 在 CPU 的 V 數(shù)據(jù)區(qū)中為庫指令分配存儲區(qū)(Library Memory)
Modbus Master 指令庫需要一個284個字節(jié)的全局 V 存儲區(qū)。
1.如下圖所示在”程序塊”上點擊右鍵選擇”庫內存區(qū)”
2.出現(xiàn)對話框,分配一個大小為284的存儲區(qū)域。注意:不要與別的存儲區(qū)域相沖突。
Modbus RTU 主站協(xié)議庫的補充說明
此為西門子正式推出的標準庫指令說明資料。
在 Modbus RTU Master 協(xié)議和 PPI 協(xié)議之間切換:
Modbus RTU Master 協(xié)議指令庫使通信口工作在自由口模式下,此時不能與 Micro/WIN 軟件通信。要在切換回 PPI 協(xié)議,可以:
· 將 MBUS_CTRL 指令的 Mode 輸入端設置為邏輯“0”
· 將 CPU 的允許模式選擇開關置為 STOP 位置
Modbus RTU Master 協(xié)議庫的執(zhí)行時間:
Modbus RTU Master 協(xié)議庫的 MBUS_CTRL 指令不需要很長的執(zhí)行時間。MBUS_需要 1.11 ms 用于初始化,在后續(xù)的每個掃描周期中只占用 0.41 ms。
調用 MBUS_MSG 子程序會加長處理時間。大部分時間都用于 CRC 校驗的計算。每讀、寫一個字的數(shù)據(jù)就需要 1.85 ms 掃描時間。數(shù)據(jù)最多的情況下(讀、寫 120 字的數(shù)據(jù)),掃描時間大概會擴增加 222 ms。讀操作的時間主要消耗在接收數(shù)據(jù)上;寫操作的時間主要消耗在發(fā)送數(shù)據(jù)上。
Modbus 地址
通常 Modbus 地址由 5 位數(shù)字組成,包括起始的數(shù)據(jù)類型代號,以及后面的偏移地址。Modbus Master 協(xié)議庫把標準的 Modbus 地址映射為所謂 Modbus 功能號,讀寫從站的數(shù)據(jù)。Modbus Master 協(xié)議庫支持如下地址:
· 00001 - 09999:數(shù)字量輸出( 線圈)
· 10001 - 19999:數(shù)字量輸入(觸點)
· 30001 - 39999:輸入數(shù)據(jù)寄存器(通常為模擬量輸入)
· 40001 - 49999:數(shù)據(jù)保持寄存器
Modbus Master 協(xié)議庫支持的功能
為了支持上述 Modbus 地址的讀寫,Modbus Master 協(xié)議庫需要從站支持下列功能:
表 1. 需要從站支持的功能
Modbus 地址 | 讀/寫 | Modbus 從站須支持的功能 |
00001 - 09999 | 讀 | 功能 1 |
寫 | 功能 5:寫單輸出點 | |
10001 - 19999 | 讀 | 功能 2 |
寫 | - | |
30001 - 39999 | 讀 | 功能 4 |
寫 | - | |
40001 - 49999 | 讀 | 功能 3 |
寫 | 功能 6:寫單寄存器單元 |
Modbus 地址和 S7-200 存儲區(qū)地址的映射
S7-200 通過 Modbus Master 和 Slave 協(xié)議庫通信時,Modbus 地址和 S7-200 內存儲區(qū)地址的 映射關系都類似。
Modbus 保持寄存器地址映射舉例:
Modbus 保持寄存器地址 40001 12 34 40002 56 78 40003 9A BC | S7-200 存儲區(qū)字尋址 VW200 12 34 VW202 56 78 VW204 9A BC | S7-200 存儲區(qū)字節(jié)尋址 VB200 12 VB201 34 VB202 56 VB203 78 VB204 9A VB205 BC |
Modbus 數(shù)字量地址映射舉例:
位地址(0xxxx 和 1xxxx)數(shù)據(jù)總是以字節(jié)為單位打包讀寫。第一個字節(jié)中的最低有效位對應 Modbus 地址的起始地址。如下圖所示:
MODBUS從站
?西門子Modbus從站協(xié)議庫包括兩條指令:MBUS_INIT 指令和MBUS_SLAVE 指令。?MBUS_INIT 指令用于啟用和初始化或禁止Modbus通訊。
?MBUS_SLAVE 指令用于為Modbus主設備發(fā)出的請求服務。
?MBUS_INIT 指令用于啟用和初始化或禁止Modbus從站通訊。在使用MBUS_SLAVE 指令之前,必須正確執(zhí)行MBUS_INIT 指令。指令完成后立即設定“完成”位,才能繼續(xù)執(zhí)行下一條指令。
MBUS_INIT 指令說明:
?EN:指令使能位。?Mode:模式選擇,啟動/停止Modbus從站通信。Mode 參數(shù)允許使用以下兩個數(shù)值:1——啟動,0——停止。
?Address:從站地址,MODBUS從站地址,取值1~247。
?Baud:波特率,可選1200,2400,4800,9600,19200,38400,57600,115200。?Parity:奇偶校驗,0=無校驗;1=奇校驗;2=偶校驗。
?Delay:延時,附加字符間延時,缺省值為0。
?MaxIQ:最大I/Q位,參與通信的最大I/O點數(shù),S7-200的I/O映像區(qū)為128/128,缺省值為128。
?MaxAI:最大AI字數(shù),參與通信的最大AI通道數(shù),可為16或32。
?MaxHold:設定供Modbus地址4xxxx使用的V存儲器中的字保持寄存器數(shù)目。
?HoldStart:保持寄存器區(qū)起始地址,以&VBx指定(間接尋址方式)。
?Done:初始化完成標志,成功初始化后置1。
?Error:初始化錯誤代碼。
{"時延"參數(shù)通過將指定的毫秒數(shù)增加至標準Modbus信息超時的方法延長標準Modbus信息結束超時條件。該參數(shù)的典型數(shù)值在有線網(wǎng)絡上應為0。如果您在使用帶有糾錯功能的調制解調器,將時延設為50至100毫秒的數(shù)值。如果您在使用擴展頻譜無線電,將時延設為10至100毫秒的數(shù)值。"時延"數(shù)值可以是0至32767毫秒。
MaxIQ參數(shù)將供Modbus地址00xxxx和01xxxx使用的I和Q點數(shù)設為0至128之間的數(shù)值。數(shù)值0禁止所有向輸入和輸出的讀取。建議使用的MaxIQ數(shù)值是128,該數(shù)值可在S7-200中存取所有的I和Q點。
MaxAI參數(shù)將供Modbus地址03xxx使用的字輸入(AI)寄存器數(shù)目設為0至32之間的數(shù)值。數(shù)值0禁止模擬輸入的讀數(shù)。建議使用的MaxAI數(shù)值如下,這些數(shù)值可允許存取所有的S7-200模擬輸入:
*0用于CPU 221
*16用于CPU 222
*32用于CPU 224、226和226XM
MaxHold參數(shù)設定供Modbus地址04xxx使用的V內存中的字保持寄存器數(shù)目。例如,為了允許主設備存取2000個字節(jié)的V內存,將MaxHold設為1000個字的數(shù)值(保持寄存器)。
HoldStart參數(shù)是V內存中保持寄存器的起始地址。該數(shù)值一般被設為VB0,因此HoldStart參數(shù)被設為&VB0(VB0地址)。其他V內存地址可指定為保持寄存器的起始地址,以便在項目的其他地方使用VB0。Modbus主設備可存取V內存MaxHold個字數(shù),從HoldStart開始。
MBUS_INIT指令完成時,"完成"輸出打開。"錯誤"輸出字節(jié)包含執(zhí)行指令的結果。請參閱Modbus從屬協(xié)議執(zhí)行錯誤代碼中可能因執(zhí)行指令而產生的錯誤條件。
MBUS_SLAVE指令被用于為Modbus主設備發(fā)出的請求服務,并且必須在每次掃描時執(zhí)行,以便允許該指令檢查和回答Modbus請求。在每次掃描且EN輸入開啟時執(zhí)行該指令。MBUS_SLAVE指令無輸入?yún)?shù)。當MBUS_SLAVE指令對Modbus請求作出應答時,"完成"輸出打開。如果沒有需要服務的請求時,"完成"輸出關閉。"錯誤"輸出包含執(zhí)行該指令的結果。該輸出只有在"完成"打開時才有效。如果"完成"關閉,錯誤參數(shù)不會改變。請參閱Modbus從屬協(xié)議執(zhí)行錯誤代碼中可能因執(zhí)行該指令而導致的錯誤條件。}
錯誤代碼 | 說明 |
0 | 無錯誤 |
1 | 內存范圍錯誤 |
2 | 非法波特率或奇偶校驗 |
3 | 非法從屬地址 |
4 | 非法Modbus參數(shù)值 |
5 | 保持寄存器與Modbus從屬符號重疊 |
6 | 收到奇偶校驗錯誤 |
7 | 收到CRC錯誤 |
8 | 非法功能請求/功能不受支持 |
9 | 請求中的非法內存地址 |
10 | 從屬功能未啟動 |
MBUS_SLAVE 指令說明:
MBUS_SLAVE 指令被用于為Modbus主設備發(fā)出的請求服務,并且必須在每次掃描時執(zhí)行,以便允許該指令檢查和回答Modbus請求。MBUS_SLAVE 指令無輸入?yún)?shù),在每次掃描且EN 輸入開啟時執(zhí)行。
?EN:指令使能位。
?Done:Modbus執(zhí)行通信中時置1,無MODBUS 通信活動時為0。
?Error:錯誤代碼。
錯誤代碼 | 說明 |
0 | 無錯誤 |
1 | 內存范圍錯誤 |
2 | 非法波特率或奇偶校驗 |
3 | 非法從屬地址 |
4 | 非法Modbus參數(shù)值 |
5 | 保持寄存器與Modbus從屬符號重疊 |
6 | 收到奇偶校驗錯誤 |
7 | 收到CRC錯誤 |
8 | 非法功能請求/功能不受支持 |
9 | 請求中的非法內存地址 |
10 | 從屬功能未啟動 |
常見問題
Modbus RTU 主站庫對 CPU 的版本確實有要求,CPU 的版本必須為 2.00 或者 2.01(即訂貨號為6ES721*-***23-0BA*),1.22 版本之前(包括 1.22 版本)的 S7-200 CPU 不支持。Modbus RTU 主站庫對 CPU 的版本是否有要求,為什么編譯例子程序時,會遇到 4 個錯誤?
Modbus 指令庫啟動后,如何通過同一個通信端口進行 CPU 監(jiān)控?
Modbus 指令庫使用的是 CPU 的自由口通信功能,工作在自由口模式下的通訊口不能使用 Micro/WIN 的 PPI 編程通信監(jiān)控。如果通信口都已經(jīng)被占用,可以考慮:
· 加一個通信模塊(如 EM 277、CP 243-1、EM 241 等)擴展出一個編程通信口
· 中止自由口模式,可以將 CPU 上的模式開關從 RUN 撥到 STOP;或者保持處于 RUN 狀態(tài),用程序停止指令庫的 Modbus 模式(參見指令庫應用)
如何理解 Modbus 地址與功能碼的區(qū)別?
Modbus 地址與 Modbus 的功能碼是兩個層次的概念。
根據(jù) Modbus 通信協(xié)議,Modbus 數(shù)據(jù)的地址使用 0xxxx、1xxxx、3xxxx 和 4xxxx 的形式,分別表示數(shù)字量輸出、數(shù)字量輸入、模擬量輸入等數(shù)據(jù)地址。在使用 S7-200 的指令庫時,Modbus 數(shù)據(jù)地址與 S7-200 的 I/O 和數(shù)據(jù)存儲區(qū)地址間有特定的對應關系。
有些設備表明它支持 Modbus RTU 通信協(xié)議,但也詳細提供了讀寫數(shù)據(jù)的詳細通信幀格式,其中包括如何指定 Modbus 站的地址,需要讀寫數(shù)據(jù)類型、長度等等。數(shù)據(jù)幀有特定字節(jié)指出此指令讀寫的數(shù)據(jù)類型和地址,此字節(jié)的數(shù)據(jù)內容即所謂“功能碼”,如功能 1 指定讀取單個/多個數(shù)字量輸出點的值。
支持 Modbus 協(xié)議的設備或軟件,使用時用戶直接設置或看到的應當是 Modbus 數(shù)據(jù)地址。Modbus 地址所訪問的數(shù)據(jù),是通過各種“功能”讀寫而來。功能碼是 Modbus 地址的底層。如果 Modbus 通信的一方提供的所謂 Modbus 協(xié)議只有功能碼,則需要注意了解此功能號與 Modbus 地址間的對應關系。
如何訪問大于 9999 的保持寄存器地址?
通常 Modbus 協(xié)議的保持寄存器地址范圍在 40001 - 49999 之間。對于多數(shù)應用來說已經(jīng)夠了。但有些 Modbus 從站把地址映射到保持寄存器區(qū)的地址超過 9999 的部分。
Modbus Master 協(xié)議庫支持超過 9999 的保持寄存器地址。地址范圍為 400001 - 465536。只需在調用 MBUS_MSG 子程序時給 Addr 參數(shù)賦相應的值即可,如 416768。
Modubs Master 擴展地址模式僅支持保持寄存器區(qū),不支持其他地址類型。