譚亞,鄧忠華
(華中科技大學自動化學院,武漢 430074)
基于Modbus/TCP協(xié)議實現(xiàn)人機界面與下位機通信
譚亞,鄧忠華
(華中科技大學自動化學院,武漢 430074)
在以通用伺服電機控制系統(tǒng)為下位機的基礎上,開發(fā)了以實時內(nèi)核μC/OS-II、DSP、CPLD控制模塊為核心的軟硬件平臺。通過移植uIP協(xié)議棧到DSP,在通信應用層上將Modbus幀嵌入到TCP幀中,簡單可靠地實現(xiàn)了Modbus/TCP協(xié)議。同時將Modbus/TCP協(xié)議與μC/OS-II實時內(nèi)核進行整合,更好地保證了系統(tǒng)調(diào)度的實時性。
Modbus/TCP;工業(yè)以太網(wǎng);uIP;μC/OS-II;TMS320F28335
隨著工業(yè)以太網(wǎng)技術的快速發(fā)展,利用工業(yè)以太網(wǎng)與Internet連接可實現(xiàn)無縫集成的優(yōu)勢,嵌入式Internet技術已經(jīng)在工控領域得到了廣泛應用。工業(yè)以太網(wǎng)是基于IEEE802.3 (Ethernet)的強大的區(qū)域和單元網(wǎng)絡。其具有價格低廉、穩(wěn)定可靠、通信速率高、軟硬件產(chǎn)品豐富、應用廣泛以及支持技術成熟等優(yōu)點,并且支持幾乎所有流行的網(wǎng)絡協(xié)議。目前,工業(yè)以太網(wǎng)技術在網(wǎng)絡的視頻傳輸、人機界面(HMI),以及觸摸屏通信等方面都得到了及時的應用。
以太網(wǎng)技術應用于工業(yè)控制時,體現(xiàn)在應用層的是實時通信、用于系統(tǒng)組態(tài)的對象,以及工程模型的應用協(xié)議。目前,還沒有統(tǒng)一的應用層協(xié)議,但受到廣泛支持并已經(jīng)開發(fā)出相應產(chǎn)品的主要有4種協(xié)議:HSE、Modbus TCP/IP、ProfINet、Ethernet/IP。
通用伺服電機控制系統(tǒng)的硬件架構(gòu)如圖1所示。
圖1 系統(tǒng)硬件架構(gòu)圖
系統(tǒng)由DSP控制模塊、CPLD輔助控制模塊、CAN通信模塊、網(wǎng)絡通信模塊、碼盤信號處理模塊、電源模塊、電平轉(zhuǎn)換模塊、D/A轉(zhuǎn)換模塊、I/O擴展模塊、通道號顯示模塊等組成。其中,網(wǎng)絡通信模塊的硬件設計如圖2所示。
圖2 網(wǎng)絡模塊硬件設計原理圖
采用TI公司工業(yè)控制領域先進的32位浮點DSP芯片TMS320F28335為主控芯片,網(wǎng)卡芯片采用臺灣DAVICOM公司的DM9000A芯片,人機界面采用威綸通觸摸屏。DSP主要完成對網(wǎng)卡芯片的收發(fā)控制、應用層數(shù)據(jù)處理、控制算法的實現(xiàn)等功能;網(wǎng)卡芯片實現(xiàn)下位機與人機界面之間數(shù)據(jù)的網(wǎng)絡收發(fā);威倫通觸摸屏完成數(shù)據(jù)顯示、參數(shù)設定,以及報警功能。
2.1 Modbus/TCP協(xié)議簡介
Modbus/TCP協(xié)議由施耐德電氣定義,并由Modbus-IDA支持,它是在TCP/IP網(wǎng)絡上應用Modbus協(xié)議。Modbus/TCP協(xié)議是Modbus的派生產(chǎn)品,在OSI模型中,它位于第7層應用層,已成為工業(yè)自動化領域中網(wǎng)絡信息傳輸?shù)耐ㄓ脴藴?。Modbus TCP/IP通信設備連接在以太網(wǎng)上,默認使用TCP502端口。其數(shù)據(jù)幀格式如圖3所示,由MBAP報文頭、功能碼和數(shù)據(jù)三部分組成,舍去了Modbus協(xié)議中的差錯校驗域,由TCP/IP協(xié)議來保證報文的正確性[6]。
圖3 Modbus/TCP的消息幀結(jié)構(gòu)
其中,MBAP報文頭為7個字節(jié),包括事務處理標識符、協(xié)議標識符、長度和單元標識符。由于Modbus/TCP的消息幀用于與人機界面之間的通信,其所需功能碼主要包括:01(讀單個或多個線圈)、03(讀保持寄存器)、05(寫單個線圈)、06(寫單個寄存器)、16(寫多個寄存器)等。
2.2 網(wǎng)卡驅(qū)動的編寫
在DM9000A中,只有兩個可以直接被處理器訪問的寄存器,這里命名為INDEX端口和DATA端口。事實上,DM9000A中有許多控制和狀態(tài)寄存器,但它們都不能直接被處理器訪問,訪問這些控制、狀態(tài)寄存器的方法是:
① 將寄存器的地址寫到INDEX端口;
② 從DATA端口讀寫寄存器中的數(shù)據(jù)。
其實,INDEX端口和DATA端口是由芯片上的CMD引腳來區(qū)分的,低電平時為INDEX端口,高電平時為DATA端口。芯片CMD引腳與DSP地址總線上的A2引腳相連,其16根數(shù)據(jù)線與DSP的數(shù)據(jù)總線相連,通過DSP總線接口來配置DM9000A的讀寫時序的方法,可以省去通過I/O口模擬總線時序來實現(xiàn)寄存器讀寫的麻煩。
#define DM9000_INDEX (*(volatile unsigned int *)0x200000)
#define DM9000_DATA(*(volatile unsigned int *)0x200004)
void iow(unsigned char reg, unsigned char data){
//向DM9000寄存器寫數(shù)據(jù)(字節(jié)為單位)
DM9000_INDEX=reg;
//將寄存器地址寫到INDEX端口
DELAY_US(1); //延時1 μs
DM9000_DATA=data;
//將數(shù)據(jù)寫到DATA端口,寄存器
}
unsigned char ior(unsigned char reg){
//從DM9000寄存器讀數(shù)據(jù)(字節(jié)為單位)
DM9000_INDEX=reg;
//將寄存器地址寫到INDEX端口
DELAY_US(1);
return DM9000_DATA;
//將數(shù)據(jù)從寄存器中讀出
}
對于網(wǎng)卡驅(qū)動部分,只需實現(xiàn)三個函數(shù):dm9000x_inital()網(wǎng)卡初始化函數(shù),初始化網(wǎng)卡的工作模式;dm9000x_sendpacket()網(wǎng)卡發(fā)送數(shù)據(jù)包函數(shù),將網(wǎng)卡收到的數(shù)據(jù)放入全局緩存區(qū)uip_buf中,返回包的長度賦給uip_len;dm9000x_receivepacket()網(wǎng)卡接收數(shù)據(jù)包函數(shù),將全局緩存區(qū)uip_buf里的數(shù)據(jù)(長度放在uip_len中)發(fā)送出去。
2.3 uIP協(xié)議棧的移植
uIP由瑞典計算機科學學院(網(wǎng)絡嵌入式系統(tǒng)小組)的Adam Dunkels開發(fā)。其源代碼由C語言編寫,并完全公開。uIP協(xié)議棧去掉了完整的TCP/IP中不常用的功能,簡化了通信流程,但保留了網(wǎng)絡通信必須使用的協(xié)議,設計重點放在了IP/TCP/ICMP/UDP/ARP這些網(wǎng)絡層和傳輸層協(xié)議上,保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。
2.3.1 uIP架構(gòu)
uIP相當于一個代碼庫,通過一系列的函數(shù)實現(xiàn)與底層硬件和高層應用程序的通信,對于整個系統(tǒng)來說它內(nèi)部的協(xié)議組是透明的,從而增強了協(xié)議的通用性[7]。uIP協(xié)議棧與系統(tǒng)底層和高層應用之間的關系如圖4所示。
圖4 uIP在系統(tǒng)中的位置
2.3.2 uIP協(xié)議在DSP上的移植
移植uIP時,首先需要配置一些選項,目的是適應具體的硬件平臺。uipopt.h/uip-conf.h是配置文件,包括:本地的IP地址、網(wǎng)關地址、MAC地址、全局緩沖區(qū)的大小、支持的最大連接數(shù)、偵聽數(shù)、ARP表大小、基本數(shù)據(jù)類型定義等[2]。
其次,將之前編寫好的網(wǎng)卡驅(qū)動函數(shù)與tapdev.c文件中相應的函數(shù)關聯(lián)起來。
接著,由于uIP協(xié)議棧需要使用時鐘,為TCP和ARP的定時器服務。因此使用DSP的通用定時器0作時鐘源,每10 ms讓系統(tǒng)嘀嗒數(shù)sys_ticks加1,這樣,50次計數(shù)(0.5 s)滿后可以調(diào)用TCP的定時處理程序,10 s后可以調(diào)用ARP老化程序。
然后,根據(jù)實際所需的功能對源uIP協(xié)議進行相應的裁剪。關閉了IPV6、IP分片重裝、UDP、ICMP,以及統(tǒng)計信息和日志記錄等功能,以減少源代碼的總量。
另外,針對C28xx系列DSP中char型數(shù)據(jù)為16位,與uIP源協(xié)議char型數(shù)據(jù)默認為8位之間所存在的不兼容問題,進行了改進。
2.4 μC/OS-II的移植
對μC/OS-II實時操作系統(tǒng)的移植,只需要根據(jù)現(xiàn)有的硬件平臺修改其中與處理器相關的代碼,包括OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三個文件[5]。
(1) OS_CPU.H
OS_CPU.H包括了用#define語句定義的與處理器相關的常數(shù)、宏,以及數(shù)據(jù)類型。其中,μC/OS-II內(nèi)核為了處理臨界段代碼或者訪問臨界資源,定義了2個宏OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()來分別關中斷和開中斷。
這兩個宏的實現(xiàn)方法如下:
#define OS_ENTER_CRITICAL() asm(" SETC INTM ")
#define OS_EXIT_CRITICAL() asm(" CLRC INTM ")
(2) OS_CPU_C.C
OS_CPU_C.C文件中有10個函數(shù)要根據(jù)用戶的需要編寫,其中最為重要的是函數(shù)OSTaskStkInit()。函數(shù)OSTaskStkInit()被OSTaskCreate()和OSTaskCreateExt()所調(diào)用,用于初始化任務的堆棧結(jié)構(gòu)。初始化之后的堆棧,就像是剛剛發(fā)生過一次中斷,所有的寄存器值均保存在堆棧中。中斷發(fā)生時,TMS320F28335保存相關寄存器入棧的順序為ST0、T、AL、AH、PL、PH、AR0、AR1、DP、ST1、DBGSTAT、PC和IER,并且其堆棧是從低地址往高地址遞增的[3]。顯然,用戶在將寄存器壓入堆棧時,必須嚴格依照同樣的順序。
(3) OS_CPU_A.ASM
μC/OS-II的移植要求用戶編寫4個簡單的匯編函數(shù),這也是移植過程的重點和難點。它們分別為:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
其中,OSStartHighRdy()用來被OSStart()調(diào)用,使就緒態(tài)任務中優(yōu)先級最高的任務開始運行。OSCtxSw()的作用是實現(xiàn)任務的任務級切換,其被OS_Sched()調(diào)用,主要完成的功能為:保存處理器寄存器,在當前任務控制塊中保存當前任務的堆棧指針,載入將要重新開始運行的任務的堆棧指針,恢復新任務堆棧中處理器所有寄存器的值,返回中斷。OSIntCtxSw()為任務中斷級切換函數(shù),其被OSIntExit()調(diào)用,完成的功能與OSCtxSw()函數(shù)基本一致,只是不必重復保存處理器寄存器。OSTickISR()在系統(tǒng)中實現(xiàn)時間的延時和超時功能,對用戶要求提供一個周期性的時鐘源,通常在DSP中使用通用定時器來實現(xiàn)。
2.5 軟件模塊的整合
有了先前的準備工作,現(xiàn)在把各個模塊整合起來,uIP模塊、網(wǎng)卡驅(qū)動模塊、μC/OS-II模塊、Modbus/TCP應用層模塊均已移植進來?,F(xiàn)利用μC/OS-II創(chuàng)建三個任務,即網(wǎng)絡主任務(NET_MAIN_TASK)、網(wǎng)卡數(shù)據(jù)包接收任務(ETH_RE_TASK),以及周期時鐘任務(PERIO_TASK)。通過這三個任務之間相互協(xié)調(diào),實現(xiàn)了數(shù)據(jù)從鏈路層到應用層或從應用層到鏈路層的傳遞[4]。程序中三個主要任務之間的關系和各自的功能如圖5所示。
圖5 軟件模塊整合流程圖
實驗時,選用基于TCP/IP協(xié)議的OnceModbus上位機調(diào)試軟件來模擬人機界面。下位機服務器的IP地址為192.168.101.16/502,圖6為PC客戶端對服務器ping通信的結(jié)果,結(jié)果顯示通信良好,丟包率為0。
圖6 對服務器ping通信的結(jié)果
圖7為OnceModbus上位機調(diào)試軟件與下位機服務器的通信結(jié)果,結(jié)果顯示調(diào)試軟件從服務器準確無誤地讀取8個寄存器的值。
圖7 OnceModbus與服務器通信的結(jié)果
[1] 張益南,王文海.嵌入式Modbus/TCP協(xié)議的研究與實現(xiàn)[J].組合機床與自動化加工技術,2008(2):26-29.
[2] 劉春鳳,張代遠. μC/OS-II下協(xié)議棧uIP的移植與應用[J].計算機技術與發(fā)展,2012,22(9): 143-145.
[3] 陳立強,吳祖堂,劉瑜.嵌入式操作系統(tǒng)在TMS320F28335平臺上的移植[J].計算機技術與發(fā)展,2013,23(6):7-11.
[4] 陳禾.基于μC_OSⅡ和TCP_IP協(xié)議的網(wǎng)絡測控平臺的研究與設計[D].重慶:重慶大學,2005.
[5] Jean J Labrosse.嵌入式實時操作系統(tǒng)μC/OS-II[M].2版.邵貝貝,等譯.北京:北京航空航天大學出版社,2003:280-332.
[6] Modbus-IDA. MODBUS Messaging on TCP/IP Implementation Guide V1.0b [EB/OL].[2014-02-25].http://www.modbus.org.
[7] W Richard Stevens.TCP/IP詳解卷1:協(xié)議[M].范建華,胥光輝,張濤,等譯.北京:機械工業(yè)出版社,2009.
譚亞(碩士研究生),主要研究方向為計算機集成與網(wǎng)絡技術;鄧忠華(教授),主要研究方向為套印智能控制、電氣傳動系統(tǒng)數(shù)字化控制、復雜非線性系統(tǒng)建模與控制等。
Implementation of Human-machine Interface Communication with PLC Based on Modbus/TCP Protocol
Tan Ya,Deng Zhonghua
(College of Automation, Huazhong University of Science and Technology, Wuhan 430074,China)
Taking general servo motor control system as the lower computer, the software and hardware platform based on real-time kernel μC/OS-II,DSP and CPLD controller is developed.By transplanting uIP protocol stack to DSP, the Modbus frame is embedded to the TCP frame in the communication application layer,the Modbus/TCP protocol is simply and reliably realized.Meanwhile, the Modbus/TCP protocol and the real-time kernel μC/OS-II are integrated in order to ensure the real-time scheduling of system.
Modbus/TCP; Industrial Ethernet; uIP; μC/OS-II; TMS320F28335
TP273
A
2014-02-25)