基于DeviceNet 的嵌入式I/O模塊設(shè)計
報文,最后經(jīng)協(xié)議轉(zhuǎn)換模塊將報文轉(zhuǎn)換為Devicenet 格式的報文傳輸給DeviceNet 主站。本I/O 模塊既是DeviceNet的從站實現(xiàn)接收主站報文并做出響應(yīng)的功能,同時又可以作為ModBus的主站向其他ModBus設(shè)備發(fā)送報文并接收響應(yīng)報文。
本文引用地址:http://m.butianyuan.cn/article/201612/328302.htm3.1 架構(gòu)設(shè)計
本程序采用中斷的方法來實現(xiàn)兩種報文的收發(fā)及轉(zhuǎn)換。本系統(tǒng)主要包括系統(tǒng)初始化,主處理程序和收發(fā)數(shù)據(jù)三部分。整體結(jié)構(gòu)如圖5所示。
3.2 DeviceNet從站協(xié)議代碼
為了實現(xiàn)DeviceNet 通信模塊與ModBus 模塊通過DeviceNet 現(xiàn)場總線進行數(shù)據(jù)傳輸,需要開發(fā)一個Devi-ceNet 從站節(jié)點。一個僅限組2 的DeviceNet 從站在通信模塊中以軟件的形式實現(xiàn),從站確保通信模塊能夠通過DeviceNet 接口接收到主站的數(shù)據(jù)。DeviceNet 從站代碼組成一套可以移植到其他DeviceNet從站產(chǎn)品上的DeviceNet協(xié)議棧,該協(xié)議棧的主要特點如下:
(1)支持DeviceNet預(yù)定義主/從連接模式;
(2)支持報文類型:Poll,Strobe,Change of State/Cyclic.
通過DeviceNet協(xié)議棧,嵌入式I/O模塊可以與主站建立顯式信息連接以及I/O 連接。DeviceNet主/從站連接的過程,當主站發(fā)送一個請求命令時,DeviceNet必須對其進行響應(yīng)。本嵌入式I/O 模塊屬于僅限組2設(shè)備,一個DeviceNet的組2 服務(wù)器在通過重復(fù)MAC ID 檢測上線后,需等待客戶機分配預(yù)定義主/從連接組并建立顯式信息連接,通過客戶機的配置和驗證后建立輪詢的I/O連接。
根據(jù)DeviceNet主/從站的連接過程,DeviceNet從站必須對主站的請求進行響應(yīng),具體的通信過程如圖6所示。
4 嵌入式I/O模塊的應(yīng)用層軟件設(shè)計
應(yīng)用層程序調(diào)用協(xié)議棧相關(guān)函數(shù)接收DeviceNet主站端的DeviceNet數(shù)據(jù),然后轉(zhuǎn)換為ModBus的通信規(guī)約格式,送入UART 口后傳送到ModBus 從站。反之,當ModBus從站發(fā)送讀命令后,若收到DeviceNet主站的響應(yīng)數(shù)據(jù),則將該UART 口的數(shù)據(jù)轉(zhuǎn)換為DeviceNet 規(guī)約格式并打包發(fā)返回到DeviceNet 主站。最終實現(xiàn)Devi-ceNet 和ModBus 之間的雙向數(shù)據(jù)交換。如圖7 所示為主程序流程圖。
上電后,嵌入式I/O模塊啟動,首先進行一次自檢,檢測它的MAC ID,波特率,E2PROM.自檢通過后,對LPC2129進行初始化,打開CAN收發(fā)中斷。在主循環(huán)里首先查看是否有新的DeviceNet主站數(shù)據(jù),若有則將它轉(zhuǎn)換為UART 的格式寫到ModBus 內(nèi)部。若無新數(shù)據(jù),則直接進入下一步,發(fā)送讀ModBus主站命令,每發(fā)一條等待響應(yīng),若在等待周期內(nèi)收到響應(yīng),則在接收中斷內(nèi)將接收到的ModBus從站數(shù)據(jù)轉(zhuǎn)換為DeviceNet數(shù)據(jù)。
在嵌入式I/O模塊自檢過程中可以根據(jù)指示燈的情況判斷自檢是否成功,只有在自檢成功后才進行CAN總線初始化。
void SelfCheck(void)是I/O 模塊自檢函數(shù)。在自檢過程中需要調(diào)用控制燈初始化函數(shù)和控制函數(shù),voidinit_led(void),void net_led_ctrl(_U08 ctrl_para)??刂茻粢还灿?個,端口號分別為P0.8~P1.3.通過這6個燈的亮滅分別驗證波特率,MAC ID,網(wǎng)絡(luò),E2PROM 是否正確。
在本工程中添加uart.h 和uart.c 文件,其中INT8UUART0_Ini(INT32U baud,UARTMODE set)(void)是串口初始化程序,在該程序中主要實現(xiàn)參數(shù)過濾,設(shè)置串口波特率,設(shè)置串口模式的功能。
void SendBytes(INT8U *data,INT8U len)(void)按字節(jié)發(fā)送數(shù)據(jù)函數(shù)。
void IRQ_UART0(void)(void)串口UART0 接收中斷。在該函數(shù)中比較是否有新數(shù)據(jù)產(chǎn)生,在有新數(shù)據(jù)的情況下進行中斷處理。
void uart0_oper()是串口數(shù)據(jù)處理函數(shù)。
void init_uart0(INT32U bandrate_uart)(void)初始化中斷啟動函數(shù),在該函數(shù)中進行設(shè)置I/O 連接到UART0,設(shè)置中斷允許等操作。
部分程序如下:
其中的中斷通道號是可以修改的,但是在一個工程中不能重復(fù)。VICVectAddr6中的6即為通道號,0×26和(1《6)中的6為中斷向量,各種中斷向量是確定的,不可隨意更改。
void DnsPollRequestUpdate(void)是DeviceNet協(xié)議棧部分DeviceNet數(shù)據(jù)的處理函數(shù),它在嵌入式I/O模塊接收到一個完整的輪詢請求后被調(diào)用。該函數(shù)首先對本次接收到的數(shù)據(jù)和上次接收到的數(shù)據(jù)進行比較,只有當不同時才將接收到的新數(shù)據(jù)賦給aubAppOldConsData[i]以便被串口通過中斷方式讀取后寫到ModBus主站。
這樣不僅減輕了MCU的處理負擔,還避免了ModBus主站寄存器的不斷寫入。
void DnsPollResponseUpdate(void)也是DeviceNet協(xié)議棧部分DeviceNet數(shù)據(jù)的處理函數(shù),它在通信模塊進行輪詢響應(yīng)前被調(diào)用。該函數(shù)將讀ModBus從站命令獲得的數(shù)據(jù)_U08 aubAppNewProdData[i]賦給aubApp-PollProdData[ubCntByte]作為輪詢響應(yīng)。
5 結(jié)論
本設(shè)計采用NXP公司的ARM7處理器LPC2129,實現(xiàn)了基于DeviceNet總線的PCI5010-D主站與基于Mod-Bus 總線的設(shè)備之間的通信。充分利用了LPC2129 的CAN控制器設(shè)計和UART接口,一個接PCI5010-D主站端的DeviceNet總線,另一個接ModBus端。主站,從站和I/O模塊同時上電后,PCI5010-D主站與I/O模塊間的DeviceNet總線先建立連接后進行I/O 輪詢,PCI5010-D主站的輸出通過I/O模塊的轉(zhuǎn)換后通過UART接口被寫入ModBus相應(yīng)的寄存器。然后I/O 模塊發(fā)出讀命令并將ModBus 的返回值轉(zhuǎn)換為DeviceNet總線格式作為輪詢輸入返回到PCI5010-D 主站。這樣便完成了一個完整的信息交換過程。
嵌入式I/O在實際的工作環(huán)境下經(jīng)過嚴格的測試,能夠滿足模塊化、數(shù)字化、網(wǎng)絡(luò)化要求。DeviceNet從站代碼經(jīng)過了ODVA 的一致性測試,可移植到其他的產(chǎn)品上。
評論