李慧燕,費 鵬,沈昱明
(1.上海理工大學 光電信息與計算機工程學院,上海 200093;2.上海自動化儀表股份有限公司,上海 200233)
所謂工業以太網,是根據國際標準IEEE802.3,設計應用于工業控制系統現場的需要,它的特點主要有系統安全性高和數據實時性強等。近年來,工業以太網控制技術和網絡協議設計技術快速發展,協議設計也有了突破性的進展,工業以太網技術得以迅速發展。
Modbus-IDA 組織是由施耐德公司成立的,就是為了專門對Modbus協議進行研究和開發的。在國內,Modbus TCP/IP協議已經處于比較成熟的階段,并對其廣泛應用。為了讓Modbus廣泛有效地使用,提出了一種支持多線程實時應用的方案,即基于AT91R40008的微處理器,在實時操作系統uC/OS-II和ARM7內核的軟硬件平臺上,通過移植TCP/IP 協議棧[1]LwIP 到ARM 開發平臺并結合Modbus/TCP協議實現通信處理器模塊通信的功能。
Modbus/TCP協議[2-3]是在TCP/IP標準中,應用層采用工業領域事實標準Modbus實現的。經過國際公認,502端口被專門用于Modbus TCP/IP應用層,且其串行總線方式支持各種介質的rs-232、rs-422、rs-485接口,網絡通信模式如圖1所示。
在一個客戶端與服務器的以太網TCP/IP協議為基礎的網絡上,Modbus報文傳輸服務提供商的設備之間可以進行相互的通信,且支持Modbus請求、響應、指示和證實這4 種類型的客戶端/服務器模式報文。Modbus/TCP客戶端首先要通過啟動事務報文處理,并在網絡上發送一個Modbus請求,服務器端接收到該報文請求,產生Modbus指示信號,當服務器收到該請求時,會自動產生一個Modbus響應,并向客戶端發送此響應,當客戶端接收到信息時,也會做出響應的反應,即產生Modbus證實來確認已經將Modbus請求發送完畢。
Modbus TCP/IP的通信系統可以包括不同類型的嵌入式設備,例如TCP/IP 網絡可以通過網橋或交換機與串行鏈路子網相連,且客戶端串行鏈路和服務器端串行鏈路通過TCP/IP網關連接到MODBUS TCP/IP 上,最終可以相互之間進行通信,其通信結構如圖2所示。
Modbus/TCP功能組件結構模型[4]主要由四個層次組成,由下到上是TCP/IP棧、TCP管理層、通信應用層和用戶應用程序。其中,在Modbus/TCP 通信的應用層中包含了Modbus客戶端、Modbus服務器、Modbus客戶端接口和Modbus服務器接口四個部分,是系統的核心所在。Modbus設備可以提供客戶端/服務器Modbus接口和Modbus后臺接口,而后臺接口包括四種數據類型:離散輸入Discrete Input、離散輸出Coil、寄存器輸入Input Register和寄存器輸出Holding Register。
Modbus客戶端完成對用戶的遠程控制和設備間的交換信息,用戶發送一個Modbus請求到客戶端接口,然后調用一個Modbus等待,最后再確認該事務處理。Modbus客戶端接口允許用戶應用程序生成,并通過提供的Modbus服務請求接口訪問Modbus應用對象。Modbus服務器的主要功能是等待接收一個Modbus請求來讀取和寫入,然后生成Modbus響應。Modbus的后臺接口僅僅是一個Modbus服務器的應用程序對象之間的接口。

圖1 Modbus/TCP的網絡通信模式Fig.1 The network communication mode of Modbus/TCP

