張 莉,鄔寶寅
(1.鄭州科技學(xué)院 機(jī)械工程學(xué)院,鄭州450064;2.新天科技股份有限公司,鄭州 450001)
在現(xiàn)代分布式現(xiàn)場(chǎng)控制系統(tǒng)發(fā)展過(guò)程中RS485總線(xiàn)起到了重要作用,成為現(xiàn)場(chǎng)智能儀表、PLC、工業(yè)PC之間最為通用的總線(xiàn)形式。RS485總線(xiàn)采用一對(duì)雙絞線(xiàn)通過(guò)差分信號(hào)以半雙工方式進(jìn)行數(shù)據(jù)通信,具有較強(qiáng)的抗干擾性和較遠(yuǎn)的傳輸距離,接口簡(jiǎn)單成本低廉。RS485總線(xiàn)硬件可以由差分信號(hào)收發(fā)器和MCU自帶的UART構(gòu)成,隨著各種類(lèi)型MCU的廣泛應(yīng)用,RS485的進(jìn)一步發(fā)展也具備了豐富的條件。由于傳統(tǒng)RS485僅為一種傳輸方式并無(wú)標(biāo)準(zhǔn)應(yīng)用協(xié)議,在不同應(yīng)用前提下穩(wěn)定性差異較大,有效傳輸速率較低,已經(jīng)在不少場(chǎng)合被具有更高可靠性、更高速率和具備上層應(yīng)用協(xié)議的現(xiàn)場(chǎng)總線(xiàn)所取代,如CAN,PROFIBUS等,故基于傳統(tǒng)RS485的發(fā)展條件和存在的問(wèn)題,設(shè)計(jì)了更加穩(wěn)定的硬件結(jié)構(gòu)和具有豐富功能的應(yīng)用協(xié)議,進(jìn)行了硬件設(shè)計(jì)、協(xié)議設(shè)計(jì)、代碼編寫(xiě)和仿真。
傳統(tǒng)RS485總線(xiàn)多機(jī)通信應(yīng)用方式如圖1所示,帶有UART的設(shè)備通過(guò)差分信號(hào)收發(fā)器將TTL電平的串行數(shù)據(jù)轉(zhuǎn)為差分方式送入總線(xiàn),差分收發(fā)器收發(fā)狀態(tài)可切換,總線(xiàn)上的各個(gè)設(shè)備以并聯(lián)的方式接入,在某一時(shí)刻只能有一個(gè)設(shè)備的差分收發(fā)器是發(fā)送狀態(tài),其他設(shè)備均為接收狀態(tài),所以必須通過(guò)某種合適的協(xié)議才能實(shí)現(xiàn)總線(xiàn)上任意設(shè)備之間的通信,否則將會(huì)造成總線(xiàn)沖突。
圖1 傳統(tǒng)RS485總線(xiàn)多級(jí)通信Fig.1 Multi level communication of traditional RS485 Bus
這種應(yīng)用方式存在一些問(wèn)題[1-4]:(1)總線(xiàn)上掛載的設(shè)備數(shù)量與通信波特率和傳輸距離之間相互限制。由于總線(xiàn)上處于發(fā)送狀態(tài)的設(shè)備需要驅(qū)動(dòng)所有處于接收狀態(tài)的設(shè)備,而且總線(xiàn)較長(zhǎng)時(shí)為了克服信號(hào)反射,需要在總線(xiàn)兩端增加假負(fù)載,假負(fù)載會(huì)進(jìn)一步消耗差分發(fā)送器的驅(qū)動(dòng)能力;(2)總線(xiàn)上每一個(gè)設(shè)備需要預(yù)設(shè)唯一地址,為了方便協(xié)議設(shè)計(jì),甚至需要在每一個(gè)設(shè)備里預(yù)存總線(xiàn)上所有設(shè)備的地址。這2個(gè)問(wèn)題限制了系統(tǒng)擴(kuò)展和應(yīng)用程序設(shè)計(jì)的靈活性。本文研究解決了這2個(gè)問(wèn)題,并可以顯著降低誤碼率,提高通信可靠性。
改進(jìn)型RS485總線(xiàn)結(jié)構(gòu)如圖2所示,設(shè)備采用串聯(lián)型總線(xiàn)接入方式和帶總線(xiàn)中繼功能的結(jié)構(gòu)來(lái)解決傳統(tǒng)RS485總線(xiàn)應(yīng)用的不足。總線(xiàn)上每個(gè)接入設(shè)備需要具有2個(gè)差分接收器、2個(gè)差分發(fā)送器和具有1個(gè)UART結(jié)構(gòu)的微控制器,差分接收器和發(fā)送器均帶有獨(dú)立的使能端,UART的輸出端在不使用時(shí)需要能夠配置為高阻或漏開(kāi)狀態(tài);其中1個(gè)差分接收器和1個(gè)差分發(fā)送器的差分信號(hào)端并聯(lián)在一起,2個(gè)差分接收器的TTL電平輸出端和2個(gè)差分發(fā)送器的TTL電平輸入端連接在一起,并與設(shè)備內(nèi)的UART數(shù)據(jù)收發(fā)線(xiàn)連在一起;每個(gè)差分接收器和發(fā)送器的使能端分別與微控制器的GPIO口連接[5-6]。
圖2 改進(jìn)型RS485總線(xiàn)結(jié)構(gòu)Fig.2 Structure of improved RS485 Bus
2對(duì)差分接收器、發(fā)送器分別構(gòu)成設(shè)備的2個(gè)總線(xiàn)接入口,這里定義為上行接口A和下行接口B。將圖2中從左至右的信號(hào)方向定義為下行方向,從右至左的信號(hào)方向定義為上行方向;總線(xiàn)設(shè)備通過(guò)接口A、B以串聯(lián)方式接入總線(xiàn),即前方設(shè)備的接口B必須與后方設(shè)備的接口A連接。差分接收器和差分發(fā)送器共4個(gè)使能端,分別通過(guò)微控制器的4個(gè) GPIO 口 C1、C2、C3、C4控制,當(dāng)接收器的使能端為0時(shí)接收有效,發(fā)送器的使能端為1時(shí)發(fā)送有效。4個(gè)GPIO口共構(gòu)成該設(shè)備的7種有效狀態(tài),即下行透?jìng)?、上行透?jìng)鳌⑾滦邪l(fā)送、上行發(fā)送、全線(xiàn)發(fā)送、下行接收、上行接收模式,其他狀態(tài)均不允許,如表1所示。
表1 改進(jìn)型RS485總線(xiàn)的傳輸模式Tab.1 Transmission mode of improved RS485 Bus
(1)當(dāng)A口接收和B口發(fā)送被使能、UART處于接收狀態(tài)時(shí),設(shè)備處于下行透?jìng)髂J?,此時(shí)總線(xiàn)信號(hào)按下行方向傳送,信號(hào)從A口進(jìn)入設(shè)備轉(zhuǎn)為T(mén)TL電平被UART接收,同時(shí)通過(guò)B口重新轉(zhuǎn)為差分信號(hào)回到總線(xiàn)。
(2)當(dāng)A口發(fā)送和B口接收被使能、UART處于接收狀態(tài)時(shí),設(shè)備處于上行透?jìng)髂J健T撃J脚c下行透?jìng)髂J焦δ芟嗤?,只是與總線(xiàn)信號(hào)按上行方向傳送。
(3)當(dāng)A口和B口發(fā)送都被使能、UART處于發(fā)送狀態(tài)時(shí),設(shè)備處于全線(xiàn)發(fā)送模式,此時(shí)UART輸出的數(shù)據(jù)通過(guò)A口和B口轉(zhuǎn)換為差分信號(hào)分別向上行和下行方向傳輸。
(4)當(dāng)A口被關(guān)閉、B口發(fā)送被使能、UART處于發(fā)送狀態(tài)時(shí),設(shè)備處于下行發(fā)送模式,此時(shí)UART輸出的數(shù)據(jù)通過(guò)B口轉(zhuǎn)換為差分信號(hào)向下行方向傳輸。
(5)當(dāng)B口被關(guān)閉、A口發(fā)送被使能、UART處于發(fā)送狀態(tài)時(shí),設(shè)備處于上行發(fā)送模式,此時(shí)UART輸出的數(shù)據(jù)通過(guò)A口轉(zhuǎn)換為差分信號(hào)向上行方向傳輸。
(6)當(dāng)B口被關(guān)閉、A口接收被使能、UART處于接收狀態(tài)時(shí),設(shè)備處于下行接收模式,此時(shí)下行方向總線(xiàn)信號(hào)從A口進(jìn)入設(shè)備轉(zhuǎn)為T(mén)TL電平被UART接收,但不會(huì)繼續(xù)向下行方向傳送。
(7)當(dāng)A口被關(guān)閉、B口接收被使能、UART處于接收狀態(tài)時(shí),設(shè)備處于上行接收模式,此時(shí)上行方向總線(xiàn)信號(hào)從B口進(jìn)入設(shè)備轉(zhuǎn)為T(mén)TL電平被UART接收,但不會(huì)繼續(xù)向上行方向傳送。
在改進(jìn)型RS485設(shè)備的7種模式中,下行透?jìng)髂J?、上行透?jìng)髂J较喈?dāng)于傳統(tǒng)RS485的接收模式,全線(xiàn)發(fā)送模式相當(dāng)于傳統(tǒng)RS485的發(fā)送模式;而下行發(fā)送、上行發(fā)送、下行接收、上行接收這4種模式是傳統(tǒng)RS485所不具備的,通過(guò)這4種模式可以實(shí)現(xiàn)總線(xiàn)設(shè)備數(shù)量自動(dòng)查詢(xún)和編址等功能。
依托改進(jìn)設(shè)計(jì)的硬件結(jié)構(gòu),可以通過(guò)協(xié)議實(shí)現(xiàn)總線(xiàn)設(shè)備數(shù)量自動(dòng)查詢(xún)、自動(dòng)編址、數(shù)據(jù)通信、設(shè)備熱插拔4種功能。這些功能通過(guò)查詢(xún)狀態(tài)和順序通信狀態(tài)來(lái)實(shí)現(xiàn)。設(shè)備上電或復(fù)位時(shí),總線(xiàn)首先進(jìn)入查詢(xún)狀態(tài),通過(guò)該狀態(tài)使每個(gè)設(shè)備獲得總線(xiàn)上設(shè)備總數(shù)量和自身的總線(xiàn)地址(即該設(shè)備在總線(xiàn)上的位置),然后總線(xiàn)進(jìn)入順序通信狀態(tài),設(shè)備按照總線(xiàn)地址的順序獲得數(shù)據(jù)發(fā)送權(quán)[5]。通信過(guò)程中,設(shè)備定時(shí)或通信發(fā)生故障時(shí)重新進(jìn)入查詢(xún)狀態(tài),檢測(cè)是否有設(shè)備新增或斷開(kāi),若檢測(cè)到總線(xiàn)設(shè)備發(fā)生變化即更新設(shè)備數(shù)量和編址,然后重新進(jìn)入通信狀態(tài),通過(guò)該功能可應(yīng)對(duì)設(shè)備熱插拔等情況[7-8]。
總線(xiàn)查詢(xún)狀態(tài)分為下位設(shè)備搜尋和下位授地址2個(gè)過(guò)程。進(jìn)入查詢(xún)狀態(tài)后首先進(jìn)行下位搜尋,即查詢(xún)總線(xiàn)下行方向是否還有相鄰設(shè)備,同時(shí)應(yīng)答來(lái)自上行方向設(shè)備的查詢(xún)指令。具體方式為設(shè)備定時(shí)切換成下行發(fā)送模式發(fā)送搜尋指令,發(fā)送時(shí)間約為100 μs,然后切換成上行接收模式接收下行方向傳來(lái)的應(yīng)答,持續(xù)5 ms;其他時(shí)間為下行接收模式,接收上行方向設(shè)備傳來(lái)的搜尋指令,若收到搜尋指令則立即轉(zhuǎn)為上行發(fā)送模式發(fā)送應(yīng)答。定時(shí)下行發(fā)送搜尋指令的周期為以100 ms為基數(shù)的隨機(jī)時(shí)間,循環(huán)進(jìn)行。由于下行接收模式的時(shí)間遠(yuǎn)大于其他階段時(shí)間,且經(jīng)過(guò)多次循環(huán),有很大的概率可以接收到上行方向設(shè)備發(fā)送的搜尋指令。經(jīng)過(guò)若干次循環(huán)后,若沒(méi)有搜尋到下位設(shè)備,則該設(shè)備置下行端部標(biāo)志;若沒(méi)有接收到搜尋指令,則置上行端部標(biāo)志;若既搜尋到下位設(shè)備又收到來(lái)自上位的搜尋指令,則置總線(xiàn)中部標(biāo)志,如圖3(a)所示。
下位授地址過(guò)程由上行端部標(biāo)志設(shè)備發(fā)起,上行端部設(shè)備首先設(shè)定自身地址為0,然后向下行方向相鄰的設(shè)備發(fā)送授地址指令,設(shè)其地址為1;相鄰設(shè)備收到授地址指令后,再向其下行方向設(shè)備發(fā)送授地址指令,設(shè)其地址為2,以此類(lèi)推,直到下行端部設(shè)備為止,如圖3(b)所示。由于在被授地址之前,總線(xiàn)設(shè)備絕大多數(shù)時(shí)間處于下行接收模式,可以收到來(lái)自上行方向的授地址指令;然后在向下行方向發(fā)送完授地址指令后,立即切換為上行接收模式;當(dāng)下行端部設(shè)備被授地址后,立即向上行方向發(fā)送通信啟動(dòng)指令,使總線(xiàn)設(shè)備進(jìn)入正常通信狀態(tài),如圖 3(c)所示。
圖3 協(xié)議過(guò)程Fig.3 Protocol process
總線(xiàn)設(shè)備進(jìn)入順序通信狀態(tài)后,從地址為0的設(shè)備開(kāi)始依次發(fā)送數(shù)據(jù),直到下行端部設(shè)備。具體過(guò)程如圖3(d)所示??偩€(xiàn)設(shè)備收到通信啟動(dòng)指令后,設(shè)備0進(jìn)入下行發(fā)送模式,總線(xiàn)中部設(shè)備進(jìn)入下行透?jìng)髂J剑滦卸瞬吭O(shè)備進(jìn)入下行接收模式。設(shè)備0發(fā)送的數(shù)據(jù)可以被其他所有設(shè)備接收;數(shù)據(jù)發(fā)送完畢后設(shè)備0切換為上行接收模式,設(shè)備1切換為全線(xiàn)發(fā)送模式,其他設(shè)備依然為下行透?jìng)髂J胶拖滦薪邮漳J剑O(shè)備1發(fā)送數(shù)據(jù)也可被其他所有設(shè)備接收;發(fā)送完畢后設(shè)備1切換為上行透?jìng)髂J剑O(shè)備2切換為全線(xiàn)發(fā)送模式,以此類(lèi)推。每個(gè)具有數(shù)據(jù)發(fā)送權(quán)的設(shè)備以全線(xiàn)發(fā)送模式發(fā)送數(shù)據(jù),其上行方向全部為上行透?jìng)髂J?,下行方向全部為下行透?jìng)髂J剑偩€(xiàn)上下兩端設(shè)備分別為上行接收模式和下行接收模式,發(fā)送的數(shù)據(jù)可以被其他所有設(shè)備接收。
總線(xiàn)設(shè)計(jì)允許在運(yùn)行狀態(tài)下,在兩端添加新設(shè)備。新設(shè)備接入總線(xiàn)端部并上電后進(jìn)入查詢(xún)狀態(tài),而總線(xiàn)原有設(shè)備在運(yùn)行過(guò)程中,其兩端設(shè)備的開(kāi)放端端口實(shí)際處于關(guān)閉狀態(tài),不會(huì)相互影響??偩€(xiàn)原有設(shè)備經(jīng)過(guò)一段時(shí)間的順序通信循環(huán)后,兩端設(shè)備定期進(jìn)入查詢(xún)狀態(tài),即原上行端部設(shè)備切換到下行接收模式,若上行方向有新設(shè)備接入,便會(huì)接收到新設(shè)備發(fā)出的搜尋指令;原下行端部設(shè)備切換到下行發(fā)送模式向下發(fā)送搜尋指令,若下行方向有新設(shè)備接入則會(huì)接收到搜尋指令應(yīng)答。兩端設(shè)備進(jìn)行新設(shè)備查詢(xún)過(guò)程中,原總線(xiàn)中部設(shè)備一直處于上行透?jìng)髂J?。若未發(fā)現(xiàn)有新設(shè)備接入,則原下行端部設(shè)備發(fā)送通信啟動(dòng)指令,重新進(jìn)行循環(huán)通信;若有新設(shè)備接入,則原下行端部設(shè)備發(fā)送復(fù)位指令,所有設(shè)備重新執(zhí)行查詢(xún)命令。
總線(xiàn)運(yùn)行狀態(tài)下,若有設(shè)備拔除或發(fā)生總線(xiàn)斷線(xiàn)時(shí),總線(xiàn)可重新進(jìn)行編址,重啟循環(huán)通信過(guò)程。這項(xiàng)處理有2種情況:若斷開(kāi)部分不包含具有數(shù)據(jù)發(fā)送權(quán)的設(shè)備,則當(dāng)數(shù)據(jù)發(fā)送權(quán)傳遞到斷開(kāi)點(diǎn)上行相鄰處設(shè)備并發(fā)送數(shù)據(jù)后,此設(shè)備將無(wú)法再向下傳遞數(shù)據(jù)發(fā)送權(quán),即數(shù)據(jù)發(fā)送權(quán)指令無(wú)應(yīng)答,而該處上行方向設(shè)備皆為上行透?jìng)髂J交蛏闲薪邮漳J?,故該設(shè)備將向上行方向發(fā)送復(fù)位指令,使總線(xiàn)上其余設(shè)備復(fù)位并重新執(zhí)行總線(xiàn)查詢(xún)、編址過(guò)程;另一種情況是,若斷開(kāi)部分包含具有數(shù)據(jù)發(fā)送權(quán)的設(shè)備,則斷開(kāi)點(diǎn)處的設(shè)備在等待超時(shí)后,將向下行方向發(fā)送復(fù)位指令。由于下行方向設(shè)備都為下行透?jìng)髂J交蛳滦薪邮漳J?,故可以接收到?fù)位指令并重新執(zhí)行總線(xiàn)查詢(xún)、編址過(guò)程。
改進(jìn)型RS485總線(xiàn)硬件通過(guò)總線(xiàn)中繼功能,保證在總線(xiàn)設(shè)備較多,總距離較遠(yuǎn)的情況下得到較高的傳輸穩(wěn)定性和傳輸波特率;同時(shí)基于該硬件結(jié)構(gòu)特點(diǎn),可通過(guò)協(xié)議實(shí)現(xiàn)總線(xiàn)設(shè)備自動(dòng)編址,順序通信、總線(xiàn)斷線(xiàn)可檢測(cè)和設(shè)備熱插拔處理,增加設(shè)備組網(wǎng)的靈活性。通過(guò)采用3臺(tái)由STM32F103RET6構(gòu)成的改進(jìn)型RS485總線(xiàn)設(shè)備進(jìn)行測(cè)試,采用與CAN總線(xiàn)相同的1M通信波特率和100 m的設(shè)備間距進(jìn)行重復(fù)數(shù)據(jù)通信,測(cè)試通信誤碼率低于10-10,優(yōu)于RS485、RS232、RS422等傳統(tǒng)通信方式,通信波特率可達(dá)到CAN總線(xiàn)的水平。改進(jìn)型RS485硬件可由STM32等具有高速UART設(shè)備的MCU構(gòu)成,通過(guò)移植包含尋址、通信、插拔處理功能的底層代碼,設(shè)計(jì)出具有協(xié)議通用性的智能儀表設(shè)備,使這種智能儀表既能保留RS485的優(yōu)勢(shì)又能具備現(xiàn)代現(xiàn)場(chǎng)總線(xiàn)的性能。
[1]趙亮,張吉禮.提高RS485總線(xiàn)通信可靠性的優(yōu)化設(shè)計(jì)方法[J].大連理工大學(xué)學(xué)報(bào),2015,55(4):393-398
[2]張潔,梅勇,苗世洪,等.提高RS-485現(xiàn)場(chǎng)總線(xiàn)網(wǎng)絡(luò)可靠性的措施[J].電工技術(shù),2004(1):31-33.
[3]張芳娥,衡君山,甄換強(qiáng).RS485總線(xiàn)網(wǎng)絡(luò)可靠性研究[J].儀器儀表學(xué)報(bào),2006,27(6):2458-2459.
[4]于月森,葉王慶.RS-485總線(xiàn)可靠性應(yīng)用研究[J].微計(jì)算機(jī)信息,2007(23):274-276.
[5]馮子陵,俞建新.RS485總線(xiàn)通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2012,38(20):215-218.
[6]NI Haiyan,HU Chao,MA Changwang.Research on a 485-serial network architecture in intelligent uptown management[C]//Proc 2006 IEEE Conf on Mechatronics and Automation.Luoyang:IEEE Press,2006:400-405.
[7]王書(shū)根,王振松,劉曉云.Modbus協(xié)議的RS485總線(xiàn)通訊機(jī)的設(shè)計(jì)及應(yīng)用[J].自動(dòng)化與儀表,2011,26(5):25-28.
[8]耿立中,王鵬,馬騁,等.RS485高速數(shù)據(jù)傳輸協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2008,48(8):1311-1314.