flexsim中的重要概念及開發(fā)技術_第1頁
flexsim中的重要概念及開發(fā)技術_第2頁
flexsim中的重要概念及開發(fā)技術_第3頁
flexsim中的重要概念及開發(fā)技術_第4頁
flexsim中的重要概念及開發(fā)技術_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、-. z.第五章 Fle*sim相關的概念及關鍵技術研究5.1 Fle*sim軟件介紹Fle*sim是由美國的Fle*sim Software Production公司出品的,是一款商業(yè)化離散事件系統(tǒng)仿真軟件。Fle*sim采用面向對象技術,并具有三維顯示功能。建模快捷方便和顯示能力強大是該軟件的重要特點。該軟件體供了原始數據擬合、輸入建模、圖形化的模型構建、虛擬現實顯示、運行模型進展仿真試驗、對結果進展優(yōu)化、生成3D動畫影像文件等功能,也提供了與其他工具軟件的接口。圖5-1是Fle*sim軟件及其構成模塊的構造圖7。E*pertFit等擬和分布工具E*cel等可以用作統(tǒng)計分析的工具模型建立與

2、調試模型有效性確認運行仿真試驗3D的可視化結果動態(tài)顯示生成影像文件Fle*sim仿真軟件Microsoft Visual C+.NET輸入建模系統(tǒng)仿真運行仿真試驗結果統(tǒng)計分析圖5-1 Fle*sim功能構造圖Fle*sim提供了仿真模型與E*pertFit和E*cel的接口,用戶可以同過E*perFit對輸入數據進展分布擬合,同時可以在E*cel中方面地實現和仿真模型之間的數據交換,包括輸出和運行模型過程中動態(tài)修改運行參數等。另外該軟件還提供了優(yōu)化模塊Optquest,增加了幫助迅速建模的Microsoft Visio的接口。5.1.1 Fle*sim軟件的主要特點Fle*sim仿真軟件的特點

3、主要表達在采用面向對象技術,突出3D顯示效果,建模和調試簡單開放方便,模型的擴展性強,易于和其他軟件配合使用等方面?;诿嫦驅ο蠹夹g建模Fle*sim中所有用來建立模型的資源都是對象,包括模型、表格、記錄、GUI等。同時,用戶可以根據自己行業(yè)和領域特點,擴展對象,構建自己的對象庫。面向對象的建模技術使得Fle*sim的建模過程生產線化,對象可以重復利用,從而減少了建模人員的重復勞動。突出的3D圖形顯示功能Fle*sim支持OpenGL技術,也支持3ds、wrl、d*f和stl等文件格式。因此用戶可以建立逼真的模型,從而可以幫助用戶對模型有一個直觀的認識,并幫助模型的驗證。用戶可以在仿真環(huán)境下很

4、容易地操控3D模型,從不同角度、放大或縮小來觀測。建模和調試的方便建模過程中用戶只需要從模型庫中拖入已有的模型,根據模型的邏輯關系進展連接,然后設定不同對象的屬性。建模的工作簡單快捷,不需要編寫程序。建模的擴展性強Fle*sim支持建立用戶定制對象,融合了C+編程。用戶完全可以將其當作一個C+的開發(fā)平臺來開發(fā)一定的仿真應用程序。開放性好提供了與外部軟件的接口,可以通過ODBC與外部數據庫相連,通過socket接口與外部硬件設備相連,與E*cel、Visio等軟件配合使用。5.2 Fle*sim的一些重要概念Fle*sim是目前國內最新的仿真軟件,關于該軟件的資料和使用經歷還很少。作者是在不斷的

5、摸索中學習的,所以希望本文能對其他人有一定的借鑒。要完全掌握好Fle*sim,并將其用到我們的工作、學習和研究當中,理解該軟件的一些重要概念和思想是很重要的,本節(jié)針對集裝箱碼頭建模仿真中用到的技術做一個梳理。5.2.1 面向對象的思想相對于目前的一些仿真軟件如Witness, eM-Plant等,Fle*sim是采用面向對象思想和技術開發(fā)的,其本身更是用C+語言實現。嚴格地說該仿真軟件包括了兩局部,仿真軟件和后臺支持環(huán)境VC+.NET。由于C+是一種面向對象的語言,所以使用Fle*sim軟件,從用戶用于系統(tǒng)建模,或是做一些二次開發(fā),這些工作都有面向對象思想的表達??梢赃@樣說,沒有領會面向對象的

6、思想,就不能完全發(fā)揮Fle*sim軟件本身的特點,也就不能用其實現用戶的目的。使用Fle*sim軟件的用戶需要對C+語言有一定程度的熟悉。本節(jié)主要是解釋Fle*sim中所特有的一些面向對象思想,而不涉及面向對象語言的解釋關于C+語言的知識請查看相關書籍。對象Object的概念在Fle*sim軟件中無處不在,我們先直觀的感受一下。軟件的運行界面左邊是一個常用的對象庫如圖5-1。庫中的各種部件就是有特定功能的對象,這些對象是軟件本身自帶的,使用這些根本的部件對象用戶可以完成大多數的仿真工作。我們使用Processor來解釋一下對象的概念:我們日常所見的任何具體事物都可看作是對象,這里Process