圖2 Modbus/TCP通信結構Fig.2 Modbus/TCP communication structure
考慮到網絡協議軟件和實時操作系統與嵌入式工控產品的應用發展需求,硬件平臺采用了美國Atmel公司提供的AT91R40008微控制器和臺灣Asix公司推出的一款基于AX88796 網卡的以太網接口芯片。硬件開發平臺框圖如圖3所示。
AT91R40008是一款主要面向嵌入式應用的高性能32位微處理器,目前在很多嵌入式設備上已經被大量的使用,工作頻率為66 MHz,且集成256kB的片內ARM,支持嵌入式ICE 內電路仿真以及調試通信接口,不需要外擴RAM 就可以滿足一般的嵌入式系統的開發。
AX88796是一款內部集成有10/100Mbps自適應的介質訪問控制層(MAC)[5]和物理層收發器(PHY)的以太網控制器,與NE2000快速兼容。AX88796與AT91R40008的接口電路如圖4所示。

圖3 系統硬件開發平臺框圖Fig.3 The block diagram of system hardware development platform

圖4 AX88796與AT91R40008的接口電路Fig.4 The interface circuit of AX88796and AT91R40008
片外Flash擴展選用SST39VF160,是一個1 MB 16位的CMOS多功能Flash(MPF)器件,由SST特有的高性能SuperFlash技術制造而成。調試工具JTAG 是一種國際標準測試協議,主要用于芯片內部測試及對系統進行仿真、調試,AT91R40008 的JTAG 接口共有5 條信號線:NRST、TMS、TCK、TDI、TDO 分別為測試復位輸入信號、模式選擇、時鐘、數據輸入和數據輸出線。為了拓展本通信模塊的適用范圍,還應該具有能夠下載配置文件的串口,故本通信模塊除了以太網和RS485 接口外,另外還增加了RS232接口。
考慮到系統的實時可靠性和代碼公開的問題,采用代碼開放的低成本的實時嵌入式操作系統uC/OS-II和TCP/IP協議棧LwIP,并結合采用Modbus協議的應用層來設計該系統的軟件結構,其軟件架構如圖5所示。
為了使實時操作系統uC/OS-II能夠在ARM7的硬件開發平臺AT91R40008上正確地運行,因此就要先將操作系統移植到該ARM 處理器上。須知的是,在編寫與處理器硬件相關的代碼時要用匯編語言來完成,而操作系統uC/OS-II的大部分代碼還是要用C 語言來編寫的。在進行操作系統的移植過程中,最主要的是實現與處理器息息相關的代碼部分,具體的有使用C語言編寫的頭文件OS_CPU.H、使用匯編程序語言編寫的源文件OS_CPU_A.S和需要C 程序語言編寫的源文件OS_CPU_C.C。
LwIP的含義是輕型(Light weight)TCP/IP協議棧,既可以移植到操作系統上,又可以在無操作系統的情況下獨立運行。它是一種源代碼開放的協議棧,可方便的用于嵌入式系統,它的成本較低,是用戶使用的理想選擇。它盡可能少的減少內存的使用率和縮小代碼容量,這樣就可以讓LwIP適用于資源有限的小型平臺,典型的如嵌入式系統。為了簡化處理過程和內存要求,LwIP對API進行了裁減,可以不復制一些數據。
在/include/arch文件下的cc.h等頭文件中存放這一些與處理器相關的數據長度和位順序,它們的定義都與移植操作系統uC/OS-II時定義的數據參數是相符合的。通常在C語言的結構體中,struct遵循四字節對齊結構。
操作系統模擬層的存在主要是為LwIP協議棧的移植提供便利條件,具體的移植涉及到的函數主要包括信號量操作函數、郵箱操作函數、實現sys_arch_timeouts()函數和實現sys_thread_new()函數這四個部分。

