金 陵,張衛(wèi)青,王興龍
(重慶理工大學(xué)汽車零部件制造與檢測(cè)教育部重點(diǎn)實(shí)驗(yàn)室,重慶 400054)
隨著數(shù)控機(jī)床的高速發(fā)展,數(shù)控系統(tǒng)的通用功能已不能滿足高檔機(jī)床的特殊需求,對(duì)開放式的數(shù)控系統(tǒng)進(jìn)行二次開發(fā)已成為當(dāng)今數(shù)控技術(shù)的研究熱點(diǎn)[1-2]。
目前,我國(guó)大部分高端機(jī)床均采用西門子840D數(shù)控系統(tǒng),為了適應(yīng)個(gè)性化市場(chǎng)的需要,國(guó)內(nèi)學(xué)者針對(duì)各種機(jī)床不同的控制要求,對(duì)西門子840D數(shù)控系統(tǒng)的二次開發(fā)方法進(jìn)行了一系列研究。其中,大部分學(xué)者利用 HMI Programming Package開發(fā)工具,通過HMI Advanced標(biāo)準(zhǔn)軟件開發(fā)標(biāo)準(zhǔn)應(yīng)用程序Regie及Sequence Control的嵌入式應(yīng)用軟件,但其開發(fā)方式存在一定局限性,一些標(biāo)準(zhǔn)類模板及窗體都不允許更改,語言動(dòng)態(tài)鏈接庫的建立也較為煩瑣。而單獨(dú)采用VC++開發(fā)標(biāo)準(zhǔn)的Windows應(yīng)用軟件則能很好地解決這些問題,且所開發(fā)的人機(jī)界面更加人性化、自由化、美觀化。因此,本文利用西門子數(shù)控系統(tǒng)提供的HMI軟件包,研究利用面向?qū)ο蟮木幊陶Z言VC進(jìn)行高端機(jī)床的專用人機(jī)界面制作,并開發(fā)了適用于840D數(shù)控系統(tǒng)的人機(jī)界面[3]。
根據(jù)相關(guān)機(jī)床的加工特點(diǎn)及功能要求,設(shè)計(jì)整個(gè)界面的總體框架,如圖1所示。圖1中顯示了界面中各窗口的調(diào)用關(guān)系及各軟件與窗口狀態(tài)的聯(lián)系[3]。
圖1 界面總體框架
圖1中,主界面為狀態(tài)監(jiān)控,包括各坐標(biāo)軸坐標(biāo)實(shí)時(shí)顯示以及報(bào)警服務(wù)、循環(huán)、余程、加工狀態(tài)等框架;數(shù)據(jù)管理主要完成機(jī)床加工數(shù)據(jù)文件的導(dǎo)入導(dǎo)出,實(shí)現(xiàn)數(shù)據(jù)文件中各項(xiàng)參數(shù)的查看、編輯等功能;程序主要控制零件程序的運(yùn)行、顯示和編輯功能;結(jié)果分析是對(duì)相關(guān)數(shù)據(jù)的處理及結(jié)果的顯示。用戶可以根據(jù)實(shí)際要求在主界面上繼續(xù)添加框架,每一個(gè)框架都是一個(gè)界面,每一個(gè)界面都是由數(shù)個(gè)對(duì)話框組成,它們之間都是相互聯(lián)系、協(xié)同工作的。
界面采用MFC基于對(duì)話框形式完成設(shè)計(jì)及數(shù)據(jù)通訊服務(wù)。通過數(shù)控通訊服務(wù)器(NCDDE Server)、數(shù)控內(nèi)核(NCK)、可編程序控制器(PLC)等組件實(shí)現(xiàn)人機(jī)界面交互功能。開發(fā)前,只需在PC機(jī)上安裝VC++編程軟件,所開發(fā)出的標(biāo)準(zhǔn)Windows應(yīng)用程序即能在西門子數(shù)控系統(tǒng)下運(yùn)行。
根據(jù)相關(guān)機(jī)床的實(shí)際要求編輯各對(duì)話框界面,并且在VC環(huán)境下直接與NCU、PLC建立連接,實(shí)現(xiàn)界面與840D數(shù)控系統(tǒng)的通訊。所開發(fā)軟件的主要功能包括:人機(jī)界面上各軟件定義及與機(jī)床操作面板上鍵盤響應(yīng);對(duì)NCU中各種變量的訪問,如軸坐標(biāo)值、進(jìn)給率、余程等;NCU文件讀取及對(duì)R參數(shù)的訪問;對(duì)PLC中各種變量的訪問,如I/O口、標(biāo)志區(qū)M、數(shù)據(jù)塊DB等。各個(gè)應(yīng)用模塊都另行開發(fā)且脫離于西門子HMI Programming Package開發(fā)框架,即獨(dú)立于西門子數(shù)控系統(tǒng)的主控制和順序控制之外。與傳統(tǒng)的VB語言開發(fā)相比較,其通用性更強(qiáng)、開發(fā)更加自由,并且語言動(dòng)態(tài)顯示更加簡(jiǎn)便[4-8]。
PC機(jī)上獨(dú)立開發(fā)的人機(jī)界面在數(shù)控系統(tǒng)中運(yùn)行時(shí),控件的文本不能顯示中文。不同于傳統(tǒng)開發(fā)方式,在VC環(huán)境下無需創(chuàng)建DLL語言動(dòng)態(tài)鏈接庫,采用UNICODE編程就可以在西門子系統(tǒng)下動(dòng)態(tài)顯示中文,并且能使界面同時(shí)支持多種語言。VC++6.0中,具體設(shè)置步驟:打開[工程]->[設(shè)置…]對(duì)話框,在 C/C++標(biāo)簽對(duì)話框的“預(yù)處理程序定義”中去除_MBCS,加上_UNICODE,UNIC-ODE,然后需要設(shè)置Unicode專用的程序入口點(diǎn),即在Link頁的Output類別的Entry-Point里填上wWinMainCRTStartup。一般情況下輸入字符時(shí)加上_T宏,則能兼容ANSI和Unicode字符。
在VC環(huán)境下,人機(jī)界面可直接利用西門子數(shù)控系統(tǒng)服務(wù)器提供的接口訪問 NCU、PLC、MMC103中的變量和文件,實(shí)現(xiàn)需要的NCK/PLC變量存取。同時(shí),在執(zhí)行程序時(shí),直接通過VC程序向數(shù)控系統(tǒng)發(fā)出指令,指示機(jī)床動(dòng)作。
2.2.1 NCK/PLC 變量存取
在人機(jī)界面上,需要實(shí)時(shí)更新采集到的數(shù)據(jù),把NCK中的變量及數(shù)據(jù)的有關(guān)信息及時(shí)反映到顯示屏上,從而使操作者能對(duì)機(jī)床狀態(tài)進(jìn)行管理和操作。NCK中采集的變量和數(shù)據(jù)主要包括系統(tǒng)變量、系統(tǒng)狀態(tài)數(shù)據(jù)、通道專用數(shù)據(jù)、軸狀態(tài)數(shù)據(jù)、驅(qū)動(dòng)狀態(tài)數(shù)據(jù)、刀具和刀具庫數(shù)據(jù)、機(jī)床和設(shè)定數(shù)據(jù)、參數(shù)、伺服、診斷數(shù)據(jù)等。
1)根據(jù)動(dòng)態(tài)數(shù)據(jù)交換技術(shù)(DDE)的優(yōu)點(diǎn)及具體要求,在VC環(huán)境下通過DDE來建立連接,獲取當(dāng)前各軸的坐標(biāo)值、進(jìn)給速度、余程等數(shù)據(jù)。首先需要對(duì) DDE連接進(jìn)行初始化,以 ncdde/nuc840d作為連接的服務(wù)器名稱和主題,通過建立函數(shù)來讀取各軸數(shù)據(jù)。下面是在VC中讀取1個(gè)軸當(dāng)前坐標(biāo)值時(shí)用到的程序代碼:
還需通過DdeClientTransaction()函數(shù)向數(shù)控系統(tǒng)服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)器必須通過DDE回調(diào)函數(shù)處理請(qǐng)求并返回DdeCreateDataHandle()來發(fā)送數(shù)據(jù)。同時(shí)可以調(diào)用DdeGetData()來獲取實(shí)時(shí)數(shù)據(jù),并動(dòng)態(tài)顯示在界面上。
2)由于VC++6.0的MFC中已集成了COM組件開發(fā)工具ATL(活動(dòng)模板庫),因此在VC中選擇使用 OPC協(xié)議,通過與 OPC Alarm&Event Server建立連接實(shí)現(xiàn)報(bào)警數(shù)據(jù)讀取。OPC是OLE for Process Control的縮寫,它采用客戶/服務(wù)器體系,是基于Microsoft的OLE/COM技術(shù),為硬件廠商和應(yīng)用軟件開發(fā)者提供了一套標(biāo)準(zhǔn)的接口。
首先,需要在MFC程序的StdAfx.h文件中添加ATL中心模塊類CComModule,并創(chuàng)建一個(gè)全局實(shí)例_Module,它的實(shí)現(xiàn)位于 atlbase.h和 atlimpl.cpp中,因此在程序中必須包含這2個(gè)文件。報(bào)警數(shù)據(jù)顯示的對(duì)話框所產(chǎn)生的類,命名為CAlarm類。同時(shí),為了實(shí)現(xiàn)回調(diào)對(duì)象的接收,還需添加一個(gè)派生于IOPCEventSink(事件訂閱的接收器接口)及 CComObjectRoot(內(nèi)部 ATL函數(shù)實(shí)現(xiàn))的類,命名為COPCEvent- Sink。
在VC中,ATL主要處理引用計(jì)數(shù)的實(shí)現(xiàn)以及IUnknown的成員函數(shù)QueryInter-face()的功能,為此,必須在COPC-EventSink類中插入COM地圖。COM地圖主要描述了哪些接口會(huì)被回調(diào)對(duì)象使用并且可以通過 QueryInterface()返回。在COPCEventSink類中,相應(yīng)的聲明代碼如下:
除了這些接收器接口以外,在COPCEv-entSink類中,使用成員函數(shù)Connect()建立回調(diào)對(duì)象與OPC server的連接點(diǎn)的連接,利用成員函數(shù)Initialize()對(duì)回調(diào)對(duì)象進(jìn)行初始化,即建立一個(gè)報(bào)警數(shù)據(jù)變量。
相應(yīng)地,還需在CAlarm類中添加相關(guān)函數(shù)才能從OPC Alarm&Event Server中接收?qǐng)?bào)警信號(hào),并在對(duì)話框中顯示。具體步驟:
①創(chuàng)建OPC服務(wù)器實(shí)例,并建立連接。通過成員函數(shù)ConnectServer()與服務(wù)器建立連接,連接之前客戶端需要服務(wù)器的 CLSID,可以通過CLSIDFromProgID()函數(shù)來獲取信息,其中ProgID為OPC.S-inumerik Events。這樣通過 CLSID及Co-CreateInstance()函數(shù)便可創(chuàng)建服務(wù)器實(shí)例,其中以IUnknown作為請(qǐng)求接口。
②請(qǐng)求數(shù)據(jù)訂閱操作接口。通過成員函數(shù)GetInterfaces()實(shí)現(xiàn),以 IUnknown的成員函數(shù)QueryInterface()獲取。
③在OPC服務(wù)器上創(chuàng)建報(bào)警數(shù)據(jù)訂閱,并連接到接收器對(duì)象。通過成員函數(shù)CreateSubscription()實(shí)現(xiàn),其中利用 IOPCEventServer::CreateEventSubscription()函數(shù)創(chuàng)建一個(gè)報(bào)警數(shù)據(jù)訂閱。若創(chuàng)建成功,即與服務(wù)器中一個(gè)接收對(duì)象連接,此時(shí),當(dāng)有一個(gè)新的報(bào)警產(chǎn)生時(shí)客戶便可以接收到服務(wù)器返回的數(shù)據(jù)。同時(shí),通過 CComObject::CreateInstance()函數(shù)創(chuàng)建一個(gè)COPCEventSink類的實(shí)例,此時(shí),服務(wù)器返回的回調(diào)對(duì)象便在COPCEventSink類中的成員函數(shù)Initialize()中進(jìn)行初始化,然后通過成員函數(shù)Connect()將回調(diào)對(duì)象與創(chuàng)建的數(shù)據(jù)訂閱接口連接。
最后,通過COPCEventSink類中的成員函數(shù)OnEvent()將所創(chuàng)建的報(bào)警數(shù)據(jù)訂閱所返回的信號(hào)(數(shù)據(jù))顯示在對(duì)話框的List Control控件上。所顯示的報(bào)警數(shù)據(jù)在界面上實(shí)時(shí)更新,包括報(bào)警時(shí)間、來源、報(bào)警號(hào)、消息等。
2.2.2 文件傳遞及程序調(diào)用
人機(jī)界面在進(jìn)行齒面測(cè)量時(shí),必須將某些程序和文件復(fù)制并存到NCK中,反之亦然。在VC環(huán)境下同樣利用COM組件技術(shù),創(chuàng)建一個(gè)派生于IDispatchImpl及 CComObject- Root的類,命名為CMCDomainCallback,添加的COM地圖聲明代碼如下:
在所用的對(duì)話框類中,添加成員函數(shù)ConnectToDomainServer(),創(chuàng)建IMC中的DomainServer實(shí)例,并建立連接。以CopyNC()以及MapACC_NC()函數(shù)發(fā)送復(fù)制文件請(qǐng)求。其中,向系統(tǒng)服務(wù)器中復(fù)制文件的詳細(xì)代碼如下:
CopyNC(bstrSourceFile,bstrTargetFile,MCDOMAIN_COPY_NC);
相應(yīng)地,同樣利用 COM組件創(chuàng)建 IMC中Command實(shí)例,從而實(shí)現(xiàn)對(duì)NC/PLC的程序調(diào)用服務(wù)。如通知NCK執(zhí)行一個(gè)指令,VC中代碼為:#PI_START,/NC,201,/_N_MPF_DIR/_N_123_MPF,_N_SELECT#。
將所有的功能集成在每一個(gè)對(duì)話框中。對(duì)話框設(shè)計(jì)完成后,就可以生成VC的標(biāo)準(zhǔn)Windows應(yīng)用程序,并在數(shù)控系統(tǒng)開發(fā)平臺(tái)中運(yùn)行。
本研究根據(jù)上節(jié)描述的開發(fā)方法,以錐齒輪磨齒機(jī)在機(jī)測(cè)量軟件開發(fā)為例,在VC環(huán)境下制作了人機(jī)界面,并將所開發(fā)的人機(jī)界面在840D數(shù)控系統(tǒng)上進(jìn)行模擬。如圖2、3所示,NCK變量存取、報(bào)警服務(wù)、多語言等均顯示成功,驗(yàn)證了基于VC的840D數(shù)控系統(tǒng)人機(jī)界面開發(fā)方法的正確性。
圖2 主界面監(jiān)控狀態(tài)
圖3 人機(jī)界面調(diào)整參數(shù)編輯界面
本文研究了VC環(huán)境下高端機(jī)床專用人機(jī)界面制作方法,采用UNICODE編程實(shí)現(xiàn)界面多語言顯示,使用DDE技術(shù)及OPC協(xié)議來對(duì)NCK/PLC變量進(jìn)行存取,利用COM組件技術(shù)進(jìn)行文件傳遞以及程序調(diào)用。根據(jù)此方法,以錐齒輪磨齒機(jī)在機(jī)測(cè)量軟件開發(fā)為例制作了人機(jī)界面,并將人機(jī)界面在840D數(shù)控系統(tǒng)中進(jìn)行模擬,驗(yàn)證了基于VC的840D數(shù)控系統(tǒng)人機(jī)界面開發(fā)方法的正確性。
[1]賴國(guó)庭,吳玉厚,富大偉.開放式數(shù)控系統(tǒng)的發(fā)展及性能研究[J].機(jī)械與電子,2003(2):3-5.
[2]魏巍.開放性的西門子840D在數(shù)控磨齒機(jī)中的應(yīng)用[J].制造技術(shù)與機(jī)床,2006(1):99 -101.
[3]張明德,張衛(wèi)青,郭曉東.全數(shù)控錐齒輪銑齒機(jī)軟件開發(fā)[J].制造技術(shù)與機(jī)床,2009(11):102-105.
[4]SIEMENS.User’s Manual for SINUMERIK 840D/840Di HMI Programming Package[Z].[S.l.]:Siemens,2004.
[5]向筱,黎勇,張衛(wèi)青.基于西門子840D數(shù)控系統(tǒng)的錐齒輪研齒機(jī)的人機(jī)界面開發(fā)[J].重慶工學(xué)院學(xué)報(bào):自然科學(xué)版,2008,22(3):111 -113.
[6]吳艷花,雷俊杰.基于840D數(shù)控系統(tǒng)的人機(jī)界面二次開發(fā)[J].機(jī)床與液壓,2011(10):118-121.
[7]余英,梁剛.Visual C++實(shí)踐與提高 COM和COM+篇[M].北京:中國(guó)鐵道出版社,2001.
[8]Smith J.Understanding and Using COM Threading Models[M].WA:MicrosoftCorp,1998.