彭偉偉
(武漢城市職業(yè)學院 電子信息工程學院,湖北 武漢 430064)
基于PIC微控制器的RS-485/Modbus總線系統(tǒng)設計與實現(xiàn)
彭偉偉
(武漢城市職業(yè)學院 電子信息工程學院,湖北 武漢 430064)
針對工業(yè)控制領域的熱點現(xiàn)場總線RS-485/Modbus,分析其典型的RTU通信模式報文協(xié)議,基于PIC微控制器與MAX487收發(fā)器設計具體的報文處理程序流程,所編寫的系統(tǒng)程序通過了主機與多個從機之間的數據傳輸與顯示測試,為Modbus現(xiàn)場總線系統(tǒng)的開發(fā)設計提供重要參考.
PIC;RS-485/Modbus;MAX487;現(xiàn)場總線;系統(tǒng)設計;仿真測試
現(xiàn)場總線已成為工業(yè)控制領域技術發(fā)展的重要熱點,1979年由Modicon公司推出的總線協(xié)議Modbus,由于協(xié)議簡單、易于布署、性價比高、可靠性強等優(yōu)點,在工業(yè)自動化領域獲得了越來越廣泛的應用,已成為應用于控制器的一種通用語言和通用工業(yè)標準,不同廠商生產的控制設備通過Modbus標準可以連成工業(yè)網絡,進行集中監(jiān)控.
Modbus是一個應用層報文傳輸協(xié)議. 串行鏈路上的Modbus系統(tǒng)可以使用不同的物理接口作為其物理層標準,最常用的接口是基于RS-485的兩線制接口,通信距離可達1200m左右. RS-485僅對電氣特征作出了規(guī)定,在RS-485網絡中通信時,需要對數據格式、傳送速度、傳送步驟及糾錯方式等內容作統(tǒng)一規(guī)定. Modbus協(xié)議要求網絡中的每個從機必須有自己的唯一地址,能識別發(fā)給自己的消息,并能決定執(zhí)行何種動作. Modbus通信為主從式(Master/Slave Architecture),總線中只能有一個主機控制整個網絡,主機可以主動發(fā)出命令,從機收到呼叫本機命令時才能回應,從機彼此之間不能直接進行通信,需要交換數據時必須經過主機間接實現(xiàn). 網絡中各從機的唯一地址或編號范圍為1~247(0x01~0xF7),其中地址0(0x00)用作網絡廣播地址,所有從機均可識別該地址.
Modbus網絡中的控制器可配置為兩種通信模式:ASCII與RTU(Remote Terminal Unit). 網絡通信以幀作為一個完整的單位傳送數據. 圖1給出了本文討論的RTU通信模式的幀序列與幀格式示意圖.
圖1 RTU幀序列與幀格式示意圖
RTU通信模式的消息幀以連續(xù)的字節(jié)流傳輸,該模式沒有專門的啟始和結束標識符. 如圖1所示,消息發(fā)送至少要以3.5個字符時間( T1-T2-T3-T4)的停頓間隔開始,至少以3.5個字符的停頓時間結束,大于
3.5 個字符時間表明一個報文結束或一個新報文開始. RTU模式傳輸的第一個數據字段(1字節(jié))是設備地址,一個數據幀中首先發(fā)送的設備地址將被所有工作站接收到,每個工作站都將判斷該地址是否與本機地址匹配,匹配者將繼續(xù)接收后續(xù)字節(jié),不匹配者將重新開始等待下一新消息幀.
在接收一幀數據過程中,如果在該數據幀結束之前遇到超過1.5個字符時間的停頓間隔,這表明字節(jié)間隔時間超時,接收設備將清空接收緩沖(將接收緩沖索引歸0),并假定下一字節(jié)是新消息幀第一字節(jié)(即地址字節(jié)).
一幀數據全部接收完畢之后,為判斷該數據是否存在錯誤,還需要進行CRC-16-IBM校驗,校驗的生成多項式為:G(x) = X16+ X15+ X2+ 1,如果校驗通過則表明數據傳輸正確,可以進行下一步的數據處理或顯示輸出. 否則,系統(tǒng)將拋棄接收到的數據,等待在下一循環(huán)中重發(fā)數據或立即請求重發(fā).
圖2給出了本文所設計的Modbus總線系統(tǒng)通信測試電路,主機控制器為PIC16F877A,4個從機控制器為PIC16F688,各從機可通過軟件預設或外部撥碼開關設定自身的唯一地址. 通過撥碼開關將各從機地址設為0x01~0x04. 主機與所有從機之間通過收發(fā)器MAX487進行RS-485通信.
圖2 基于PIC與RS-485的Modbus總線系統(tǒng)測試電路
圖2中MAX487構成的半雙工網絡支持多點數據通信,拓撲結構采用終端匹配的總線型結構. 電路中DE、RE引腳連接在一起,高電平時使能發(fā)送,低電平時使能接收. MAX487采用平衡發(fā)送和差分接收方式實現(xiàn)通信,發(fā)送端將串口的TTL電平信號轉換成差分信號由A、B兩路輸出,接收端再將差分信號還原成TTL電平信號. 傳輸線通常使用雙絞線,且采用差分方式傳輸,具有很強的抗共模干擾能力.
測試電路中主機將向各從機發(fā)送其AN0通道A/D轉換命令(功能碼),各從機將本機A/D轉換數據分別發(fā)送給主機,主機將各從機的A/D值換算為模擬電壓值(0.00~5.00V)刷新顯示在液晶顯示屏上.
Modbus RTU通信模式的描述較為簡單,但其具體實現(xiàn)卻比較復雜,為了清晰的描繪整個算法實現(xiàn)過程,圖3給出了網絡中主機的Modbus RTU模式報文處理流程,其中虛線僅用于表示變量標識的改變將影響箭頭所指向區(qū)域的判斷及運行分支.
圖3 主機Modbus RTU通信模式報文處理流程圖
在Modbus RTU通信模式下,設計協(xié)議數據處理程序需要解決定時問題、數據發(fā)送/接收問題及CRC校驗處理問題,下面對這三個問題逐一進行分析:
1) 1.5/3.5字符的字節(jié)間隔定時與幀間隔定時問題:TIMER1溢出中斷函數設計.
定時控制涉及RTU模式下的數據幀與幀之間的界定問題以及幀內字節(jié)間的界定問題. 本文用PIC微控制器的TIMER1定時器來控制和標識RTU幀中1.5字符時間間隔(數據字節(jié)間隔)和3.5字符時間間隔(幀間隔),系統(tǒng)擬配置的波特率為19200bps,每比特時間為:1/19200 ≈ 52ms,系統(tǒng)定義的每字符占用的比特數為1+8+2 (1個起始位,2個停止位),故每字符時間為11×52=572ms.
為實現(xiàn)兩種類型的定時控制,系統(tǒng)啟用了TIMER1定時器溢出中斷;為處理字節(jié)接收問題,系統(tǒng)啟用了串口接收中斷. 由于串口接收中斷是在接收1個字符后才判斷時間間隔,因此定義1.5字符時間與3.5字符時間時應分別增加了1個字符時間,于是有幀間隔時間與幀內字節(jié)間隔時間分別為:572×(3.5 + 1) ≈ 2574ms,572×(1.5 + 1) ≈ 1430 ms. 另外,為避免從機過長時間沒有響應而阻塞系統(tǒng),主程序還啟用TIMER0進行10ms的從機超時定時.
2) 數據發(fā)送/接收程序設計:串口發(fā)送函數與串口接收中斷函數設計.
數據幀的發(fā)送操作很容易處理,所組織的一幀數據可以直接通過PIC的串行端口輸出. 數據接收則相對復雜很多,承擔這一工作的串口接收中斷函數不是簡單的讀取串口數據字節(jié)并保存到RAM緩沖區(qū),其更重要的工作是與TIMER1定時器溢出中斷配合,根據中斷控制的兩種類型的定時操作,判斷當前接收的是一幀數據的開始還是結束,是否是一個數據幀內的連續(xù)字節(jié),字節(jié)間是否超時等. 處理程序應根據判斷結果,將數據保存到正確的緩沖位置. 如遇異常,應復位RAM緩沖索引(相當于清空緩沖),并按指定的定時類型重置定時器,例如重設“幀”定時操作為:Set_TIMER1(FRAME_SPAN).
3) 數據校驗:CRC-16-IBM循環(huán)冗余校驗算法設計.
RTU通信模式中每一數據幀最后2字節(jié)是CRC-16-IBM校驗碼,在讀取一幀中的所有N個數據字節(jié)以后,可令所有字節(jié)全部參與CRC16校驗,如果所得結果等于0x0000,則認為數據傳輸正確,否則判定為傳輸出錯,也可以僅令前N-2個字節(jié)參與CRC16校驗,所得結果如果和數據緩沖內最后兩字節(jié)對應相等,同樣可以判定數據傳輸正確. 設計CRC16校驗算法時,可選擇串行移位校驗算法、全字節(jié)查表法、半字節(jié)查表算法等.
對于測試電路中四個從機的報文處理設計,兩個中斷函數(定時器溢出中斷/串口接收中斷)與主機基本相同,但從機的主程序內沒有從機掃描循環(huán),它在main函數的主循環(huán)之前初始化相關配置,并開中斷,然后在主循環(huán)內等待由串口中斷置位的接收成功標識(Recv_OK),在該標識置位后,它首先對所接收的主機數據幀進行CRC-16校驗,通過檢驗后,再根據指定的功能碼進行相應操作. 本文指定的功能碼為:ADC_REQ(請求A/D轉換),從機將啟動A/D轉換獲取本機AN0通道的A/D值(2字節(jié)),然后再向主機發(fā)送數據幀,包括本地地址、功能碼、2字節(jié)A/D值、2字節(jié)CRC校驗碼.
本節(jié)僅列出定時器設置宏定義、主機定時器溢出中斷與主機串口接收中斷函數、CRC16校驗函數. 其中:F_T1為當前定時類型標識,值為0時表示幀定時,為1表示字節(jié)定時. T_FRAME與T_BYTE分別為幀及字節(jié)定時到達標識符(值為1時表示到達). 限于篇幅,本節(jié)略去了其他部分程序.
通過分析RS-485/Modbus總線系統(tǒng)典型的RTU通信模式報文協(xié)議,基于PIC微控制器與RS-485收發(fā)器MAX487,設計了報文協(xié)議處理程序流程,基于HI-TECH PICC編譯器編寫的C程序在主機與從機上通過了運行測試,取得了理想的運行效果,為RS-485/Modbus系統(tǒng)開發(fā)提供了重要參考.
[1] 文小玲, 余 飛, 盧圣文. 基于Modbus協(xié)議的串口通信軟件設計[J]. 湖南工業(yè)大學學報, 2008, 22(6): 100-102.
[2] 張 桓, 趙樹忠. 基于Modbus協(xié)議的單片機與觸摸屏通訊系統(tǒng)設計[J]. 河北理工大學學報: 自然科學版, 2010, 32(4): 82-87.
[3] 張丹紅, 劉 波. 基于RS-485總線的多電機同步控制系統(tǒng)研究[J]. 計算機技術與發(fā)展, 2010, 19(9): 228-231.
[4] 羅 勇, 賈建華, 黃俊杰. 利用PIC單片機和Max1480進行數據采集的通訊[J]. 自動化與儀表, 2007(4): 39-44.
[5] 汪獻忠, 劉 巍, 呂運朋. 基于Modbus 協(xié)議的工業(yè)智能通訊模塊的設計[J]. 儀表技術與傳感器, 2006(6): 47-49.
[6] 朱小超, 徐雪春. 基于Modbus協(xié)議的上位機與單片機通信的實現(xiàn)與仿真[J] 儀表技術與傳感器, 2011(6): 65-68.
(責任編輯:饒 超)
RS-485/Modbus Bus System Design and Implementation Based on PIC Micro Controller
PENG Wei
(School of Electronic and Information Engineering, Wuhan City Vocational College, Wuhan 430064, China)
Aiming at the hotspot of field bus RS-485/Modbus in the domain of industrial control, it analyzes and studies its typical RTU mode of communication message protocol. Based on PIC micro controller and MAX487 transceiver, it designs a specific message processing procedures. The system program passes the data transmission and display test between the master and a number of slavers, and it provides an important reference for the development and design of Modbus field bus system.
PIC; RS-485/Modbus; MAX487; Field bus; System design; Simulation test
TP368.2;TP274+.2
A
1009-2854(2012)02-0017-04
2011-11-15
彭 偉(1972— ) , 男, 湖北武漢人, 武漢城市職業(yè)學院電子信息工程學院副教授.