葉笑冬+陸宇+王子健
摘 要 本文根據分層設計思想,基于RS485總線和Modbus協(xié)議,實現主從通信模式下的通用化設計,同時滿足不同設備和硬件平臺下的可移植性和擴展性的需要。另外,設計中利用偵測幀技術,解決子節(jié)點信息及時上告的問題。
關鍵詞 RS485;Modbus;RTU;OSI模型;主從模式;對等模式
中圖分類號:TP23 文獻標識碼:A 文章編號:1671-7597(2014)23-0058-02
在工業(yè)現場,設備間通信、分布式系統(tǒng)的模塊之間的通信,都離不開主從通信模式或對等通信模式。對等通信模式的通信主體沒有主從之分,每個設備、每個模塊都是主節(jié)點,可以隨時發(fā)起通信,隨時接收信息;主從通信模式,相對而言比較復雜,主節(jié)點是唯一的控制主體,它向每個從節(jié)點發(fā)起通信,而相關子節(jié)點則響應,每個子節(jié)點之間不能直接通信。主節(jié)點可以點對點地和子節(jié)點通信,也可以向所有子節(jié)點發(fā)起廣播。由于RS485總線采用半雙工拓撲結構,使得某一段時間段內,只有某個特定的子節(jié)點和主節(jié)點之間才能而且必須建立一個完整的會話,即主節(jié)點發(fā)起請求,子節(jié)點收到后響應并回復請求。而其它子節(jié)點必須等待。在實際應用中,經常會有以下情況
發(fā)生:
1)由于不同子節(jié)點的響應,不同的命令的響應,需要延時的時間不同,則對于應用而言就顯得比較復雜。
2)由于主節(jié)點發(fā)送的命令可能某些原因未被子節(jié)點響應,從應用角度而言,可能需要進行重發(fā),如果針對每一個命令做相應工作其擴展性存在很大的問題。
3)子節(jié)點由于產生事件或告警,希望盡快告知主節(jié)點,子節(jié)點因無法直接發(fā)起請求,使得這種應用的及時性存在問題。
4)由于項目的需要,MCU芯片可能有所不同,有可能是單片機、DSP、ARM等其中的任何一種或幾種,也可能是同種類型的不同配置,但是通信都同樣遇到以上問題。如果針對每一款MCU都重寫通信部分的功能,開發(fā)周期、測試周期都會涉及這部分內容,浪費有限的人力資源。
這些共性的問題如果能在通用的模塊內解決,一方面企業(yè)的共性模塊可以增強可復用性,另外一方面,開發(fā)工程師就可以把精力花在相關的應用領域,降低開發(fā)復雜度。
工業(yè)現場使用Modus現場總線協(xié)議非常普遍,利用Modbus協(xié)議作為載體作為通用模塊的一部分具有典型性。對于RS485總線的應用場合,不管是設備(或裝置)之間的通信還是設備(或裝置)內的主節(jié)點和子節(jié)點之間的通信,通用模塊都適合。
1 協(xié)議簡介
1)RS485總線。
RS485總線由于其成本低廉、布線簡單,抗干擾性強,通信距離長,穩(wěn)定可靠等特點,從而廣泛的應用于工業(yè)控制、電力通信、智能儀表等領域中。RS-485采用半雙工工作方式,任何時候只能有唯一節(jié)點處于發(fā)送狀態(tài),因此,發(fā)送電路須由使能信號加以控制。應用RS-485可以聯(lián)網構成分布式系統(tǒng),在不加中繼器的情況下,允許最多32個子節(jié)點。主節(jié)點同時只能和一個子節(jié)點進行通信,子節(jié)點之間不能直接通信。另外,主節(jié)點可以通過廣播方式和所有子節(jié)點進行通信。其拓撲結構如圖1所示。
2)Modbus 串行鏈路協(xié)議。
Modbus協(xié)議定義了一個與基礎通信層無關的簡單協(xié)議數據單元(PDU),位于在OSI模型[1][2]中的第7層。是一個應用層報文傳輸協(xié)議。其數據包結構如圖2所示。
而Modbus串行鏈路協(xié)議位于OSI 模型的第二層,是一個主/從協(xié)議。如圖3所示。在一個串行總線上,只有一個主節(jié)點,有一個或多個子節(jié)點(最大編號為247)。Modbus通信總是由主節(jié)點發(fā)起。子節(jié)點從來不會主動發(fā)送數據。子節(jié)點之間也不會直接通信。正因為這種特點,主從節(jié)點采用的是乒乓機制,即同一時刻有且只有一個子節(jié)點和主節(jié)點進行交互,完成之后,主節(jié)點才能訪問下一個子節(jié)點。
Modbus串行鏈路協(xié)議是Modbus在串行總線上的實現協(xié)議,特別適合于RS485總線結構。另外,如果把RS232結構可以看成是一個只有一個子節(jié)點的主/從結構。則Modbus串行鏈路協(xié)議也同樣適合。
Modbus串行鏈路協(xié)議支持單播模式和廣播模式。如圖2所示,地址域的地址值用于區(qū)分單播模式和廣播模式,其中1~247是單播模式地址,0是廣播模式地址。在單播模式下,主節(jié)點指定某個子節(jié)點的地址進行訪問,被指定的子節(jié)點接到并處理完請求后,向主節(jié)點返回一個 ‘應答,而其它子節(jié)點,雖然也收到數據,但是由于地址域信息和自身不符,就會拋棄該報文。在廣播模式下,主節(jié)點向所有的子節(jié)點發(fā)送請求,即報文中地址域的值為0。各子節(jié)點接收到報文后判斷是廣播模式,因此,僅僅處理請求,但不會應答。所以廣播請求一般用于寫命令。
2 主從模式下的及時響應
由于RS485的總線方式決定了通信方式必然是主從通信機制,主從方式的最大缺陷在于子節(jié)點無法主動發(fā)起通信,而主節(jié)點發(fā)起通信也是定時或按需的。如果子節(jié)點有告警需要盡快得到主節(jié)點響應,對于主節(jié)點而言,這將是一個很大的挑戰(zhàn)。如果主節(jié)點縮短輪詢周期,則會無形中加大主節(jié)點和子節(jié)點的負荷,也會浪費RS485的通信帶寬。如果輪詢周期太長,子節(jié)點的告警可能就得不到及時的響應。事實上,我們通過對需求的分析歸納可以得出結論,即一個應用系統(tǒng)的通信命令無非是由兩種類型的命令組成:交互式命令和主動上告命令。在這里交互式命令就是主節(jié)點和子節(jié)點進行通信;主動上告命令就是子節(jié)點有告警需要通知主節(jié)點。如何滿足子節(jié)點及時上告主節(jié)點的需要,是通用性設計的一個重要內容。
3 通用化設計
1)數據鏈路層的設計。
在通用化設計中,根據OSI分層設計思想,數據鏈路層實現Modbus串行鏈路協(xié)議[3],包括兩部分的內容:
①滿足一個完整幀的處理的要求。
一個完整幀的處理包括發(fā)送命令方如何組成一個完整的RTU模式下的Modbus幀;接收命令方如何接收一個完整的RTU模式下的Modbus幀。如果接收錯誤,進行相應的處理。由于這部分功能牽涉到具體硬件,因此被封裝在相應的文件中,對應于不同的MCU,修改相關硬件實現即可。endprint
②滿足上層對一個完整的事務處理的需求。
上層對一個完整的事務處理,包括對接收的命令進行解析和回復;支持單播模式和廣播模式;判斷命令請求超時;超時啟動重發(fā)機制等。另外,考慮到以后多子板熱插拔的應用需要,該層也預留了相應的接口,如定義探測幀獲取子板是否存在的信息等。這些內容已經和具體硬件沒有關系,因此這部分可以很方便地移植。另外,對于具體應用而言,可能不同命令的需要子節(jié)點響應的時間也不盡相同,而且需要重發(fā)的要求也可能有所不同,但是通信的狀態(tài)遷移圖都是一樣的,如圖4所示,因此,通用模塊中利用了一個數據結構,如圖5所示,采用同一種方法解決不同命令的發(fā)送和等待回復以及重發(fā)的過程。
實際應用中,應用開發(fā)工程師只需按照這一結構,建立相應的一張命令表,并通過配置的方法讓模塊知道如何訪問該表即可。至于,如何根據該表中的命令ID,獲得該命令是否單播命令,timeout時間,允許重發(fā)次數等參數,按圖4的機制運行等工作,這些都是模塊完成的任務。
2)網絡層的設計。
Modbus協(xié)議規(guī)范中并沒有網絡層的定義,但實際應用中針對每個端口都會存在主模式或者從模式,因此,模塊增加了網絡層的功能。網絡層實現對通信端口的配置,包括是該節(jié)點的某一個端口是處于主模式還是從模式。如果是主模式,則可以充當主節(jié)點的作用,發(fā)起和子節(jié)點的通信;如果是從模式,則只能被動的接收來自主節(jié)點的請求,并進行回復。該層沒有涉及到硬件,也可以很方便地移植。由于目前的需求不要求通信端口之間進行轉發(fā),因此,該層的機制比較簡單。以后需要增加功能,可以修改相應的文件。
此外,模塊內在主模式下,增加了一個特殊的偵測幀,定時地訪問各子節(jié)點,用最小的通信帶寬和工作負荷換來子節(jié)點及時的響應,滿足了子節(jié)點主動上告,即子節(jié)點響應及時性的需求。在模塊設計中,增加了偵測幀和普通幀的協(xié)同工作的機制。他們輪流工作,當允許進行偵測時,這一階段主節(jié)點依此發(fā)送簡短的偵測幀給每個子節(jié)點。子節(jié)點也會回送簡短的信息,可以用位定義方式定義各種上告類型,比如運行是否正常、是否有告警等等。對于應用層,主節(jié)點可以根據這些信息,決定下一步將發(fā)起什么命令。比如發(fā)現告警,則下一個命令就是獲取告警的具體信息。從而實現及時響應的需求。
4 實際應用
該通用化設計模塊已被應用在儲能裝置的信息采集子系統(tǒng),主板MCU采用TMS320F28335,子板的MCU采用MSP430,子板共32塊。系統(tǒng)的波特率設為115200bps,數據格式8/N/2,每個字節(jié)的傳輸時間約為87us。對于偵測幀,幀的長度為8個字節(jié),則0.087*8+1.75=2.446ms,考慮到命令的一個來回時間,則大致需要5ms的時間。如果按32個子節(jié)點的系統(tǒng)計算,則一次一個完整的系統(tǒng)訪問所需時間為5*32=160ms。考慮到一定的通信占空比,則一個合理的偵測幀系統(tǒng)訪問周期為1秒時間。除此之外,如果保證通信帶寬負荷為80%,如果按每秒訪問各子板一次的周期測算,則平均每個子節(jié)點傳輸數據的最大數據量不超過23個字節(jié)為宜。如果采集周期適當放寬,則每次采集數據量可以相應增加。
5 結論
本通用化模塊可以應用于各種嵌入式設備中,由于在設計之初已經充分考慮到移植性和擴展性,采用分層設計方法,對于不同的MCU,只要修改和硬件相關的文件即可,而且主要牽涉到串口部分和定時器部分,因此移植到新的硬件平臺也很方便。另外,雖然模塊目前的應用主要是非操作系統(tǒng)下的單進程運行環(huán)境中,但是由于層內利用狀態(tài)機的運行機制,層之間利用信號方式進行耦合,這樣已經和是否單進程無關。因此理論上模塊同樣可以用在操作系統(tǒng)多進程的運行環(huán)境中。目前單進程環(huán)境的移植已經在MSP430平臺上,TMS320F28335平臺得到驗證,對于ARM等芯片也同樣可以快捷地應用該模塊實現系統(tǒng)的通信。另外,正如前文所述,如果需要進行功能擴展,可以在相應功能層,即相應的文件中修改。
參考文獻
[1]胡道元.計算機局域網[M].清華大學出版社,1996:10-12.
[2]李遜林,袁宗福.計算機網絡[M].電子科技大學出版社,1998:33-40.
[3]王苒,湯冬誼.基于RS485主從通信協(xié)議的實現[J].現代電子技術,2003(24):67-71.endprint
②滿足上層對一個完整的事務處理的需求。
上層對一個完整的事務處理,包括對接收的命令進行解析和回復;支持單播模式和廣播模式;判斷命令請求超時;超時啟動重發(fā)機制等。另外,考慮到以后多子板熱插拔的應用需要,該層也預留了相應的接口,如定義探測幀獲取子板是否存在的信息等。這些內容已經和具體硬件沒有關系,因此這部分可以很方便地移植。另外,對于具體應用而言,可能不同命令的需要子節(jié)點響應的時間也不盡相同,而且需要重發(fā)的要求也可能有所不同,但是通信的狀態(tài)遷移圖都是一樣的,如圖4所示,因此,通用模塊中利用了一個數據結構,如圖5所示,采用同一種方法解決不同命令的發(fā)送和等待回復以及重發(fā)的過程。
實際應用中,應用開發(fā)工程師只需按照這一結構,建立相應的一張命令表,并通過配置的方法讓模塊知道如何訪問該表即可。至于,如何根據該表中的命令ID,獲得該命令是否單播命令,timeout時間,允許重發(fā)次數等參數,按圖4的機制運行等工作,這些都是模塊完成的任務。
2)網絡層的設計。
Modbus協(xié)議規(guī)范中并沒有網絡層的定義,但實際應用中針對每個端口都會存在主模式或者從模式,因此,模塊增加了網絡層的功能。網絡層實現對通信端口的配置,包括是該節(jié)點的某一個端口是處于主模式還是從模式。如果是主模式,則可以充當主節(jié)點的作用,發(fā)起和子節(jié)點的通信;如果是從模式,則只能被動的接收來自主節(jié)點的請求,并進行回復。該層沒有涉及到硬件,也可以很方便地移植。由于目前的需求不要求通信端口之間進行轉發(fā),因此,該層的機制比較簡單。以后需要增加功能,可以修改相應的文件。
此外,模塊內在主模式下,增加了一個特殊的偵測幀,定時地訪問各子節(jié)點,用最小的通信帶寬和工作負荷換來子節(jié)點及時的響應,滿足了子節(jié)點主動上告,即子節(jié)點響應及時性的需求。在模塊設計中,增加了偵測幀和普通幀的協(xié)同工作的機制。他們輪流工作,當允許進行偵測時,這一階段主節(jié)點依此發(fā)送簡短的偵測幀給每個子節(jié)點。子節(jié)點也會回送簡短的信息,可以用位定義方式定義各種上告類型,比如運行是否正常、是否有告警等等。對于應用層,主節(jié)點可以根據這些信息,決定下一步將發(fā)起什么命令。比如發(fā)現告警,則下一個命令就是獲取告警的具體信息。從而實現及時響應的需求。
4 實際應用
該通用化設計模塊已被應用在儲能裝置的信息采集子系統(tǒng),主板MCU采用TMS320F28335,子板的MCU采用MSP430,子板共32塊。系統(tǒng)的波特率設為115200bps,數據格式8/N/2,每個字節(jié)的傳輸時間約為87us。對于偵測幀,幀的長度為8個字節(jié),則0.087*8+1.75=2.446ms,考慮到命令的一個來回時間,則大致需要5ms的時間。如果按32個子節(jié)點的系統(tǒng)計算,則一次一個完整的系統(tǒng)訪問所需時間為5*32=160ms??紤]到一定的通信占空比,則一個合理的偵測幀系統(tǒng)訪問周期為1秒時間。除此之外,如果保證通信帶寬負荷為80%,如果按每秒訪問各子板一次的周期測算,則平均每個子節(jié)點傳輸數據的最大數據量不超過23個字節(jié)為宜。如果采集周期適當放寬,則每次采集數據量可以相應增加。
5 結論
本通用化模塊可以應用于各種嵌入式設備中,由于在設計之初已經充分考慮到移植性和擴展性,采用分層設計方法,對于不同的MCU,只要修改和硬件相關的文件即可,而且主要牽涉到串口部分和定時器部分,因此移植到新的硬件平臺也很方便。另外,雖然模塊目前的應用主要是非操作系統(tǒng)下的單進程運行環(huán)境中,但是由于層內利用狀態(tài)機的運行機制,層之間利用信號方式進行耦合,這樣已經和是否單進程無關。因此理論上模塊同樣可以用在操作系統(tǒng)多進程的運行環(huán)境中。目前單進程環(huán)境的移植已經在MSP430平臺上,TMS320F28335平臺得到驗證,對于ARM等芯片也同樣可以快捷地應用該模塊實現系統(tǒng)的通信。另外,正如前文所述,如果需要進行功能擴展,可以在相應功能層,即相應的文件中修改。
參考文獻
[1]胡道元.計算機局域網[M].清華大學出版社,1996:10-12.
[2]李遜林,袁宗福.計算機網絡[M].電子科技大學出版社,1998:33-40.
[3]王苒,湯冬誼.基于RS485主從通信協(xié)議的實現[J].現代電子技術,2003(24):67-71.endprint
②滿足上層對一個完整的事務處理的需求。
上層對一個完整的事務處理,包括對接收的命令進行解析和回復;支持單播模式和廣播模式;判斷命令請求超時;超時啟動重發(fā)機制等。另外,考慮到以后多子板熱插拔的應用需要,該層也預留了相應的接口,如定義探測幀獲取子板是否存在的信息等。這些內容已經和具體硬件沒有關系,因此這部分可以很方便地移植。另外,對于具體應用而言,可能不同命令的需要子節(jié)點響應的時間也不盡相同,而且需要重發(fā)的要求也可能有所不同,但是通信的狀態(tài)遷移圖都是一樣的,如圖4所示,因此,通用模塊中利用了一個數據結構,如圖5所示,采用同一種方法解決不同命令的發(fā)送和等待回復以及重發(fā)的過程。
實際應用中,應用開發(fā)工程師只需按照這一結構,建立相應的一張命令表,并通過配置的方法讓模塊知道如何訪問該表即可。至于,如何根據該表中的命令ID,獲得該命令是否單播命令,timeout時間,允許重發(fā)次數等參數,按圖4的機制運行等工作,這些都是模塊完成的任務。
2)網絡層的設計。
Modbus協(xié)議規(guī)范中并沒有網絡層的定義,但實際應用中針對每個端口都會存在主模式或者從模式,因此,模塊增加了網絡層的功能。網絡層實現對通信端口的配置,包括是該節(jié)點的某一個端口是處于主模式還是從模式。如果是主模式,則可以充當主節(jié)點的作用,發(fā)起和子節(jié)點的通信;如果是從模式,則只能被動的接收來自主節(jié)點的請求,并進行回復。該層沒有涉及到硬件,也可以很方便地移植。由于目前的需求不要求通信端口之間進行轉發(fā),因此,該層的機制比較簡單。以后需要增加功能,可以修改相應的文件。
此外,模塊內在主模式下,增加了一個特殊的偵測幀,定時地訪問各子節(jié)點,用最小的通信帶寬和工作負荷換來子節(jié)點及時的響應,滿足了子節(jié)點主動上告,即子節(jié)點響應及時性的需求。在模塊設計中,增加了偵測幀和普通幀的協(xié)同工作的機制。他們輪流工作,當允許進行偵測時,這一階段主節(jié)點依此發(fā)送簡短的偵測幀給每個子節(jié)點。子節(jié)點也會回送簡短的信息,可以用位定義方式定義各種上告類型,比如運行是否正常、是否有告警等等。對于應用層,主節(jié)點可以根據這些信息,決定下一步將發(fā)起什么命令。比如發(fā)現告警,則下一個命令就是獲取告警的具體信息。從而實現及時響應的需求。
4 實際應用
該通用化設計模塊已被應用在儲能裝置的信息采集子系統(tǒng),主板MCU采用TMS320F28335,子板的MCU采用MSP430,子板共32塊。系統(tǒng)的波特率設為115200bps,數據格式8/N/2,每個字節(jié)的傳輸時間約為87us。對于偵測幀,幀的長度為8個字節(jié),則0.087*8+1.75=2.446ms,考慮到命令的一個來回時間,則大致需要5ms的時間。如果按32個子節(jié)點的系統(tǒng)計算,則一次一個完整的系統(tǒng)訪問所需時間為5*32=160ms??紤]到一定的通信占空比,則一個合理的偵測幀系統(tǒng)訪問周期為1秒時間。除此之外,如果保證通信帶寬負荷為80%,如果按每秒訪問各子板一次的周期測算,則平均每個子節(jié)點傳輸數據的最大數據量不超過23個字節(jié)為宜。如果采集周期適當放寬,則每次采集數據量可以相應增加。
5 結論
本通用化模塊可以應用于各種嵌入式設備中,由于在設計之初已經充分考慮到移植性和擴展性,采用分層設計方法,對于不同的MCU,只要修改和硬件相關的文件即可,而且主要牽涉到串口部分和定時器部分,因此移植到新的硬件平臺也很方便。另外,雖然模塊目前的應用主要是非操作系統(tǒng)下的單進程運行環(huán)境中,但是由于層內利用狀態(tài)機的運行機制,層之間利用信號方式進行耦合,這樣已經和是否單進程無關。因此理論上模塊同樣可以用在操作系統(tǒng)多進程的運行環(huán)境中。目前單進程環(huán)境的移植已經在MSP430平臺上,TMS320F28335平臺得到驗證,對于ARM等芯片也同樣可以快捷地應用該模塊實現系統(tǒng)的通信。另外,正如前文所述,如果需要進行功能擴展,可以在相應功能層,即相應的文件中修改。
參考文獻
[1]胡道元.計算機局域網[M].清華大學出版社,1996:10-12.
[2]李遜林,袁宗福.計算機網絡[M].電子科技大學出版社,1998:33-40.
[3]王苒,湯冬誼.基于RS485主從通信協(xié)議的實現[J].現代電子技術,2003(24):67-71.endprint