新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > 基于DeviceNet 的嵌入式I/O模塊設計

        基于DeviceNet 的嵌入式I/O模塊設計

        作者: 時間:2016-12-09 來源:網絡 收藏

        報文,最后經協議轉換模塊將報文轉換為Devicenet 格式的報文傳輸給DeviceNet 主站。本I/O 模塊既是DeviceNet的從站實現接收主站報文并做出響應的功能,同時又可以作為ModBus的主站向其他ModBus設備發送報文并接收響應報文。

        本文引用地址:http://www.104case.com/article/201612/328302.htm

        3.1 架構設計

        本程序采用中斷的方法來實現兩種報文的收發及轉換。本系統主要包括系統初始化,主處理程序和收發數據三部分。整體結構如圖5所示。

        3.2 DeviceNet從站協議代碼

        為了實現DeviceNet 通信模塊與ModBus 模塊通過DeviceNet 現場總線進行數據傳輸,需要開發一個Devi-ceNet 從站節點。一個僅限組2 的DeviceNet 從站在通信模塊中以軟件的形式實現,從站確保通信模塊能夠通過DeviceNet 接口接收到主站的數據。DeviceNet 從站代碼組成一套可以移植到其他DeviceNet從站產品上的DeviceNet協議棧,該協議棧的主要特點如下:

        (1)支持DeviceNet預定義主/從連接模式;

        (2)支持報文類型:Poll,Strobe,Change of State/Cyclic.

        通過DeviceNet協議棧,嵌入式I/O模塊可以與主站建立顯式信息連接以及I/O 連接。DeviceNet主/從站連接的過程,當主站發送一個請求命令時,DeviceNet必須對其進行響應。本嵌入式I/O 模塊屬于僅限組2設備,一個DeviceNet的組2 服務器在通過重復MAC ID 檢測上線后,需等待客戶機分配預定義主/從連接組并建立顯式信息連接,通過客戶機的配置和驗證后建立輪詢的I/O連接。

        根據DeviceNet主/從站的連接過程,DeviceNet從站必須對主站的請求進行響應,具體的通信過程如圖6所示。

        4 嵌入式I/O模塊的應用層軟件設計

        應用層程序調用協議棧相關函數接收DeviceNet主站端的DeviceNet數據,然后轉換為ModBus的通信規約格式,送入UART 口后傳送到ModBus 從站。反之,當ModBus從站發送讀命令后,若收到DeviceNet主站的響應數據,則將該UART 口的數據轉換為DeviceNet 規約格式并打包發返回到DeviceNet 主站。最終實現Devi-ceNet 和ModBus 之間的雙向數據交換。如圖7 所示為主程序流程圖。

        上電后,嵌入式I/O模塊啟動,首先進行一次自檢,檢測它的MAC ID,波特率,E2PROM.自檢通過后,對LPC2129進行初始化,打開CAN收發中斷。在主循環里首先查看是否有新的DeviceNet主站數據,若有則將它轉換為UART 的格式寫到ModBus 內部。若無新數據,則直接進入下一步,發送讀ModBus主站命令,每發一條等待響應,若在等待周期內收到響應,則在接收中斷內將接收到的ModBus從站數據轉換為DeviceNet數據。

        在嵌入式I/O模塊自檢過程中可以根據指示燈的情況判斷自檢是否成功,只有在自檢成功后才進行CAN總線初始化。

        void SelfCheck(void)是I/O 模塊自檢函數。在自檢過程中需要調用控制燈初始化函數和控制函數,voidinit_led(void),void net_led_ctrl(_U08 ctrl_para)。控制燈一共有6個,端口號分別為P0.8~P1.3.通過這6個燈的亮滅分別驗證波特率,MAC ID,網絡,E2PROM 是否正確。

        在本工程中添加uart.h 和uart.c 文件,其中INT8UUART0_Ini(INT32U baud,UARTMODE set)(void)是串口初始化程序,在該程序中主要實現參數過濾,設置串口波特率,設置串口模式的功能。

        void SendBytes(INT8U *data,INT8U len)(void)按字節發送數據函數。

        void IRQ_UART0(void)(void)串口UART0 接收中斷。在該函數中比較是否有新數據產生,在有新數據的情況下進行中斷處理。

        void uart0_oper()是串口數據處理函數。

        void init_uart0(INT32U bandrate_uart)(void)初始化中斷啟動函數,在該函數中進行設置I/O 連接到UART0,設置中斷允許等操作。

        部分程序如下:

        其中的中斷通道號是可以修改的,但是在一個工程中不能重復。VICVectAddr6中的6即為通道號,0×26和(1《6)中的6為中斷向量,各種中斷向量是確定的,不可隨意更改。

        void DnsPollRequestUpdate(void)是DeviceNet協議棧部分DeviceNet數據的處理函數,它在嵌入式I/O模塊接收到一個完整的輪詢請求后被調用。該函數首先對本次接收到的數據和上次接收到的數據進行比較,只有當不同時才將接收到的新數據賦給aubAppOldConsData[i]以便被串口通過中斷方式讀取后寫到ModBus主站。

        這樣不僅減輕了MCU的處理負擔,還避免了ModBus主站寄存器的不斷寫入。

        void DnsPollResponseUpdate(void)也是DeviceNet協議棧部分DeviceNet數據的處理函數,它在通信模塊進行輪詢響應前被調用。該函數將讀ModBus從站命令獲得的數據_U08 aubAppNewProdData[i]賦給aubApp-PollProdData[ubCntByte]作為輪詢響應。

        5 結論

        本設計采用NXP公司的ARM7處理器LPC2129,實現了基于DeviceNet總線的PCI5010-D主站與基于Mod-Bus 總線的設備之間的通信。充分利用了LPC2129 的CAN控制器設計和UART接口,一個接PCI5010-D主站端的DeviceNet總線,另一個接ModBus端。主站,從站和I/O模塊同時上電后,PCI5010-D主站與I/O模塊間的DeviceNet總線先建立連接后進行I/O 輪詢,PCI5010-D主站的輸出通過I/O模塊的轉換后通過UART接口被寫入ModBus相應的寄存器。然后I/O 模塊發出讀命令并將ModBus 的返回值轉換為DeviceNet總線格式作為輪詢輸入返回到PCI5010-D 主站。這樣便完成了一個完整的信息交換過程。

        嵌入式I/O在實際的工作環境下經過嚴格的測試,能夠滿足模塊化、數字化、網絡化要求。DeviceNet從站代碼經過了ODVA 的一致性測試,可移植到其他的產品上。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄梅县| 遵义市| 集安市| 汽车| 健康| 和田县| 北票市| 温宿县| 庐江县| 理塘县| 日土县| 威海市| 德江县| 中西区| 富蕴县| 基隆市| 玉屏| 贡觉县| 同江市| 正镶白旗| 海晏县| 大方县| 隆回县| 临江市| 陇西县| 北流市| 沂源县| 赞皇县| 墨江| 周宁县| 方山县| 堆龙德庆县| 新营市| 自治县| 汶上县| 马山县| 府谷县| 喀喇| 通化县| 黑河市| 南城县|