|
S7-1200 Modbus RTU通信概述 (資料信息來(lái)源西門官網(wǎng)) Modbus具有兩種串行傳輸模式:分別為ASCII和RTU。 Modbus是一種單主站的主從通信模式,Modbus網(wǎng)絡(luò)上只能有一個(gè)主站存在,主站在Modbus網(wǎng)絡(luò)上沒(méi)有地址,每個(gè)從站必須有唯一的地址,從站的地址范圍為0 - 247,其中0為廣播地址,從站的實(shí)際地址范圍為1 - 247。Modbus RTU通信以主從的方式進(jìn)行數(shù)據(jù)傳輸,在傳輸?shù)倪^(guò)程中Modbus RTU主站是主動(dòng)方,即主站發(fā)送數(shù)據(jù)請(qǐng)求報(bào)文到從站,Modbus RTU從站返回響應(yīng)報(bào)文。 S7-1200以下模塊支持 Modbus RTU通信:
S7-1200 Modbus RTU指令 隨著 TIA PORATL 軟件和 S7-1200 CPU 固件的不斷更新,S7-1200 Modbus RTU 指令也出現(xiàn)了不同的版本。用戶需要根據(jù)使用的軟件和硬件,正確選擇使用符合要求的 S7-1200 Modbus RTU 指令來(lái)實(shí)現(xiàn) Modbus RTU 通信。 軟件,硬件要求和指令版本說(shuō)明如下。 ![]() 軟件STEP 7 V11版本開始,可以從“指令”→“通信處理器”→“MODBUS”下直接調(diào)用 “MB_COMM_LOAD”和“MB_MASTER”或“MB_SLAVE”指令,如下圖1所示:
圖1 Modbus RTU指令 Modbus RTU指令有兩個(gè)版本:分別為V1 和V2。版本V1最初在 STEP 7 Basic V10.5 中提供;版本V2 在 STEP 7 Basic/Professional V11 中提供。 ![]() TIA V13 SP1版本軟件中提供了2個(gè)版本的 Modbus RTU指令。如下圖 2 所示:早期版本的 Modbus RTU 指令(圖2. 中 MODBUS (V2.2))僅可通過(guò) CM1241 通信模塊或 CB1241 通信板進(jìn)行 Modbus RTU 通信。新版本的Modbus RTU指令(圖2. 中 MODBUS(RTU) V3.0)擴(kuò)展了Modbus RTU的功能,該指令除了支持 CM1241 通信模塊、CB1241 通信板,還支持PROFINET或PROFIBUS分布式 I/O 機(jī)架上的PTP通信模塊實(shí)現(xiàn) Modbus RTU 通信。 注意:新版本 Modbus RTU 指令的使用限制條件 新版本 Modbus RTU 指令通過(guò)CM1241通信模塊或CB1241通信板進(jìn)行Modbus RTU通信時(shí),需要滿足如下條件:a. S7-1200 CPU 的固件版本不能低于V4.1;b. CM1241通信模塊 V2.1 以上或 CB1241。
圖2. 兩個(gè)版本 Modbus RTU 指令 ![]() 1、西門子不提供支持MODBUS-ASCII通信模式的的現(xiàn)成指令,需要用戶自己用自由口模式編程。![]() 2、Modbus RTU指令版本 V2 將參數(shù)“REQ”和“DONE”添加到“MB_COMM_LOAD”指令。而且,“MB_MASTER”和“MB_SLAVE ”指令的“MB_ADDR ”參數(shù)現(xiàn)在允許一個(gè)UInt值以進(jìn)行擴(kuò)展尋址。![]() 3、不能在同一CPU 程序中同時(shí)使用V1(V1.x)和V2(V2.y)指令版本。用戶程序的 Modbus 指令必須具有相同的主版本號(hào);主版本組內(nèi)的各個(gè)指令可具有不同的次版本號(hào)。![]() 4、對(duì)S7-1200 通信模塊CM1241組態(tài)并編程調(diào)用“MB_COMM_LOAD”指令,可將其設(shè)置為Modbus RTU通信模式。通過(guò)編程調(diào)用“MB_MASTER”指令,S7-1200 通信模塊CM1241可作為Modbus RTU主站,或調(diào)用“MB_SLAVE”指令,S7-1200 通信模塊CM1241可作為Modbus RTU從站。![]() 5、無(wú)論S7-1200 通信模塊CM1241作為Modbus RTU主站還是從站,都需要調(diào)用“MB_COMM_LOAD”指令進(jìn)行編程。![]() 6、S7-1200 CM1241/CB1241 Modbus RTU 通信支持兩位停止位。S7-1200 CM1241/CB1241屬性里可以設(shè)置停止位,但是該模塊用于 Modbus 通信時(shí),此設(shè)置的停止位無(wú)效,需要在 Modbus_Commload 指令的背景DB里Static修改STOP_BITS停止位數(shù)值為2。如下圖3、4所示:
圖3. CM1241 配置停止位參數(shù) Modbus_Commload 指令的背景DB里Static修改STOP_BITS停止位數(shù)值為2(默認(rèn)值=1)
圖4. 修改 Modbus RTU 通信停止位 (資料信息來(lái)源西門官網(wǎng)) TIA V13 SP1版本軟件中提供了2個(gè)版本的Modbus RTU指令:
圖1. 兩個(gè)版本Modbus RTU指令 早期版本的Modbus RTU指令(圖1中MODBUS (V2.2))僅可通過(guò)CM1241通信模塊或CB1241通信板進(jìn)行Modbus RTU通信。 新版本Modbus RTU指令所支持的PTP模塊如下圖2所示:
新版本Modbus RTU指令中包含Modbus RTU 主站指令和從站指令。本文以 CPU1217C+CM1241 RS422/485+ET200SP CM PTP 模塊為例,介紹新版本 Modbus RTU 指令主從通信的編程步驟。
使用到的硬件和軟件如下: 硬件: 軟件: 一、設(shè)備組態(tài) 打開設(shè)備視圖,添加S7-1200CPU,并在硬件目錄里找到“通信模塊”→“點(diǎn)到點(diǎn)”→“CM1241(RS422/485)”,拖拽此模塊至CPU左側(cè)即可,如下圖4所示:
圖4. 添加 CM 1241 RS422/485模塊 需要注意:固件版本>=V2.1 的CM 1241 RS422/485模塊,才支持新版本Modbus RTU指令。 接下來(lái),在“設(shè)備視圖”中用鼠標(biāo)選中CM1241(RS422/485)模塊,在“屬性”→“端口組態(tài)”中配置此模塊硬件接口參數(shù),
最后在“硬件標(biāo)識(shí)符”里確認(rèn)一下硬件標(biāo)識(shí)符為269(該參數(shù)在程序編程中會(huì)被使用),如下圖6所示:
圖6.硬件標(biāo)識(shí)符 另外,S7-1200 還提供了系統(tǒng)和時(shí)鐘存儲(chǔ)器功能,為了便于后續(xù)指令,建議使能該功能。在CPU “屬性”→“常規(guī)”→“系統(tǒng)和時(shí)鐘存儲(chǔ)器”使能系統(tǒng)和時(shí)鐘存儲(chǔ)器功能,如圖7所示。
a、插入一個(gè)ET200SP分布式站點(diǎn)。打開網(wǎng)絡(luò)視圖并拖入一個(gè)ET200SP站點(diǎn),并將其分配給相應(yīng)的IO控制器(本例CPU1217C 為 IO 控制器),如圖8所示。
b、組態(tài)ET200SP 站點(diǎn)。在ET200SP的'設(shè)備視圖'環(huán)境下,為ET200SP 站點(diǎn)添加信號(hào)、通信模塊和服務(wù)器模塊,在本例中只添加了CM PTP模塊和服務(wù)器模塊。 ET200SP接口模塊需要為其分配IP地址和Device Name, 有關(guān)ET200 SP 分布式IO 組態(tài)詳細(xì)步驟,請(qǐng)參考《ET200 SP使用快速入門》。 《ET200 SP 使用快速入門》下載鏈接: 在ET200SP'設(shè)備視圖'中用鼠標(biāo)選中CM PTP,在“屬性”→“常規(guī)”→“接口”→“操作模式”中配置此模塊硬件接口參數(shù),
接下來(lái),在“屬性”→“常規(guī)”→“接口”→“端口組態(tài)”中配置此模塊端口組態(tài)參數(shù),
最后需要在“硬件標(biāo)識(shí)符”里確認(rèn)一下CM PTP 模塊硬件標(biāo)識(shí)符,該參數(shù)在程序編程中會(huì)被使用。 二、軟件編程 Modbus RTU主站編程需要調(diào)用Modbus_Comm_Load指令和Modbus_Master指令,其中Modbus_Comm_Load指令通過(guò)Modbus RTU協(xié)議對(duì)通信模塊進(jìn)行組態(tài),Modbus_Master指令可通過(guò)由Modbus_Comm_Load指令組態(tài)的端口作為Modbus主站進(jìn)行通信,Modbus_Comm_Load指令的MB_DB參數(shù)必須連接到Modbus_Master指令的(靜態(tài))MB_DB參數(shù)。 本例中分布式機(jī)架ET200SP中CM PTP模塊作為Modbus RTU主站,其相關(guān)編程步驟如下: a、OB1中插入一個(gè)FC函數(shù),并在函數(shù)中拖入Modbus_Comm_Load指令和Modbus_Master指令。如圖11所示
圖11. 拖入Modbus RTU 主站指令 Modbus_Comm_Load指令各參數(shù)意義如下表1所示:
表1 MB_COMM_LOAD指令參數(shù)意義
表2 Modbus_Master指令參數(shù)意義 注意 ① Modbus_Comm_Load指令不建議在啟動(dòng)組織塊OB100中調(diào)用,建議在OB1中調(diào)用。Modbus_Comm_Load指令在OB1中調(diào)用時(shí),其輸入位“REQ”需使用上升沿觸發(fā),本例中該輸入位采用 “FirstScan” 系統(tǒng)存儲(chǔ)器位。 · 0 = 全雙工 (RS232) · 1 = 全雙工 (RS422) 四線制模式(點(diǎn)對(duì)點(diǎn)) · 2 = 全全雙工 (RS 422) 四線制模式(多點(diǎn)主站,CM PtP (ET 200SP)) · 3 = 全全雙工 (RS 422) 四線制模式(多點(diǎn)從站,CM PtP (ET 200SP)) · 4 = 半雙工 (RS485) 二線制模式 該靜態(tài)變量“MODE”默認(rèn)數(shù)據(jù)為0(RS232 全雙工模式),需要根據(jù)CM PTP模塊實(shí)際組態(tài)修改該數(shù)值,本例中CM PTP模塊工作在RS485半雙工模式需要將該數(shù)值修改為4,如圖12所示。
圖12. Modbus_Comm_Load背景數(shù)據(jù)塊靜態(tài)變量“MODE”修改為4 ③ Modbus_Master指令的“DATA_PTR”參數(shù)用于指向要進(jìn)行數(shù)據(jù)寫入或數(shù)據(jù)讀取的數(shù)據(jù)區(qū)域地址,該數(shù)據(jù)區(qū)域支持優(yōu)化訪問(wèn)的數(shù)據(jù)塊或者非優(yōu)化(標(biāo)準(zhǔn)的)數(shù)據(jù)塊,建議采用非優(yōu)化訪問(wèn)的數(shù)據(jù)塊。
當(dāng)Modbus_Master指令的“DATA_PTR”指向非優(yōu)化訪問(wèn)的數(shù)據(jù)塊時(shí),該輸入?yún)?shù)需要使用指針?lè)绞教顚懭鏟#DB3.DBX0.0 WORD 5 方式填寫。
b、插入'Pull or plug of modules' 中斷OB83。本例中Modbus RTU主站模塊安裝在分布式IO站點(diǎn)上,因此程序中需要考慮分布式IO站點(diǎn)故障、CM PTP 模塊插拔模塊等故障。 圖15. OB83中再次調(diào)用Modbus_Comm_Load 指令 注意 ① OB83 中調(diào)用Modbus_Comm_Load指令的背景數(shù)據(jù)塊需要與OB1中調(diào)用的Modbus_Comm_Load指令的背景數(shù)據(jù)塊相同。
圖16. 系統(tǒng)常量 c、插入'Rack or Station failure' 中斷OB86。分布式IO站點(diǎn)故障和恢復(fù)時(shí),操作系統(tǒng)都會(huì)調(diào)用一次OB86。通過(guò)OB86接口區(qū)的輸入變量“16#Event_Class”判斷故障的模塊和類型:事件類型16#39表示站點(diǎn)故障,事件類型16#38表示站點(diǎn)恢復(fù)。
圖17. OB86中調(diào)用Modbus_Comm_Load 指令 注意 ①OB86 中調(diào)用Modbus_Comm_Load指令的背景數(shù)據(jù)塊需要與OB1中調(diào)用的Modbus_Comm_Load指令的背景數(shù)據(jù)塊相同。 Modbus RTU從站編程需要調(diào)用Modbus_Comm_Load指令和Modbus_Slave指令,其中Modbus_Comm_Load指令通過(guò)Modbus RTU協(xié)議對(duì)通信模塊進(jìn)行組態(tài),Modbus_Slave指令可通過(guò)由Modbus_Comm_Load指令組態(tài)的端口作為Modbus從站進(jìn)行通信,Modbus_Comm_Load指令的MB_DB參數(shù)必須連接到Modbus_Slaver指令的(靜態(tài))MB_DB參數(shù)。 本例中CPU機(jī)架CM1241 RS422/485作為Modbus RTU從站,其相關(guān)編程步驟如下: OB1中插入一個(gè)FC函數(shù),并在函數(shù)中拖入Modbus_Comm_Load指令和Modbus_Slave指令。如圖18所示
圖18. 拖入Modbus RTU 從站指令 Modbus_Slave指令各參數(shù)意義如下表3所示:
表3 Modbus_Slave指令參數(shù)意義 注意 ① Modbus_Comm_Load指令不建議在啟動(dòng)組織塊OB100中調(diào)用,建議在OB1中調(diào)用。Modbus_Comm_Load指令在OB1中調(diào)用時(shí),其輸入位“REQ”需使用上升沿觸發(fā),本例中該輸入位采用 “FirstScan” 系統(tǒng)存儲(chǔ)器位。 · 0 = 全雙工 (RS232) · 1 = 全雙工 (RS422) 四線制模式(點(diǎn)對(duì)點(diǎn)) · 2 = 全全雙工 (RS 422) 四線制模式(多點(diǎn)主站,CM PtP (ET 200SP)) · 3 = 全全雙工 (RS 422) 四線制模式(多點(diǎn)從站,CM PtP (ET 200SP)) · 4 = 半雙工 (RS485) 二線制模式 該靜態(tài)變量“MODE”默認(rèn)數(shù)據(jù)為0(RS232 全雙工模式),需要根據(jù)CM1241 RS422/485模塊實(shí)際組態(tài)修改該數(shù)值,本例中CM1241 RS422/485模塊工作在RS485半雙工模式需要將該數(shù)值修改為4,如何修改“MODE”靜態(tài)變量見(jiàn)圖12.所示。 ③ Modbus_Slave指令的“MB_HOLD_REG”用于指向Modbus保持寄存器的數(shù)據(jù)區(qū)域地址,該數(shù)據(jù)區(qū)域支持優(yōu)化訪問(wèn)的數(shù)據(jù)塊或者非優(yōu)化(標(biāo)準(zhǔn)的)數(shù)據(jù)塊,建議采用非優(yōu)化訪問(wèn)的數(shù)據(jù)塊。 將程序下載到PLC中,并使用Profibus DP通信電纜將CM1241 RS422/485與CM PTP串口模塊連接起來(lái),即可測(cè)試Modbus RTU通信了。 三、常見(jiàn)問(wèn)題匯總 1. 新版本 Modbus RTU指令的使用是否存在些限制條件? a. S7-1200 CPU 的固件版本不能低于V4.1; b. CM1241通信模塊或CB1241通信板的固件不能低于V2.1。 S7-1200 V4.0 固件CPU可以通過(guò)固件更新到V4.1版本,V2.0固件的CM1241通信模塊也可以通過(guò)固件更新的方式更新到V2.1版本。 2 .Modbus_Comm_Load指令背景數(shù)據(jù)塊中的靜態(tài)變量“MODE”的作用是什么?為什么一般項(xiàng)目中,都需要對(duì)該變量進(jìn)行修改? 3. Modbus_Comm_Load指令能否在啟動(dòng)組織塊OB100中調(diào)用?Modbus_Comm_Load指令不建議在啟動(dòng)組織塊OB100中調(diào)用。新版本的Modbus RTU指令擴(kuò)展了Modbus RTU的功能,該指令支持PROFINET或PROFIBUS分布式 I/O 機(jī)架上的PtP通信模塊實(shí)現(xiàn)Modbus RTU通信。 4. 如何查詢Modbus RTU通信錯(cuò)誤時(shí)的錯(cuò)誤代碼?
圖19. 獲取通訊錯(cuò)誤代碼STATUS |
|
|
來(lái)自: 睿心_悟?qū)W志 > 《機(jī)電電工》