7、or就是一種設備,它的作用就是對經過他的物件進展一些加工,即改變物件的狀態(tài)。這里我們可以將其當作現實中的設備,如機床等。圖5-1這里我們借用C+程序設計語言中的對象的概念。對象是類的實例,類是對現實對象的抽象。類中包含了對象的數據相當于現實對象的狀態(tài),以及對象的方法相當于現實對象用來處理外界所給信息的方法。對象封裝了屬性和方法,進一步到Fle*sim中,對于軟件中可用的庫對象,他們本身有自己的屬性如顏色,尺寸,位置等,還有處理物件的方法。在使用軟件的過程中,我們完全可以以人們平時的思維方式來思考,而無須過多的抽象化,這也就是面向對象方法的優(yōu)點。5.2.2 Fle*sim的對象層次構造面向對象方

8、法的一個優(yōu)點是類與類之間可以有繼承關系,對象的繼承性給我們提供了更大的柔性來擴展我們自己的對象,即衍生出新的對象。在Fle*sim中我們可以充分利用繼承性來開發(fā)我們自己的對象,而軟件本身也給用戶提供了這樣的機制。Fle*sim本身的庫對象是高度抽象化的,具有很強的通用性,幾乎涵蓋了仿真中可能遇到的所有對象。這些對象之間有一定的繼承關系,他們之間存在著邏輯關系。下列圖圖5-2是Fle*sim中對象的層次構造。Fle*simObjectFi*edResourceDispatcherNavigatorNetworkNodeSourceQueueSinkConveyorRackReservoirFi*

9、edSourceTemplateProcessorTaskE*ecuterbinerSeparatorOperatorTranspoterCraneASRSvehicleNetworkNavigatorCraneNavigatorBasicTEBasicRF從類的派生關系圖中我們可以對Fle*sim中各種對象的邏輯關系一目了然。對象庫中的對象分為兩種,一種是從Fi*edResource中派生下來的,另一種是TaskE*ecuter中派生下來的。通過分析我們不難發(fā)現,從Fi*edResource中派生來的對象有一個共同的特點,其本身是不會運動的,他們的作用只是產生或消除物件、存儲物件、加工物件等

10、等;從TaskE*ecuter中派生的對象,其本身是可以運動的,其作用是將物件從一個地點運送到另一個地點。當現有的庫對象不能滿足用戶的需要時,用戶就需要創(chuàng)立自己的對象。Fle*sim為用戶提供了這樣一種機制用戶可以定制自己的庫對象。在對象層次圖中,我們看到有兩個虛線框,這表示用戶可以從Fi*edResource和TaskE*ecuter中派生出自己的對象。Fle*sim的早期版本中從這兩個類中派生新的對象比擬復雜,最新的3.06版中增加了BasicFR和BasicTE類,使用戶的開發(fā)工作更容易。后面的章節(jié)中將具體介紹怎樣來實現一個新對象的定制。5.2.3 節(jié)點和樹在介紹樹構造之前,我們先來了解

11、Fle*sim中節(jié)點node的概念。節(jié)點是樹構造的最根本的組成單元,他們組成了的層次。所有的節(jié)點都有一個文本緩沖區(qū),用來保存節(jié)點的名字。節(jié)點可以是其他節(jié)點的容器,可以是用來定義一個對象屬性的關鍵字,或是擁有一個數據項。屬于一個節(jié)點的數據項類型可能是:數值number,字符串string,對象object,或指針pointer。下面列出FLe*sim中不同類型的節(jié)點標志:標準Standard:對象Object:屬性/變量Attribute/Varibale:函數Function(C+):函數Function(Fle*Script):用戶可以在對象的樹構造中任意地操作節(jié)點,例如增加節(jié)點,刪除節(jié)點,

12、改變節(jié)點所包含的值等。含有對象數據Object的節(jié)點可能包含有節(jié)點的子列表。含有對象數據的節(jié)點稱之為對象節(jié)點。當你單擊一個對象節(jié)點時,你會看到在節(jié)點的左邊有一個大于號。單擊將翻開對象數據的樹分支。如果一個節(jié)點包含子節(jié)點,可以按下+按鈕來展開。如果一個節(jié)點包含對象數據,可以按下來展開。下列圖圖5-3展示了一個隊列Queue展開的對象數據樹。圖5-3樹構造tree是一種很常用的數據構造。Fle*sim仿真模型中的對象,或對象中的屬性和方法節(jié)點等都是樹構造;用戶甚至可以直接在樹構造中操作對象。在Fle*sim中有兩個主要的對象類型:模型Model或仿真對象Simulation Object和視圖對象

