K metodice modelování ve SmallDEVS
Jsou možné 2 přístupy k modelování:
- Komponenty realizovat třídami za použití standardních nástrojů Smalltalku (jde o podtřídy tříd AtomicDEVS a CompositeDEVS, viz příklady v kategorii SmallDEVS-Core-Examples, pro inspiraci je vhodné prostudovat třídy MyGenerator, MyJob, MyProcessor a MySystem2). Tento způsob modelování je velmi robustní a bezproblémový, jde jen o běžné programování ve Smalltalku s využitím knihovny tříd pro podporu modelování na bázi DEVS.
- Komponenty realizovat prototypovými objekty vytvářenými za pomoci specializovaného GUI nebo pomocí skriptů (viz články a videodokumenty na webové stránce SmallDEVSu), případně použít Kombinovaný vývoj pomocí GUI a pomocí skriptů. Modelování pomocí GUI je poněkud riskantnější, proto doporučuji často zálohovat image+changes a udržovat pro jistotu několik úrovní záloh).
Podpůrné knihovny a vazba na GUI
- Vzhledem k tomu, že není vždy vhodné jít do detailů na úrovni DEVS, v řadě případů je vhodné vytvořit podpůrné třídy, nezávislé na SmallDEVSu, ale SmallDEVSovými komponentami následně používané. Alternativně lze vytvořit prototypové objekty a traits a umístit je do MyRepository.
- K modelu je možné připojit vhodné vizualizační prvky, např. PlotMorph nebo podobné objekty. Vazba na tyto objekty však musí býr realizována s ohledem na potřeby serializace.
- Podrobněji: Kombinace SmallDEVSu a objektů Smalltalku
Je třeba ctít definici DEVS:
- Stav komponenty (odpovídající inst. proměnné, resp. sloty) smějí být modifikovány jen přechodovými funkcemi (intTransition a extTransition), případně metodami z nich (a pouze z nich) volanými.
- timeAdvance ani outputFnc NESMÍ modifikovat stav, mohou jen na základě stavu něco vypočítat a vrátit resp. uložit do výstupních portů.
- Číst ze vstupních portů smí pouze extTransition, zapisovat do výstupních portů smí pouze outputFnc. Jiný přístup k portům je chybný.
- Výstupní funkce se volá vždy jen bezprostředně před provedením interního přechodu. Chceme-li okamžitě neco generovat jako reakci na vstup, je třeba v extTranition přejít do nového stavu, pro který je hodnota timeAdvance nulová. Následuje pak automaticky volání outputFnc a intTransition, který převede komponentu do následujícícho stavu. Pro tento stav mže pak být definovaná jiná hodnota timeAdvance.
Práce s časem
- Modelujeme-li mechanismus výpočtu a nezajímají nás konkrétní časové údaje, není nutná jiná hodnota timeAdvance, než 0 nebo Float infinity, podle situace. Modelujeme-li dobu trvání výpočtu, dávají smysl i jiné hodnoty.
- Je-li v rámci jedné kompozitní komponenty plánovaná interní událost v několika jejích komponentách současně (jde o konflikt), vybírá se implicitně komponenta, jejíž jméno je menší (podle lexikografického uspořádání). Je-li to pro funkčnost komponenty nutné, řešte konflikty vhodným pojmenováním subkomponent. Jiná možnost spočívá v předefinování metody select (... doplnit podrobnosti pro prototype-based přístup, bude-li to nutné ...). Obecné doporučení: Je třeba zajistit, aby každá komponenta občas přešla do pasivního stavu (čekání na vstup), jinak (beze změny selet) může dojít k tomu, že se ostatní komponenty nedostanou ke slovu.
- (pro pokročilé) Lze pracovat i s reálným časem, tj. skutečnou dobou výpčtu, to však vyžaduje v atomických komponentách startovat pro příslušné výpočty samostatné procesy, které ohlásí dokončení výpočtu speciáním typem události (stateEvent). Tím se bezprostředně naplánuje interní přechod. Takže výstupní funkce může předat výsledek na výstup a interní přechod převede komponentu do stavu "hotovo". Jde vlastně o software-in-the-loop simulaci, podobně lze řešit i hardware-in-the-loop simulaci, human-in-the-loop simulaci apod. (nedoporucuji pro typické studentské projekty, protože je to trochu náročnější na ladění)
Init-Start-Stop
- Metoda initModel se volá při resetu simulace. Měla by inicializovat všechny sloty atomické komponenty (a zrušit vazbu na GUI).
- Metody prepareToStart a prepareToStop se volají při každém (re)startu a při každém stopnutí (pozastavení) simulace. Mají smysl pro HIL simulaci - startují a ukončují procesy uvnitř atomických komponent, které se starají o vazbu na reálné okolí.
Vizualizace
- Lze využít např PlotMorph. Vazba na GUI by se měla řešit línou inicializací (accessorem s konstrukcí "self x ifNil: [self x: ...]. ^ self x") a resetem (initModel) by se měla přerušit. Je to nutné kvli serializaci (export-import) - ta nfunguje pro GUI. Export lze provést jen bezprostředně po resetu, který vazbu na GUI zruší nastavením příslušných slotů na nil.
Export-Import
- Třídy (kategorie tříd) Smalltalku se exportují kontextovou volbou "file out". Soubor .st je automaticky pojmenován podle toho, co se exportuje a ukládá se do aktuálního adresáře. Importuje se nástrojem FileList (volbou "file in" nad vybraným souborem).
- Model nebo simulaci z MyRepository vyexportujeme volbou "make SAR". Subor .sar je automaticky pojmenován podle pathname komponenty v MyRepository, začíná prefixem Root. Importuje se z FileListu volbou install.
- Volby fileout a filein pro položky v MyRepository mají význam jen ve zvláštních případech, kdy potřebujeme pracovat s čitelnou textovou reprezentací komponent (na rozdíl od XML reprezentace, která je použita v SAR).
Manipulace s modely a se simulacemi (pomocí GUI)
- Operace cut, copy, paste mají obvyklý význam. Je vhodné takto klonovat simulace jen v případě, že nemají vazbu na GUI - bezpečné je to po resetu simulace. To je omezení současné verze SmallDEVSu.
- Simulace v současne verzi nelze klonovat (přesněji: lze, ale není na to položka v menu), modely ano. Toto omezení lze obejít. Lze vytvořit novou simulaci a do ní pomocí pasteRootDEVS vložit naklonovaný model.
Odpovědi na často kladné dotazy
[Ve vývoji, připomínky jsou vítány. – vj]
Links to this Page