基於RS485橋電路裝置的故障定位方法與流程
2023-11-01 15:57:32
本發明涉及串行通信技術,特別涉及一種基於rs485橋電路裝置的故障定位方法。
背景技術:
rs485是兩線制、半雙工、差分信號通訊接口(物理層)。參見圖1,傳統rs485總線允許多個設備連接到同一條總線上,這些設備通常使用modbus協議格式通訊,每個設備預先設置一個485id。主機採用輪詢的方式跟總線上的設備交互,通過485id區分各個設備。主機發送請求時所有設備均會收到,但是只有485id相匹配的那個設備應答,485總線是半雙工的,同一時間只能有一個數據發送者。傳統rs485總線的所有傳感器接在一根數據線上,當任何一個傳感器發生故障時,主機與該傳感器之後傳感器的通信完全中斷,而且也無法確定到底是哪一個傳感器發生故障。特別地,在運行過程中,任一個傳感器發生故障時,它並不能報告主機。
此外,根據傳統的rs485總線技術,主機到傳感器之間的通信線路質量是無法檢測的。
因此,現有技術中存在對一種能夠基於rs485總線進行傳感器的故障定位以消除現有技術存在的缺陷的技術的需要。
技術實現要素:
有鑑於此,本發明提供一種基於rs485橋電路裝置的故障定位方法,可以克服現有技術存在的問題。
本發明的技術方案具體是這樣實現的:
一種基於rs485橋電路裝置的故障確定方法,該方法包括:
主機向總線上發送攜帶有橋電路裝置地址uid和命令代碼的數據包;
橋電路裝置從它的p埠接收到數據包後,解析所接收的通訊數據包以得到解析的uid和命令代碼;將解析的uid與該橋電路裝置的uid比較,如解析的uid與該橋電路裝置的uid相同,則該橋電路裝置執行該數據包中的命令代碼所代表的命令以進行與主機的通信並向主機發送響應數據包;如不相同則忽略所述命令;
具有等於和大於解析的uid並且小於m的地址的每一個橋電路裝置向與本橋電路裝置最相鄰的、具有大於解析的uid的橋電路裝置發送心跳包;
每一個接收到心跳包的橋電路裝置將向本橋電路裝置發送心跳包的橋電路裝置發送第一響應消息;
發送心跳包的橋電路裝置如未能接收到來自最相鄰的、具有大於解析的uid的橋電路裝置的第一響應消息,則確定未發送響應的橋電路裝置發生故障;
發送心跳包的、未能接收到來自最相鄰的、具有大於解析的uid的橋電路裝置的第一響應消息的橋電路裝置將自身的地址加1作為發生故障的橋電路裝置地址,並且在向相鄰的、具有小於本橋電路裝置的地址的橋電路裝置發送第二響應消息時將發生故障的橋電路裝置地址和故障標識加載到第二響應消息中;
位於與主機通信的橋電路裝置和發生故障的橋電路裝置之間的每一個橋電路裝置在向與本橋電路裝置相鄰的、具有小於本橋電路裝置的地址的橋電路裝置發送第二響應消息時將接收到的發生故障的橋電路裝置地址和故障標識加載到第二響應消息中;
與主機通信的橋電路裝置在接收到攜帶有生故障的橋電路裝置地址和故障標識的第二響應消息後,在向主機發送響應數據包時將發生故障的橋電路裝置地址和故障標識加載到響應數據包中;
主機根據接收的響應數據包中的發生故障的橋電路裝置地址和故障標識確定發生故障的橋電路裝置;
其中,m個橋電路裝置通過rs485總線串聯在一起並連接到主機並且m個橋電路裝置的地址按照距離主機從近到遠依次為1,2,3,…,m。
其中,一個橋電路裝置包括處理器;作為p端的第一rs485串口,用於通過總線連接上一個橋電路裝置;作為n端的第二rs485串口,用於通過總線連接下一個橋電路裝置;以及作為橋電路裝置的l端的第三串口,用於連接類型匹配的傳感器,所述處理器與第一rs485串口、第二rs485串口和第三串口進行信號交互。
較佳地,在橋電路裝置從它的p埠接收到數據包後,並且解析所接收的通訊數據包以得到解析的uid和命令代碼之前,該方法還包括:
橋電路裝置將從它的p埠收到的所述數據包時立即開始逐單位信息長度的先轉發到它的n埠以傳遞到下一個橋電路裝置;
所述單位信息長度為1位元組或者1比特。
進一步,所述故障定位方法還包括步驟:
主機將發生故障的橋電路裝置地址加載和讀取傳感器應答數據的命令代碼的數據包發送到總線上;
如主機無法接收到具有所述故障橋電路裝置地址的橋電路裝置的傳感器的應答數據,則確定是發生故障的橋電路裝置地址的橋電路裝置的傳感器發生故障;否則,確定是發生故障的橋電路裝置地址的橋電路裝置本身發生故障。
較佳地,在主機向總線上發送攜帶有uid和命令代碼的數據包的步驟之前,所述方法還包括:
主機向總線上發送攜帶有指定橋電路裝置地址和echo命令代碼的數據包;
如無法接收到指定橋電路裝置地址的橋電路裝置發送的echo響應消息,則確定指定橋電路裝置地址的橋電路裝置發生故障。
其中,指定橋電路裝置地址的橋電路裝置接收到攜帶有指定橋電路裝置地址和echo命令代碼的數據包後,向主機返回攜帶原始echo命令代碼的響應消息。
其中,位於主機以及m個橋電路裝置的每一段總線都是獨立的。
其中,每一個橋電路裝置的uid都是唯一的。
如上可見,在本發明中的基於rs485橋電路裝置的故障定位方法,提供了可以用於基於rs485橋電路裝置的新故障定位方式。由於傳感器並不是直接連接到總線上,而是通過橋電路裝置連接到總線上,因此可以避免了現有技術中任一個傳感器發生故障導致主機與它之後的傳感器無法通信的問題;此外,每一個橋電路裝置與主機的通信都是相對獨立的,不與主機通信的橋電路裝置可以利用發送心跳包的方式確定與它相鄰的在後橋電路裝置是否發生故障,並將發送故障的橋電路裝置地址通過一個個在前的橋電路裝置最終傳遞報告給主機,從而可以確定發生故障的橋電路裝置。而且,通過主機主動發送的取傳感器數據命令,可以確定是橋電路裝置發生故障,還是與橋電路裝置連接的傳感器發生故障。
附圖說明
圖1是現有技術中的基於rs485的傳統總線電路示意圖。
圖2為本發明實施例中的基於rs485的橋電路裝置的組成示意圖。
圖3為本發明實施例中的基於rs485的橋電路裝置的總線電路示意圖。
圖4為本發明實施例中的基於rs485橋電路裝置的故障定位方法的流程圖。
具體實施方式
為使本發明的目的、技術方案及優點更加清楚明白,以下參照附圖並舉實施例,對本發明進一步詳細說明。
本發明中,基於rs485的橋電路裝置具有三個埠,分別為l端,p端和n端,p端和n端分別用於連接上一個和下一個橋電路裝置,l端用於連接到傳感器。基於rs485的橋電路裝置直接連接到rs485總線上。這樣,傳感器不再直接連接到rs485總線上,主機不再直接與傳感器交互,而是使用485總線協議與橋電路裝置交互。橋電路裝置及與其連接的傳感器可以稱為rs485總線上的一個節點。rs485總線上的每兩個橋電路裝置之間都是一段獨立的數據線,甚至基於rs485的橋電路裝置連接傳感器的那段線即l端也是一段獨立的數據線,基於rs485的橋電路裝置通過接力的方式在節點之間傳遞數據。可見,採用本發明,節點之間的數據線長度變短了,因此信號衰減小了,信號線上的信號抗幹擾能力也相應變強。
本發明中,總線上的基於rs485的橋電路裝置是數據搬運工即數據轉發設備,rs485總線也是使用rs485物理接口,但不使用modbus協議,而是使用自定義協議。自定義協議在本發明中不是必須的,本發明也可以由本領域技術人員採用其它協議,因此在此略去對自定義協議的介紹。橋電路裝置是主機跟傳感器通訊的橋梁,它為主機和傳感器提供一條不同與傳統rs485總線的通訊線路。rs485總線上只連接基於rs485的橋電路裝置,不像傳統rs485總線那樣直接連接傳感器。使用rs485總線時,主機不再直接跟傳感器交互,而是使用rs485橋協議跟橋電路裝置交互。橋協議提供命令供主機將打包後的「傳感器指令」轉發給傳感器來實現主機跟傳感器的交互。
下面結合圖2和圖3對本發明的基於rs485的橋電路裝置進行詳細介紹。
圖2示出了根據本發明實施例的基於rs485的橋電路裝置的組成示意圖。橋電路裝置包括處理器,第一rs485串口和第二rs485串口。第一rs485串口用於通過總線連接上一個橋電路裝置的第二rs485串口,第二rs485串口用於通過總線連接下一個橋電路裝置的第一rs485串口。所述橋電路裝置進一步包括作為橋電路裝置的l端的第三串口,用於提供多種類型的接口以供連接類型匹配的傳感器。
本發明中,第一rs485串口作為橋電路裝置的p端,用於通過總線連接上一個橋電路裝置;第二rs485串口作為橋電路裝置的n端,用於通過總線連接下一個橋電路裝置。所述處理器與第一rs485串口、第二rs485串口和第三串口進行信號交互。其中,所述第三串口為rs485、rs422和rs232串口的集合串口,用於連接基於rs485工作的傳感器,基於rs422工作的傳感器和基於rs232工作的傳感器。較佳地,所述橋電路裝置進一步包括輔助串口,用於連接期望類型的傳感器。較佳地,所述處理器為c51晶片,所述第一rs485串口和第二rs485串口為rj45接口。根據本發明的實施例,第一rs485串口,第二rs485串口和第三串口是彼此獨立的,能夠彼此獨立地同時進行數據通信。較佳地,橋電路裝置還包括位於l端的幹節點埠,用於連接幹節點。
本發明的實施例中,雖然基於rs485的接口是半雙工通訊的,但基於rs485的橋電路裝置內部的三個接口是獨立的,它們可以同時進行數據通訊,也就是說橋電路裝置在將p端的數據轉發到n端時,仍然可以跟l端連接的傳感器進行通訊。這種工作方式比半雙工通訊的傳統rs485總線更高效。
傳統rs485總線只能接rs485接口的傳感器,而且通常只能以modbus協議進行通訊。而本發明中,基於rs485的橋電路裝置的l端可以支持多種類型的傳感器,這些傳感器的協議可以是任意的。作為選擇,l端也可以配置成僅連接一種類型的傳感器。在rs485橋總線上,主機與這些不同類型傳感器之間通訊不會產生任何衝突,因為實際直接跟傳感器通訊的橋電路裝置僅限於它所連接的那個rs485橋電路裝置。
圖3示出了根據本發明實施例的基於rs485的橋電路裝置的總線電路示意圖。如圖4所示,基於rs485的總線電路包括m個串聯連接在rs485總線上的節點和主機,m為正整數。每一個節點均為如前所述的橋電路裝置,第一個節點的p端與所述主機連接,第m個節點的l端懸空,第i個節點的p端連接到第i-1個節點的l端,i為2,3,4,…,m-1。第k個節點和第k-1個節點之間的數據線為獨立數據線段,k為2,3,4,…,m。較佳地,節點的p端、l端和n端中的每一個埠配置有4根線,其中2根線為信號線,另外2根線一根為地線,一根為5v電源線。較佳地,所述主機通過橋電路裝置與傳感器進行數據交互。較佳地,在主機通過橋電路裝置與傳感器進行數據交互,所述橋電路裝置還可以與其後的橋電路裝置通信。
參見圖3,基於rs485的總線電路中,每兩個橋電路裝置即節點之間都是一段獨立的數據線,甚至基於rs485的橋電路裝置即l端連接傳感器的那段線也是一段獨立的數據線,橋電路裝置通過接力的方式在節點之間傳遞數據。顯然,由於節點之間的數據線長度變短了,因而信號衰減變小,抗幹擾能力也就變強了。
根據本發明的實施例,主機發送給橋電路裝置的數據包基本格式如下:
【命令開始符】+【橋電路裝置uid】+【命令代碼】+【內容】+【結束符】
橋協議要求【命令開始符】和【結束符】之間的數據要進行轉碼,以免這些數據中出現跟開始符、結束符衝突的字符。本發明中,轉碼規則是8bit轉7bit,計算機每個字節由8個比特位組成,轉碼是將一組字節以每7個比特位重新組織,然後形成一組新的數據,新數據每個字節只使用低7位,最高位總是0(最高位為1是橋協議的特殊控制符,例如命令開始符和結束符),轉碼後的數據字節會比原數據字節多,但可以保證不會跟橋協議的特殊控制符衝突。
橋電路裝置回應的數據包中可能會包含兩份【內容】數據。因為rs485通訊是半雙工的,一問一答式的,為了避免衝突,橋電路裝置不能主動向主機發送數據包。有時候橋電路裝置需要向主機報告一些事件,例如總線上新接入了一個橋電路裝置,這個事件會在主機發出命令並等待回應時,橋電路裝置將事件放在第2份【內容】數據中匯報給主機。
下面介紹本發明中的主要的rs485橋通訊命令代碼和功能。
主機通過uid指定與某個橋電路裝置通訊,每個橋電路裝置都有一個自動分配的uid。本發明中,【命令代碼】是單字節數值,命令需要的參數放在【內容】欄位中。橋電路裝置回應的數據包,【命令代碼】是所回應命令的命令代碼數值的反碼。
主要的rs485橋通訊命令和功能如下:
1、要求總線上的橋電路裝置自動分配地址(即uid)。
2、取「指定橋電路裝置」的硬體信息(版本號、類型、出廠日期等信息)。
3、要求「指定橋電路裝置」原樣回復命令中攜帶的數據,用於測試線路通訊質量。
4、用一條命令獲取總線所有橋電路裝置的io輸入狀態(例如幹節點輸入狀態)。
5、取「指定橋電路裝置」的指定io的輸入狀態(例如幹節點輸入狀態)。
6、將傳感器指令告訴「指定橋電路裝置」。橋電路裝置記住指令並自動的重複向傳感器發送這些指令,實現自動從傳感器取數。該命令適合固定不變的傳感器指令。
7、讀取「指定橋電路裝置」收到的傳感器應答數據。橋電路裝置自動從傳感器取到數據後,先將數據存放到自己的內存區中,能保存多少條歷史數據要看單條數據的大小。主機發送該命令從橋電路裝置中讀取這些傳感器歷史數據。這條命令跟上一條命令即第條命令是成對的。
8、要求「指定橋電路裝置」開啟主機到傳感器的直接通訊通道。有些傳感器通訊需要多次交互,或則,傳感器數據量太大,橋電路裝置無法對這樣的傳感器執行自動取數。主機可以用這條命令跟傳感器建立直接通訊通道,橋電路裝置負責主機和傳感器之間的雙向數據轉發。
9、橋電路裝置內部事件通知,主要是用於橋電路裝置之間的一些事件溝通。
參見圖4,示出了本發明實施例中的基於rs485橋電路裝置的故障定位方法的流程圖。在步驟410,主機向總線上發送攜帶有橋電路裝置地址uid和命令代碼的數據包。接下來,在步驟420,橋電路裝置從它的p埠接收到數據包後,解析所接收的通訊數據包以得到解析的uid和命令代碼;將解析的uid與該橋電路裝置的uid比較,如解析的uid與該橋電路裝置的uid相同,則該橋電路裝置執行該數據包中的命令代碼所代表的命令以進行與主機的通信並向主機發送響應數據包;如不相同則忽略所述命令。
根據本發明的基於rs485橋電路裝置的總線技術,總線上的任何一個橋電路裝置開始接收到數據包時,均先判斷數據包中的命令開始符是否表明數據包為攜帶自動分配地址的命令代碼的數據包。根據本發明的實施例,所述數據包是由主機向rs485總線上發送的,該數據包的格式為:依次按序排列的命令開始符、橋電路裝置的uid、命令代碼、第一內容和結束符;其中,命令開始符和結束符之間的數據被轉碼,命令開始符的最高位為「1」,用於表示一個數據包的開始,其它字節都是以「0」開始的字節;所述轉碼為將8比特一字節的數據轉換為以7比特為一字節的數據。較佳地,本發明的實施例是以命令開始符的值來判斷該數據包所包含的命令代碼是否是自動分配地址的命令,並且命令開始符所在的字節的值表示是何種類型的命令代碼。
然而,本發明的基於rs485橋電路裝置的故障定位方法主要是涉及到故障定位,它可以不關心總線上的數據包是否攜帶有自動分配地址的命令,只要是可以根據數據包進行故障定位就不影響本發明的實施。此外,如果總線上的數據包是否攜帶有自動分配地址的命令,主機將會自動為總線上的橋電路裝置重新分配唯一的uid。該重新分配唯一的uid的具體過程不屬於本發明的技術方案的構成部分,在此略去詳述。
在步驟430,具有等於和大於解析的uid並且小於m的地址的每一個橋電路裝置向與本橋電路裝置最相鄰的、具有大於解析的uid的橋電路裝置發送心跳包。例如,如果圖3中的節點3正在與主機通信,那麼節點3及其之後的節點4,5,…,m-1中的橋電路裝置都可以向後發送一個心跳包。
在步驟440,每一個接收到心跳包的橋電路裝置將向本橋電路裝置發送心跳包的橋電路裝置發送第一響應消息。在步驟450,發送心跳包的橋電路裝置如未能接收到來自最相鄰的、具有大於解析的uid的橋電路裝置的第一響應消息,則確定未發送響應的橋電路裝置發生故障。例如,如果節點6發生故障,則節點5中的橋電路裝置無法接收到第一響應消息。
在步驟460,發送心跳包的、未能接收到來自最相鄰的、具有大於解析的uid的橋電路裝置的第一響應消息的橋電路裝置將自身的地址加1作為發生故障的橋電路裝置地址,並且在向相鄰的、具有小於本橋電路裝置的地址的橋電路裝置發送第二響應消息時將發生故障的橋電路裝置地址和故障標識加載到第二響應消息中。例如,如果節點6發生故障,則節點5中的橋電路裝置將它的地址加1作為發生故障的橋電路裝置地址,即表明是地址為「6」的橋電路裝置發生故障。
在步驟470,位於與主機通信的橋電路裝置和發生故障的橋電路裝置之間的每一個橋電路裝置在向與本橋電路裝置相鄰的、具有小於本橋電路裝置的地址的橋電路裝置發送第二響應消息時將接收到的發生故障的橋電路裝置地址和故障標識加載到第二響應消息中。例如,如果是主機正在與節點3中的橋電路裝置通信,則在節點6的橋電路裝置發生故障的情況下,節點5中的橋電路裝置將故障地址「6」和故障標識加載到第二響應消息中發送給節點4中的橋電路裝置;節點4中的橋電路裝置在收到故障地址和故障標識後,又將故障地址和故障標識記載到它要發送給節點3中的橋電路裝置的第二響應消息中。
在步驟480,與主機通信的橋電路裝置在接收到攜帶有生故障的橋電路裝置地址和故障標識的第二響應消息後,在向主機發送響應數據包時將發生故障的橋電路裝置地址和故障標識加載到響應數據包中。例如,如果是主機正在與節點3中的橋電路裝置通信,在節點6的橋電路裝置發生故障的情況下,節點3中的橋電路裝置將故障地址和故障標識加載到響應數據包中發送給主機。
在步驟490,主機根據接收的響應數據包中的發生故障的橋電路裝置地址和故障標識確定發生故障的橋電路裝置。
下面舉一個例子說明本發明的故障定位方法的實現。
如圖3所示,假設主機持續跟節點2進行交互,如果節點1有故障需要上報(比如傳感器死機了),它可以篡改節點2的響應數據包來實現故障上報,因為節點2的數據包是經過它傳遞的。現在,架設節點10發現它後邊的節點11故障了。如果主機向節點10發命令,它可以趁機匯報這條故障,但是主機一直跟節點2通訊,節點10不能直接將故障發送給主機。根據本發明,節點10如下確定知道節點11故障。當主機與節點2交互時,節點2右邊路段空閒,節點2主動向右發送心跳包,要求節點3做出響應。節點3應該會響應,而且節點3響應數據被節點2收到的時間小於節點2響應數據被主機收到的時間,因為心跳包字節數比較少,也就是說節點2不會因為等待節點3的應答而導致不能及時向下轉發下一條主機命令。節點3的響應數據除了告訴節點2它還活著,還能趁機向節點2報告其它事件。這種傳感器內部狀態溝通數據包僅限兩個橋電路裝置之間,不會向前或向後轉發。節點10就是通過心跳包判斷出節點11出故障了,因為它收不到節點11的響應數據,然後它利用響應節點9心跳包的機會將故障地址和故障標識告訴節點9,就這樣一直這樣傳遞到節點2,節點2就能夠將故障地址和故障標識插入到響應數據包中發給主機了。
較佳地,在橋電路裝置從它的p埠接收到數據包後,並且解析所接收的通訊數據包以得到解析的uid和命令代碼之前,本發明的實施例的故障定位方法還包括:橋電路裝置將從它的p埠收到的所述數據包時立即開始逐單位信息長度的先轉發到它的n埠以傳遞到下一個橋電路裝置;所述單位信息長度為1位元組或者1比特。
較佳地,在步驟490之後,本發明的故障定位方法還包括步驟:主機將發生故障的橋電路裝置地址加載和讀取傳感器應答數據的命令代碼的數據包發送到總線上;如主機無法接收到具有所述故障橋電路裝置地址的橋電路裝置的傳感器的應答數據,則確定是發生故障的橋電路裝置地址的橋電路裝置的傳感器發生故障;否則,確定是發生故障的橋電路裝置地址的橋電路裝置本身發生故障。
較佳地,本發明的故障定位方法中,在主機向總線上發送攜帶有uid和命令代碼的數據包的步驟之前,所述方法還包括:主機向總線上發送攜帶有指定橋電路裝置地址和echo命令代碼的數據包;如無法接收到指定橋電路裝置地址的橋電路裝置發送的echo響應消息,則確定指定橋電路裝置地址的橋電路裝置發生故障。其中,指定橋電路裝置地址的橋電路裝置接收到攜帶有指定橋電路裝置地址和echo命令代碼的數據包後,向主機返回攜帶原始echo命令代碼的響應消息。通過發送echo命令,可以判斷總線線路質量。因為echo命令由橋電路裝置原樣返回,主機可以通過比較發出和收到的數據來判斷總線線路錯碼的情況,當發現錯碼率太高(線路質量差)時,可以提示用戶解決它。
其中,位於主機以及m個橋電路裝置的每一段總線都是獨立的。
在本發明中的基於rs485橋電路裝置的故障定位方法,提供了可以用於基於rs485橋電路裝置的新故障定位方式。由於傳感器並不是直接連接到總線上,而是通過橋電路裝置連接到總線上,因此可以避免了現有技術中任一個傳感器發生故障導致主機與它之後的傳感器無法通信的問題;此外,每一個橋電路裝置與主機的通信都是相對獨立的,不與主機通信的橋電路裝置可以利用發送心跳包的方式確定與它相鄰的在後橋電路裝置是否發生故障,並將發送故障的橋電路裝置地址通過一個個在前的橋電路裝置最終傳遞報告給主機,從而可以確定發生故障的橋電路裝置。而且,通過主機主動發送的取傳感器數據命令,可以確定是橋電路裝置發生故障,還是與橋電路裝置連接的傳感器發生故障。
以上所述僅為本發明的較佳實施例而已,並不用以限制本發明,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明保護的範圍之內。