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