


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、5.1 第五章Flexsim相關(guān)的概念及關(guān)鍵技術(shù)研究Flexsim軟件介紹Flexsim是由美國(guó)的FlexsimSoftwareProduction公司出品的,是一款商業(yè)化離散事件系統(tǒng)仿真軟件。Flexsim采用面向?qū)ο蠹夹g(shù),并具有三維顯示功能。建??旖莘奖愫惋@示能力強(qiáng)大是該軟件的重要特點(diǎn)。該軟件體供了原始數(shù)據(jù)擬合、輸入建模、圖形化的模型構(gòu)建、虛擬現(xiàn)實(shí)顯示、運(yùn)行模型進(jìn)行仿真試驗(yàn)、對(duì)結(jié)果進(jìn)行優(yōu)化、生成3D動(dòng)畫影像文件等功能也提供了與其他工具軟件的接口。圖5-1是Flexsim軟件及其構(gòu)成模塊的結(jié)構(gòu)圖7。圖5-1Flexsim功能結(jié)構(gòu)圖輸入建模系統(tǒng)仿真運(yùn)行仿真試驗(yàn)結(jié)果統(tǒng)計(jì)分析Flexsim提供了仿
2、真模型與ExpertFit和Excel的接口,用戶可以同過ExperFit對(duì)輸入數(shù)據(jù)進(jìn)行分布擬合,同時(shí)可以在Excel中方面地實(shí)現(xiàn)和仿真模型之間的數(shù)據(jù)交換,包括輸出和運(yùn)行模型過程中動(dòng)態(tài)修改運(yùn)行參數(shù)等。另外該軟件還提供了優(yōu)化模塊Optquest,增加了幫助迅速建模的MicrosoftVisio的接口。5.1.1 Flexsim軟件的主要特點(diǎn)Flexsim仿真軟件的特點(diǎn)主要體現(xiàn)在采用面向?qū)ο蠹夹g(shù),突出3D顯示效果,建模和調(diào)試簡(jiǎn)單開放方便,模型的擴(kuò)展性強(qiáng),易于和其他軟件配合使用等方面。(1) 基于面向?qū)ο蠹夹g(shù)建模Flexsim中所有用來建立模型的資源都是對(duì)象,包括模型、表格、記錄、GUI等。同時(shí),用
3、戶可以根據(jù)自己行業(yè)和領(lǐng)域特點(diǎn),擴(kuò)展對(duì)象,構(gòu)建自己的對(duì)象庫。面向?qū)ο蟮慕<夹g(shù)使得Flexsim的建模過程生產(chǎn)線化,對(duì)象可以重復(fù)利用,從而減少了建模人員的重復(fù)勞動(dòng)。(2) 突出的3D圖形顯示功能Flexsim支持OpenGL技術(shù),也支持3ds、wrl、dxf和stl等文件格式。因此用戶可以建立逼真的模型,從而可以幫助用戶對(duì)模型有一個(gè)直觀的認(rèn)識(shí),并幫助模型的驗(yàn)證。用戶可以在仿真環(huán)境下很容易地操控3D模型,從不同角度、放大或縮小來觀測(cè)。(3)建模和調(diào)試的方便建模過程中用戶只需要從模型庫中拖入已有的模型,根據(jù)模型的邏輯關(guān)系進(jìn)行連接,然后設(shè)定不同對(duì)象的屬性。建模的工作簡(jiǎn)單快捷,不需要編寫程序。(4)建模
4、的擴(kuò)展性強(qiáng)Flexsim支持建立用戶定制對(duì)象,融合了C+編程。用戶完全可以將其當(dāng)作一個(gè)C+的開發(fā)平臺(tái)來開發(fā)一定的仿真應(yīng)用程序。(5)開放性好提供了與外部軟件的接口,可以通過ODBC與外部數(shù)據(jù)庫相連,通過socket接口與外部硬件設(shè)備相連,與Excel、Visio等軟件配合使用。5.2Flexsim的一些重要概念Flexsim是目前國(guó)內(nèi)最新的仿真軟件,關(guān)于該軟件的資料和使用經(jīng)驗(yàn)還很少。作者是在不斷的摸索中學(xué)習(xí)的,所以希望本文能對(duì)其他人有一定的借鑒。要完全掌握好Flexsim,并將其用到我們的工作、學(xué)習(xí)和研究當(dāng)中,理解該軟件的一些重要概念和思想是很重要的,本節(jié)針對(duì)集裝箱碼頭建模仿真中用到的技術(shù)做一
5、個(gè)梳理。5.2.1 面向?qū)ο蟮乃枷胂鄬?duì)于目前的一些仿真軟件(如Witness,eM-Plant等),F(xiàn)lexsim是采用面向?qū)ο笏枷牒图夹g(shù)開發(fā)的,其本身更是用C+語言實(shí)現(xiàn)。嚴(yán)格地說該仿真軟件包括了兩部分,仿真軟件和后臺(tái)支持環(huán)境VC+.NET。由于C+是一種面向?qū)ο蟮恼Z言,所以使用Flexsim軟件,從用戶用于系統(tǒng)建模,或是做一些二次開發(fā),這些工作都有面向?qū)ο笏枷氲捏w現(xiàn)。可以這樣說,沒有領(lǐng)會(huì)面向?qū)ο蟮乃枷?,就不能完全發(fā)揮Flexsim軟件本身的特點(diǎn),也就不能用其實(shí)現(xiàn)用戶的目的。使用Flexsim軟件的用戶需要對(duì)C+語言有一定程度的熟悉。本節(jié)主要是解釋Flexsim中所特有的一些面向?qū)ο笏枷?,而?/p>
6、涉及面向?qū)ο笳Z言的解釋(關(guān)于C+語言的知識(shí)請(qǐng)查看相關(guān)書籍)。對(duì)象(Object)的概念在Flexsim軟件中無處不在,我們先直觀的感受一下。軟件的運(yùn)行界面左邊是一個(gè)常用的對(duì)象庫(如圖5-1)。庫中的各種部件就是有特定功能的對(duì)象,這些對(duì)象是軟件本身自帶的,使用這些基本的部件對(duì)象用戶可以完成大多數(shù)的仿真工作。我們使用Processor來解釋一下對(duì)象的概念:我們?nèi)粘K姷娜魏尉唧w事物都可看作是對(duì)象,這里Processor就是一種設(shè)備,它的作用就是對(duì)經(jīng)過他的物件進(jìn)行一些加工,即改變物件的狀態(tài)。這里我們可以將其當(dāng)作現(xiàn)實(shí)中的設(shè)備,如機(jī)床等。圖5-1這里我們借用C+程序設(shè)計(jì)語言中的對(duì)象的概念。對(duì)象是類的實(shí)例
7、,類是對(duì)現(xiàn)實(shí)對(duì)象的抽象。類中包含了對(duì)象的數(shù)據(jù)(相當(dāng)于現(xiàn)實(shí)對(duì)象的狀態(tài)),以及對(duì)象的方法(相當(dāng)于現(xiàn)實(shí)對(duì)象用來處理外界所給信息的方法)。對(duì)象封裝了屬性和方法,進(jìn)一步到Flexsim中,對(duì)于軟件中可用的庫對(duì)象,他們本身有自己的屬性(如顏色,尺寸,位置等),還有處理物件的方法。在使用軟件的過程中,我們完全可以以人們平時(shí)的思維方式來思考,而無須過多的抽象化,這也就是面向?qū)ο蠓椒ǖ膬?yōu)點(diǎn)。5.2.2 Flexsim的對(duì)象層次結(jié)構(gòu)面向?qū)ο蠓椒ǖ囊粋€(gè)優(yōu)點(diǎn)是類與類之間可以有繼承關(guān)系,對(duì)象的繼承性給我們提供了更大的柔性來擴(kuò)展我們自己的對(duì)象,即衍生出新的對(duì)象。在Flexsim中我們可以充分利用繼承性來開發(fā)我們自己的對(duì)象
8、,而軟件本身也給用戶提供了這樣的機(jī)制。Flexsim本身的庫對(duì)象是高度抽象化的,具有很強(qiáng)的通用性,幾乎涵蓋了仿真中可能遇到的所有對(duì)象。這些對(duì)象之間有一定的繼承關(guān)系,他們之間存在著邏輯關(guān)系。下圖(圖5-2)是Flexsim中對(duì)象的層次結(jié)構(gòu)。從類的派生關(guān)系圖中我們可以對(duì)Flexsim中各種對(duì)象的邏輯關(guān)系一目了然。對(duì)象庫中的對(duì)象分為兩種,一種是從FixedResource中派生下來的,另一種是TaskExecuter中派生下來的。通過分析我們不難發(fā)現(xiàn),從FixedResource中派生來的對(duì)象有一個(gè)共同的特點(diǎn),其本身是不會(huì)運(yùn)動(dòng)的,他們的作用只是產(chǎn)生或消除物件、存儲(chǔ)物件、加工物件等等;從TaskExe
9、cuter中派生的對(duì)象,其本身是可以運(yùn)動(dòng)的,其作用是將物件從一個(gè)地點(diǎn)運(yùn)送到另一個(gè)地點(diǎn)。當(dāng)現(xiàn)有的庫對(duì)象不能滿足用戶的需要時(shí),用戶就需要?jiǎng)?chuàng)建自己的對(duì)象。Flexsim為用戶提供了這樣一種機(jī)制一一用戶可以定制自己的庫對(duì)象。在對(duì)象層次圖中,我們看到有兩個(gè)虛線框,這表示用戶可以從FixedResource和TaskExecuter中派生出自己的對(duì)象。Flexsim的早期版本中從這兩個(gè)類中派生新的對(duì)象比較復(fù)雜,最新的3.06版中增加了BasicFR和BasicTE類,使用戶的開發(fā)工作更容易。后面的章節(jié)中將具體介紹怎樣來實(shí)現(xiàn)一個(gè)新對(duì)象的定制。5.2.3 節(jié)點(diǎn)和樹在介紹樹結(jié)構(gòu)之前,我們先來了解Flexsim中
10、節(jié)點(diǎn)(node)的概念。節(jié)點(diǎn)是樹結(jié)構(gòu)的最基本的組成單元,他們組成了鏈接的層次。所有的節(jié)點(diǎn)都有一個(gè)文本緩沖區(qū),用來保存節(jié)點(diǎn)的名字。節(jié)點(diǎn)可以是其他節(jié)點(diǎn)的容器,可以是用來定義一個(gè)對(duì)象屬性的關(guān)鍵字,或是擁有一個(gè)數(shù)據(jù)項(xiàng)。屬于一個(gè)節(jié)點(diǎn)的數(shù)據(jù)項(xiàng)類型可能是:數(shù)值(number),字符串(string),對(duì)象(object),或指針(pointer)。下面列出FLexsim中不同類型的節(jié)點(diǎn)標(biāo)志:o8>o回圄例如增加節(jié)點(diǎn),刪除節(jié)點(diǎn),改變節(jié)點(diǎn)所包標(biāo)準(zhǔn)(Standard):對(duì)象(Object):屬性/變量(Attribute/Varibale):函數(shù)(Function(C+):函數(shù)(Function(FlexS
11、cript):用戶可以在對(duì)象的樹結(jié)構(gòu)中任意地操作節(jié)點(diǎn),含的值等。含有對(duì)象數(shù)據(jù)(Object)的節(jié)點(diǎn)可能包含有節(jié)點(diǎn)的子列表。含有對(duì)象數(shù)據(jù)的節(jié)點(diǎn)稱之為對(duì)象節(jié)點(diǎn)。當(dāng)你單擊一個(gè)對(duì)象節(jié)點(diǎn)為時(shí),你會(huì)看到在節(jié)點(diǎn)的左邊有一個(gè)大于號(hào)(>)。單擊將打開對(duì)象數(shù)據(jù)的樹分支。如果一個(gè)節(jié)點(diǎn)包含子節(jié)點(diǎn),可以按下+按鈕來展開。如果一個(gè)節(jié)點(diǎn)包含對(duì)象數(shù)據(jù),可以按下>來展開。下圖(圖5-3)展示了一個(gè)隊(duì)列(Queue)展開的對(duì)象數(shù)據(jù)樹。|CObBCuup也怔Im紋坐ECclasses田Qvariablas臼QbehiwiourE田Qvisual田Qspatial-Qcenlroii<J1.00回CotJjec4i
12、nfo圖5-3樹結(jié)構(gòu)(tree)是一種很常用的數(shù)據(jù)結(jié)構(gòu)。Flexsim仿真模型中的對(duì)象,或?qū)ο笾械膶傩院头椒ü?jié)點(diǎn)等都是樹結(jié)構(gòu);用戶甚至可以直接在樹結(jié)構(gòu)中操作對(duì)象。在Flexsim中有兩個(gè)主要的對(duì)象類型:模型(Model)或仿真對(duì)象(SimulationObject)和視圖對(duì)象(ViewObject)。兩種類型都有對(duì)象數(shù)據(jù)樹,包含了屬性和行為控件。一個(gè)對(duì)象節(jié)點(diǎn)的對(duì)象數(shù)據(jù)樹中的節(jié)點(diǎn)可以作為屬性、變量或成員函數(shù)。也有只是作為簡(jiǎn)單的容器來包含節(jié)點(diǎn)以達(dá)到組織的目的。5.2.4任務(wù)序列任務(wù)序列(TaskSequences)是Flexsim仿真軟件中的核心機(jī)制。各種復(fù)雜仿真的實(shí)現(xiàn)很大程度取決于怎樣實(shí)現(xiàn)任務(wù)序
13、列。前面介紹了Flexsim中有兩種對(duì)象,一種是派生至FixedResource的靜態(tài)對(duì)象(即對(duì)象本身不運(yùn)動(dòng));另一種是派生至TaskExecuter的動(dòng)態(tài)對(duì)象(即對(duì)象本身可運(yùn)動(dòng))。如果用戶建立的系統(tǒng)模型全部使用了靜態(tài)對(duì)象,那么就不需要任務(wù)序列的機(jī)制,但是這種情況幾乎沒有。使用動(dòng)態(tài)對(duì)象搬運(yùn)物件,對(duì)象怎樣運(yùn)動(dòng),實(shí)現(xiàn)什么樣的功能等,這就需要。任務(wù)序列是由TaskExecuter執(zhí)行的一組命令序列。這里TaskExecuter涵蓋了所有派生自他的動(dòng)態(tài)對(duì)象,如Operators,Transpoters,Crane,ASRSvehicle,Robots,Elevators以及其他可運(yùn)動(dòng)的對(duì)象。圖1-4表
14、示一個(gè)任務(wù)序列,該任務(wù)序列有多個(gè)任務(wù)組成。SimulationTimeP1P2Task1Task2Task3Task4P1:PriorityValueP2:PreemptValue圖1-4Flexsim中為用戶提供了功能齊備的任務(wù)類型。常用的任務(wù)序列有:TASKTYPE_TRAVELTASKTYPE_LOADTASKTYPE_UNLOADTASKTYPE_TRAVELTOLOC等。不同的任務(wù)序列有不同的設(shè)置參數(shù),用戶可以根據(jù)需要在使用的時(shí)候查詢幫助文檔。默認(rèn)任務(wù)序列FixedResource為了將物件(item)移至下一個(gè)站點(diǎn)(station),有一個(gè)創(chuàng)建任務(wù)序列的默認(rèn)機(jī)制。Fi
15、xedResource對(duì)象的參數(shù)對(duì)話框中一個(gè)通用的"Flow”選項(xiàng)頁,選擇其中的"UseTransport”復(fù)選框,這樣就可創(chuàng)建默認(rèn)的任務(wù)序列。對(duì)于Processor對(duì)象,還可以自動(dòng)創(chuàng)建對(duì)Setuptime/Processtime/Repairoperation的任務(wù)序列。當(dāng)仿真運(yùn)行時(shí),這些自動(dòng)創(chuàng)建的任務(wù)序列就會(huì)傳遞給與其中心端口相連的動(dòng)態(tài)對(duì)象來執(zhí)行。這里給個(gè)簡(jiǎn)單的例子說明。假設(shè)用戶選擇了Queue對(duì)象參數(shù)對(duì)話框的“Flow”選項(xiàng)頁中的"UseTransport”復(fù)選框,當(dāng)系統(tǒng)運(yùn)行時(shí),產(chǎn)生了如下任務(wù)序列:P1P2TravelLoadBreakTravelUnloa
16、d當(dāng)Operator收到該任務(wù)序列時(shí),順序地執(zhí)行任務(wù)序列中的每個(gè)任務(wù),執(zhí)行過程如下:Operator先移動(dòng)到Queue處(Travel);接著拿起物件(Load);然后移動(dòng)到下一個(gè)站點(diǎn)處(Travel);最后放下物件(Unload)。在仿真運(yùn)行的任意時(shí)刻,一個(gè)TaskExecuter只能執(zhí)行一個(gè)任務(wù)序列,而此時(shí)FixedResource可能創(chuàng)建了許多任務(wù)序列,這些未執(zhí)行的任務(wù)序列被放置在緩存隊(duì)列中等待執(zhí)行。定制任務(wù)序列一般情況下,默認(rèn)的任務(wù)序列就可以滿足仿真要求。有時(shí)候用戶需要為某些特定的工藝、多個(gè)設(shè)備的組合操控?zé)舳ㄖ迫蝿?wù)序列。這里分三種介紹定制任務(wù)序列,第一種是創(chuàng)建最簡(jiǎn)單的、只
17、分配給一個(gè)對(duì)象執(zhí)行的任務(wù)序列;第二種是由多個(gè)對(duì)象協(xié)同作業(yè)的任務(wù)序列。定制簡(jiǎn)單任務(wù)序列使用3條命令來創(chuàng)立任務(wù)序列,命令執(zhí)行的順序如下:createemptytasksequence(-);inserttask(-);dispatchtasksequence(-);從函數(shù)名就可以看出創(chuàng)建任務(wù)序列的過程。首先創(chuàng)立一個(gè)空的任務(wù)序列,然后在此任務(wù)序列中插入具體的任務(wù),最后發(fā)布該任務(wù)序列。我們舉個(gè)簡(jiǎn)單的例子,叉車運(yùn)動(dòng)到集裝箱旁邊,然后裝載集裝箱。在這個(gè)過程中,涉及了兩個(gè)任務(wù):運(yùn)動(dòng)(TASKTYPE_TRAVEL和裝載(TASKTYPE_LOAD。具體實(shí)現(xiàn)如下:fsnode*new_ts=createemp
18、tytasksequence(forklift,0,0);inserttask(new_ts,TASKTYPE_TRAVEL,station);inserttask(new_ts,TASKTYPE_LOAD,item,station,2);dispatchtasksequence(new_ts);這里叉車(forklift)是任務(wù)序列的執(zhí)行者,我們?yōu)槠鋭?chuàng)建了一個(gè)新任務(wù)序列(new_ts),在此任務(wù)序列中插入具體的任務(wù)(TRAVEL/LOAD),最后發(fā)布任務(wù)序列。我們?cè)趧?chuàng)建新任務(wù)序列時(shí),createemptytaskseqence函數(shù)的第一個(gè)參數(shù)forklift可以是該任務(wù)序列的執(zhí)行者,或者是D
19、ispatcher對(duì)象。關(guān)于Dispatcher對(duì)象的作用下一小節(jié)有具體的介紹。后兩者參數(shù)決定了該任務(wù)序列的優(yōu)先級(jí)別,我們可以根據(jù)任務(wù)的緊急程度來定義任務(wù)序列的執(zhí)行順序。Inserttask函數(shù)插入具體的任務(wù)類型。第一個(gè)參數(shù)表示該任務(wù)所屬的任務(wù)序列。前面提過不同的任務(wù)類型有著不同的代碼,以及不同的參數(shù)選擇。這些參數(shù)分別是:TaskType/involved1/involved2/var1/var2/var3,有些參數(shù)是選擇性的,這要根據(jù)任務(wù)類型來決定。這里以TASKTYPE_LOAD為例,圖1-5表示了不同參數(shù)的意義。用戶可以根據(jù)所示規(guī)則查詢具體的任務(wù)的參數(shù)選項(xiàng)。P1P2TRAVELLOAD&
20、quot;廠:一TaskType:LOADInvoloved1:bjecttoloaditemInvoloved2:objecttoloadfromstationVar1:outputport2Var2:0(默認(rèn)值)Var3:0(默認(rèn)值)圖1-5任務(wù)Load的參數(shù)含義協(xié)同作業(yè)的任務(wù)序列協(xié)同作業(yè)的情況有很多,比如叉車作業(yè)需要一個(gè)司機(jī)來操控,或者一件物品需要兩個(gè)人來同時(shí)搬運(yùn)等。在Flexsim中叉車、人都是可運(yùn)動(dòng)對(duì)象,要實(shí)現(xiàn)協(xié)同作業(yè)的任務(wù)序列相對(duì)于PPWaitLoadTravelLoadTravelUnloadPPTraveltoforkliftWait只對(duì)一個(gè)對(duì)象創(chuàng)建任務(wù)序列要復(fù)雜許多。我們以叉
21、車和司機(jī)的協(xié)同工作為例來說明怎樣實(shí)現(xiàn)協(xié)同作業(yè)的任務(wù)序列。我們先來分解任務(wù)的執(zhí)行過程:1)人運(yùn)動(dòng)到叉車上(Travel);2)人進(jìn)入駕駛室(這里是叉車的動(dòng)作)(Load);3)叉車運(yùn)動(dòng)到指定地點(diǎn)(Travel);4)叉車裝載貨物(Load);5)叉車運(yùn)動(dòng)到卸載點(diǎn)(Travel);6)卸載貨物(Unload)。圖1-6是叉車和人的任務(wù)序列。ForkliftOperator圖1-6協(xié)同任務(wù)序列從圖中可以看出,叉車在人到達(dá)之后才執(zhí)行任務(wù),人進(jìn)入叉車之后就隨著叉車一起完成叉車的任務(wù)。人的任務(wù)序列中只有一個(gè)任務(wù),其他時(shí)間不做任何事情。在Flexsim中實(shí)現(xiàn)的代碼要復(fù)雜一些,調(diào)用的函數(shù)與前面所講的函數(shù)不同。
22、涉及的函數(shù)主要有:createcoordinatedtasksequence(-);insertallocatetask(-);insertproxytask(-);insertsynctask(-);insertdeallocatetask(-);dispatchcoordinatedtasksequence(-);一個(gè)協(xié)同作業(yè)的任務(wù)序列的定制是很復(fù)雜,也是很容易出錯(cuò)的。在開始實(shí)現(xiàn)之前必須分析清楚作業(yè)的過程。對(duì)于前面人操控叉車的例子我們已經(jīng)將作業(yè)流程分析清楚了,下面是具體的實(shí)現(xiàn),我將每個(gè)函數(shù)的功能寫在程序的注釋當(dāng)中。/創(chuàng)建協(xié)同任務(wù)序列fsnode*myts=createcoordinated
23、tasksequence(operatorteam);/為每個(gè)執(zhí)行對(duì)象分配任務(wù)intopkey=insertallocatetask(myts,operatorteam,0,0);intforkliftkey=insertallocatetask(myts,forkliftteam,0,0);,TASKTYPE_TRAVEL,forkliftkey,/人的分派任務(wù)序列inttraveltask=insertproxytask(myts,opkeyNULL);insertsynctask(myts,traveltask);/叉車的分派任務(wù)序列,TASKTYPE_MOVEOBJECTopkey,f
24、orkliftkey);,TASKTYPE_TRAVEL,loadstation,NULL);,TASKTYPE_LOAD,item,loadstation);,TASKTYPE_TRAVEL,unloadstation,NULL);,TASKTYPE_UNLOAD,item,unloadstation);insertproxytask(myts,forkliftkeyinsertproxytask(myts,forkliftkeyinsertproxytask(myts,forkliftkeyinsertproxytask(myts,forkliftkeyinsertproxytask(my
25、ts,forkliftkey/釋放分派的任務(wù)序列insertdeallocatetask(myts,forkliftkey);insertdeallocatetask(myts,opkey);/發(fā)布協(xié)同任務(wù)序列 dispatchcoordinatedtasksequence(myts);對(duì)象Dispatcher及任務(wù)序列的分配規(guī)則現(xiàn)在考慮一種較為復(fù)雜的情況:有兩個(gè)Queue對(duì)象用于存放物件,三個(gè)Operator對(duì)象用于搬運(yùn)物件;三個(gè)Operator是自由的,沒有被分配給固定的Queue,那么怎樣來有效地調(diào)用這三個(gè)Operator呢?此時(shí)就要用到Dispatcher對(duì)象。Dispa
26、tcher用來控制一組Transporter或Operator。任務(wù)序列從一個(gè)靜態(tài)對(duì)象發(fā)送到Dispatcher,然后Dispatcher來調(diào)配這些任務(wù)序列分配給與其輸出端口相連的動(dòng)態(tài)對(duì)象。動(dòng)態(tài)對(duì)象接收到任務(wù)序列后執(zhí)行相應(yīng)的命令序列。Dispatcher對(duì)象的功能就是將任務(wù)序列進(jìn)行隊(duì)列存儲(chǔ)和發(fā)送任務(wù)序列。根據(jù)用戶建模的邏輯,任務(wù)序列可以被排隊(duì)等待或是立即傳送個(gè)相應(yīng)的對(duì)象。Dispatcher的參數(shù)設(shè)置對(duì)話框只有兩項(xiàng),當(dāng)接收到一個(gè)任務(wù)序列時(shí),調(diào)用“PassTo”函數(shù)。顧名思義,該函數(shù)將任務(wù)序列發(fā)送給接收對(duì)象;如果該函數(shù)返回值是0,即該任務(wù)序列不能被立即分配,貝U根據(jù)"QueueStra
27、tegy”定義的規(guī)則將任務(wù)序列放入隊(duì)列中等候。QueueStrategy函數(shù)返回任務(wù)序列的相關(guān)值,然后根據(jù)優(yōu)先級(jí)來確定任務(wù)序列在隊(duì)列中的位置。高優(yōu)先級(jí)的任務(wù)序列放在隊(duì)列的前面,低優(yōu)先級(jí)的放在隊(duì)列的后面。如果優(yōu)先級(jí)相同,則根據(jù)隊(duì)列的先進(jìn)先出(FIFO)原則來處理。用戶可以根據(jù)需要,動(dòng)態(tài)的改變?nèi)蝿?wù)序列的優(yōu)先級(jí)。當(dāng)將隊(duì)列中的任務(wù)序列進(jìn)行排序時(shí),Dispatcher執(zhí)行隊(duì)列策略函數(shù),遍歷取得已有任務(wù)序列的優(yōu)先級(jí)值,與最新的任務(wù)序列優(yōu)先級(jí)值比較,根據(jù)比較的結(jié)果重新進(jìn)行隊(duì)列排序。在Flexsim對(duì)象層次圖中,我們發(fā)現(xiàn)Dispatcher是所有TaskExecuter的父類,也就是說所有的TaskExecu
28、ter也是Dispatcher。這就意味著Operator或Transporter也可以擔(dān)當(dāng)Dispatcher的角色來分配任務(wù)序列,或者是自己執(zhí)行任務(wù)序列。 Dispatcher與TaskExecuter的區(qū)別在仿真執(zhí)行的任意時(shí)刻,即使任務(wù)序列的等候隊(duì)列中多個(gè)任務(wù)序列,TaskExecuter一次只能執(zhí)行一個(gè)任務(wù)序列。而Dispatcher對(duì)象的作用只是在緩存隊(duì)列中存放已排序好任務(wù)序列,并將隊(duì)列最前面的任務(wù)序列發(fā)送給動(dòng)態(tài)對(duì)象,但并不執(zhí)行任務(wù)序列。 利用任務(wù)序列實(shí)現(xiàn)集裝箱的裝卸過程在集裝箱碼頭的作業(yè)的過程中,集卡行駛到岸橋設(shè)備處等待裝箱,岸橋?qū)⒓b箱從船上卸下裝到已
29、等待的集卡上;裝箱后的集卡行駛到堆場(chǎng)中,場(chǎng)橋?qū)⒓b箱從集卡上卸下,堆放到堆場(chǎng)中。集裝箱從船到堆場(chǎng)的過程中,經(jīng)過了集卡、岸橋、場(chǎng)橋等設(shè)備的搬運(yùn),在Flexsim中就需要使用任務(wù)序列來完成這個(gè)過程。這里涉及了三個(gè)可運(yùn)動(dòng)對(duì)象:集卡、岸橋和場(chǎng)橋。這里設(shè)計(jì)的思路是這樣的,集裝箱的運(yùn)輸由集卡來實(shí)現(xiàn),這樣集卡就有這樣一個(gè)任務(wù)序列:TravelLoadTravelUnload。集裝箱裝入集卡的作業(yè)由岸橋設(shè)備完成,卸載放入堆場(chǎng)的作業(yè)由場(chǎng)橋設(shè)備完成,所以集卡的任務(wù)序列中Load/Unload的任務(wù)就應(yīng)該由岸橋和場(chǎng)橋來完成。岸橋完成一次作業(yè)的過程也就是完成一個(gè)任務(wù)序列的過程,可以知道岸橋完成的任務(wù)序列應(yīng)該是:Tra
30、velLoadTravelUnload。岸橋在作業(yè)的過程中,集卡處于等待的狀態(tài),也就是說岸橋和集卡之間是協(xié)同作業(yè)的。場(chǎng)橋的情況與岸橋一致。Flexsim中可以使用調(diào)用子任務(wù)的方法將岸橋和場(chǎng)橋的任務(wù)序列插入到集卡的任務(wù)序列中。圖1-7表示了主任務(wù)序列和子任務(wù)序列之間的關(guān)系。場(chǎng)橋子任務(wù)序列TravelLoadTravelUnload圖1-7集裝箱搬運(yùn)過程的任務(wù)序列在Flexsim中的實(shí)現(xiàn)的主要代碼如下,其關(guān)鍵的代碼在文中有注釋:/獲取任務(wù)序列中的任務(wù)數(shù)量intnroftasks=gettotalnroftasks(tasksequence);/查找Load/Unload任務(wù),找到之后調(diào)用子任務(wù)來替
31、換這兩個(gè)任務(wù)for(inti=1;i<=nroftasks;i+)inttasktype=gettasktype(tasksequence,i);switch(tasktype)caseTASKTYPE_LOAD:caseTASKTYPE_FRLOAD:intmsgtype=(tasktype=TASKTYPE_LOAD?1:2);/changetask(-)函數(shù)會(huì)發(fā)出一個(gè)消息(message),我們?cè)谙⒌慕邮苷叩腛nMessage(-)函/數(shù)中創(chuàng)建岸橋和叉車的子任務(wù)序列changetask(tasksequence,i,TASKTYPE_CALLSUBTASKS,current,NU
32、LL,msgtype,tonum(gettaskinvolved(tasksequence,i,1),tonum(gettaskinvolved(tasksequence,i,2),gettaskvariable(tasksequence,i,1);break;caseTASKTYPE_UNLOAD:caseTASKTYPE_FRUNLOAD:intmsgtype=(tasktype=TASKTYPE_UNLOAD?3:4);changetask(tasksequence,i,TASKTYPE_CALLSUBTASKS,current,NULL,msgtype,tonum(gettaskinv
33、olved(tasksequence,i,1),tonum(gettaskinvolved(tasksequence,i,2),gettaskvariable(tasksequence,i,1);break;default:break;子任務(wù)序列的實(shí)現(xiàn)過程,關(guān)鍵代碼有注釋/由changetask()傳過來的參數(shù)msgtypeintmsgtype=msgparam(1);switch(msgtype)/這里只實(shí)現(xiàn)了岸橋子任務(wù)序列case1:case2:fsnode*op=msgsendingobject;fsnode*item=tonode(msgparam(2);fsnode*queue=up
34、(item);/queue1fsnode*active_ts=gettasksequence(op,0);/0表示當(dāng)前活動(dòng)的任務(wù)序列intport=gettaskvariable(active_ts,getcurtask(active_ts),4);fsnode*sts=centerobject(queue,2);/注意連接時(shí)候的端口號(hào)fsnode*ts=createcoordinatedtasksequence(op);/創(chuàng)建協(xié)同工作序歹Uintop_key=insertallocatetask(ts,op,0,0);intsync_key1=insertproxytask(ts,op_ke
35、y,TASKTYPE_PICKOFFSETitem,queue,0,1,0);intsts_key=insertallocatetask(ts,sts,tonum(queue),0);insertproxytask(ts,sts_key,TASKTYPE_TRAVEL,queue,NULL,0);intsync_key2=insertproxytask(ts,sts_key,msgtype=1?TASKTYPE_FRLOAD:TASKTYPE_LOAD,item,queue,port);insertsynctask(ts,sync_key1);insertsynctask(ts,sync_ke
36、y2);intsync_key3=insertproxytask(ts,sts_key,TASKTYPE_UNLOAD,item,op,port);insertsynctask(ts,sync_key3);insertdeallocatetask(ts,op_key);insertdeallocatetask(ts,sts_key);returntonum(ts);break;具體的代碼實(shí)現(xiàn)部分有些復(fù)雜,但是我們通過前面的分析,將思路整理清楚了,實(shí)現(xiàn)也就相對(duì)容易了。5.3運(yùn)動(dòng)學(xué)(Kinematics)運(yùn)動(dòng)學(xué)部分是Flexsim3.06版中新引入的功能。Flexsim軟件的一大特點(diǎn)就是三維顯示功
37、能非常強(qiáng)大,除了能夠處理數(shù)據(jù)統(tǒng)計(jì)外,還能使模型的場(chǎng)景中的可運(yùn)動(dòng)設(shè)備動(dòng)起來,從而使模擬過程更接近真實(shí)。例如,對(duì)于港口設(shè)備岸邊集裝箱岸橋,在系統(tǒng)建模中如果我們只關(guān)心數(shù)據(jù)、處理時(shí)間等的話,可以用Processor來簡(jiǎn)單代替岸橋的功能。在Flexsim中可以將岸橋完全實(shí)現(xiàn),不僅在外觀上,更重要的是設(shè)備處理物件的動(dòng)作。要實(shí)現(xiàn)設(shè)備的動(dòng)作,平移(水平運(yùn)動(dòng),或垂直運(yùn)動(dòng)),或是旋轉(zhuǎn)運(yùn)動(dòng),這些都需要用到運(yùn)動(dòng)學(xué)的知識(shí)。本節(jié)主要介紹運(yùn)動(dòng)學(xué)相關(guān)知識(shí),例如坐標(biāo)空間轉(zhuǎn)換,運(yùn)動(dòng)實(shí)現(xiàn),模型的導(dǎo)入,尺寸大小的設(shè)定等,還將詳細(xì)講述如何在Flexsim中創(chuàng)建用戶自己的專門對(duì)象庫。5.3.1FLexsim中的坐標(biāo)空間運(yùn)動(dòng)功能允許一個(gè)對(duì)
38、象同時(shí)實(shí)現(xiàn)多個(gè)移動(dòng)操作,在每個(gè)運(yùn)動(dòng)方向都有加速度、減速度、起始速度、結(jié)束速度以及最大速度等屬性。例如集裝箱岸橋的運(yùn)動(dòng)就是由多個(gè)部件的運(yùn)動(dòng)組成,即大車沿著軌道運(yùn)行,小車在大車上運(yùn)行,吊具在垂直方向上運(yùn)行。大車、小車和吊具都有其自己的速度屬性。如果有了岸橋這樣一個(gè)設(shè)備對(duì)象,在仿真過程中我們就可以實(shí)現(xiàn)岸橋的作業(yè)過程。運(yùn)動(dòng)學(xué)函數(shù)的引入就是幫助用戶來實(shí)現(xiàn)自己定制的設(shè)備的動(dòng)作。運(yùn)動(dòng)學(xué)這部分是從3.06版才開始引入的,新版本還會(huì)對(duì)這部分進(jìn)一步改進(jìn)。實(shí)現(xiàn)運(yùn)動(dòng)學(xué)并不難,主要是對(duì)三個(gè)函數(shù)的使用。要執(zhí)行運(yùn)動(dòng)操作,首先要調(diào)用initkinematics命令。該命令為運(yùn)動(dòng)初始化數(shù)據(jù),保存對(duì)象的起始位置、起始角度。初始化
39、完畢之后,調(diào)用addkinematic命令為對(duì)象添加平移或旋轉(zhuǎn)動(dòng)作。例如,用戶告訴對(duì)象在5秒鐘時(shí)開始運(yùn)動(dòng),給定加速度、減速度和最大速度,在x方向上平移10個(gè)單位;然后告訴對(duì)象在7秒鐘時(shí),用不同的加速度、減速度和最大速度,在y方向上移動(dòng)10個(gè)單位。這兩個(gè)運(yùn)動(dòng)的結(jié)果是:對(duì)象先在x方向上運(yùn)動(dòng),然后同時(shí)在y方向上加速,最后到達(dá)目的點(diǎn)的運(yùn)動(dòng)軌跡是拋物線。每一個(gè)單獨(dú)的運(yùn)動(dòng)通過addkinematic命令添加;然后調(diào)用updatekinematics命令在運(yùn)動(dòng)過程中不斷地刷新視圖,該命令的作用就是計(jì)算對(duì)象當(dāng)前的位置和旋轉(zhuǎn)角度。上面的例子很簡(jiǎn)單,為了更好的解釋運(yùn)動(dòng)學(xué),我們先介紹坐標(biāo)空間的概念。Flexsim中
40、最常用的坐標(biāo)空間就是模型空間(model)。用戶建立系統(tǒng)模型時(shí),將許多對(duì)象放入視圖中,根據(jù)不同的邏輯關(guān)系組成不同的模型。這些對(duì)象都處于模型空間中。模型空間是Flexsim中最大的坐標(biāo)空間,系統(tǒng)模型中的所有對(duì)象都被包含在這個(gè)空間當(dāng)中。還有一種容器坐標(biāo)空間(container)。容器對(duì)象就是可以存儲(chǔ)物件,舉例來說,對(duì)象Queue的作用是暫存物件,此時(shí)Queue就相當(dāng)于一個(gè)容器。當(dāng)物件置于Queue中時(shí),物件(item)就處于Queue的容器空間中。當(dāng)一個(gè)物體處于不同的容器空間中時(shí),他的位置坐標(biāo)就是他所在容器坐標(biāo)空間坐標(biāo)系的值。圖1-5描述了容器空間的概念。圖1-5在上圖中,Queue置于Model
41、坐標(biāo)空間中,其位置坐標(biāo)是(2,3);物件item置于Queue的容器空間中,其位置坐標(biāo)是(1,-2)。用戶查看對(duì)象的屬性頁面可以得到對(duì)象的坐標(biāo)值。這里需要提示一點(diǎn)的是,在Flexsim中每個(gè)被選中的對(duì)象都有一個(gè)黃色的外界矩形框,對(duì)象的坐標(biāo)是以如圖所示的位置點(diǎn)來確定的。當(dāng)用戶定制的對(duì)象需要做的動(dòng)作比較復(fù)雜的動(dòng)作時(shí),相對(duì)運(yùn)動(dòng)的坐標(biāo)關(guān)系常常需要在不同的容器坐標(biāo)系之間作相應(yīng)的轉(zhuǎn)換工作。Flexsim也提供了相應(yīng)的坐標(biāo)轉(zhuǎn)換函數(shù),在我們后面的內(nèi)容中會(huì)有詳細(xì)的講述。模型的導(dǎo)入及模型尺寸的調(diào)整Flexsim可以導(dǎo)入多種3D媒體文件。這些文件格式包含了3ds、wrl、dxf和stl,這些都是很常用的工業(yè)標(biāo)準(zhǔn)。用
42、戶可以使用第三方的軟件,如3DMax,MAYA來構(gòu)造模型,然后將模型文件轉(zhuǎn)化為標(biāo)準(zhǔn)格式,最后導(dǎo)入Flexsim中。這里有一些注意點(diǎn),F(xiàn)lexsim只支持VRML1.0版的圖形,不支持2.0版本;Flexsim只能導(dǎo)入stl的ascii文件,不支持stl的二進(jìn)制(binary)文件。在對(duì)象的屬性對(duì)話框中,在“3Dshape”一項(xiàng)中可以更改3D模型。我們這里用一個(gè)實(shí)例來介紹一個(gè)制作的過程,以及一些技巧。制作一個(gè)集裝箱吊具。我們?cè)?DMax中按比例做出吊具的三維模型,具體的制作過程不是我們討論的內(nèi)容。在完成之后我們還需要做一些后期的處理工作,使導(dǎo)出的文件在導(dǎo)入Flexsim中有最佳的效果。實(shí)現(xiàn)過程很
43、簡(jiǎn)單,過程如下:量取模型長(zhǎng)寬高的比例值(0.525:0.6);設(shè)置3DMax軟件的最小單元的尺寸為1;將已完成的模型縮小到尺寸大小為1的正方體中(圖1-6);最后將模型導(dǎo)出,保存為3ds文件格式。圖1-6我們選取BasicTE作為吊具的模板。在Flexsim中,BasicTE對(duì)象的默認(rèn)外形是一個(gè)球體。打開該對(duì)象的屬性對(duì)話框,將“3Dshape”選項(xiàng)中的媒體文件改為吊具模型的文件。導(dǎo)入之后的外觀如圖1-7所示。在“Position,Rotation,andSize”選項(xiàng)中,將SX/SY/SZ三項(xiàng)的值改為我們之前記錄的外界矩形框的長(zhǎng)寬高比例,效果如圖1-8。XOrthographicV.-.區(qū)Se
44、ttingsEditSslectedULjtctsVi電心Object:BasicTE4Position-4.00,0.000.00圖1-7圖1-8從圖中我們看到,不管模型的尺寸怎么改變,模型始終被包含在黃色的外界框中。這么做的目的不僅是為了外觀上的好看,更重要的是為了后面的運(yùn)動(dòng)學(xué)計(jì)算時(shí)的方便。有時(shí)候模型導(dǎo)入Flexsim后,模型和外界框之間有一些偏差。此時(shí)可以使用“Edit3DShapeFactors”來修正,使模型完全處于黃色的外界框之中。除了改變模型的外觀和尺寸,F(xiàn)lexsim中還可以改變對(duì)象外觀的貼圖和顏色。還有一點(diǎn)就是用戶還可以自己編寫OpenGL代碼來畫出對(duì)象的外觀,具體實(shí)現(xiàn)在“C
45、ustomDrawCode”中實(shí)現(xiàn)。這部分的要求比較高,用的不是很多。制作岸邊集裝箱起重機(jī)對(duì)象岸橋設(shè)備是集裝箱碼頭裝卸船作業(yè)的最主要設(shè)備,在港口中有著廣泛的應(yīng)用。我們用一個(gè)例子來總結(jié)一下本節(jié)所講的內(nèi)容,該例子對(duì)于其他對(duì)象的開發(fā)有很多的借鑒意義。岸橋設(shè)備對(duì)象在后面的系統(tǒng)建模及仿真中也得到了應(yīng)用。BasicTE對(duì)象我們前面提到,F(xiàn)lexsim為用戶提供了BasicTE/BasicFR對(duì)象來開發(fā)自己的對(duì)象。岸橋設(shè)備的實(shí)現(xiàn)要涉及到運(yùn)動(dòng)學(xué),所以我們選擇BasicTE對(duì)象。BasicTE對(duì)象的引入就是為了實(shí)現(xiàn)對(duì)象的運(yùn)動(dòng),我們主要的工作就要實(shí)現(xiàn)參數(shù)對(duì)話框中OnBeginOffset/OnUpdateOffs
46、et/OnFinishOffset函數(shù)。圖1-9BasicTE參數(shù)對(duì)話框這些函數(shù)的功能是:OnBeginOffset計(jì)算出該對(duì)象在X/Y/Z方向上要運(yùn)行的距離或要旋轉(zhuǎn)的角度;(1) OnUpdateOffset在對(duì)象運(yùn)動(dòng)的過程不斷地計(jì)算位置或旋轉(zhuǎn)的角度;(2) OnFinishOffset運(yùn)動(dòng)結(jié)束后調(diào)用該函數(shù)。部件的層級(jí)關(guān)系這里我們將岸橋分解為三個(gè)主要運(yùn)動(dòng)部件:大車運(yùn)行結(jié)構(gòu)、小車運(yùn)行機(jī)構(gòu)和吊具。三者之間的關(guān)系是:小車和吊具跟隨大車運(yùn)動(dòng);吊具跟隨小車運(yùn)動(dòng)。也就是說大車和小車都相當(dāng)Flexsim中的實(shí)現(xiàn)如圖1-10于容器,小車置于大車容器中,吊具置于小車容器中。在BasicTEBasicTEBas
47、icTE大車運(yùn)行機(jī)構(gòu)圖1-10岸橋部件層次關(guān)系導(dǎo)入三維模型我們?cè)?DMax中制作三維模型,調(diào)整三個(gè)部件的比例關(guān)系,記錄模型外接矩形框的窗寬高比例,然后將三個(gè)部件分別導(dǎo)出,保存為:STS.3ds/Trolley.3ds/Grabber.3ds。將三個(gè)模型導(dǎo)入到各自對(duì)應(yīng)的BasicTE對(duì)象。調(diào)整尺寸之后得到的如圖1-11所示的效果。圖1-11三維模型導(dǎo)入Flexism后的效果運(yùn)動(dòng)的實(shí)現(xiàn)我們先來看看BasicTE是怎樣來完成一次搬運(yùn)的作業(yè)過程的。圖1-12表示的是BasicTE與物件容器(容器1是提取物件的位置,容器2是物件放下的位置)的相對(duì)位置。BasicTE先運(yùn)動(dòng)到容器1;提取物件;在運(yùn)動(dòng)到容器
48、2;放下物件。這就是一個(gè)完整的作業(yè)過程。我們關(guān)心的是BasicTE兩次運(yùn)動(dòng)的行走路線,從圖中我們可以清楚地看到有兩種路線:1)在X/Y方向上同時(shí)有運(yùn)動(dòng)速度,此時(shí)從起始點(diǎn)到目的點(diǎn)的運(yùn)動(dòng)路線是拋物線;2)將X/Y方向上的運(yùn)動(dòng)分解,可以先完成X方向上的運(yùn)行距離,再完成Y方向上的運(yùn)行距離,或反過來。YX圖1-12兩種運(yùn)行路線確定了運(yùn)行路線后,接下來需要知道的是BasicTE對(duì)象需要運(yùn)動(dòng)的距離。不管是拋物線的運(yùn)行路線還是直線的運(yùn)動(dòng)路線,都可以將分解為起始點(diǎn)與目的點(diǎn)之間在X方向上的距離和Y方向的距離。BasicTE的參數(shù)對(duì)話框的“OnBeginOffset”選項(xiàng)中為我們提供了多個(gè)有用的參數(shù)值,這是系統(tǒng)自動(dòng)
49、計(jì)算的,用戶只要明白這些參數(shù)的含義直接拿來使用即可。下面是對(duì)這些參數(shù)含義的解釋:1) current:BasicTE對(duì)象本身;x:BasicTE在x方向上的偏移量;其值為v:BasicTE在y方向上的偏移量;其值為z:BasicTE在z方向上的偏移量;其值為BasicTE與物件中心坐標(biāo)在x方向的差;BasicTE與物件中心坐標(biāo)在y方向的差;BasicTE與物件中心坐標(biāo)在z方向的差;5) item:BasicTE所搬運(yùn)的物件;endspeed:BasicTE到達(dá)目的點(diǎn)的速度;maxspeed:BasicTE運(yùn)動(dòng)過程中所能達(dá)到的最大速度;acceleration:BasicTE運(yùn)動(dòng)過程中的加速度;
50、deceleration:BasicTE運(yùn)動(dòng)過程中的減速度;我們接著來看看我們做要完成的岸橋設(shè)備該怎樣運(yùn)動(dòng)?可以肯定岸橋不會(huì)有拋物線的運(yùn)動(dòng)軌跡,假設(shè)岸橋的大車(STS)在model坐標(biāo)空間中沿著y方向運(yùn)動(dòng),那么小車(Trolley)在大車的坐標(biāo)空間中沿著x方向運(yùn)動(dòng),吊具(Grabber)在z方向上運(yùn)動(dòng)。小車和吊具都處于大車的坐標(biāo)空間中,當(dāng)我們?cè)诖筌囍袑?shí)現(xiàn)運(yùn)動(dòng)函數(shù)時(shí),上面所提到的距離參數(shù)需要做一些轉(zhuǎn)換。這里x/y/z距離參數(shù)都是大車的BasicTE對(duì)象相對(duì)物件的距離,這個(gè)距離值只有在model坐標(biāo)空間中才有意義;大車處在model的坐標(biāo)空間中,大車在y方向上運(yùn)動(dòng),所以y參數(shù)值可以直接使用。小車處
51、于大車的坐標(biāo)空間中,需要將x參數(shù)轉(zhuǎn)化到同一坐標(biāo)系下,這樣小車才能準(zhǔn)確地運(yùn)動(dòng)到物件的正上方。吊具運(yùn)行的距離也同要需要將z值轉(zhuǎn)換到同一坐標(biāo)系下。圖1-13是對(duì)上述文字的一些解釋。x圖1-13岸橋各部件運(yùn)動(dòng)距離從圖中我們可以清楚地看到大車的運(yùn)行距離是y。小車的運(yùn)行距離xDis_Trolley需要經(jīng)過一些計(jì)算才能得到。因?yàn)樾≤囂幱诖筌嚨淖鴺?biāo)空間中,而x參數(shù)值是大車中心與物件中心的差,是model坐標(biāo)空間中的值,所以我們先將x轉(zhuǎn)換到大車的坐標(biāo)空間中,F(xiàn)lexsim為我們提供了轉(zhuǎn)換函數(shù)vectorprojerx(-)。物件在大車坐標(biāo)空間的坐標(biāo)值newx:newx=vectorprojectx(model,
52、xcenter(current)+x,0,0,current);從圖中可以知道delta是在大車的坐標(biāo)空間中:delta=xloc(trolley)+0.5*xsize(trolley);小車最終的運(yùn)行距離是:xDis_Trolley=newx-delta。同樣的我們可以得到吊具的運(yùn)行距離z。運(yùn)行距離得到之后,接下來的工作是分析岸橋在完成一次裝卸作業(yè)的運(yùn)動(dòng)周期。我們將完成一次裝卸作業(yè)的運(yùn)動(dòng)定義如下:1)吊具運(yùn)動(dòng);2)大車運(yùn)行;3)小車運(yùn)行;4)吊具運(yùn)行。仿真過程中岸橋設(shè)備按照這樣的作業(yè)周期不停地作業(yè),直到仿真結(jié)束或者裝卸完畢。在OnBeginOffset中具體實(shí)現(xiàn)如下:/初始化運(yùn)動(dòng)initki
53、nematics(sts_kin,current);/全局坐標(biāo)initkinematics(trolley_kin,trolley);initkinematics(grabber_kin,grabber);/添加運(yùn)動(dòng)doubletimel=addkinematic(grabber_kin,0,0,乙-time(),KINEMATIC_TRAVEL);doubletime2=addkinematic(sts_kin,0,y,0,timel,KINEMATIC_TRAVEL);doubletime3=addkinematic(trolley_kin,x,0,0,time2,KINEMATIC_TR
54、AVEL);doubletime4=addkinematic(grabber_kin,0,0,乙-time3,KINEMATIC_TRAVEL);returntime4-time();在OnUpdateOffset中的實(shí)現(xiàn)比較簡(jiǎn)單,只要不斷地更新運(yùn)動(dòng)過程即可,主要實(shí)現(xiàn)如下:if(offsettingnow)(updatekinematics(label(current,"sts_kin"),current);updatekinematics(label(current,"trolley_kin"),trolley);updatekinematics(la
55、bel(current,"grabber_kin"),grabber);在OnFinishOffset中的實(shí)現(xiàn)代碼與OnUpdateOffset的主要代碼一樣。對(duì)于調(diào)用運(yùn)動(dòng)學(xué)函數(shù),用戶必須給這些函數(shù)傳遞一個(gè)空節(jié)點(diǎn)作為第一個(gè)參數(shù)。該參數(shù)的作用是存儲(chǔ)運(yùn)動(dòng)信息,或從該節(jié)點(diǎn)中提取信息。對(duì)于用戶來說只要添加一個(gè)標(biāo)簽即可,例如在代碼中有這樣一些標(biāo)簽,如label(current,"sts_kin")等。函數(shù)調(diào)用的過程中,該標(biāo)簽會(huì)顯示"donottouch”文本。用戶不必關(guān)心其中的內(nèi)容,只要添加了即可。Addkinematic()函數(shù)的最后一個(gè)參數(shù)KINEMATIC_TRAVEL定義了平移的運(yùn)動(dòng)方式。還有其它一些參數(shù)來定義不同的功能,如KINEMATIC_ROTATE定義了
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 康復(fù)輔具的跨國(guó)合作與市場(chǎng)準(zhǔn)入考核試卷
- 木材切割精度控制技術(shù)考核試卷
- 停車設(shè)備行業(yè)營(yíng)銷策略與渠道建設(shè)考核試卷
- 圖書、報(bào)刊行業(yè)風(fēng)險(xiǎn)管理考核試卷
- 電工培訓(xùn)課件
- 再生物資回收在氣候變化適應(yīng)策略中的應(yīng)用考核試卷
- 家居紡織品的文化與藝術(shù)欣賞考核試卷
- 土地利用規(guī)劃中的鄉(xiāng)村景觀規(guī)劃考核試卷
- 快遞商鋪轉(zhuǎn)讓合同范本
- 采購合作合同范本
- 2023年新改版教科版五年級(jí)下冊(cè)科學(xué)全冊(cè)教案(附知識(shí)點(diǎn))
- 固定式塔式起重機(jī)基礎(chǔ)設(shè)計(jì)及計(jì)算
- 奶牛性控凍精的使用細(xì)則:張相文 整理
- GB/T 34376-2017數(shù)控板料折彎?rùn)C(jī)技術(shù)條件
- GB/T 22492-2008大豆肽粉
- 三年級(jí)下冊(cè)豎式脫式計(jì)算
- 《財(cái)務(wù)風(fēng)險(xiǎn)的識(shí)別與評(píng)估管理國(guó)內(nèi)外文獻(xiàn)綜述》
- ??谑写媪糠抠I賣合同模板(范本)
- 經(jīng)典文學(xué)作品中的女性形象研究外文文獻(xiàn)翻譯2016年
- 高爐煤氣安全知識(shí)的培訓(xùn)
- 2008 年全國(guó)高校俄語專業(yè)四級(jí)水平測(cè)試試卷
評(píng)論
0/150
提交評(píng)論