嵌入式Modbus/TCP網(wǎng)關(guān)的設計與實(shí)現
4 軟件系統設計
嵌入式實(shí)時(shí)操作系統在目前的嵌入式應用中使用越來(lái)越廣泛,尤其在功能復雜、系統龐大的應用中顯得愈來(lái)愈重要[5]。網(wǎng)關(guān)采用了μC/OS-II實(shí)時(shí)操作系統。μC/OS- II實(shí)時(shí)操作系統是專(zhuān)門(mén)為嵌入式應用設計的,除了與CPU硬件相關(guān)部分是用匯編語(yǔ)言編寫(xiě)外,其他絕大部分代碼用C語(yǔ)言編寫(xiě)。 μC/OS-II具有執行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良、可靠性高、可擴展性強和移植性好等特點(diǎn)[6]。
選擇合適的ARM處理器的開(kāi)發(fā)工具可以加快嵌入式系統的開(kāi)發(fā)進(jìn)度、節約成本、提高效率。CodeWarrior for ARM Developer Suite V1.2集成開(kāi)發(fā)環(huán)境是ARM公司推出的新一代ARM集成開(kāi)發(fā)工具,網(wǎng)關(guān)的所有程序代碼均在此集成開(kāi)發(fā)環(huán)境中編譯、鏈接、調試。
4.1 μC/OS-II初始化程序設計
μC/OS-II操作系統運行前需要對硬件系統的片內和片外存儲器、系統堆棧等進(jìn)行初始化。這些工作與硬件系統相關(guān),難以用C語(yǔ)言實(shí)現,需要用匯編語(yǔ)言實(shí)現。系統在執行完初始化程序之后就將系統的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為啟動(dòng)μC/OS-II準備好正確的環(huán)境,最后通過(guò)跳轉指令執行μC/OS- II主函數main中的第一條C語(yǔ)句[7]。
初始化程序的設計不屬于μC/OS-II操作系統的移植,但是其質(zhì)量的好壞關(guān)系到整個(gè)系統程序的運行。初始化程序的執行步驟如下:(1)定義程序的入口點(diǎn);(2)設置異常向量; (3)執行硬件初始化;(4)在CP15控制寄存器中,將AT91RM9200配置成小端模式; (5)初始化堆棧指針寄存器SP; (6)開(kāi)放系統中斷;(7)初始化C變量;(8)運行μC/OS-II操作系統。
4.2 μC/OS-II移植
μC/OS-II在最初設計時(shí)就已經(jīng)考慮到了系統的可移植性。移植的絕大部分工作集中在多任務(wù)切換的實(shí)現上。這部分代碼主要是進(jìn)行處理器狀態(tài)的保存、切換和恢復,主要用匯編語(yǔ)言來(lái)實(shí)現[8]。網(wǎng)關(guān)采用μC/OS-II V2.52版本的內核,其全部源代碼量大約是6 000~7 000行,共16個(gè)文件。移植到ARM處理器上,主要修改3個(gè)與ARM體系結構相關(guān)的文件:os_cpu.h、os_cpu_c.c和 os_cpu_a.s,代碼量大約是500行,另外還要添加μC/OS-II系統時(shí)鐘節拍的代碼。
時(shí)鐘節拍初始化代碼需要根據具體的硬件系統來(lái)編寫(xiě)。網(wǎng)關(guān)選用分頻后的系統內部時(shí)鐘做為定時(shí)器的輸入,通過(guò)對AIC高級中斷控制器進(jìn)行設置,μC/OS- II利用AT91RM9200片內定時(shí)器1提供的周期性系統時(shí)鐘節拍中斷。
4.3 TCP/IP協(xié)議棧移植
考慮到商業(yè)TCP/IP協(xié)議棧價(jià)格昂貴,有的僅提供庫函數調用并不開(kāi)放源代碼,所以本文在對幾種開(kāi)放源代碼的TCP/IP協(xié)議棧進(jìn)行比較后選用2006 年3月發(fā)布的穩定版本LwIP 1.1.1協(xié)議棧[9]移植到μC/OS-II操作系統和硬件系統上。
LwIP對μC/OS-II的支持也非常好,文檔管理和軟件版本升級比較完善。LwIP的移植主要涉及兩部分:操作系統模擬層的修改和以太網(wǎng)硬件驅動(dòng)程序的設計。
對于嵌入式系統來(lái)說(shuō),操作系統中進(jìn)程切換的代價(jià)相當昂貴。LwIP沒(méi)有直接使用屬于操作系統的函數調用及數據結構,而是用操作系統模擬層來(lái)代替這些函數的使用。所有TCP/IP協(xié)議都在μC/OS-II的一個(gè)任務(wù)tcpip_thread中運行。網(wǎng)關(guān)的應用層程序建立單獨的T_httpServer任務(wù) (進(jìn)程)和T_ModbusServer任務(wù)(進(jìn)程),通過(guò)μC/OS-II的郵箱、消息隊列等與lwIP任務(wù)(進(jìn)程)進(jìn)行通信。
操作系統模擬層使用統一的接口來(lái)提供定時(shí)器、進(jìn)程同步及消息傳遞機制等此類(lèi)系統服務(wù)。因此移植LwIP需針對μC/OS-II操作系統修改模擬層中的與處理器和編譯工具相關(guān)的include文件、與操作系統相關(guān)的數據結構和函數,主要涉及LwIP的sys_arch.c和sys_arch.h文件。
以太網(wǎng)硬件驅動(dòng)程序的設計包括LwIP接口函數設計和硬件相關(guān)函數設計。AT91RM9200微處理器集成了以太網(wǎng)媒質(zhì)訪(fǎng)問(wèn)層EMAC控制器。EMAC控制器通過(guò)RMII接口訪(fǎng)問(wèn)物理層芯片DM9161,實(shí)現以太網(wǎng)數據的傳輸。以太網(wǎng)設備驅動(dòng)程序需要實(shí)現EMAC層的接收、發(fā)送、初始化以及中斷處理功能。 LwIP提供了一個(gè)網(wǎng)絡(luò )驅動(dòng)程序的參考模板,即LwIP的源代碼目錄src etif下找到ethernetif.c文件,根據微處理器的硬件修改其中的6個(gè)函數即可。
4.4 應用層程序設計
在嵌入式操作系統μC/OS-II和LwIP的基礎上進(jìn)行應用層程序的設計,主要實(shí)現嵌入式Modbus/TCP網(wǎng)關(guān)的兩個(gè)主要功能:通過(guò)網(wǎng)關(guān)的Web服務(wù)功能對網(wǎng)關(guān)進(jìn)行配置;通過(guò)Modbus/TCP協(xié)議將Modbus串行通信鏈路與以太網(wǎng)相連。
4.4.1 Web服務(wù)功能設計
HTTP協(xié)議實(shí)現的客戶(hù)機/服務(wù)器模式是一種請求/響應行為。嵌入式Modbus/TCP網(wǎng)關(guān)將充當Web服務(wù)器??蛻?hù)機是任意一臺與網(wǎng)關(guān)以太網(wǎng)接口相連的計算機。
(1)網(wǎng)關(guān)復位啟動(dòng)后,μC/OS-II運行T_httpServer任務(wù)(啟動(dòng)Web服務(wù))??蛻?hù)機可以通過(guò)瀏覽器向網(wǎng)關(guān)發(fā)出HTTP的GET方法的請求。
(2)網(wǎng)關(guān)收到該請求后對請求消息中的方法字段進(jìn)行判斷。如果是GET方法,則表示是第一次請求,網(wǎng)關(guān)執行__Handler_HTTPGet( )函數,將固化在片外Flash中的HTTP表單頁(yè)面和網(wǎng)關(guān)的配置信息返回給客戶(hù)機。
(3)用戶(hù)填寫(xiě)網(wǎng)關(guān)發(fā)送的表單頁(yè)面,輸入新的IP地址、子網(wǎng)掩碼和網(wǎng)關(guān)地址,然后點(diǎn)擊提交按鈕,客戶(hù)機向網(wǎng)關(guān)發(fā)出POST方法的請求。其中對用戶(hù)填寫(xiě)數據進(jìn)行驗證的工作是通過(guò)嵌在表單頁(yè)面中的javascript程序實(shí)現的,減輕了網(wǎng)關(guān)的負擔。
(4)網(wǎng)關(guān)收到客戶(hù)機POST方法的請求后擦除片外Flash中原有的配置信息,然后燒寫(xiě)新的信息,從而保證網(wǎng)關(guān)的配置在復位后不會(huì )丟失,配置信息在網(wǎng)關(guān)重啟后生效。
4.4.2 Modbus/TCP協(xié)議轉換功能設計
Modbus/TCP嵌入式網(wǎng)關(guān)復位啟動(dòng)之后會(huì )進(jìn)行一系列的初始化操作,最后啟動(dòng)T_modbusServer任務(wù),該任務(wù)實(shí)現Modbus/TCP幀與串行鏈路中的Modbus RTU幀之間的轉發(fā)。當Modbus/TCP客戶(hù)機需要對串行鏈路中的服務(wù)器進(jìn)行查詢(xún)時(shí),首先會(huì )向Modbus/TCP網(wǎng)關(guān)的502端口發(fā)起連接請求,網(wǎng)關(guān)*到這一請求后會(huì )執行中斷服務(wù)程序,喚醒處于等待狀態(tài)的T_modbusServer任務(wù),并與之建立TCP連接,Modbus/TCP客戶(hù)機就會(huì )發(fā)送一個(gè)Modbus/TCP請求幀并等待網(wǎng)關(guān)的響應信息。網(wǎng)關(guān)在收到Modbus/TCP客戶(hù)機的請求信息后會(huì )對幀進(jìn)行分析處理,最后生成一個(gè) Modbus RTU格式的查詢(xún)幀并發(fā)送到串行鏈路中去。之后繼續*串行鏈路,若收到串行鏈路上的RTU響應幀,則將該幀封裝成Modbus/TCP應答幀,發(fā)送給以太網(wǎng)的Modbus/TCP客戶(hù)機,并斷開(kāi)連接。
5 測試
網(wǎng)關(guān)采用了第三方的Modbus客戶(hù)機測試工具M(jìn)odbusPoll V4.2和服務(wù)器測試工具M(jìn)odbusSlave V4.1進(jìn)行測試。在一臺PC機上運行多個(gè)ModbusSlave程序模擬不同的設備和設備功能狀態(tài),該PC機通過(guò)串行通信鏈路與網(wǎng)關(guān)相連。另一臺PC機運行ModbusPoll程序,模擬Modbus/TCP客戶(hù)機,通過(guò)以太網(wǎng)與網(wǎng)關(guān)相連,并且運行Commview軟件捕捉以太網(wǎng)通信的全過(guò)程并計算響應時(shí)間。測試時(shí)由Modbus/TCP客戶(hù)機通過(guò)網(wǎng)關(guān)循環(huán)查詢(xún)串行通信鏈路中的三臺Modbus服務(wù)器, 串行通信的波特率設置為9 600 b/s,無(wú)校驗位,停止位為1。網(wǎng)關(guān)連續工作48 h未發(fā)生查詢(xún)失敗。根據Commview捕捉到的以太網(wǎng)數據包的間隔時(shí)間可以計算出Modbus/TCP客戶(hù)機一次查詢(xún)響應的實(shí)際時(shí)間約為110 ms。網(wǎng)關(guān)各部分均正常,主控芯片僅微微發(fā)熱。網(wǎng)關(guān)直流5 V電源,輸入電流為55 mA,總功率僅為0.275 W。
隨著(zhù)企業(yè)管理信息化的迅速發(fā)展,越來(lái)越多的工廠(chǎng)和企業(yè)擁有了自己的信息管理網(wǎng)絡(luò )。有用戶(hù)提出將自己的控制系統(如中央空調系統)的管理納入到企業(yè)信息管理系統統一的框架中去。利用嵌入式Modbus/TCP網(wǎng)關(guān)可以在保留現有的控制設備和布線(xiàn)網(wǎng)絡(luò )的情況下,使用戶(hù)通過(guò)企業(yè)的信息網(wǎng)絡(luò )對整個(gè)控制系統進(jìn)行監控,既滿(mǎn)足了用戶(hù)升級的愿望又減少了成本的支出。
tcp/ip相關(guān)文章:tcp/ip是什么
評論