13、View Object。兩種類型都有對象數據樹,包含了屬性和行為控件。一個對象節(jié)點的對象數據樹中的節(jié)點可以作為屬性、變量或成員函數。也有只是作為簡單的容器來包含節(jié)點以到達組織的目的。5.2.4 任務序列任務序列Task Sequences是Fle*sim仿真軟件中的核心機制。各種復雜仿真的實現很大程度取決于怎樣實現任務序列。前面介紹了Fle*sim中有兩種對象,一種是派生至Fi*edResource的靜態(tài)對象即對象本身不運動;另一種是派生至TaskE*ecuter的動態(tài)對象即對象本身可運動。如果用戶建立的系統(tǒng)模型全部使用了靜態(tài)對象,則就不需要任務序列的機制,但是這種情況幾乎沒有。使用動態(tài)對象搬

14、運物件,對象怎樣運動,實現什么樣的功能等,這就需要。任務序列是由TaskE*ecuter執(zhí)行的一組命令序列。這里TaskE*ecuter涵蓋了所有派生自他的動態(tài)對象,如Operators,Transpoters,Crane,ASRSvehicle,Robots,Elevators以及其他可運動的對象。圖1-4表示一個任務序列,該任務序列有多個任務組成。P1 P2 Task1 Task2 Task3 Task4 Simulation TimeP1: Priority ValueP2: Preempt Value圖1-4Fle*sim中為用戶提供了功能齊備的任務類型。常用的任務序列有:TASKTY

15、PE_TRAVEL、TASKTYPE_LOAD、TASKTYPE_UNLOAD、TASKTYPE_TRAVELTOLOC等。不同的任務序列有不同的設置參數,用戶可以根據需要在使用的時候查詢幫助文檔。 默認任務序列Fi*edResource為了將物件item移至下一個站點station,有一個創(chuàng)立任務序列的默認機制。Fi*edResource對象的參數對話框中一個通用的Flow選項頁,選擇其中的Use Transport復選框,這樣就可創(chuàng)立默認的任務序列。對于Processor對象,還可以自動創(chuàng)立對Setup time/Process time/Repair operation的任

16、務序列。當仿真運行時,這些自動創(chuàng)立的任務序列就會傳遞給與其中心端口相連的動態(tài)對象來執(zhí)行。這里給個簡單的例子說明。假設用戶選擇了Queue對象參數對話框的Flow選項頁中的Use Transport復選框,當系統(tǒng)運行時,產生了如下任務序列:P1 P2 Travel Load Break Travel Unload當Operator收到該任務序列時,順序地執(zhí)行任務序列中的每個任務,執(zhí)行過程如下:Operator先移動到Queue處Travel;接著拿起物件Load;然后移動到下一個站點處Travel;最后放下物件Unload。在仿真運行的任意時刻,一個TaskE*ecuter只能執(zhí)行一個任務序列,

17、而此時Fi*edResource可能創(chuàng)立了許多任務序列,這些未執(zhí)行的任務序列被放置在緩存隊列中等待執(zhí)行。 定制任務序列一般情況下,默認的任務序列就可以滿足仿真要求。有時候用戶需要為*些特定的工藝、多個設備的組合操控燈定制任務序列。這里分三種介紹定制任務序列,第一種是創(chuàng)立最簡單的、只分配給一個對象執(zhí)行的任務序列;第二種是由多個對象協同作業(yè)的任務序列。定制簡單任務序列使用3條命令來創(chuàng)立任務序列,命令執(zhí)行的順序如下:createemptytasksequence();inserttask();dispatchtasksequence();從函數名就可以看出創(chuàng)立任務序列的過程。首先創(chuàng)立一

18、個空的任務序列,然后在此任務序列中插入具體的任務,最后發(fā)布該任務序列。我們舉個簡單的例子,叉車運動到集裝箱旁邊,然后裝載集裝箱。在這個過程中,涉及了兩個任務:運動TASKTYPE_TRAVEL和裝載TASKTYPE_LOAD。具體實現如下:fsnode* new_ts = createemptytasksequence(forklift, 0, 0);inserttask(new_ts, TASKTYPE_TRAVEL, station);inserttask(new_ts, TASKTYPE_LOAD, item, station, 2);dispatchtasksequence(new_t

19、s);這里叉車forklift是任務序列的執(zhí)行者,我們?yōu)槠鋭?chuàng)立了一個新任務序列new_ts,在此任務序列中插入具體的任務TRAVEL/LOAD,最后發(fā)布任務序列。我們在創(chuàng)立新任務序列時,createemptytaskseqence函數的第一個參數forklift可以是該任務序列的執(zhí)行者,或者是Dispatcher對象。關于Dispatcher對象的作用下一小節(jié)有具體的介紹。后兩者參數決定了該任務序列的優(yōu)先級別,我們可以根據任務的緊急程度來定義任務序列的執(zhí)行順序。Inserttask函數插入具體的任務類型。第一個參數表示該任務所屬的任務序列。前面提過不同的任務類型有著不同的代碼,以及不同的參數選