圖5 嵌入式TCP/IP協議棧軟件架構Fig.5 The software architecture of embedded TCP/IP protocol stack
根據Modbus/TCP規范提供的參考組件模型,采用分層式軟件設計方法。其中,在通信應用層軟件設計過程中,通過創建多個線程函數來實現客戶端/服務器之間數據的傳送。
通信控制器模塊發送定值信號到定值模塊SP 卡上的線程函數sndto_sp_card_thread();通過調用sp_copy_modreg_to_485buf()函數,將Modbus協議對應地址中(Coils,Holding Reg)的數據拷貝到要發送的數據緩沖485buf中,然后通過38譯碼器選擇通道,最后調用sndto_sp_card()函數,通過485發送數據到SP卡上。
通信控制器模塊接收來自定值模塊SP卡的定值狀態信號的線程函數recvfrom_sp_card_thread();通過調用sp_recvfrom_fpga_to_485buf()函數,從相應fpga(該芯片通過RS485接口進行m 序列的發送和接收)內存中讀取數據數據放入485buf中,然后調用sp_copy_485buf_to_modreg()函數,將接收到定值卡SP卡數據拷貝到Modbus協議對應的地址中。
通信控制器模塊接收來自調理模塊AD 卡的調理信號的線程函數recvfrom_ad_card_thread();通過調用ad_recvfrom_fpga_to_485buf()函數,從相應fpga內存中讀取數據放入緩沖485buf中,然后調用ad_copy_485buf_to_modreg()函數,將接收到調理卡AD 卡數據拷貝到Modbus協議對應的地址中。
Modbus/TCP客戶端線程函數client_thread();通過調用conn_netconn()和服務器建立連接。連接一旦建立,客戶和服務器之間就可以通過調用函數netconn_write()來進行Modbus/TCP事務報文的傳輸,然后調用netconn_recv()讀應答報文,并根據事務響應情況給用戶應用發送證實信息。最后待數據傳輸結束以后,雙方調用函數mbserver_close()關閉TCP連接。
Modbus/TCP服務器主線程函數mbserver_thread();通過調用函數netconn_new()創建一個套接字,然后調用函數netconn_bind()將該套接字和本地網絡地址綁定在一起,再調用函數netconn_listen()監聽TCP 502端口的連接請求,最后調用函數mbserver_accept()接收并產生一個新的線程處理連接,然后分析netconn_recv()讀取的報頭并處理請求,等待請求成功或關閉連接。
介紹了在實時嵌入式操作系統uC/OS-II和ARM7內核的軟硬件平臺上,結合Modbus/TCP協議實現通信處理器模塊信號傳輸的方法。將uC/OS-II實時操作系統移植到ARM7AT91R40008系列的處理器內核上,再將嵌入式TCP/IP協議棧LwIP移植到該操作系統,實現了一種多線程的實時應用協議棧。在通訊應用層上,則在將Modbus信息幀嵌入到TCP幀中,分析研究Modbus/TCP協議通信結構模型,最終簡單可靠地實現了嵌入式Modbus/TCP客戶端/服務器端之間的通信。
[1] 王海,張娟,朱曉陽,等.TCP/IP協議族[M].4版.北京:清華大學出版社,2011:300-319.
[2] 王可鵬.基于Modbus TCP/IP通信的實現[J].電腦知識與技術,2008,4(3):553-555.
[3] 司馬莉萍,賀貴明,陳明榜.基于Modbus/TCP協議的工業控制通信[J].計算機應用,2005,25(S1):29-31.
[4] 金青,戴勝華,歐陽勁松.基于Modbus/TCP的工業以太網通信[J].儀器儀表標準化與計量,2006(1):22-24.
[5] 宋玉貴,康婷颋.基于ZigBee的天幕靶信號處理裝置的設計與研究[J].光學儀器,2012,34(1):55-58.
[6] 王曉鳴,王樹新,張宏偉.實時操作系統uC_OS_II在ARM 上的移植[J].機電一體化,2007,13(1):56-58.
[7] 闕大順,王近濤.LwIP協議在uC/OS-II系統上的移植與實現[J].艦船電子工程,2006,26(4):89-91.
[8] DUNKELS A.TCP/IP協議棧LwIP的設計與實現[M].焦海波,譯.北京:北京航空航天大學出版社,2006:1-12.