汪韓韓,楊 輝,張 華,朱淑云
(1. 南昌大學 機器人研究所,南昌 330031;2. 華東交通大學 科研處,南昌 330013;3. 南昌大學 教務(wù)處,南昌330031;4. 南昌大學 科學技術(shù)學院,南昌 330031)
MODBUS RTU協(xié)議是莫迪康公司發(fā)明的一種廣泛應用于自動化控制領(lǐng)域的工業(yè)通訊標準。協(xié)議規(guī)定,控制器之間通訊采用主從技術(shù),即主機可對各從機尋址,發(fā)出廣播信息,從機返回信息作為對查詢的響應[1]。該協(xié)議支持RS-232、RS-422、RS-485和Ethernet等多種接口類型的通訊設(shè)備。而本文研究的是基于RS-485接口,采用MODBUS RTU通信協(xié)議,組態(tài)王作為主端,智能儀表為從端,進行相互握手、互相數(shù)據(jù)交換,并且利用KingView6.5開發(fā)平臺對通訊過程進行實時監(jiān)測和管理,從而完成整個通信系統(tǒng)的設(shè)計和實現(xiàn)。
控制器以RTU模式在MODBUS總線上通訊時,具體信息格式定義如表1所示。
MAC_ID:設(shè)備地址,組態(tài)王對智能儀表從端的訪問地址,定義為01,如若是多機通訊,可以依次疊加02,03…;
Function ID:功能代碼,組態(tài)王對智能儀表從端的命令操作;
Ptr Addr:待查詢數(shù)據(jù)起始地址,2字節(jié),首字節(jié)為高地址;
Ptr Numb:待查詢數(shù)據(jù)數(shù)量,2字節(jié),從起始地址開始,地址依次加一;
CRC:循環(huán)冗余校驗碼,2字節(jié),從MAC_ID至Ptr numb計算CRC值,如計算值與實際值相同則傳送正確;若不相同證明錯誤,丟棄該幀,重新檢測;
T1-T2-T3-T4:靜止時間,當發(fā)送或接收數(shù)據(jù)時需延時>3.5個字符;
除主機查詢模式下的數(shù)據(jù)格式外,還有主機寫數(shù)據(jù)、從機應答等數(shù)據(jù)格式,具體見MODBUS協(xié)議標準,這里不再重復敘述。
基本通訊參數(shù)配置為:波特率9600bps,數(shù)據(jù)位8位,無奇偶校驗,停止位1位,通訊方式RS485總線傳輸模式,通訊超時時間1000ms。
從站設(shè)備COM配置可按配置向?qū)б来芜M行。選擇驅(qū)動——莫迪康MODBUS RTU(COM),定義邏輯名稱——智能儀表01,選擇串行口——COM1,選擇設(shè)備地址——1.0(1為設(shè)備地址,不打包),嘗試恢復時間與最長恢復時間——30s和24h。如需配置多臺智能儀表,方法類似[2]。
配置完設(shè)備端口之后,則需要在數(shù)據(jù)詞典定義變量,如表2所示。
表1 數(shù)據(jù)傳輸格式
表2 數(shù)據(jù)詞典用戶變量
智能儀表作為從機端,硬件配置為485總線接口,軟件一般使用固化好的通信協(xié)議或自主開發(fā)編程設(shè)計,這里給出示例。以Stc89c52為例,利用串行中斷進行MODBUS RTU通訊設(shè)計,其中T2計數(shù)器用于產(chǎn)生9600bps波特率,22M晶振下,初始值設(shè)置為TL2=0xCC,TH2=0xCD,中斷服務(wù)子程序如圖1所示。
圖1 發(fā)送接收串行中斷服務(wù)子程序
單片機應答程序是主程序Main()函數(shù)中的,詳細流程圖如圖2所示。為滿足通訊需求,我們需要分析串口接收的命令,對不同的功能指令做出相應的答復。首先,對接收命令中數(shù)據(jù)依次進行校驗,包括地址碼校驗、功能碼校驗、CRC校驗、地址范圍校驗等,若出錯則給出相應的出錯指令。其次,根據(jù)功能碼把與單片機相對應的地址、數(shù)據(jù)等一一寫入待發(fā)送數(shù)組中,具體發(fā)送格式依功能碼的不同而不同,詳細參考《MODBUS中文協(xié)議手冊》。最后,啟動發(fā)送函數(shù)BeginSend(),將發(fā)送數(shù)據(jù)發(fā)送至發(fā)送接收緩存區(qū)[3]。
應答流程圖中只給出了1、3、5、16四種功能碼指令,即足以滿足實現(xiàn)本文對組態(tài)王中離散變量和模擬變量讀寫操作要求,如需添加強制多個線圈、預置單個寄存器等功能指令,可進行額外拓展,見圖中省略部分。
為滿足實時調(diào)試和監(jiān)控相關(guān)的參數(shù)與狀態(tài),開發(fā)相應的組態(tài)王通訊調(diào)試界面,如圖3所示。其中1號參變量設(shè)定為:DI1~DI8分別用兩組黃、綠、紅、藍的按鍵顯示輸入狀態(tài)10101100,當為1時按鍵按下,當為0時按鍵彈起;DO1~DO8分別用兩組黃、綠、紅、藍的LED燈表示輸出狀態(tài)01010011,當為1時燈亮,當為0時燈滅;AI1~AI8分別顯示輸入寄存器值11,22,33,444,555,666,7777,8888;AO1~AO8則分別表示預置寄存器值8888,7777, 666, 555,444,33,22,11。另外,2號參變量設(shè)置:DI1~DI8分別讀入00111000;DO1~DO8分別寫出11000111;AI1~AI8分別讀入6,216,56,7676,356,46,1986,66;AO1~AO8分別寫出66,1986,46,356,7676,56,216,6。
從通信結(jié)果來看,效果良好,能夠?qū)崟r穩(wěn)定地讀和寫數(shù)據(jù)。針對測試過程中遇到的問題,給出了解決方案,主要有以下兩點:1)寄存器數(shù)值超出上限0~65535。解決方案——設(shè)置智能儀表中變量初始值和原始值,并將實際數(shù)據(jù)縮小至一定倍數(shù),然后在組態(tài)王中將相應的參變量擴大適當?shù)谋稊?shù)即可。2)多機通訊測試時,部分監(jiān)控參數(shù)錯亂變化且無規(guī)律。由于在組態(tài)王中設(shè)置的各從機通訊參數(shù)中“采集頻率”都是相同的,導致采集數(shù)據(jù)時出現(xiàn)了數(shù)據(jù)沖突,因此,設(shè)置不同的“采集頻率”能夠很好地解決以上問題。
在本文設(shè)計的組態(tài)王與智能儀表通信系統(tǒng)中,采用標準的MODBUS RTU數(shù)據(jù)傳輸格式,詳細描述了通信參數(shù)配置,并給出了《組態(tài)王與單片機通信工程》平臺的調(diào)試方案與測試結(jié)果。實驗結(jié)果表明該方法簡單有效、穩(wěn)定可靠。
圖2 單片機應答流程圖
圖3 組態(tài)王與2臺單片機通信工程測試平臺
[1] MODBUS Application Protocol Specification V1.1b [k].MODBUS-IDA,2006.
[2] 北京亞控科技發(fā)展有限公司.組態(tài)王6.5使用手冊[Z].2010.
[3] 尤慧芳.MODBUS RTU單片機通信程序編寫方法[J].工業(yè)控制計算機,2009,22(12):86-87.
[4] 胡雄峰,鄭應霞.基于MODBUS-RTU通訊協(xié)議的組態(tài)王與TOP9500通訊[J].工業(yè)控制計算機,2010,23(3):9-10.
[5] 劉杰,王慧.組態(tài)王與單片機多機串口通信的設(shè)計[J].電子設(shè)計工程,2009,17(7):7-11.
[6] 呂國芳,唐海龍,李進.基于Modbus RTU的串口調(diào)試軟件的實現(xiàn)[J].計算機技術(shù)與發(fā)展,2009,19(9):236-241.