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