本節書摘來自華章出版社《資訊實體融合系統(cps)設計、模組化與仿真——基于 ptolemy ii 平台》一書中的第2章,第2.7節,作者:[美]愛德華·阿什福德·李(edward ashford lee),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
ptolemy ii 包含大量的高階元件(higher-order component)。這些角色對模型的結構進行操作,而不對輸入資料進行操作。接下來将介紹幾個相應的例子,在這些例子中,5個channel角色被置于一個模型中。為什麼用5個? 也許最好是有一個單獨元件可以表示channel的n個執行個體,其中n是一個變量,這正是高階元件所能解決的問題。高階角色由lee和parks(1995)提出,它使得在模型結構不依賴于問題規模時更容易進行大型設計的建構。在本節中,将對這些角色進行描述,并且它們都能在higherorderactors庫中找到。
2.7.1 multiinstancecomposite角色
考慮圖2-32所示的模型,有5個并行連接配接的channel類執行個體。執行個體的數量在圖中是硬連接配接的,很難進行數量的改變,特别是如果需要增加它時。這個問題可通過使用multiinstance composite(多執行個體複合)角色來解決,如圖2-40所示。multiinstancecomposite是一個複合角色,我們可以在它裡面插入一個單獨的channel執行個體(通過建立一個channel執行個體,将其複制并粘貼到複合角色中)多執行個體複合角色。(multiinstancecomposite)是不透明的(這意味着它包含了訓示器)。它在模型中充當着單個角色,但它内部實作是并行運作的多重角色。

圖2-40 一個模型,它相當于圖2-32,但是使用了multiinstancecomposite,它允許僅僅通過改變一個參數值來改變channel執行個體的數量
如圖2-41所示,multiinstancecomposite角色有3個參數:ninstances、instance、showclones。
第一個參數指定了要建立的執行個體數量。運作時,該角色将自我複制,次數由ninstances指定,如第一個(原型)執行個體那樣,将輸入和輸出連接配接到相同的源和目的地。在圖2-40中,注意multiinstancecomposite的輸入連接配接到一個關系(黑色菱形),輸出直接連接配接到一個addsubtract角色的多端口輸入。是以,連接配接多個執行個體的方式類似于圖2-32,其中相同的輸入值将傳遞給所有執行個體,但是提供給addsubtract角色的輸出值是不同的。
圖2-41 multiinstancecomposite的第一個參數指定執行個體的數量。第二個參數可以使模型的建立者識别單獨的執行個體。第三個參數控制執行個體是否呈現在螢幕上(當模型運作時)
因為執行個體的數量可以由一個參數改變,是以使用多執行個體建立模型比原始方法更好。根據multiinstancecomposite中的instance參數來表示每個執行個體中的參數值,每個執行個體都可以按需定制。比如,令圖2-40中instanceofchannel 角色的noisepower參數值取決于instance。如将其設定為instance*0.1,然後将ninstance設定為1。當運作模型時,将看到清晰的正弦波。這是因為這個instance的值為0,是以該執行個體中沒有噪聲。
2.7.2 iterateoverarray角色
如圖2-37所示,channel類的實作沒有包含任何狀态,這意味着信道模型的調用不依賴于上次調用的資料計算。是以,沒有必要使用channel類的幾個不同執行個體來實作一個多樣化通信系統;一個執行個體可以對n個資料副本調用n次。這種方法可以通過使用iterateoverarray高階角色來實作。
iterateoverarray 角色可以用類似于前面章節中的multiinstancecomposite的方法來使用。也就是說,我們可以在其内填充一個channel類執行個體,類似于圖2-40。iterateoverarray 角色在模型中也需要一個訓示器。
例2.2 考慮圖2-42中的例子。在這種情況下,頂層模型使用一個含有信道輸入的多副本數組,而不是使用一個關系将輸入廣播到channel的多個執行個體。這是使用repeat角色(在flowcontrol→sequencecontrol子庫中找到)和sequencetoarray角色(見2.7.3節補充閱讀)的結合來完成的。repeat有一個參數numberoftimes,在圖2-42中将其值設定為等于diversity參數的值。sequencetoarray角色有一個參數arraylength,其值也可以設定為等于diversity參數的值(這個參數可以通過arraylength端口來設定,灰色填充表示它既是一個參數又是一個端口)。輸出被發送到arrayaverage角色(見2.8節補充閱讀:處理數組的角色)。
圖2-42中模型的執行與它前面的版本類似,除了輸出的規模不同外,其輸出是平均值而不是總和。
圖2-42 iterateoverarray 角色可以用來完成與圖2-40中一樣多的信道模型,但是不需要創造信道模型的多個執行個體。這種方法是可能的,因為信道模型沒有狀态
不論iterateoverarray包含什麼角色,對于輸入數組的每個元素,都将進行簡單重複的執行動作。如圖2-42所示,它包含的角色可以是不透明的複合角色。然而,有趣的是,它也可以作為原子角色。為了使用帶有iterateoverarray的原子角色,隻要将原子角色拖到iterateoverarray執行個體中。然後,它将執行輸入數組的每一個元素中的原子角色,并産生作為輸出的結果數組。該機制将在圖2-43中說明。當一個角色從庫中拖出并移到iterateoverarray角色時,它的圖示将獲得白色的邊框。這個邊框表明,如果角色被放下,它将放在光标下的角色中,而不是模型所包含的角色上。放入的iterateoverarray角色将成為為輸入數組的每一個元素執行的角色。為了和 channel 角色一起使用,定義了如上規則,但是需要将channel角色轉換為一個不透明角色,方式是通過插入一個訓示器,因為對于數組元素iterateoverarray隻能應用不透明角色。
圖2-43 iterateoverarray 角色支援在它上面放入一個角色。它變換為模仿放入角色的圖示。這裡我們使用channel類,儲存到如圖2-39所示的userlibrary(使用者庫)中
2.7.3 生命周期管理角色
higher orderactors中的一些角色調用整個ptolemy ii模型的執行。這些角色通常把端口(使用者或者角色建立的)和模型的參數關聯在一起。它們可用于建立模型,所建立的模型可通過修改參數值來使得其他模型反複運作。包括runcompositeactor,其執行所包含的模型。modelreference 角色執行檔案或url中定義的模型。當visualmodelreference執行模型時,visualmodelreference角色打開模型的vergil視圖。更多細節可以在角色文檔和vergil連接配接展示中找到。
補充閱讀:數組建構與拆分角色
下面是建構和拆分數組的角色:
arraytoelements将輸出端口信道中的數組元素輸出。
elementstoarray用輸入端口信道中的元素建構一個數組。
arraytosequence将輸出端口中的數組元素順序輸出。
sequencetoarray用輸入端口中的一系列元素建構一個數組。
stringtounsignedbytearray從字元串建構一個數組。
unsignedbytearraytostring從數組建構一個字元串。
arraytomatrix從數組中建構一個矩陣。
matrixtoarray從矩陣建構一個數組。
此外,很多多态角色,比如說addsubtract,也能對數組進行操作。