20、擇。這些參數分別是:Task Type/involved1/involved2/var1/var2/var3,有些參數是選擇性的,這要根據任務類型來決定。這里以TASKTYPE_LOAD為例,圖1-5表示了不同參數的意義。用戶可以根據所示規(guī)則查詢具體的任務的參數選項。P1 P2 TRAVEL LOADTask Type: LOADInvoloved1: bject to load itemInvoloved2 : object to load from stationVar1 : output port 2Var2 : 0 默認值Var3 : 0 默認值圖1-5 任務Load的參數含義協同作業(yè)

21、的任務序列協同作業(yè)的情況有很多,比方叉車作業(yè)需要一個司機來操控,或者一件物品需要兩個人來同時搬運等。在Fle*sim中叉車、人都是可運動對象,要實現協同作業(yè)的任務序列相對于只對一個對象創(chuàng)立任務序列要復雜許多。我們以叉車和司機的協同工作為例來說明怎樣實現協同作業(yè)的任務序列。我們先來分解任務的執(zhí)行過程:1人運動到叉車上Travel;2人進入駕駛室這里是叉車的動作Load;3叉車運動到指定地點Travel;4叉車裝載貨物Load;5叉車運動到卸載點Travel;6卸載貨物Unload。圖1-6是叉車和人的任務序列。P P Wait Load Travel Load Travel UnloadP P

22、Travel to forklift WaitForkliftOperatort圖1-6 協同任務序列從圖中可以看出,叉車在人到達之后才執(zhí)行任務,人進入叉車之后就隨著叉車一起完成叉車的任務。人的任務序列中只有一個任務,其他時間不做任何事情。在Fle*sim中實現的代碼要復雜一些,調用的函數與前面所講的函數不同。涉及的函數主要有:createcoordinatedtasksequence();insertallocatetask();insertpro*ytask();insertsynctask();insertdeallocatetask();dispatchcoordinatedtasks

23、equence();一個協同作業(yè)的任務序列的定制是很復雜,也是很容易出錯的。在開場實現之前必須分析清楚作業(yè)的過程。對于前面人操控叉車的例子我們已經將作業(yè)流程分析清楚了,下面是具體的實現,我將每個函數的功能寫在程序的注釋當中。/創(chuàng)立協同任務序列fsnode * myts = createcoordinatedtasksequence(operatorteam);/為每個執(zhí)行對象分配任務int opkey = insertallocatetask(myts, operatorteam, 0, 0);int forkliftkey = insertallocatetask(myts, forklif

24、tteam, 0,0);/人的分派任務序列int traveltask = insertpro*ytask(myts, opkey, TASKTYPE_TRAVEL, forkliftkey, NULL);insertsynctask(myts, traveltask);/叉車的分派任務序列insertpro*ytask(myts, forkliftkey, TASKTYPE_MOVEOBJECT, opkey, forkliftkey);insertpro*ytask(myts, forkliftkey, TASKTYPE_TRAVEL, loadstation, NULL);insertp

25、ro*ytask(myts, forkliftkey, TASKTYPE_LOAD, item, loadstation);insertpro*ytask(myts, forkliftkey, TASKTYPE_TRAVEL, unloadstation, NULL);insertpro*ytask(myts, forkliftkey, TASKTYPE_UNLOAD, item, unloadstation);/釋放分派的任務序列insertdeallocatetask(myts, forkliftkey);insertdeallocatetask(myts, opkey);/發(fā)布協同任務序

26、列dispatchcoordinatedtasksequence(myts);對象Dispatcher及任務序列的分配規(guī)則現在考慮一種較為復雜的情況:有兩個Queue對象用于存放物件,三個Operator對象用于搬運物件;三個Operator是自由的,沒有被分配給固定的Queue,則怎樣來有效地調用這三個Operator呢?此時就要用到Dispatcher對象。Dispatcher用來控制一組Transporter或Operator。任務序列從一個靜態(tài)對象發(fā)送到Dispatcher,然后Dispatcher來調配這些任務序列分配給與其輸出端口相連的動態(tài)對象。動態(tài)對象接收到任務序列

27、后執(zhí)行相應的命令序列。Dispatcher對象的功能就是將任務序列進展隊列存儲和發(fā)送任務序列。根據用戶建模的邏輯,任務序列可以被排隊等待或是立即傳送個相應的對象。Dispatcher的參數設置對話框只有兩項,當接收到一個任務序列時,調用Pass To函數。顧名思義,該函數將任務序列發(fā)送給接收對象;如果該函數返回值是0,即該任務序列不能被立即分配,則根據QueueStrategy定義的規(guī)則將任務序列放入隊列中等候。QueueStrategy函數返回任務序列的相關值,然后根據優(yōu)先級來確定任務序列在隊列中的位置。高優(yōu)先級的任務序列放在隊列的前面,低優(yōu)先級的放在隊列的后面。如果優(yōu)先級一樣,則根據隊列的

