李慧燕,費 鵬,沈昱明
(1.上海理工大學(xué) 光電信息與計算機工程學(xué)院,上海 200093;2.上海自動化儀表股份有限公司,上海 200233)
所謂工業(yè)以太網(wǎng),是根據(jù)國際標(biāo)準(zhǔn)IEEE802.3,設(shè)計應(yīng)用于工業(yè)控制系統(tǒng)現(xiàn)場的需要,它的特點主要有系統(tǒng)安全性高和數(shù)據(jù)實時性強等。近年來,工業(yè)以太網(wǎng)控制技術(shù)和網(wǎng)絡(luò)協(xié)議設(shè)計技術(shù)快速發(fā)展,協(xié)議設(shè)計也有了突破性的進(jìn)展,工業(yè)以太網(wǎng)技術(shù)得以迅速發(fā)展。
Modbus-IDA 組織是由施耐德公司成立的,就是為了專門對Modbus協(xié)議進(jìn)行研究和開發(fā)的。在國內(nèi),Modbus TCP/IP協(xié)議已經(jīng)處于比較成熟的階段,并對其廣泛應(yīng)用。為了讓Modbus廣泛有效地使用,提出了一種支持多線程實時應(yīng)用的方案,即基于AT91R40008的微處理器,在實時操作系統(tǒng)uC/OS-II和ARM7內(nèi)核的軟硬件平臺上,通過移植TCP/IP 協(xié)議棧[1]LwIP 到ARM 開發(fā)平臺并結(jié)合Modbus/TCP協(xié)議實現(xiàn)通信處理器模塊通信的功能。
Modbus/TCP協(xié)議[2-3]是在TCP/IP標(biāo)準(zhǔn)中,應(yīng)用層采用工業(yè)領(lǐng)域事實標(biāo)準(zhǔn)Modbus實現(xiàn)的。經(jīng)過國際公認(rèn),502端口被專門用于Modbus TCP/IP應(yīng)用層,且其串行總線方式支持各種介質(zhì)的rs-232、rs-422、rs-485接口,網(wǎng)絡(luò)通信模式如圖1所示。
在一個客戶端與服務(wù)器的以太網(wǎng)TCP/IP協(xié)議為基礎(chǔ)的網(wǎng)絡(luò)上,Modbus報文傳輸服務(wù)提供商的設(shè)備之間可以進(jìn)行相互的通信,且支持Modbus請求、響應(yīng)、指示和證實這4 種類型的客戶端/服務(wù)器模式報文。Modbus/TCP客戶端首先要通過啟動事務(wù)報文處理,并在網(wǎng)絡(luò)上發(fā)送一個Modbus請求,服務(wù)器端接收到該報文請求,產(chǎn)生Modbus指示信號,當(dāng)服務(wù)器收到該請求時,會自動產(chǎn)生一個Modbus響應(yīng),并向客戶端發(fā)送此響應(yīng),當(dāng)客戶端接收到信息時,也會做出響應(yīng)的反應(yīng),即產(chǎn)生Modbus證實來確認(rèn)已經(jīng)將Modbus請求發(fā)送完畢。
Modbus TCP/IP的通信系統(tǒng)可以包括不同類型的嵌入式設(shè)備,例如TCP/IP 網(wǎng)絡(luò)可以通過網(wǎng)橋或交換機與串行鏈路子網(wǎng)相連,且客戶端串行鏈路和服務(wù)器端串行鏈路通過TCP/IP網(wǎng)關(guān)連接到MODBUS TCP/IP 上,最終可以相互之間進(jìn)行通信,其通信結(jié)構(gòu)如圖2所示。
Modbus/TCP功能組件結(jié)構(gòu)模型[4]主要由四個層次組成,由下到上是TCP/IP棧、TCP管理層、通信應(yīng)用層和用戶應(yīng)用程序。其中,在Modbus/TCP 通信的應(yīng)用層中包含了Modbus客戶端、Modbus服務(wù)器、Modbus客戶端接口和Modbus服務(wù)器接口四個部分,是系統(tǒng)的核心所在。Modbus設(shè)備可以提供客戶端/服務(wù)器Modbus接口和Modbus后臺接口,而后臺接口包括四種數(shù)據(jù)類型:離散輸入Discrete Input、離散輸出Coil、寄存器輸入Input Register和寄存器輸出Holding Register。
Modbus客戶端完成對用戶的遠(yuǎn)程控制和設(shè)備間的交換信息,用戶發(fā)送一個Modbus請求到客戶端接口,然后調(diào)用一個Modbus等待,最后再確認(rèn)該事務(wù)處理。Modbus客戶端接口允許用戶應(yīng)用程序生成,并通過提供的Modbus服務(wù)請求接口訪問Modbus應(yīng)用對象。Modbus服務(wù)器的主要功能是等待接收一個Modbus請求來讀取和寫入,然后生成Modbus響應(yīng)。Modbus的后臺接口僅僅是一個Modbus服務(wù)器的應(yīng)用程序?qū)ο笾g的接口。
圖1 Modbus/TCP的網(wǎng)絡(luò)通信模式Fig.1 The network communication mode of Modbus/TCP
圖2 Modbus/TCP通信結(jié)構(gòu)Fig.2 Modbus/TCP communication structure
考慮到網(wǎng)絡(luò)協(xié)議軟件和實時操作系統(tǒng)與嵌入式工控產(chǎn)品的應(yīng)用發(fā)展需求,硬件平臺采用了美國Atmel公司提供的AT91R40008微控制器和臺灣Asix公司推出的一款基于AX88796 網(wǎng)卡的以太網(wǎng)接口芯片。硬件開發(fā)平臺框圖如圖3所示。
AT91R40008是一款主要面向嵌入式應(yīng)用的高性能32位微處理器,目前在很多嵌入式設(shè)備上已經(jīng)被大量的使用,工作頻率為66 MHz,且集成256kB的片內(nèi)ARM,支持嵌入式ICE 內(nèi)電路仿真以及調(diào)試通信接口,不需要外擴RAM 就可以滿足一般的嵌入式系統(tǒng)的開發(fā)。
AX88796是一款內(nèi)部集成有10/100Mbps自適應(yīng)的介質(zhì)訪問控制層(MAC)[5]和物理層收發(fā)器(PHY)的以太網(wǎng)控制器,與NE2000快速兼容。AX88796與AT91R40008的接口電路如圖4所示。
圖3 系統(tǒng)硬件開發(fā)平臺框圖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技術(shù)制造而成。調(diào)試工具JTAG 是一種國際標(biāo)準(zhǔn)測試協(xié)議,主要用于芯片內(nèi)部測試及對系統(tǒng)進(jìn)行仿真、調(diào)試,AT91R40008 的JTAG 接口共有5 條信號線:NRST、TMS、TCK、TDI、TDO 分別為測試復(fù)位輸入信號、模式選擇、時鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。為了拓展本通信模塊的適用范圍,還應(yīng)該具有能夠下載配置文件的串口,故本通信模塊除了以太網(wǎng)和RS485 接口外,另外還增加了RS232接口。
考慮到系統(tǒng)的實時可靠性和代碼公開的問題,采用代碼開放的低成本的實時嵌入式操作系統(tǒng)uC/OS-II和TCP/IP協(xié)議棧LwIP,并結(jié)合采用Modbus協(xié)議的應(yīng)用層來設(shè)計該系統(tǒng)的軟件結(jié)構(gòu),其軟件架構(gòu)如圖5所示。
為了使實時操作系統(tǒng)uC/OS-II能夠在ARM7的硬件開發(fā)平臺AT91R40008上正確地運行,因此就要先將操作系統(tǒng)移植到該ARM 處理器上。須知的是,在編寫與處理器硬件相關(guān)的代碼時要用匯編語言來完成,而操作系統(tǒng)uC/OS-II的大部分代碼還是要用C 語言來編寫的。在進(jìn)行操作系統(tǒng)的移植過程中,最主要的是實現(xiàn)與處理器息息相關(guān)的代碼部分,具體的有使用C語言編寫的頭文件OS_CPU.H、使用匯編程序語言編寫的源文件OS_CPU_A.S和需要C 程序語言編寫的源文件OS_CPU_C.C。
LwIP的含義是輕型(Light weight)TCP/IP協(xié)議棧,既可以移植到操作系統(tǒng)上,又可以在無操作系統(tǒng)的情況下獨立運行。它是一種源代碼開放的協(xié)議棧,可方便的用于嵌入式系統(tǒng),它的成本較低,是用戶使用的理想選擇。它盡可能少的減少內(nèi)存的使用率和縮小代碼容量,這樣就可以讓LwIP適用于資源有限的小型平臺,典型的如嵌入式系統(tǒng)。為了簡化處理過程和內(nèi)存要求,LwIP對API進(jìn)行了裁減,可以不復(fù)制一些數(shù)據(jù)。
在/include/arch文件下的cc.h等頭文件中存放這一些與處理器相關(guān)的數(shù)據(jù)長度和位順序,它們的定義都與移植操作系統(tǒng)uC/OS-II時定義的數(shù)據(jù)參數(shù)是相符合的。通常在C語言的結(jié)構(gòu)體中,struct遵循四字節(jié)對齊結(jié)構(gòu)。
操作系統(tǒng)模擬層的存在主要是為LwIP協(xié)議棧的移植提供便利條件,具體的移植涉及到的函數(shù)主要包括信號量操作函數(shù)、郵箱操作函數(shù)、實現(xiàn)sys_arch_timeouts()函數(shù)和實現(xiàn)sys_thread_new()函數(shù)這四個部分。
圖5 嵌入式TCP/IP協(xié)議棧軟件架構(gòu)Fig.5 The software architecture of embedded TCP/IP protocol stack
根據(jù)Modbus/TCP規(guī)范提供的參考組件模型,采用分層式軟件設(shè)計方法。其中,在通信應(yīng)用層軟件設(shè)計過程中,通過創(chuàng)建多個線程函數(shù)來實現(xiàn)客戶端/服務(wù)器之間數(shù)據(jù)的傳送。
通信控制器模塊發(fā)送定值信號到定值模塊SP 卡上的線程函數(shù)sndto_sp_card_thread();通過調(diào)用sp_copy_modreg_to_485buf()函數(shù),將Modbus協(xié)議對應(yīng)地址中(Coils,Holding Reg)的數(shù)據(jù)拷貝到要發(fā)送的數(shù)據(jù)緩沖485buf中,然后通過38譯碼器選擇通道,最后調(diào)用sndto_sp_card()函數(shù),通過485發(fā)送數(shù)據(jù)到SP卡上。
通信控制器模塊接收來自定值模塊SP卡的定值狀態(tài)信號的線程函數(shù)recvfrom_sp_card_thread();通過調(diào)用sp_recvfrom_fpga_to_485buf()函數(shù),從相應(yīng)fpga(該芯片通過RS485接口進(jìn)行m 序列的發(fā)送和接收)內(nèi)存中讀取數(shù)據(jù)數(shù)據(jù)放入485buf中,然后調(diào)用sp_copy_485buf_to_modreg()函數(shù),將接收到定值卡SP卡數(shù)據(jù)拷貝到Modbus協(xié)議對應(yīng)的地址中。
通信控制器模塊接收來自調(diào)理模塊AD 卡的調(diào)理信號的線程函數(shù)recvfrom_ad_card_thread();通過調(diào)用ad_recvfrom_fpga_to_485buf()函數(shù),從相應(yīng)fpga內(nèi)存中讀取數(shù)據(jù)放入緩沖485buf中,然后調(diào)用ad_copy_485buf_to_modreg()函數(shù),將接收到調(diào)理卡AD 卡數(shù)據(jù)拷貝到Modbus協(xié)議對應(yīng)的地址中。
Modbus/TCP客戶端線程函數(shù)client_thread();通過調(diào)用conn_netconn()和服務(wù)器建立連接。連接一旦建立,客戶和服務(wù)器之間就可以通過調(diào)用函數(shù)netconn_write()來進(jìn)行Modbus/TCP事務(wù)報文的傳輸,然后調(diào)用netconn_recv()讀應(yīng)答報文,并根據(jù)事務(wù)響應(yīng)情況給用戶應(yīng)用發(fā)送證實信息。最后待數(shù)據(jù)傳輸結(jié)束以后,雙方調(diào)用函數(shù)mbserver_close()關(guān)閉TCP連接。
Modbus/TCP服務(wù)器主線程函數(shù)mbserver_thread();通過調(diào)用函數(shù)netconn_new()創(chuàng)建一個套接字,然后調(diào)用函數(shù)netconn_bind()將該套接字和本地網(wǎng)絡(luò)地址綁定在一起,再調(diào)用函數(shù)netconn_listen()監(jiān)聽TCP 502端口的連接請求,最后調(diào)用函數(shù)mbserver_accept()接收并產(chǎn)生一個新的線程處理連接,然后分析netconn_recv()讀取的報頭并處理請求,等待請求成功或關(guān)閉連接。
介紹了在實時嵌入式操作系統(tǒng)uC/OS-II和ARM7內(nèi)核的軟硬件平臺上,結(jié)合Modbus/TCP協(xié)議實現(xiàn)通信處理器模塊信號傳輸?shù)姆椒?。將uC/OS-II實時操作系統(tǒng)移植到ARM7AT91R40008系列的處理器內(nèi)核上,再將嵌入式TCP/IP協(xié)議棧LwIP移植到該操作系統(tǒng),實現(xiàn)了一種多線程的實時應(yīng)用協(xié)議棧。在通訊應(yīng)用層上,則在將Modbus信息幀嵌入到TCP幀中,分析研究Modbus/TCP協(xié)議通信結(jié)構(gòu)模型,最終簡單可靠地實現(xiàn)了嵌入式Modbus/TCP客戶端/服務(wù)器端之間的通信。
[1] 王海,張娟,朱曉陽,等.TCP/IP協(xié)議族[M].4版.北京:清華大學(xué)出版社,2011:300-319.
[2] 王可鵬.基于Modbus TCP/IP通信的實現(xiàn)[J].電腦知識與技術(shù),2008,4(3):553-555.
[3] 司馬莉萍,賀貴明,陳明榜.基于Modbus/TCP協(xié)議的工業(yè)控制通信[J].計算機應(yīng)用,2005,25(S1):29-31.
[4] 金青,戴勝華,歐陽勁松.基于Modbus/TCP的工業(yè)以太網(wǎng)通信[J].儀器儀表標(biāo)準(zhǔn)化與計量,2006(1):22-24.
[5] 宋玉貴,康婷颋.基于ZigBee的天幕靶信號處理裝置的設(shè)計與研究[J].光學(xué)儀器,2012,34(1):55-58.
[6] 王曉鳴,王樹新,張宏偉.實時操作系統(tǒng)uC_OS_II在ARM 上的移植[J].機電一體化,2007,13(1):56-58.
[7] 闕大順,王近濤.LwIP協(xié)議在uC/OS-II系統(tǒng)上的移植與實現(xiàn)[J].艦船電子工程,2006,26(4):89-91.
[8] DUNKELS A.TCP/IP協(xié)議棧LwIP的設(shè)計與實現(xiàn)[M].焦海波,譯.北京:北京航空航天大學(xué)出版社,2006:1-12.