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