28、先進先出FIFO原則來處理。用戶可以根據需要,動態(tài)的改變任務序列的優(yōu)先級。當將隊列中的任務序列進展排序時,Dispatcher執(zhí)行隊列策略函數,遍歷取得已有任務序列的優(yōu)先級值,與最新的任務序列優(yōu)先級值比擬,根據比擬的結果重新進展隊列排序。在Fle*sim對象層次圖中,我們發(fā)現Dispatcher是所有TaskE*ecuter的父類,也就是說所有的TaskE*ecuter也是Dispatcher。這就意味著Operator或Transporter也可以擔當Dispatcher的角色來分配任務序列,或者是自己執(zhí)行任務序列。Dispatcher與TaskE*ecuter的區(qū)別在仿真執(zhí)行

29、的任意時刻,即使任務序列的等候隊列中多個任務序列,TaskE*ecuter一次只能執(zhí)行一個任務序列。而Dispatcher對象的作用只是在緩存隊列中存放已排序好任務序列,并將隊列最前面的任務序列發(fā)送給動態(tài)對象,但并不執(zhí)行任務序列。利用任務序列實現集裝箱的裝卸過程在集裝箱碼頭的作業(yè)的過程中,集卡行駛到岸橋設備處等待裝箱,岸橋將集裝箱從船上卸下裝到已等待的集卡上;裝箱后的集卡行駛到堆場中,場橋將集裝箱從集卡上卸下,堆放到堆場中。集裝箱從船到堆場的過程中,經過了集卡、岸橋、場橋等設備的搬運,在Fle*sim中就需要使用任務序列來完成這個過程。這里涉及了三個可運動對象:集卡、岸橋和場橋。

30、這里設計的思路是這樣的,集裝箱的運輸由集卡來實現,這樣集卡就有這樣一個任務序列:Travel Load Travel Unload。集裝箱裝入集卡的作業(yè)由岸橋設備完成,卸載放入堆場的作業(yè)由場橋設備完成,所以集卡的任務序列中Load/Unload的任務就應該由岸橋和場橋來完成。岸橋完成一次作業(yè)的過程也就是完成一個任務序列的過程,可以知道岸橋完成的任務序列應該是:Travel Load Travel Unload。岸橋在作業(yè)的過程中,集卡處于等待的狀態(tài),也就是說岸橋和集卡之間是協同作業(yè)的。場橋的情況與岸橋一致。Fle*sim中可以使用調用子任務的方法將岸橋和場橋的任務序列插入到集卡的任務序列中。圖

31、1-7表示了主任務序列和子任務序列之間的關系。TravelLoadTravelUnload場橋子任務序列TravelLoadTravelUnload集卡主任務序列TravelLoadTravelUnload岸橋子任務序列圖1-7 集裝箱搬運過程的任務序列在Fle*sim中的實現的主要代碼如下,其關鍵的代碼在文中有注釋:/獲取任務序列中的任務數量int nroftasks = gettotalnroftasks(tasksequence);/查找Load/Unload任務,找到之后調用子任務來替換這兩個任務for(int i=1; i=nroftasks; i+)int tasktype = g

