《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > EPA通信協(xié)議在μC/OS-II嵌入式系統(tǒng)中的設計與實現(xiàn)
EPA通信協(xié)議在μC/OS-II嵌入式系統(tǒng)中的設計與實現(xiàn)
摘要:  本文實現(xiàn)EPA通信協(xié)議的硬件結構如圖2所示,,通信卡CPU為RABBIT2000微處理器,,它是Rabbit半導體公司所生產(chǎn)的8位微處理器,,工作主頻22.1MHZ,,工作電壓5V,,具有40個通用I/O引腳,。內(nèi)建日歷,、時鐘,、看門狗,、定時器、多級中斷,、雙DMA通道,,數(shù)據(jù)存儲為128K靜態(tài)存儲器和 256K 動態(tài)存儲器,可外擴4~8MB FLASH,,對于通信協(xié)議棧和小型控制應用,,其存儲空間是足夠的。
Abstract:
Key words :

         1. 引言

 

      《用于工業(yè)測量與控制系統(tǒng)的EPA系統(tǒng)結構與通信規(guī)范》(以下簡稱EPA)是基于工業(yè)以太網(wǎng)的實時通信規(guī)范,,它有效地解決了以太網(wǎng)通信的確定性通信問題,,進而可以應用于多種工業(yè)領域,,構成各種工業(yè)測量與控制系統(tǒng)。該規(guī)范將收錄在制定中的實時以太網(wǎng)國際標準IEC61784-2中,,成為我國首例具有自主知識產(chǎn)權的現(xiàn)場總線標準,;開發(fā)和實現(xiàn)EPA通信協(xié)議是應用EPA系統(tǒng)的基礎和前提。
  μC/OS-II是一種占先機制的實時多任務嵌入式操作系統(tǒng),,具有源碼公開,、可移植、可固化,、可裁剪等特點,,已經(jīng)得到廣泛的應用。相對于同為源碼公開的μClinux,,它具有內(nèi)核小,、實時性高等特點,更適合于控制應用,。μC/OS-II作為EPA通信協(xié)議的實現(xiàn)平臺,,能夠較大的提高系統(tǒng)資源利用率,利用優(yōu)先級劃分獲得較好的實時響應性能,,其任務間多種通信方法有助于實現(xiàn)各實體協(xié)議狀態(tài)機,。
  2. EPA通信協(xié)議與模型
  EPA系統(tǒng)采用ISO/OSI開放系統(tǒng)互連模型(ISO 7498)的第一、二,、三,、四和七層,并增加用戶層,。系統(tǒng)中除了采用普通以太網(wǎng)協(xié)議組件外,,有些層增加了部分實體,以適應EPA通信的需求:
  增加的用戶層包含EPA功能塊應用進程與非實時應用進程,。應用層增加了由EPA系統(tǒng)管理實體,、EPA應用訪問實體和EPA套接字映射實體組成的EPA協(xié)議,三個實體分別實現(xiàn)EPA設備管理,、應用通信服務,、應用層與UDP/IP軟件實體之間的映射接口和報文優(yōu)先發(fā)送管理、報文封裝,、響應信息返回,、鏈路狀況監(jiān)視等功能。在MAC層和IP層之間增加EPA通信調(diào)度管理實體,,對EPA設備向網(wǎng)絡上發(fā)送的報文進行調(diào)度管理,。調(diào)度策略采用分時發(fā)送機制,將報文分為周期報文和非周期報文,,按預先組態(tài)的調(diào)度方案,,在相應的時間段內(nèi)發(fā)送,,以避免碰撞。各設備網(wǎng)絡時間由時間同步組件維護其一致性,。EPA管理信息庫為各層協(xié)議實體提供操作所需信息,,包括設備描述對象,鏈接對象等,。
  按照EPA通信協(xié)議,,每個EPA設備由至少一個功能塊實例,、EPA應用訪問實體,、EPA系統(tǒng)管理實體、EPA套接字映射實體,、EPA鏈接對象,、通信調(diào)度管理實體以及UDP/IP協(xié)議等幾個部分組成。各個實體和對象通過互相調(diào)用,,協(xié)同完成設備間通信過程如圖1示,。
 
  3. 實現(xiàn)平臺
 
  本文實現(xiàn)EPA通信協(xié)議的硬件結構如圖2所示,通信卡CPURABBIT2000" title="RABBIT2000" target="_blank">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000" title="RABBIT2000">RABBIT2000微處理器,,它是Rabbit半導體公司所生產(chǎn)的8位微處理器,,工作主頻22.1MHZ,工作電壓5V,,具有40個通用I/O引腳,。內(nèi)建日歷、時鐘,、看門狗,、定時器、多級中斷,、雙DMA通道,,數(shù)據(jù)存儲為128K靜態(tài)存儲器和 256K 動態(tài)存儲器,可外擴4~8MB FLASH,,對于通信協(xié)議棧和小型控制應用,,其存儲空間是足夠的。
 
  由zworld公司提供的基于Dynamic C的軟件開發(fā)平臺集編程,、編譯,、鏈接、調(diào)試,、下載于一體,,提供完善的TCP/IP協(xié)議棧,支持全功能RS232/485通信,,配備了各種I/O驅動函數(shù)庫,;文件管理系統(tǒng)可在FLASH或SRAM上建立數(shù)據(jù)文件,,便于存儲系統(tǒng)或用戶數(shù)據(jù);開源的協(xié)議庫不但縮短了軟件開發(fā)周期,,而且便于修改以更好的實現(xiàn)EPA通信協(xié)議,。
 
  通信卡通過以太網(wǎng)模塊接口與EPA網(wǎng)絡相連,通過串口RS-232與電動執(zhí)行器連接形成一個底層IO設備,,掛接在EPA網(wǎng)絡上進行測試,。
 
  RABBIT2000支持協(xié)作式(使用costate)和占先式(移植μC/OS-II)多任務模式,選擇占先式模式基于以下兩點考慮:
 
 ?。?)對于EPA設備來說,,系統(tǒng)實時性是一個很重要的指標,表現(xiàn)在經(jīng)過組態(tài)后功能塊模塊的執(zhí)行時間精度,、通信調(diào)度發(fā)送周期性報文的時間精度,,以及時鐘同步的精度,而且這幾個參數(shù)在很大程度上影響了網(wǎng)絡帶寬利用率,。μC/OS-II具有任務執(zhí)行時間的可確定性,,可以很好的滿足系統(tǒng)的實時性要求。
 
 ?。?)EPA設備可以直接在通信卡的接口上進一步開發(fā)實現(xiàn),,同時需要增加用戶層任務進程,而RABBIT2000是8位微處理器,,資源比較有限,,因此基于任務可擴展性考慮,也應該采用占先式任務調(diào)度方式,。
 
  4. 軟件設計與實現(xiàn)
  4.1 通信協(xié)議的模塊化設計
  從數(shù)據(jù)處理角度上看,,EPA設備通信是對控制過程所需要數(shù)據(jù)進行處理和通過EPA網(wǎng)絡傳輸?shù)倪^程,發(fā)送方從上到下各層依次對應用進程或者管理服務數(shù)據(jù)進行處理和封裝,,接收方則進行解包和處理,,將服務數(shù)據(jù)交給應用進程。因此,,協(xié)議軟件設計主要是系統(tǒng)各模塊對服務數(shù)據(jù)的處理程序的設計,。EPA通信卡的功能主要包含系統(tǒng)管理、應用服務,、時鐘同步,、實時調(diào)度等。需要編寫的功能模塊有EPA服務棧模塊,、套接字映射模塊,、時間同步模塊、通信調(diào)度模塊。
 ?。?)EPA服務棧模塊:系統(tǒng)管理服務包括設備查詢,、設備聲明等服務,應用訪問服務包括域操作服務,、事件操作服務,、變量操作服務,各種服務對相應的服務報文進行處理,。 以域下載服務為例說明服務棧的實現(xiàn)流程如圖3示,。
 
  (2)EPA套接字映射模塊:對服務棧數(shù)據(jù)進行封裝,,并作為與UDP層之間的數(shù)據(jù)接口,,其接口函數(shù)包括創(chuàng)建與關閉EPA套接字函數(shù)、發(fā)送應用服務報文與響應報文函數(shù),,發(fā)送系統(tǒng)管理報文與響應報文函數(shù),,從UDP層接收應用服務與系統(tǒng)管理報文函數(shù)等。EPA套接字開UDP套接字的實現(xiàn)語句如下:
  if(!udp_open(&gEPA_AP_Sock, EPA_AP_PORT, -1, EPA_AP_PORT, NULL))
  SockErr=1;
  else SockErr=0;
 
 ?。?)時鐘同步服務的實現(xiàn)采用IEEE 1588精確時鐘同步協(xié)議,該協(xié)議用于分布式系統(tǒng)中的設備通過以太網(wǎng)的亞微秒級時鐘同步,。設備與主時鐘通過交換同步報文而實現(xiàn)同步,,同步報文分為同步信息(Sync)、附加信息(Follow_Up),、延時請求(Delay_Req),、延時響應(Delay_Rsp)四種報文。同步過程分兩個階段,,第一階段通過Sync和Follow_Up報文測量時間偏差,,第二個階段通過Delay_Req和Delay_Rsp測量延遲(網(wǎng)絡延遲和協(xié)議棧延遲),進一步校正偏差,。為了進一步減少協(xié)議棧帶來的延遲,,可以讓時間同步服務盡量接近物理層,這里通過修改TCP/IP庫文件實現(xiàn),。
 
 ?。?)實時調(diào)度的實現(xiàn),包括時間中斷調(diào)度函數(shù)——判斷是否到達本設備的周期報文發(fā)送時間或非周期報文發(fā)送開始時間,,以及報文發(fā)送函數(shù)——實現(xiàn)對幾個優(yōu)先級的數(shù)據(jù)隊列報文發(fā)送等,。
 
  4.2 在μC/OS-II中的實現(xiàn)
  在完成各個模塊的編寫之后,通信協(xié)議在μC/OS-II系統(tǒng)中的實現(xiàn)主要是根據(jù)應用要求進行任務的創(chuàng)建,、劃分以及任務間通信與調(diào)度的設計,。因為μC/OS-II在RABBIT2000中的移植已經(jīng)由Dynamic開發(fā)平臺實現(xiàn),這里不再詳細介紹,。模塊與任務之間非一一對應關系,,因為模塊是基于功能進行劃分,,而任務是基于時間優(yōu)先級進行劃分。劃分任務優(yōu)先級就是確定任務實時性要求的過程,。實時性要求越高的,,則任務優(yōu)先級越高,其對應的優(yōu)先級號越低,。μC/OS-II共支持最多56個用戶任務,,對于本系統(tǒng)來說是綽綽有余的。按照優(yōu)先級由高到低次序的任務劃分與調(diào)度方案如下:
 ?。?)設備管理任務:完成設備的上電與初始化組態(tài),,之后根據(jù)設備狀態(tài)機,在設備為正??刹僮鳡顟B(tài)下被掛起,,直到設備狀態(tài)被其他事件改變后由信號量激活。
 ?。?)周期性報文發(fā)送任務:由時間調(diào)度任務在宏周期內(nèi)本設備周期性報文發(fā)送時間到達時產(chǎn)生中斷激活而進入就緒狀態(tài),,在中斷退出后成為最高優(yōu)先級任務被執(zhí)行,立即發(fā)送周期性報文,,發(fā)送完畢即掛起等待下一次激活,。
  (3)非周期性報文發(fā)送任務:與任務(2)相似,,在非周期報文發(fā)送時間到被激活,,通過調(diào)度算法發(fā)送非周期性報文。以上兩個任務由于不會在同一時間段執(zhí)行,,因此實際運行時的優(yōu)先級是等同的,。
  (4)功能塊調(diào)度任務:在組態(tài)的功能塊調(diào)度時間到達時被激活,,或者在控制回路中上一個功能塊執(zhí)行之后被激活,,立刻執(zhí)行后掛起。由于首先要確保EPA網(wǎng)絡通信的確定性,,所以此任務的優(yōu)先級低于前兩個任務,。
  (5)時間調(diào)度任務:通過對網(wǎng)絡時間的判斷,,在到達以上三個任務的執(zhí)行時間時進入時間中斷函數(shù),,給相應的任務發(fā)送信號量,使任務進入就緒狀態(tài),,中斷退出即可以執(zhí)行就緒的高優(yōu)先級任務,。根據(jù)時間精度的要求設置內(nèi)核調(diào)用OSTimeTick的頻率,可以通過#define OS_TICKS_PER_SEC 256,實現(xiàn)每秒256次的Tick頻率,。
 ?。?)普通報文接收任務:套接字映射實體偵聽來自EPA網(wǎng)絡的報文并根據(jù)需要調(diào)用相應的應用層服務處理報文,設為每100ms執(zhí)行一次,。
 ?。?)時鐘同步任務:獨立接收與發(fā)送時間同步報文,以確保設備時間與網(wǎng)絡時間的同步,。由于主時鐘發(fā)送Sync報文周期為2秒一次,,所以其優(yōu)先級可以低于時間調(diào)度任務,設為每2秒執(zhí)行一次,。
 ?。?)串口通信任務:與電動執(zhí)行器進行周期性的串口通信,根據(jù)電動執(zhí)行器的物理特性,,通信頻率設為每秒2次,,其通信方法在后文中介紹。
  各任務之間采用全局變量或者消息機制進行通信,,以完成任務狀態(tài)機的變化,。任務堆棧則根據(jù)各任務的實際需要分配,這里不再詳述,。
  5. 測試
  為了測試通信協(xié)議的實現(xiàn),,使用通信卡的RS-232串口與某型電動執(zhí)行器的異步串行通信接口相連,形成一個EPA現(xiàn)場設備,。EPA通信卡接收來自EPA網(wǎng)絡的閥位指令并通過串行口傳送給電動執(zhí)行器,電動執(zhí)行器接到閥位指令后向網(wǎng)板發(fā)出應答幀,,雙方各自一收一發(fā)完成一個周期的通信,。通信中網(wǎng)板是主節(jié)點,電動執(zhí)行器為從節(jié)點,,每周期通信均是由通信卡發(fā)起,,電動執(zhí)行器響應。
  通過EPA網(wǎng)橋將該設備加入EPA網(wǎng)絡進行測試,,經(jīng)過專家組的驗收,,該實驗系統(tǒng)成功通過了一致性測試、互可操作性測試等服務測試,,時鐘同步精度也達到了毫秒級,,基本上實現(xiàn)了EPA通信卡的功能。
  6. 結束語
  系統(tǒng)實時性要求越高,,對硬件的要求也越高,,如果要求時鐘同步精度和通信調(diào)度發(fā)送報文的時間精度達到實際應用的水平,并且進一步提高EPA設備通信的可靠性,則需要采用硬件實現(xiàn)的方法,,即開發(fā)EPA專用通信芯片,,在芯片級實現(xiàn)通信協(xié)議,預計EPA芯片很快會面世,。相信在眾多研究機構與廠商的共同努力下,,EPA的推廣應用將會取得豐碩的成果。
  本文作者創(chuàng)新點:針對EPA通信協(xié)議提出了一種新的實現(xiàn)方法,,此方法基于μC/OS-II嵌入式操作系統(tǒng),,用多任務的方式實現(xiàn)了各個協(xié)議實體及其調(diào)度。
此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉載,。