李紹安 李維嘉 郎飛陽(華中科技大學 船舶與海洋工程學院輪機工程系,湖北 武漢 430074)
電動缸相對于液壓缸,在響應頻率、設計周期、硬件成本和維修等方面有較大的優(yōu)勢[1],因此在實際運用中,十噸以下六自由度平臺的設計多采用電動缸作為驅(qū)動元件。伺服電機驅(qū)動器作為電動缸系統(tǒng)中的關(guān)鍵組成部分,近幾年以來得到了飛速的發(fā)展,其功率逐漸增大,模擬伺服逐漸發(fā)展到數(shù)字伺服,輸入方式由以前的模擬量發(fā)展到現(xiàn)在的數(shù)字通訊。由于PLC和FPGA的使用,伺服驅(qū)動器更加智能,逐漸簡化了控制的工作量,減少了控制開發(fā)的成本。
隨著數(shù)字伺服驅(qū)動器的大量使用,對其控制代碼的設計及優(yōu)化成為六自由度控制系統(tǒng)中的重要組成部分。在實際工程項目中,根據(jù)平臺的功率以及總體成本,常選用不同品牌和型號的數(shù)字驅(qū)動器。由于不同的數(shù)字伺服驅(qū)動器在控制及通訊方式上存在差異,往往需要開發(fā)不同版本的控制軟件,給開發(fā)成本和后期維護帶來了巨大的困難。
綜上所述,為減少開發(fā)成本,增加程序代碼復用程度,有必要開發(fā)一套通用的數(shù)字伺服驅(qū)動器管理程序,簡化驅(qū)動器控制的設計。讓設計人員能快速開發(fā)新的數(shù)字伺服驅(qū)動器的控制代碼,從而把主要精力投入到其他關(guān)鍵控制系統(tǒng)及算法的設計中。
考慮數(shù)字驅(qū)動伺服控制系統(tǒng)的復雜性,為了保證控制系統(tǒng)的可靠性和可維護性,可選用成熟的軟件設計模式。本文數(shù)字驅(qū)動伺服控制系統(tǒng)的結(jié)構(gòu)設計,以成熟的“狀態(tài)機設計模式”為依據(jù)[2]。“狀態(tài)機”設計模式通過實際控制對象的狀態(tài)描述和狀態(tài)遷移控制,能夠很好的簡化數(shù)字驅(qū)動伺服控制系統(tǒng)的復雜性。
針對本控制系統(tǒng)可以控制多種不同品牌和型號的數(shù)字伺服驅(qū)動器,這里對“狀態(tài)機”設計模式進行了進一步優(yōu)化,引入配置數(shù)據(jù)庫,提出了“數(shù)據(jù)驅(qū)動狀態(tài)機”設計模式。如圖1所示。
圖1 數(shù)據(jù)驅(qū)動狀態(tài)機“設計模式”
“數(shù)字驅(qū)動狀態(tài)機”在傳統(tǒng)狀態(tài)機設計模式的基礎(chǔ)上添加了狀態(tài)管理類(StateManager)以及向配套的狀態(tài)數(shù)據(jù)庫(StateData-Base)。狀態(tài)管理類主要負責狀態(tài)的配置和管理狀態(tài)轉(zhuǎn)換。
(1)引入命令方式(Command)[3],作為狀態(tài)改變的接口,及環(huán)境類(Context)采用命令方式改變當前狀態(tài)。環(huán)境類(Context)當接收外部指令時,向狀態(tài)管理類(StateManager)發(fā)送狀態(tài)改變命令,狀態(tài)管理類根據(jù)命令決定當前狀態(tài)(ConcreteState)。
(2)允許一個命令產(chǎn)生一系列狀態(tài)變化。在實際控制系統(tǒng)中,控制對象的狀態(tài)常??梢詣澐譃槎鄠€子狀態(tài)。不同的狀態(tài)中包含多個相同的子狀態(tài)。因此,可以通過細分子狀態(tài),組合得到不同控制對象狀態(tài),達到節(jié)省開發(fā)時間的目的。
(3)定義狀態(tài)類(State)的三個基本接口,分別為開始(begin),運行(run)和結(jié)束(end)。使所有的子狀態(tài)類(ConcreteS-tate),獨立完成初始化和結(jié)束代碼。保證子狀態(tài)類(ConcreteS-tate)之間無耦合,并且狀態(tài)管理類(StateManager)對子狀態(tài)(ConcreteState)的管理僅僅通過狀態(tài)類(State)提供的接口。減少類與類之間的耦合。
(4)定義狀態(tài)轉(zhuǎn)換數(shù)據(jù)庫(StateDataBase),使狀態(tài)轉(zhuǎn)換顯式化。狀態(tài)數(shù)據(jù)庫(StateDataBase)定義了一系列指令以及該指令所對應的狀態(tài)轉(zhuǎn)換流程。
根據(jù)“數(shù)據(jù)驅(qū)動狀態(tài)機”設計模式所要求的設計過程,首先劃分數(shù)字驅(qū)動器控制系統(tǒng)的功能模塊,然后逐步設計各功能模塊的功能和狀態(tài),最后定義各功能模塊的狀態(tài)轉(zhuǎn)變過程和方法,從而確定數(shù)字驅(qū)動器控制軟件的總體結(jié)構(gòu)。具體設計方法如下:
功能模塊劃分可按照如下原則
(1)按照實際控制對象的物理種類來劃分大功能模塊,一個模塊只管理一類具有類似性質(zhì)的物理對象。
(2)劃分的模塊可以定義清晰的接口。
(3)模塊應具備可替換性及模塊間無耦合。
(4)模塊的接口的定義在滿足基本功能的前提下,至少設計一個通用接口,方便快速添加新功能。
(5)如果一個模塊用來管理多個類型性質(zhì)的物理對象,應設計對象管理子模塊和對象接口子模塊,以便將來添加新的物理對象。
(6)模塊的功能應提供一定升級空間。
根據(jù)以上原則,數(shù)字伺服驅(qū)動器控制過程可初步劃分成控制管理接口模塊、數(shù)字伺服驅(qū)動器功能模塊、通信模塊和驅(qū)動器四個部分組成,如圖2所示。
圖2 功能模塊劃分
其中控制接口模塊為電動缸控制系統(tǒng)提供各種功能接口。所有與驅(qū)動器的功能被封裝到控制接口模塊中。功能的具體實現(xiàn)向電動缸控制系統(tǒng)透明。驅(qū)動器功能模塊向控制接口模塊負責,提供驅(qū)動器包括參數(shù)設置、尋找零位、返回狀態(tài)等各種驅(qū)動器功能。功能的具體實現(xiàn)及控制驅(qū)動器的實際代碼向控制接口模塊透明。通訊模塊用來管理控制系統(tǒng)與驅(qū)動器之間的實際物理鏈路,包括數(shù)字通訊及IO接口等。
(1)驅(qū)動器功能分析
對于不同型號,不同品牌的數(shù)字伺服驅(qū)動器,雖然它們在通訊方式和控制方法上存在著不同,但相對于電動缸伺服系統(tǒng)[4],它們所實現(xiàn)的功能基本一致,僅僅是具體實現(xiàn)的方法存在差異。比如,對于電動缸伺服系統(tǒng),數(shù)字伺服驅(qū)動器實現(xiàn)的基本功能有:
①位置控制
②找零位(HOME)
③零位設置
④極限位處理
⑤手動控制
⑥故障報警
⑦故障復位
⑧控制參數(shù)設置
⑨狀態(tài)數(shù)據(jù)獲取
數(shù)字伺服驅(qū)動器控制流程如圖3所示。
圖3中,控制程序首先根據(jù)數(shù)字伺服驅(qū)動器的種類從配置數(shù)據(jù)庫中讀取相關(guān)配置信息(“配置管理”),并根據(jù)配置信息初始化驅(qū)動器控制量(“初始參數(shù)設置”),如速度增益、加速度增益、最大速度和最大加速度等信息,在初始參數(shù)設置完成后,向控制類實時反饋驅(qū)動器狀態(tài)信息(“狀態(tài)信息反饋”),并等待進一步指令;然后,根據(jù)控制類指令,驅(qū)動器分別執(zhí)行“手動控制”、“位置控制”和“找零位(HOME)”等功能,并且在每個控制周期中,對驅(qū)動器報警信息進行監(jiān)測,如果驅(qū)動器報警,根據(jù)報警內(nèi)容的不同,生成報警指令,使驅(qū)動器進入“報警處理”。
(2)驅(qū)動器子狀態(tài)劃分
根據(jù)驅(qū)動器功能分析,驅(qū)動器運行過程可劃分為如下子狀態(tài)
①初始參數(shù)設置狀態(tài)(InitDriverPara State)
②狀態(tài)信息反饋狀態(tài)(GetDriverState State)
圖3 數(shù)字伺服器控制流程圖
③手動控制狀態(tài)(ManualCtrl State)
④位置控制狀態(tài)(PosCtrl State)
⑤找零位狀態(tài)(HomeCtrl State)
⑥停止狀態(tài)(Stop State)
⑦普通故障處理狀態(tài)(Fail1Manage State)
⑧緊急故障處理狀態(tài)(Fail2Manage State)
其中,初始參數(shù)設置狀態(tài)(InitDriverPara State)負責設置驅(qū)動器控制參數(shù);狀態(tài)信息反饋狀態(tài)(GetDriverState State)負責讀取驅(qū)動器狀態(tài)參數(shù)包括故障報警信號,由于它每個控制周期中都必須執(zhí)行,屬于典型的復合子狀態(tài);手動控制狀態(tài)(ManualCtrl State)、位置控制狀態(tài)(PosCtrl State)和找零位狀態(tài)(HomeCtrl State)實現(xiàn)電機三種實際控制功能。;通故障處理狀態(tài)(Fail1Manage State)和緊急故障處理狀態(tài)(Fail2Manage State)負責管理不同級別下的故障處理過程;停止狀態(tài)(Stop State)表示驅(qū)動器未使能時的特殊狀態(tài),在實際控制過程中由于未完成任何控制,可以把它等同于狀態(tài)信息反饋狀態(tài)(GetDriverState State)。
(3)驅(qū)動器狀態(tài)轉(zhuǎn)換的設計
根據(jù)驅(qū)動器功能分析,驅(qū)動器在以下幾種指令下狀態(tài)發(fā)生改變
①驅(qū)動器初始化命令(InitCmd)
②手動控制命令(ManualCtrlCmd)
③位置控制命令(PosCtrlCmd)
④找零位命令(HomeCtrlCmd)
⑤普通故障命令(Fail1Cmd)
⑥緊急故障命令(Fail2Cmd)
⑦停止命令(StopCmd)
驅(qū)動器的狀態(tài)發(fā)送改變分為兩類,一類是控制系統(tǒng)通過向驅(qū)動器管理類(MotorDriver)發(fā)送命令改變驅(qū)動器狀態(tài)。另一類是,驅(qū)動器管理類(MotorDriver)根據(jù)驅(qū)動器執(zhí)行過程或故障直接改變驅(qū)動器狀態(tài)。當改變狀態(tài)的唯一途徑是發(fā)送上述指令。
(4)驅(qū)動器狀態(tài)轉(zhuǎn)換命令的優(yōu)先級設計
①根據(jù)命令的緊急程度,驅(qū)動器狀態(tài)轉(zhuǎn)換命令的優(yōu)先級分為四個級別。
緊急故障命令(Fail2Cmd)具備最高優(yōu)先級(priority 0),及無論驅(qū)動器處于何種狀態(tài),緊急故障命令(Fail2Cmd)和立即得到相應。例如,驅(qū)動器管理類(MotorDriver)檢測到驅(qū)動器輸入三相電源缺相時,應立即發(fā)送緊急故障命令(Fail2Cmd),關(guān)閉驅(qū)動器使能,閉合電機剎車,使電動缸保持當前位置。
②普通故障命令(Fail1Cmd)具備優(yōu)先級(priority 1)。例如,驅(qū)動器管理類(MotorDriver)檢測到驅(qū)動器溫度超過標準時,應立即普通故障命令(Fail1Cmd),使電動缸緩慢運行到初始零位,關(guān)閉驅(qū)動器使能,閉合電機剎車。
③驅(qū)動器初始化命令(InitCmd)、手動控制命令(ManualCtrl-Cmd)和停止命令(StopCmd)具備優(yōu)先級(priority 2)。
④找零位命令(HomeCtrlCmd)和位置控制命令(PosCtrlC-md)具備優(yōu)先級(priority 3)。
⑤由于手動控制命令(ManualCtrlCmd)和停止命令(StopC-md)常運用于電動缸的人工控制,既當驅(qū)動器在位置控制時,用于人為干預電動缸的運行。因此,它們的優(yōu)先級要高于找零位命令(HomeCtrlCmd)和位置控制命令(PosCtrlCmd)。
(5)數(shù)據(jù)驅(qū)動狀態(tài)機設計
根據(jù)上述的驅(qū)動器狀態(tài)劃分和狀態(tài)轉(zhuǎn)換設計,數(shù)字驅(qū)動模塊設計如圖4所示。
圖4 數(shù)字伺服智控制流程圖
本文針對數(shù)字驅(qū)動控制系統(tǒng)的開發(fā),采用數(shù)據(jù)驅(qū)動狀態(tài)機設計模式,設計控制系統(tǒng)的軟件結(jié)構(gòu),以適應不同品牌和型號數(shù)字驅(qū)動器的功能控制。以簡化開發(fā)團隊在使用數(shù)字驅(qū)動器項目中的開發(fā)過程,并且進一步提高開發(fā)工作的效率和軟件產(chǎn)品質(zhì)量,使軟件系統(tǒng)具有良好的穩(wěn)定性和擴充性。此數(shù)字驅(qū)動控制系統(tǒng)已在“模型軍用直升機六自由度飛行模擬器”和“中國科技館宇宙飛船模擬器”等項目的控制系統(tǒng)中得到了應用,并取得了良好的效果。
[1] D.Stewart.A Platform with Six Degrees of Freedom.Proc.Inst.Mech.Eng[C].1965 -66,180(15):371 -386.
[2] Peter Cad.Object- oriented patterns.Communications of the ACM[J].1992,35(9):152-159.