32、ettasktype(tasksequence, i);switch(tasktype)case TASKTYPE_LOAD:case TASKTYPE_FRLOAD:int msgtype = (tasktype = TASKTYPE_LOAD 1 : 2);/changetask()函數會發(fā)出一個消息message,我們在消息的承受者的OnMessage()函/數中創(chuàng)立岸橋和叉車的子任務序列changetask(tasksequence, i, TASKTYPE_CALLSUBTASKS, current, NULL, msgtype, tonum(gettaskinvolved(task

33、sequence, i, 1), tonum(gettaskinvolved(tasksequence, i, 2), gettaskvariable(tasksequence, i, 1);break;case TASKTYPE_UNLOAD:case TASKTYPE_FRUNLOAD:int msgtype = (tasktype = TASKTYPE_UNLOAD 3: 4);changetask(tasksequence, i, TASKTYPE_CALLSUBTASKS, current, NULL, msgtype, tonum(gettaskinvolved(taskseque

34、nce, i, 1), tonum(gettaskinvolved(tasksequence, i, 2), gettaskvariable(tasksequence, i, 1);break;default: break;子任務序列的實現過程,關鍵代碼有注釋/由changetask()傳過來的參數msgtypeint msgtype = msgparam(1);switch(msgtype)/這里只實現了岸橋子任務序列case 1:case 2:fsnode* op = msgsendingobject;fsnode* item = tonode(msgparam(2);fsnode* qu

35、eue = up(item);/queue1fsnode* active_ts = gettasksequence(op, 0); /0表示當前活動的任務序列int port = gettaskvariable(active_ts, getcurtask(active_ts), 4);fsnode* sts = centerobject(queue, 2); /注意連接時候的端口號fsnode* ts = createcoordinatedtasksequence(op);/創(chuàng)立協同工作序列int op_key = insertallocatetask(ts, op, 0, 0); int s

36、ync_key1 = insertpro*ytask(ts, op_key, TASKTYPE_PICKOFFSET, item, queue, 0, 1, 0); int sts_key = insertallocatetask(ts, sts, tonum(queue), 0);insertpro*ytask(ts, sts_key, TASKTYPE_TRAVEL, queue, NULL, 0); int sync_key2 = insertpro*ytask(ts, sts_key, msgtype = 1 TASKTYPE_FRLOAD : TASKTYPE_LOAD, item,

37、 queue, port);insertsynctask(ts, sync_key1);insertsynctask(ts, sync_key2);int sync_key3 = insertpro*ytask(ts, sts_key, TASKTYPE_UNLOAD, item, op, port);insertsynctask(ts, sync_key3);insertdeallocatetask(ts, op_key);insertdeallocatetask(ts, sts_key);return tonum(ts);break;具體的代碼實現局部有些復雜,但是我們通過前面的分析,將思

38、路整理清楚了,實現也就相對容易了。5.3 運動學Kinematics運動學局部是Fle*sim3.06版中新引入的功能。Fle*sim軟件的一大特點就是三維顯示功能非常強大,除了能夠處理數據統(tǒng)計外,還能使模型的場景中的可運動設備動起來,從而使模擬過程更接近真實。例如,對于港口設備岸邊集裝箱岸橋,在系統(tǒng)建模中如果我們只關心數據、處理時間等的話,可以用Processor來簡單代替岸橋的功能。在Fle*sim中可以將岸橋完全實現,不僅在外觀上,更重要的是設備處理物件的動作。要實現設備的動作,平移水平運動,或垂直運動,或是旋轉運動,這些都需要用到運動學的知識。本節(jié)主要介紹運動學相關知識,例如坐標空間轉

39、換,運動實現,模型的導入,尺寸大小的設定等,還將詳細講述如何在Fle*sim中創(chuàng)立用戶自己的專門對象庫。5.3.1 FLe*sim中的坐標空間運動功能允許一個對象同時實現多個移動操作,在每個運動方向都有加速度、減速度、起始速度、完畢速度以及最大速度等屬性。例如集裝箱岸橋的運動就是由多個部件的運動組成,即大車沿著軌道運行,小車在大車上運行,吊具在垂直方向上運行。大車、小車和吊具都有其自己的速度屬性。如果有了岸橋這樣一個設備對象,在仿真過程中我們就可以實現岸橋的作業(yè)過程。運動學函數的引入就是幫助用戶來實現自己定制的設備的動作。運動學這局部是從3.06版才開場引入的,新版本還會對這局部進一步改良。實

40、現運動學并不難,主要是對三個函數的使用。要執(zhí)行運動操作,首先要調用initkinematics命令。該命令為運動初始化數據,保存對象的起始位置、起始角度。初始化完畢之后,調用addkinematic命令為對象添加平移或旋轉動作。例如,用戶告訴對象在5秒鐘時開場運動,給定加速度、減速度和最大速度,在*方向上平移10個單位;然后告訴對象在7秒鐘時,用不同的加速度、減速度和最大速度,在y方向上移動10個單位。這兩個運動的結果是:對象先在*方向上運動,然后同時在y方向上加速,最后到達目的點的運動軌跡是拋物線。每一個單獨的運動通過addkinematic命令添加;然后調用updatekinematics

41、命令在運動過程中不斷地刷新視圖,該命令的作用就是計算對象當前的位置和旋轉角度。上面的例子很簡單,為了更好的解釋運動學,我們先介紹坐標空間的概念。Fle*sim中最常用的坐標空間就是模型空間model。用戶建立系統(tǒng)模型時,將許多對象放入視圖中,根據不同的邏輯關系組成不同的模型。這些對象都處于模型空間中。模型空間是Fle*sim中最大的坐標空間,系統(tǒng)模型中的所有對象都被包含在這個空間當中。還有一種容器坐標空間container。容器對象就是可以存儲物件,舉例來說,對象Queue的作用是暫存物件,此時Queue就相當于一個容器。當物件置于Queue中時,物件item就處于Queue的容器空間中。當一

42、個物體處于不同的容器空間中時,他的位置坐標就是他所在容器坐標空間坐標系的值。圖1-5描述了容器空間的概念。32物件itemOOZ*Y*YZModel空間Queue空間-21圖1-5在上圖中,Queue置于Model坐標空間中,其位置坐標是2,3;物件item置于Queue的容器空間中,其位置坐標是1,-2。用戶查看對象的屬性頁面可以得到對象的坐標值。這里需要提示一點的是,在Fle*sim中每個被選中的對象都有一個黃色的外界矩形框,對象的坐標是以如下圖的位置點來確定的。當用戶定制的對象需要做的動作比擬復雜的動作時,相對運動的坐標關系常常需要在不同的容器坐標系之間作相應的轉換工作。Fle*sim也

43、提供了相應的坐標轉換函數,在我們后面的內容中會有詳細的講述。模型的導入及模型尺寸的調整Fle*sim可以導入多種3D媒體文件。這些文件格式包含了3ds、wrl、d*f和stl,這些都是很常用的工業(yè)標準。用戶可以使用第三方的軟件,如3DMa*,MAYA來構造模型,然后將模型文件轉化為標準格式,最后導入Fle*sim中。這里有一些注意點,Fle*sim只支持VRML1.0版的圖形,不支持2.0版本;Fle*sim只能導入stl的ascii文件,不支持stl的二進制binary文件。在對象的屬性對話框中,在3D shape一項中可以更改3D模型。我們這里用一個實例來介紹一個制作的過程,以及一些技巧。

44、制作一個集裝箱吊具。我們在3DMa*中按比例做出吊具的三維模型,具體的制作過程不是我們討論的內容。在完成之后我們還需要做一些后期的處理工作,使導出的文件在導入Fle*sim中有最正確的效果。實現過程很簡單,過程如下:量取模型長寬高的比例值0.5:2.5:0.6;設置3DMa*軟件的最小單元的尺寸為1;將已完成的模型縮小到尺寸大小為1的正方體中圖1-6;最后將模型導出,保存為3ds文件格式。圖1-6我們選取BasicTE作為吊具的模板。在Fle*sim中,BasicTE對象的默認外形是一個球體。翻開該對象的屬性對話框,將3D shape選項中的媒體文件改為吊具模型的文件。導入之后的外觀如圖1-7

45、所示。在Position, Rotation, and Size選項中,將S*/SY/SZ三項的值改為我們之前記錄的外界矩形框的長寬高比例,效果如圖1-8。圖1-7 圖1-8從圖中我們看到,不管模型的尺寸怎么改變,模型始終被包含在黃色的外界框中。這么做的目的不僅是為了外觀上的好看,更重要的是為了后面的運動學計算時的方便。有時候模型導入Fle*sim后,模型和外界框之間有一些偏差。此時可以使用Edit 3D Shape Factors來修正,使模型完全處于黃色的外界框之中。除了改變模型的外觀和尺寸,Fle*sim中還可以改變對象外觀的貼圖和顏色。還有一點就是用戶還可以自己編寫OpenGL代碼來畫

46、出對象的外觀,具體實現在Custom Draw Code中實現。這局部的要求比擬高,用的不是很多。制作岸邊集裝箱起重機對象岸橋設備是集裝箱碼頭裝卸船作業(yè)的最主要設備,在港口中有著廣泛的應用。我們用一個例子來總結一下本節(jié)所講的內容,該例子對于其他對象的開發(fā)有很多的借鑒意義。岸橋設備對象在后面的系統(tǒng)建模及仿真中也得到了應用。BasicTE對象我們前面提到,Fle*sim為用戶提供了BasicTE/BasicFR對象來開發(fā)自己的對象。岸橋設備的實現要涉及到運動學,所以我們選擇BasicTE對象。BasicTE對象的引入就是為了實現對象的運動,我們主要的工作就要實現參數對話框中OnBeginOffse

47、t/OnUpdateOffset/OnFinishOffset函數。圖1-9 BasicTE參數對話框這些函數的功能是:OnBeginOffset 計算出該對象在*/Y/Z方向上要運行的距離或要旋轉的角度;OnUpdateOffset 在對象運動的過程不斷地計算位置或旋轉的角度;OnFinishOffset 運動完畢后調用該函數。部件的層級關系這里我們將岸橋分解為三個主要運動部件:大車運行構造、小車運行機構和吊具。三者之間的關系是:小車和吊具跟隨大車運動;吊具跟隨小車運動。也就是說大車和小車都相當于容器,小車置于大車容器中,吊具置于小車容器中。在Fle*sim中的實現如圖1-10大車運行機構小

48、車運行機構吊具BasicTEBasicTEBasicTE圖1-10 岸橋部件層次關系導入三維模型我們在3DMa*中制作三維模型,調整三個部件的比例關系,記錄模型外接矩形框的窗寬高比例,然后將三個部件分別導出,保存為:STS.3ds/Trolley.3ds/Grabber.3ds。將三個模型導入到各自對應的BasicTE對象。調整尺寸之后得到的如圖1-11所示的效果。圖1-11 三維模型導入Fle*ism后的效果運動的實現我們先來看看BasicTE是怎樣來完成一次搬運的作業(yè)過程的。圖1-12表示的是BasicTE與物件容器容器1是提取物件的位置,容器2是物件放下的位置的相對位置。BasicTE先

49、運動到容器1;提取物件;在運動到容器2;放下物件。這就是一個完整的作業(yè)過程。我們關心的是BasicTE兩次運動的行走路線,從圖中我們可以清楚地看到有兩種路線:1在*/Y方向上同時有運動速度,此時從起始點到目的點的運動路線是拋物線;2將*/Y方向上的運動分解,可以先完成*方向上的運行距離,再完成Y方向上的運行距離,或反過來。*Y*y*YBasicTE容器1容器2圖1-12 兩種運行路線確定了運行路線后,接下來需要知道的是BasicTE對象需要運動的距離。不管是拋物線的運行路線還是直線的運動路線,都可以將分解為起始點與目的點之間在*方向上的距離和Y方向的距離。BasicTE的參數對話框的OnBeg

50、inOffset選項中為我們提供了多個有用的參數值,這是系統(tǒng)自動計算的,用戶只要明白這些參數的含義直接拿來使用即可。下面是對這些參數含義的解釋:current:BasicTE對象本身;*:BasicTE在*方向上的偏移量;其值為BasicTE與物件中心坐標在*方向的差;y:BasicTE在y方向上的偏移量;其值為BasicTE與物件中心坐標在y方向的差;z:BasicTE在z方向上的偏移量;其值為BasicTE與物件中心坐標在z方向的差;item:BasicTE所搬運的物件;endspeed:BasicTE到達目的點的速度;ma*speed:BasicTE運動過程中所能到達的最大速度;acce

51、leration:BasicTE運動過程中的加速度;deceleration:BasicTE運動過程中的減速度;我們接著來看看我們做要完成的岸橋設備該怎樣運動?可以肯定岸橋不會有拋物線的運動軌跡,假設岸橋的大車STS在model坐標空間中沿著y方向運動,則小車Trolley在大車的坐標空間中沿著*方向運動,吊具Grabber在z方向上運動。小車和吊具都處于大車的坐標空間中,當我們在大車中實現運動函數時,上面所提到的距離參數需要做一些轉換。這里*/y/z距離參數都是大車的BasicTE對象相對物件的距離,這個距離值只有在model坐標空間中才有意義;大車處在model的坐標空間中,大車在y方向上

52、運動,所以y參數值可以直接使用。小車處于大車的坐標空間中,需要將*參數轉化到同一坐標系下,這樣小車才能準確地運動到物件的正上方。吊具運行的距離也同要需要將z值轉換到同一坐標系下。圖1-13是對上述文字的一些解釋。*Dis_Trolleydelta*YY*y*STStrolleyitemModelnew*圖1-13 岸橋各部件運動距離從圖中我們可以清楚地看到大車的運行距離是y。小車的運行距離*Dis_Trolley需要經過一些計算才能得到。因為小車處于大車的坐標空間中,而*參數值是大車中心與物件中心的差,是model坐標空間中的值,所以我們先將*轉換到大車的坐標空間中,Fle*sim為我們提供了

53、轉換函數vectorprojer*()。物件在大車坐標空間的坐標值new*:new* = vectorproject*(model, *center(current)+*, 0, 0, current);從圖中可以知道delta是在大車的坐標空間中:delta = *loc(trolley) + 0.5*size(trolley);小車最終的運行距離是:*Dis_Trolley = new* delta。同樣的我們可以得到吊具的運行距離z。運行距離得到之后,接下來的工作是分析岸橋在完成一次裝卸作業(yè)的運動周期。我們將完成一次裝卸作業(yè)的運動定義如下:1吊具運動;2大車運行;3小車運行;4吊具運行。

54、仿真過程中岸橋設備按照這樣的作業(yè)周期不停地作業(yè),直到仿真完畢或者裝卸完畢。在OnBeginOffset中具體實現如下:/初始化運動initkinematics(sts_kin, current);/全局坐標initkinematics(trolley_kin, trolley);initkinematics(grabber_kin, grabber);/添加運動double time1 = addkinematic(grabber_kin, 0, 0, z, time(), KINEMATIC_TRAVEL);double time2 = addkinematic(sts_kin, 0, y,

55、 0, time1, KINEMATIC_TRAVEL);double time3 = addkinematic(trolley_kin, *, 0, 0, time2, KINEMATIC_TRAVEL);double time4 = addkinematic(grabber_kin, 0, 0, z, time3, KINEMATIC_TRAVEL);return time4 time();在OnUpdateOffset中的實現比擬簡單,只要不斷地更新運動過程即可,主要實現如下:if(offsettingnow)updatekinematics(label(current, sts_kin), current

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論