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