第一部分:S7-1200 Modbus RTU通信
(一)概述
通信模塊/通信板 | 訂貨號 |
CM1241 RS232 | 6ES7241-1AH32-0XB0 |
CM1241 RS422/485 | 6ES7241-1CH32-0XB0 |
CB 1241 RS485 | 6ES7241-1CH30-1XB0 |
(2)使用通信模塊CM 1241 RS485作為Modbus RTU主站時,則允許建立最多與 32 個從站的通訊。
(二)Modbus RTU指令版本與限制
(1)博途中的 S7-1200 Modbus RTU 指令
早期版本的 Modbus RTU 指令(圖1. 中 MODBUS (V2.2))僅可通過 CM1241 通信模塊或 CB1241 通信板進行 Modbus RTU 通信。 新版本的 Modbus RTU 指令(圖1. 中 MODBUS(RTU) V3.0)擴展了 Modbus RTU 的功能,該指令除了支持 CM1241 通信模塊、CB1241 通信板,還支持 PROFINET 或 PROFIBUS 分布式 I/O 機架上的 PTP 通信模塊實現(xiàn) Modbus RTU 通信。
新版本 Modbus RTU 指令通過CM1241通信模塊或CB1241通信板進行Modbus RTU通信時,需要滿足如下條件:
a. S7-1200 CPU 的固件版本不能低于V4.1
b. CM1241通信模塊 V2.1 以上或 CB1241
圖1. 兩個版本 Modbus RTU 指令
(三)常見問題
圖2. CM1241 配置停止位參數(shù)
Modbus_Commload 指令的背景 DB 里 Static 修改 STOP_BITS停止位數(shù)值為 2(默認值=1)
圖3. 修改 Modbus RTU 通信停止位
第二部分:V3版指令功能
(一)Modbus RTU指令概述
博途V13 SP1版本軟件中提供了2個版本的Modbus RTU指令:
圖1. 兩個版本Modbus RTU指令
(2)新版本的 Modbus RTU指令(圖1. 中 MODBUS(RTU) V3.0)擴展了Modbus RTU的功能,該指令除了支持CM1241通信模塊、CB1241通信板,還支持 PROFINET 或 PROFIBUS 分布式 I/O 機架上的PTP通信模塊實現(xiàn)Modbus RTU通信。
圖2. 新版本 Modbus RTU指令所支持的PTP模塊
(二)Modbus RTU指令實例環(huán)境介紹
新版本Modbus RTU指令中包含Modbus RTU 主站指令和從站指令。本文以 CPU1217C+CM1241 RS422/485+ET200SP CM PTP 模塊為例,介紹新版本 Modbus RTU 指令主從通信的編程步驟。其中CPU 機架CM1241 RS422/485作為Modbus RTU從站,分布式機架ET200SP 中 CMPTP 模塊作為Modbus RTU主站。
1、網(wǎng)絡結構圖如下:
圖3. Modubus RTU 網(wǎng)絡通信結構圖
2、本項目中使用到的硬件和軟件如下:
(1)硬件:
① CPU1217C (訂貨號:6ES7 217-1AG40-0XB0),固件版本V4.1.3
② CM1241 RS422/485模塊 (訂貨號:6ES7 241-1CH32-0XB0),固件版本V2.1
③ 24V 電源PS307(訂貨號:6ES7307-1KA02-0AA0)
④ ET200 SP IM155-6PN HF(訂貨號:6ES7155-6AU00-0CN0)
⑤ CM PTP模塊(訂貨號:6ES7137-6AA00-0BA0)
(2)軟件:
① 博途SP1 UP 9
(三)實例之設備組態(tài)
1、組態(tài)CM1241 RS422/485模塊
(1)打開設備視圖,添加S7-1200CPU,并在硬件目錄里找到“通信模塊”→“點到點”→“CM1241(RS422/485)”,拖拽此模塊至CPU左側即可,如下圖4所示:
圖4. 添加 CM 1241 RS422/485模塊
注意:固件版本>=V2.1 的CM 1241 RS422/485模塊,才支持新版本Modbus RTU指令。
(2)接下來,在“設備視圖”中用鼠標選中CM1241(RS422/485)模塊,在“屬性”→“端口組態(tài)”中配置此模塊硬件接口參數(shù),本例以傳輸率=9.6Kbps,奇偶校驗=無奇偶校驗,數(shù)據(jù)位=8位字符,停止位=1為例。如CM 1241 端口組態(tài)設置如下圖5所示:
圖5. CM1241 RS422/485 模塊端口組態(tài)
(3)最后在“硬件標識符”里確認一下硬件標識符為269(該參數(shù)在程序編程中會被使用),如下圖6所示:
圖6 硬件標識符
(4)另外,S7-1200 還提供了系統(tǒng)和時鐘存儲器功能,為了便于后續(xù)指令,建議使能該功能。在CPU “屬性”→“常規(guī)”→“系統(tǒng)和時鐘存儲器”使能系統(tǒng)和時鐘存儲器功能,如圖7所示。
圖7. 系統(tǒng)和時鐘存儲器功能
2、組態(tài)ET200 SP CM PtP 模塊
(1)插入一個ET200SP分布式站點,打開網(wǎng)絡視圖并拖入一個ET200SP站點,并將其分配給相應的IO 控制器(本例CPU1217C 為 IO 控制器),如圖8所示:
圖8. 插入ET200SP站點
(2)組態(tài)ET200SP 站點,在ET200SP的"設備視圖"環(huán)境下,為ET200SP 站點添加信號、通信模塊和服務器模塊,在本例中只添加了CM PTP模塊和服務器模塊。在ET200SP"設備視圖"中用鼠標選中CM PTP,在“屬性”→“常規(guī)”→“接口”→“操作模式”中配置此模塊硬件接口參數(shù),本例設定“指定工作模式":"半雙工(RS485)2線制操作";"接收線路的初始狀態(tài)":"無"。如下圖9所示:
圖9. CM PTP 操作模式
注意:ET200SP站點中,服務器模塊是必須組態(tài)的。服務器模塊隨接口模塊一起采購,無需單獨購買。ET200SP接口模塊需要為其分配IP地址和Device Name, 有關ET200 SP 分布式IO 組態(tài)詳細步驟,請參考《ET200 SP 使用快速入門》,本例不再描述Profinet IO通信的相關設置與步驟。《ET200 SP 使用快速入門》下載鏈接:
https://support.industry.siemens.com/cs/cn/zh/view/78304711
(3)接下來,在“屬性”→“常規(guī)”→“接口”→“端口組態(tài)”中配置此模塊端口組態(tài)參數(shù),本例設定"協(xié)議":"Freeport/Modbus";"端口參數(shù)"設置:傳輸率=9.6Kbps,奇偶校驗=無奇偶校驗,數(shù)據(jù)位=8位字符,停止位=1為例。端口組態(tài)設置如下圖10所示:
圖10. CM PTP 端口組態(tài)
(4)最后需要在“硬件標識符”里確認一下CM PTP 模塊硬件標識符,該參數(shù)在程序編程中會被使用。
(四)實例之軟件編程
1、Modbus RTU 主站編程
Modbus RTU主站編程需要調用Modbus_Comm_Load 指令和Modbus_Master 指令,其中Modbus_Comm_Load 指令通過 Modbus RTU 協(xié)議對通信模塊進行組態(tài),Modbus_Master 指令可通過由 Modbus_Comm_Load 指令組態(tài)的端口作為 Modbus 主站進行通信, Modbus_Comm_Load 指令的 MB_DB 參數(shù)必須連接到 Modbus_Master 指令的(靜態(tài))MB_DB 參數(shù)。本例中分布式機架ET200SP 中 CM PTP 模塊作為Modbus RTU主站,其相關編程步驟如下:
(1)OB1 中插入一個FC函數(shù),并在函數(shù)中拖入Modbus_Comm_Load 指令和Modbus_Master 指令。如圖11所示:
圖11. 拖入Modbus RTU 主站指令
Modbus_Comm_Load指令各參數(shù)意義如下表1所示:
引腳 | 說明 |
---|---|
REQ | 上升沿觸發(fā) |
PORT | 通信端口的硬件標識符 |
BAUD | 波特率選擇:3600,6000,12000,2400,4800,9600,19200,38400,57600,76800,115200 |
PARITY | 奇偶檢驗選擇:0-無;1-奇校驗;2-偶校驗 |
FLOW_CTRL | 流控制選擇:0-(默認值)無流控制 |
RTS_ON_DLY | RTS延時選擇:0-(默認值) |
RTS_OFF_DLY | RTS關斷延時選擇:0-(默認值) |
RESP_TO | 響應超時:默認值 = 1000 ms。MB_MASTER 允許用于從站響應的時間(以毫秒為單位)。 |
MB_DB | 對 Modbus_Master 或 Modbus_Slave 指令的背景數(shù)據(jù)塊的引用。 |
DONE | 如果上一個請求完成并且沒有錯誤,DONE 位將變?yōu)?TRUE 并保持一個周期。 |
ERROR | 如果上一個請求完成出錯,則 ERROR 位將變?yōu)?TRUE 并保持一個周期。STATUS 參數(shù)中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 |
STATUS | 端口組態(tài)錯誤代碼,請參考TIA 軟件在線幫助或S7-1200 系統(tǒng)手冊。 |
表1 MB_COMM_LOAD指令參數(shù)意義
Modbus_Master指令各參數(shù)意義如下表2所示:
引腳 | 說明 |
---|---|
EN | 使能端 |
REQ | TRUE = 請求向 Modbus 從站發(fā)送數(shù)據(jù) ,建議采用上升沿觸發(fā) |
MB_ADDR | Modbus RTU從站地址。默認地址范圍:0至247;擴展地址范圍:0至65535。值0被保留用于將消息廣播到所有Modbus從站。 |
MODE | 模式選擇:指定請求類型(讀取或寫入)。 |
DATA_ADDR | 從站中的起始地址:指定Modbus從站中將供訪問的數(shù)據(jù)的起始地址。 |
DATA_LEN | 數(shù)據(jù)長度:指定要在該請求中訪問的位數(shù)或字數(shù)。 |
DATA_PTR | 數(shù)據(jù)指針:指向要進行數(shù)據(jù)寫入或數(shù)據(jù)讀取的標記或數(shù)據(jù)塊地址。 |
DONE | 完成位:上一請求已完成且沒有出錯后,DONE 位將保持為 TRUE 一個掃描周期時間。 |
BUSY | FALSE – Modbus_Master 無激活命令: |
ERROR | 對 Modbus_Master 或 Modbus_Slave 指令的背景數(shù)據(jù)塊的引用。 |
STATUS | 如果上一個請求完成并且沒有錯誤,DONE 位將變?yōu)?TRUE 并保持一個周期。 |
ERROR | 如果上一個請求完成出錯,則 ERROR 位將變?yōu)?TRUE 并保持一個周期。STATUS 參數(shù)中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 |
STATUS | 錯誤代碼 |
表2 Modbus_Master指令參數(shù)意義
①Modbus_Comm_Load指令不建議在啟動組織塊OB100中調用,建議在OB1中調用。Modbus_Comm_Load指令在OB1中調用時,其輸入位“REQ”需使用上升沿觸發(fā),本例中該輸入位采用 “FirstScan” 系統(tǒng)存儲器位。
②Modbus_Comm_Load指令背景數(shù)據(jù)塊中的靜態(tài)變量“MODE”用于描述PTP模塊的工作模式,有效的工作模式包括:
0 = 全雙工 (RS232) 1 = 全雙工 (RS422) 四線制模式(點對點) 2 = 全全雙工 (RS 422) 四線制模式(多點主站,CM PtP (ET 200SP)) 3 = 全全雙工 (RS 422) 四線制模式(多點從站,CM PtP (ET 200SP)) 4 = 半雙工 (RS485) 二線制模式
圖12. Modbus_Comm_Load背景數(shù)據(jù)塊靜態(tài)變量“MODE”修改為
③Modbus_Master指令的“DATA_PTR”參數(shù)用于指向要進行數(shù)據(jù)寫入或數(shù)據(jù)讀取的數(shù)據(jù)區(qū)域地址,該數(shù)據(jù)區(qū)域支持優(yōu)化訪問的數(shù)據(jù)塊或者非優(yōu)化(標準的)數(shù)據(jù)塊,建議采用非優(yōu)化訪問的數(shù)據(jù)塊。
本例中使用的數(shù)據(jù)區(qū)為非優(yōu)化訪問的數(shù)據(jù)塊,在數(shù)據(jù)塊的屬性中取消“優(yōu)化的塊訪問”即可將數(shù)據(jù)塊修改為非優(yōu)化訪問的數(shù)據(jù)塊(鼠標右鍵數(shù)據(jù)塊,選擇“屬性”,取消“優(yōu)化的塊訪問”),如圖13所示:
圖13. 設置數(shù)據(jù)塊為非優(yōu)化訪問
當Modbus_Master指令的“DATA_PTR”指向非優(yōu)化訪問的數(shù)據(jù)塊時,該輸入?yún)?shù)需要使用指針方式填寫如P#DB3.DBX0.0 WORD 5 方式填寫。
④當Modbus RTU網(wǎng)絡中存在多個modbus RTU從站或一個modbus RTU從站同時需要讀操作和寫操作,則需要調用多個Modbus_Master指令,Modbus_Master指令之間需要采用輪詢方式調用。
下圖14. 用于描述兩個Modbus_Master指令輪詢調用的方式。
圖14.Modbus_Master輪詢調用方式
(2)插入"Pull or plug of modules" 中斷OB83
本例中Modbus RTU主站模塊安裝在分布式IO站點上,因此程序中需要考慮分布式IO站點故障、CM PTP 模塊插拔模塊等故障。分布式IO站點中插出、拔入模塊時,操作系統(tǒng)都會調用一次OB83。通過OB83接口區(qū)的輸入變量“16#Event_Class”判斷故障的模塊和類型:事件類型16#39表示模塊被拔出,事件類型16#38表示模塊被插入。CM PTP 模塊被重新插入的時候,需要在中斷OB83中調用Modbus_Comm_Load 指令對通信模塊進行重新組態(tài),如圖15所示。
圖15. OB83中再次調用Modbus_Comm_Load 指令
注意:
①OB83 中調用Modbus_Comm_Load指令的背景數(shù)據(jù)塊需要與OB1中調用的Modbus_Comm_Load指令的背景數(shù)據(jù)塊相同。
②CM PTP模塊的硬件標識符也可以在"PLC變量"--->"系統(tǒng)常數(shù)"中查詢,如圖16所示:
圖16. 系統(tǒng)常量
(3)插入"Rack or Station failure" 中斷OB86
分布式IO站點故障和恢復時,操作系統(tǒng)都會調用一次OB86。通過OB86接口區(qū)的輸入變量“16#Event_Class”判斷故障的模塊和類型:事件類型16#39表示站點故障,事件類型16#38表示站點恢復。CM PTP 模塊所在的IO站點恢復時,需要在中斷OB86中調用Modbus_Comm_Load 指令對通信模塊進行重新組態(tài),如圖17所示:
圖17. OB86中調用Modbus_Comm_Load 指令
注意:
①OB86 中調用Modbus_Comm_Load指令的背景數(shù)據(jù)塊需要與OB1中調用的Modbus_Comm_Load指令的背景數(shù)據(jù)塊相同。
②分布式IO 站點的硬件標識符也可以在"PLC變量"--->"系統(tǒng)常數(shù)"中查詢。
2、Modbus RTU 從站編程
Modbus RTU從站編程需要調用Modbus_Comm_Load 指令和Modbus_Slave 指令,其中Modbus_Comm_Load 指令通過 Modbus RTU 協(xié)議對通信模塊進行組態(tài),Modbus_Slave 指令可通過由 Modbus_Comm_Load 指令組態(tài)的端口作為 Modbus 從站進行通信, Modbus_Comm_Load 指令的 MB_DB 參數(shù)必須連接到 Modbus_Slaver 指令的(靜態(tài))MB_DB 參數(shù)。本例中CPU 機架CM1241 RS422/485作為Modbus RTU從站,其相關編程步驟如下:
(1)OB1 中插入一個FC函數(shù),并在函數(shù)中拖入Modbus_Comm_Load 指令和Modbus_Slave 指令。如圖18所示:
圖18. 拖入Modbus RTU 從站指令
Modbus_Slave指令各參數(shù)意義如下表3所示:
引腳 | 說明 |
---|---|
MB_ADDR | Modbus 從站的標準尋址: |
MB_HOLD_REG | 數(shù)據(jù)指針,指向Modbus 保持寄存器的地址, Modbus 保持寄存器可以為M存儲區(qū)或DB數(shù)據(jù)區(qū)。 |
NDR | 可用的新數(shù)據(jù):
|
DR | 讀取數(shù)據(jù):
|
ERROR | 如果上一個請求完成出錯,則 ERROR 位將變?yōu)?TRUE 并保持一個周期。如果執(zhí)行因錯誤而終止,則 STATUS 參數(shù)中的錯誤代碼僅在 ERROR = TRUE 的周期內有效。 |
STATUS | 錯誤代碼 |
表3 Modbus_Slave指令參數(shù)意義
①Modbus_Comm_Load指令不建議在啟動組織塊OB100中調用,建議在OB1中調用。Modbus_Comm_Load指令在OB1中調用時,其輸入位“REQ”需使用上升沿觸發(fā),本例中該輸入位采用 “FirstScan” 系統(tǒng)存儲器位。
②Modbus_Comm_Load指令背景數(shù)據(jù)塊中的靜態(tài)變量“MODE”用于描述PTP模塊的工作模式,有效的工作模式包括:
0 = 全雙工 (RS232) 1 = 全雙工 (RS422) 四線制模式(點對點) 2 = 全全雙工 (RS 422) 四線制模式(多點主站,CM PtP (ET 200SP)) 3 = 全全雙工 (RS 422) 四線制模式(多點從站,CM PtP (ET 200SP)) 4 = 半雙工 (RS485) 二線制模式
(五)常見問題
新版本 Modbus RTU指令通過CM1241通信模塊或CB1241通信板進行Modbus RTU通信時,需要滿足如下條件:
a. S7-1200 CPU 的固件版本不能低于V4.1;
b. CM1241通信模塊或CB1241通信板的固件不能低于V2.1。
新版本的 Modbus RTU指令擴展了Modbus RTU的功能,該指令除了支持CM1241通信模塊、CB1241通信板還支持 PROFINET 或 PROFIBUS 分布式 I/O 機架上的PTP通信模塊實現(xiàn)Modbus RTU通信。而分布式 I/O 機架上的PTP通信模塊可以支持多種工作模式,以ET200SP CM PtP模塊(訂貨號:6ES7137-6AA00-0BA0)為例,其可以支持RS232、RS485以及RS422等多種工作模式。Modbus_Comm_Load指令背景數(shù)據(jù)塊中的靜態(tài)變量“MODE”則用于定義PTP模塊的工作模式?!癕ODE”的默認數(shù)值為0,代表“全雙工 (RS232)”工作模式,實際項目組態(tài)中則需要根據(jù)實際工作模式對該變量進行修改。
Modbus_Comm_Load指令不建議在啟動組織塊OB100中調用。新版本的Modbus RTU指令擴展了Modbus RTU的功能,該指令支持 PROFINET 或 PROFIBUS 分布式 I/O 機架上的PtP通信模塊實現(xiàn)Modbus RTU通信。操作系統(tǒng)需要調用讀取數(shù)據(jù)記錄和寫入數(shù)據(jù)記錄等指令來實現(xiàn)與分布式I/O機架上PtP模塊的Modbus RTU通信。讀取數(shù)據(jù)記錄和寫入數(shù)據(jù)記錄指令為異步讀寫指令,指令的執(zhí)行需要N個掃描周期,所以不建議Modbus_Comm_Load指令在啟動組織塊OB100中調用。
以Modbus_Master指令為例,當通信出現(xiàn)錯誤時,Modbus_Master指令的“ERROR”輸出位將變?yōu)?TRUE 但是只保持一個掃描周期,所以通過TIA 軟件程序監(jiān)控時無法查詢到錯誤。Modbus_Master指令“STATUS” 參數(shù)中的錯誤代碼僅在“ERROR” = TRUE 的掃描周期內有效,為了獲取了Modbus RTU通信錯誤的錯誤代碼我們可以采用下圖19. 方式編程。
圖19. 獲取STATUS