隨著現(xiàn)代制造業(yè)的進步和計算機集成系統(tǒng)的不斷成熟,數(shù)控系統(tǒng)融合計算機技術(shù)正朝著開放化、網(wǎng)絡(luò)化、智能化的方向發(fā)展。具有層次化結(jié)構(gòu)的開放式數(shù)控系統(tǒng)以其可擴展、可移植、可互換和可配置等特點,成為當(dāng)今數(shù)控技術(shù)發(fā)展的趨勢。
組件技術(shù)具有可重用性和良好的語言無關(guān)性,可以實現(xiàn)跨進程、跨平臺甚至網(wǎng)絡(luò)范圍內(nèi)的互操作,較好地解決軟件復(fù)用技術(shù)所面臨的問題。由組件來組建開放數(shù)控軟件,可在較高層次上滿足開放式數(shù)控系統(tǒng)的要求。因此,本文提出了一個基于組件技術(shù)的開放式數(shù)控系統(tǒng)體系結(jié)構(gòu),并對系統(tǒng)的設(shè)計、實現(xiàn)、封裝、部署等過程進行了詳細(xì)介紹。
1 系統(tǒng)組件的劃分
本文建立的數(shù)控系統(tǒng)從邏輯上劃分為人機交互服務(wù)器(HMI Server)組件、認(rèn)證服務(wù)(Authentica-tion Service)組件、運動控制核心(Motion ControlKernel,以下簡稱MCK)組件、PLC組件、運動學(xué)(Kinematics)組件和人機交互客戶端(HMI Client)5個基本組成部分。
a) HMI Client是數(shù)控系統(tǒng)的客戶端,為用戶提供一個與數(shù)控系統(tǒng)進行交互的圖形或命令行形式的界面,并且可以同時存在多個實例,它不與運動控制組件進行直接交互,而是以HMI Server作為中介。
b) HMI Server組件存在的目的是為HMIClient訪問運動控制組件提供一個簡單的外觀層,降低HMI Client與運動控制組件之間的耦合度,因此,其主要功能是轉(zhuǎn)發(fā)請求,并對任何加工數(shù)據(jù)進行處理,它是Facade設(shè)計模式的一個具體應(yīng)用,滿足了軟件架構(gòu)低耦合的要求。
c) MCK組件是整個系統(tǒng)的功能核心,負(fù)責(zé)完成系統(tǒng)大部分的任務(wù)。根據(jù)高內(nèi)聚原則,將該組件進一步細(xì)分成8個子組件,每個子組件獨立地實現(xiàn)一個特定的功能,這些子組件包括誤差補償(ErrorCompensation)組件、插補(Interpolation)組件、超前讀(Look Ahead)組件、NC代碼解釋器(NC CodeInterpreter)組件、路徑規(guī)劃(Path Planning)組件、位置控制(Position Control)組件、刀具補償(ToolCompensation)組件和速度規(guī)劃(Velocity Control)組件。
d) Kinematics組件負(fù)責(zé)正向計算和逆向運動計算、采用幾何方法糾錯和刀具偏移量、對工件的動態(tài)檢測、在聯(lián)合坐標(biāo)系和笛卡兒坐標(biāo)系中進行運動學(xué)極限檢測等。
e) PLC負(fù)責(zé)實現(xiàn)機床監(jiān)控、換刀機構(gòu)控制、夾具控制、潤滑和冷卻系統(tǒng)控制、傳感器檢測等數(shù)控系統(tǒng)的輔助控制功能。
2 系統(tǒng)的部署架構(gòu)
基于CCM的分布式系統(tǒng),可以通過網(wǎng)絡(luò)將若干處理器資源組織起來,并通過將系統(tǒng)任務(wù)合理地分布于各處理節(jié)點上來實現(xiàn)系統(tǒng)功能。相對于運行于單機的系統(tǒng)而言,運行在分布式環(huán)境下的系統(tǒng)的運行能力可以隨網(wǎng)絡(luò)結(jié)構(gòu)的擴展而進一步增強,并且可以避免單個節(jié)點過載的情況。
對于建立在分布式環(huán)境下的系統(tǒng),系統(tǒng)組件之間的消息傳遞路徑大體分為2種:位于同一節(jié)點內(nèi)的組件之間的消息傳遞路徑通常為PC總線;位于不同節(jié)點的組件之間的消息傳遞路徑通常為網(wǎng)絡(luò)總線。前者的響應(yīng)延遲較低,因此,可以將有交互并且對交互響應(yīng)時間要求較為嚴(yán)格的組件放置于同一節(jié)點,對交互響應(yīng)時間并無明確要求的組件則可分布于不同的節(jié)點。
由于實現(xiàn)運動控制是系統(tǒng)的主要任務(wù),并且運動控制過程對實時性有一定的要求,因此出于對效率的考慮,將與運動控制相關(guān)的組件即MCK、PLC和Kinematics安排在同一節(jié)點,稱為運動控制節(jié)點。運動控制節(jié)點上安裝了實時操作系統(tǒng),這就使得數(shù)控系統(tǒng)可以根據(jù)各項任務(wù)對實時性要求的不同,為每個任務(wù)分配不同的優(yōu)先級,從而保證了對關(guān)鍵任務(wù)的及時處理。系統(tǒng)的部署架構(gòu)如圖1。
圖1 系統(tǒng)的部署架構(gòu)
3 組件的IDL/CIDL定義
以HMI Server為例,對定義過程進行描述。
HMI Server的IDL定義如下: component HMIServer supports SystemService { provides RegisterService RegSrv; provides NCCodeManager NCCodeMgr; uses AuthenticationService AuthSrv; publishes StartMotionControl StartMC; publishes StopMotionControl StopMC; publishes PauseMotionControl PauseMC; publishes NCCodeReady NCCodeRD; publishes SystemInitiation SysInit; }; home HMIServerHome manages HMIServer{}。
其中,系統(tǒng)服務(wù)面向系統(tǒng)外部的HMI Client注冊服務(wù)面向所有運動控制組件;NC代碼管理器則面向MCK中的NC代碼解釋器組件;Home則是用于創(chuàng)建組件實例的工廠(Factory)。
允許系統(tǒng)使用者開發(fā)適合自身需要的HMIClient也是本系統(tǒng)的一個目標(biāo),所以應(yīng)該讓系統(tǒng)使用者自主選擇HMI Client的開發(fā)技術(shù),而不應(yīng)該使HMI Client僅基于CCM,因此HMI Client只要遵循系統(tǒng)接口規(guī)范,可以使用任何技術(shù)實現(xiàn)。由于Provides/uses方式僅能用于組件之間連接的建立,因此HMI Server以支持(supports)的方式對外提供系統(tǒng)服務(wù),而注冊服務(wù)和NC代碼管理器則以提供(provides)的方式與相應(yīng)的使用者建立連接。
由于系統(tǒng)服務(wù)中的登錄和注銷功能只是對HMI Client提供了一個訪問認(rèn)證服務(wù)的接口,因此HMI Server需要與認(rèn)證服務(wù)組件建立連接,以使用其提供的認(rèn)證功能。對于HMI Server組件,由于其狀態(tài)不需要在生存期以外進行保存,所以沒有必要將組件定義為Entity或Process類型,并且一個組件的生存期需要超過一次客戶請求,所以Service類型也不合適。因此,要使組件在整個系統(tǒng)運行期間保持激活狀態(tài),Session類型是最合適的選擇。
HMI Server的CIDL定義如下: composition session HMIServer_impl { home executor HMIServerHome_Exec { implements CNC::HMISERVER_MODULE::H MIServerHome; manages HMIServer_Exec; }; }。
4 IDL/CIDL到C++的映射
完成IDL和CIDL的定義后,首先,使用TAO/CIAO開發(fā)包中的Perl腳本來生成工程描述文件;然后,建立空白的實現(xiàn)文件,這樣可以使整個工程通過編譯,而具體的實現(xiàn)代碼則可在隨后逐步完善。編譯完成后,將會在各組件的工程目錄中生成映射到C++的客戶端stub、服務(wù)器端skeleton、服務(wù)器端servant等文件。在生成了組件的C++框架文件后,就可以以此為基礎(chǔ)進行組件的具體實現(xiàn)過程。
5 組件的實現(xiàn)
以HMI Server為例,對組件的實現(xiàn)進行說明。
a) 定義每個組件executor的實現(xiàn)類,它們都位于單獨的名稱空間下,例如,HMIServer_exec_i是HMI Server組件executor的實現(xiàn)類,它定義了executor接口,規(guī)定了executor所必需實現(xiàn)的方法,包括HMI Server組件使用supports關(guān)鍵字明確支持的接口中的方法。
由于HMIServer_Exec是一個Session類型的組件,因此HMIServer_exec_i需要對SessionComponent中的一些容器回調(diào)函數(shù)進行重置(override)。例如,set_session_context,其具體實現(xiàn)如下:
void HMIServer_exec_i::set_session_context(Com ponents::SessionContext_ptr ctx) { ,, this->m_context=HMIServer_Exec_Con text::_narrow(ctx); }。
b) 組件所提供的facet也需要單獨實現(xiàn),通常在facet的實現(xiàn)中保存了對相應(yīng)executor的引用,以實現(xiàn)其向exector的導(dǎo)航,在相應(yīng)的executor中則必須為receptacle提供獲取關(guān)聯(lián)的facet的/get_<facet_name>0方法。
HMI Client這類非組件的客戶端是通過調(diào)用/provide_<facet_name>0來得到組件相應(yīng)的fac-et,而/get_<facet_name>0實際上是/provide_<facet_name>0在組件executor端的映射。
c) 使用supports關(guān)鍵字聲明的接口是通過繼承的方式在組件executor中實現(xiàn)的,例如,HMIServer組件通過繼承的方式支持SystemService接口。
HMI Server組件在IDL中聲明了對認(rèn)證服務(wù)組件的Authentication Service接口的使用。在具體實現(xiàn)中,HMI Server組件executor通過其上下文(Context)得到指向Authentication Service接口實現(xiàn)類的指針,從而調(diào)用其中相應(yīng)的方法,HMI Server組件的上下文在組件部署期間被創(chuàng)建,并由組件的容器在組件激活前通過容器的回調(diào)函數(shù)set_ses-sion_context進行設(shè)置。
對事件的發(fā)布也是通過組件上下文,例如,HMI Server作為系統(tǒng)初始化事件的事件源,其具體發(fā)布方法為:
::CNC::SystemInitiation_var evt1=new ::OBV_CNC::SystemInitiation ; m_context->push_SysInit(evt1)。
該事件的響應(yīng)方法,則由各接收者獨立實現(xiàn)。
d) 定義組件home executor的實現(xiàn)類以及組件executor在DLL中的入口點(Entry Point),入口點的主要作用是創(chuàng)建組件home實例。HMIServer組件入口點的具體實現(xiàn)如下:
extern "C" ::Components::HomeExecutorBase_ptr createHMIServerHome_Impl() { return new CIDL_HMIServer_Impl::HMIServerHo me_exec_i(); }。
6 組件的封裝組裝及部署
在得到了各組件的DLL實現(xiàn)后,需要對其進行封裝與組裝,以便使系統(tǒng)能夠在分布式環(huán)境下進行部署,系統(tǒng)使用者可以根據(jù)需要,制定不同的部署方案。
組裝的具體工作就是為系統(tǒng)中相關(guān)的facet和receptacle,event source和event sink建立連接描述文件,這是一個遞歸的過程,最終形成完整的系統(tǒng)。本系統(tǒng)由HMI Server,MCK,PLC,運動學(xué)、認(rèn)證服務(wù)組件組裝而成,其中MCK由8個子組件組裝而成。
封裝過程的目標(biāo)是制作一個包括組件實現(xiàn)和組件描述的可部署的組件包,組件包是用于部署的最小單元。對于單獨的組件,需要將該組件的XML描述文件和組件的DLL文件封裝為zip格式的組件包;對于組裝而來的組件,由于它沒有獨立的組件實現(xiàn),因此,只需要為其組件描述和組件包建立關(guān)系。
在部署階段,首先,需要建立目標(biāo)環(huán)境(TargetEnvironment)的模型,該模型描述了作為組件載體的物理資源及其拓?fù)浣Y(jié)構(gòu);然后,參照預(yù)先設(shè)計的部署架構(gòu)建立相應(yīng)的部署計劃。
整個過程通過使用CosMIC工具完成,這樣能有效地避免手工編輯XML文件時容易出現(xiàn)的錯誤,從而提高開發(fā)效率。
7 組件的運行
在CORBA體系結(jié)構(gòu)中,分布環(huán)境中的節(jié)點監(jiān)控進程被稱作節(jié)點管理器(Node Manager),分布在某一節(jié)點上的一個組件的運行,被稱作節(jié)點應(yīng)用程序(Node Application)。解析部署計劃,判斷計劃是否可行,并且將計劃轉(zhuǎn)換為合適的數(shù)據(jù)結(jié)構(gòu),以作為執(zhí)行管理器輸入的進程被稱作部署計劃執(zhí)行器(Plan Launcher);根據(jù)部署計劃的解析結(jié)果,負(fù)責(zé)將系統(tǒng)各組件分布到相應(yīng)的節(jié)點上的進程被稱作執(zhí)行管理器(Execution Manager)。
部署計劃執(zhí)行器在完成解析后,會將結(jié)果發(fā)送到執(zhí)行管理器,然后執(zhí)行管理器按照計劃將系統(tǒng)各組件分布到域中各節(jié)點。計劃成功執(zhí)行后,各系統(tǒng)組件被激活待命,可以通過生成的IOR文件直接獲取其引用,也可以使用CORBA名稱服務(wù)進行定位。另外,可以編寫腳本以方便整個啟動過程的進行,系統(tǒng)啟動后,用戶就可以通過HMI Client對系統(tǒng)進行操作和監(jiān)控。HMI Client的圖形界面如圖2。
圖2 HMI Client的圖形界面
8 結(jié)語
提出了一個基于CCM技術(shù)的開放式數(shù)控系統(tǒng),并介紹了數(shù)控組件的設(shè)計、實現(xiàn)、封裝、組裝、部署及運行的全過程。該系統(tǒng)可以更好地滿足系統(tǒng)模塊化、可重構(gòu)、可擴展、可移植等開放性要求,對于推動組件技術(shù)在開放式數(shù)控系統(tǒng)領(lǐng)域中的應(yīng)用具有重要意義。
(審核編輯: 智匯張瑜)
分享