\chapter{Functional Mock-up Interface 2.0}
\label{sec:fmi}
\zkratkatext{zkFMI} (dále jen \zk{zkFMI}) je otevřený standard pro výměnu simulačních modelů mezi různými nástroji ve standardizovaném formátu \cite{FMIwhatisit}. \zk{zkFMI} umožňuje libovolnému modelovacímu nástroji generovat kód v~jazyce C nebo binární soubor, jenž představuje model dynamického systému, který může být zcela integrován do~jiného modelu nebo simulačního nástroje \cite{FMIinterface}. Funkce \zk{zkFMI} jsou volány simulačním nástrojem nebo prostředím za účelem vytvoření jedné nebo více instancí \zkratkatext{zkFMU}. Ty mohou být v~simulačním nástroji simulovány odděleně, nebo dohromady s~jinými modely. Další obsah této kapitoly vychází především z~definice standardu \zk{zkFMI} uvedeném v~\cite{FMIstandard}.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/FMUstructureorez}
	\caption{Adresářová hierarchie FMU \cite{FMIstandard}}
	\label{obr:FMU.struktura}
	\end{center}
\end{figure}
\par
Modely, které jsou uloženy v~souladu se standardem \zk{zkFMI}, jsou označovány jako \zkratkatext{zkFMU} zkráceně \zk{zkFMU}. Tento výstupní formát modelu je zabalen v~pomyslném zip archivu s~příponou *.fmu, v~němž se nachází popis modelu, zdrojové kódy a~jeho dokumentace. V~tomto zip souboru se nachází, kromě zdrojových kódů modelu uložených v~jazyce C, také definice binárních souborů v~podobě \zkratkatext{zkDLL} pro \zkratka{zkOS} Windows. Ty bývají častěji označovány jako \zk{zkDLL} knihovny a~mají také stejnojmennou souborovou příponu *.dll. Existují ovšem také sdílené knihovny objektů určené pro \zkratkatext{zkOS} Linux. Tyto knihovny jsou označeny, podobně jako v~případě \zk{zkDLL} knihoven, souborovou příponou *.so. Instance FMU ve své adresářové struktuře, která je zobrazena na~obrázku \ref{obr:FMU.struktura}, obsahuje mimo jiné hlavně soubor s~příponou *.xml, ve kterém se nachází popis modelu.

Standard \zk{zkFMI} definuje v~zásadě dvě rozhraní (formy) popisu totožného fyzikálního (akauzálního) modelu. První forma popisu modelu se nazývá ModelExchange a~druhá Co-simulation. Do~obou těchto rozhraní mohou být modely fyzikálních systémů vyexportovány z~libovolného modelovacího nástroje, který byl použit pro jejich vymodelování, avšak za předpokladu, že tento nástroj umožňuje exportování modelu v~souladu se standardem \zk{zkFMI} verze 2.0.

Nástroje, které podporují standard \zk{zkFMI}, jsou uvedeny na~oficiálních webových stránkách: \href{http://fmi-standard.org/tools/}{http://fmi-standard.org/tools/}. Tyto webové stránky jsou provozovány skupinou společností, institutů a~univerzit, které jsou organizovány pod záštitou Modelica Association a~jejich projektu \zkratkatext{zkFMI}. Mezi nástroje, ve kterých je možné vytvářet fyzikální modely v~jazyce Modelica a~které současně podporují standard \zk{zkFMI} 2.0, patří komerčně dostupná Dymola. Dále je zde možné nalézt mnoho \zkratkatext{zkOSS}, které jsou legálně dostupné, jako např. JModelica.org nebo OpenModelica. OpenModelica, jež byla pro modelování fyzikálních systémů a~k jejich následnému exportu v~této práci použita, umožňuje exportování a~importování modelů ve formě ModelExchange. Dále je možné použít tento nástroj pro Co-simulační mód, ale pouze za předpokladu, že vygenerované \zk{zkFMU} bude použito pouze jako Slave. Implementace Master funkce je pro OpenModelicu pouze plánována a~prozatím nezrealizována.

\section{FMI ModelExchange a~Co-simulation}
Jednotka \zk{zkFMU} může mít buď vlastního řešitele (FMI pro Co-simulation), nebo požadovat simulační prostředí k~provádění numerické integrace (FMI pro ModelExchange). Schematické znázornění jednotky \zk{zkFMU} je ukázáno na~obrázku \ref{obr:FMU.schema}.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[scale=0.9]{obrazky/FMUschema2}
	\caption{Schematické znázornění \zk{zkFMU} \cite{FMIstandard}}
	\label{obr:FMU.schema}
	\end{center}
\end{figure}
Na níže uvedených obrázcích \ref{obr:FMU.schema}, \ref{obr:FMI.ModelExchange} a~\ref{obr:FMI.Cosimulation0} se nachází modře a~červeně vyznačené šipky, které znázorňují tok dat mezi okolním prostředím a~\zk{zkFMU}. Modré šipky znázorňují informace poskytované \zk{zkFMU}, červené šipky naopak informace vstupující do~\zk{zkFMU}.

Rozhraní \zk{zkFMI} pro ModelExchange (obrázek \ref{obr:FMI.ModelExchange}) definuje rozhraní k~modelu dynamického systému popsaného diferenciálními, algebraickými a~diskrétními časovými rovnicemi a~poskytuje rozhraní pro vyhodnocování těchto rovnic v~různých simulačních prostředích podle potřeby, stejně jako v~integrovaných řídicích systémech s~explicitními nebo implicitními integrátory a~pevnou nebo variabilní velikostí kroku. (Odstavec vychází z~\cite{FMIstandard}).

\begin{figure}[!h]
	\begin{center}
	\includegraphics[scale=0.9]{obrazky/FMIModelExchange2}
	\caption{Tok dat v~\zk{zkFMI} pro ModelExchange \cite{FMIstandard}}
	\label{obr:FMI.ModelExchange}
	\end{center}
\end{figure}
Rozhraní \zk{zkFMI} pro Co-simulaci (obrázek \ref{obr:FMI.Cosimulation1}) je určeno jak pro propojení jednotlivých simulačních nástrojů (tzv. simulátorová spojka nebo spojka s~nástroji), tak pro spojování s~modely subsystémů, které byly vyexportovány prostřednictvím jejich simulátorů spolu s~jejich solvery, a~to ve formě spustitelného programu. 

\begin{figure}[!h]
	\begin{center}
	\includegraphics[scale=0.8]{obrazky/FMICosimulation00}
	\caption{Tok dat v~\zk{zkFMI} pro Co-simulation \cite{FMIstandard}}
	\label{obr:FMI.Cosimulation0}
	\end{center}
\end{figure}
Cílem Co-Simulace je výpočet řešení časově závislých spojených systémů sestávajících z~podsystémů, které jsou v~čase spojité (komponenty modelu, které jsou popsány diferenciálními rovnicemi) nebo časově diskrétní (modelové komponenty, které jsou popsány diferenčními rovnicemi, např. diskrétní regulátory). V~blokové reprezentaci spojitého systému jsou subsystémy reprezentovány bloky s~(interními) stavovými proměnnými $x(t)$, které jsou připojeny k~jiným subsystémům (blokům) pomocí vstupů subsystému $u(t)$ a~výstupů subsystému $y(t)$.

Na obrázku \ref{obr:FMI.Cosimulation1} se nachází \zk{zkFMU}, které obsahuje popis modelu a~ solver v~jediném spustitelném kódu. Toto \zk{zkFMU} je pomocí \zk{zkFMI} spojeno s~hlavním procesem, který je označován jako master. Chování nebo podřízenost hlavnímu procesu je pak označována jako funkce slave.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[scale=0.8]{obrazky/FMICosimulation11}
	\caption{\zk{zkFMI} pro Co-simulaci - \zk{zkFMU} součástí spustitelného procesu \cite{FMIstandard}}
	\label{obr:FMI.Cosimulation1}
	\end{center}
\end{figure}
V případě, kdy je \zk{zkFMI} použito ke spojení procesu a~externího simulačního nástroje, vykonává implementace \zk{zkFMU} funkce \zk{zkFMI} (\zk{zkFMI} Wrapper) jejich voláním v~\zk{zkAPI} (\zkratkatext{zkAPI}). \zk{zkAPI} funkce jsou poskytovány pomocí simulačního nástroje např. COBRA \zk{zkAPI}. Jak \zk{zkFMU}, tak i~simulační nástroj jsou umístěny na~jednom výpočetním zařízení a~přítomnost simulačního nástroje je nezbytná ke spuštění simulace (viz obrázek \ref{obr:FMI.Cosimulation2}).

\begin{figure}[!h]
	\begin{center}
	\includegraphics[scale=0.9]{obrazky/FMICosimulation22}
	\caption{\zk{zkFMI} pro Co-simulaci - FMU poskytuje komunikační rozhraní \cite{FMIstandard}}
	\label{obr:FMI.Cosimulation2}
	\end{center}
\end{figure}
Nejobecnější formou Co-simulace (obrázek \ref{obr:FMI.Cosimulation3}), kterou \zk{zkFMI} 2.0 standard definuje, je případ použití dvou různých výpočetních zařízení. Použité výpočetní prostředky smí používat také různé platformy \zk{zkOS}. Spuštěný proces je prováděn operačním systémem jednoho počítače (master), zatímco na~druhém počítači (např. server nebo cluster) se stejným nebo i~odlišným \zk{zkOS} běží simulační nástroj.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/FMICosimulation33}
	\caption{\zk{zkFMI} pro Co-simulaci -  odlišné platformy \zk{zkOS} \cite{FMIstandard}}
	\label{obr:FMI.Cosimulation3}
	\end{center}
\end{figure}
Vzájemné propojení obou zařízení zajišťuje síťový komunikační protokol, např. nejznámější TCP/IP, který zajišťuje spolehlivé spojení s~aplikačním serverem. Navazující datové propojení aplikačního serveru a~instance \zk{zkFMU} poskytuje FMI wrapper, který používá funkce definované \zk{zkFMI} standardem. Tento wrapper je následně propojen se simulačním nástrojem obdobně jako v~předchozím případě.

\section{Matematický popis modelu}
Standard \zk{zkFMI}, jehož cílem je poskytnout jednotné prostředí pro výměnu modelů a~jejich simulaci, byl navržen pro numerické řešení systému diferenciálních, algebraických a~diferenčních rovnic. Tento systém bývá označován jako hybridní systém diferenciálních rovnic. V~literatuře jej můžeme nalézt pod zkratkou \zk{zkODE} nebo hybrid \zk{zkODE} (\zkratkatext{zkODE}).

Hybridní systém diferenciálních rovnic podporovaný \zk{zkFMI} je po částech spojitý, kde k~nespojitostem může docházet pouze za předpokladu, že $t_{i} < t_{i+1}$. Splnění této podmínky je v~definici standardu \zk{zkFMI} 2.0 \cite{FMIstandard} označováno jako časy událostí. Kromě toho jsou pro hybridní systém rovnic definovány následující stavové vektory:
\begin{itemize}
\item $x_{c}(t)$ je vektor spojitých stavů
\item $x_{d}(t)$ je vnitřní vektor diskrétních stavů
\end{itemize}
\smallskip \par
Hodnoty vektoru spojitých stavů jsou spojité i~mezi dvojicí po sobě jdoucích událostí. Naopak u~vektoru diskrétních stavů jsou hodnoty mezi dvojicí po sobě jdoucích událostí konstantní. Příklad průběhu stavových vektorů v~čase je zobrazen na~\ref{obr:Vektory.stavu}. Oproti \zk{zkFMI} 1.0 došlo ke změně pojmenování stavových vektorů.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=0.7 \linewidth]{obrazky/VektoryStavu2}
	\caption{Průběh vektorů stavů v~po částech spojitém systému \cite{FMIstandard}}
	\label{obr:Vektory.stavu}
	\end{center}
\end{figure}
V časech $t_{0},t_{1}$ a~$t_{2}$ se nacházejí výskyty událostí. Z~obrázku průběhu vektorů stavů \ref{obr:Vektory.stavu} je zřejmé, že v~okamžiku nespojitosti $t_{i}$ nabývají stavové vektory $x_{c}(t_i)$ a~$x_{d}(t_i)$ dvou hodnot $v^{-}_{c}(t_i)$ a~$v^{+}_{c}(t_i)$ (obdobně u~diskrétního vektoru). Řešením vzniklé situace je definice limitních hodnot v~čase okamžiku, a~to následovně:
\begin{itemize}
\item $v^{-}_{c}(t_i)$ limitní hodnota zleva spojitého stavu
\item $v^{-}_{d}(t_i)$ limitní hodnota zleva diskrétního stavu
\item $v^{+}_{c}(t_i)$ limitní hodnota zprava spojitého stavu
\item $v^{+}_{d}(t_i)$ limitní hodnota zprava diskrétního stavu
\end{itemize}
\smallskip \par
Dále smí model obsahovat další proměnné, mezi které patří vstupy, výstupy, interní proměnné a~parametry, které jsou po dobu simulace konstantní. Zbylé proměnné smí po dobu simulace měnit svoje hodnoty.

\section{Funkce modelu}
Funkce \zk{zkFMI} jsou volány prostřednictvím instancí \zk{zkFMU}, a~to za účelem vytvoření komunikačního kanálu, který slouží k~přenosu dat mezi spustitelným procesem (masterem) a~\zk{zkFMU}, anebo masterem či aplikačním serverem a~\zk{zkFMI} Wrapperem. 

Všechny funkce, které \zk{zkFMI} poskytuje a~které jsou spolu s~funkcí \textit{fmi2Status} volány, mají návratovou hodnotu typu enumeration. Definice funkce fmi2Status je následující:
\begin{small}
\begin{lstlisting}[language={C},caption={Definice funkce fmi2Status},label=lst:fce.fmi2status,captionpos=b]
typedef enum {	fmi2OK,
								fmi2Warning,
								fmi2Discard,
								fmi2Error,
								fmi2Fatal,
								fmi2Pending	} fmi2Status;
\end{lstlisting}
\end{small}
Význam jednotlivých hodnot, kterých může výčtová proměnná \textit{fmi2status} nabývat, je:
\begin{itemize}
\item fmi2OK -- vše v~pořádku
\item fmi2Warning -- vše není zcela v~pořádku, avšak simulace může pokračovat, byla zavolána funkce „logger“ k~vytvoření zprávy s~popisem problému
\item fmi2Discard -- ModelExchange - snížit periodu vzorkování, Co-simulation - slave neposkytnul masterem požadované informace
\item fmi2Error -- nastala chyba, simulace nemůže dále pokračovat, je potřeba zavolat funkci „fmi2FreeInstance“ nebo „fmi2Reset“, byla zavolána funkce „logger“
\item fmi2Fatal -- výpočty modelu jsou nenávratně poškozeny pro všechny instance \zk{zkFMU}, byla zavolána funkce „logger“
\item fmi2Pending -- vrácena pouze v~případě Co-simulačního rozhraní a~za podmínky, že slave provede funkci asynchronně = slave začne s~výpočtem, ale okamžitě vrací hodnotu, master musí zavolat funkci „ fmi2GetStatus (\dots, fmi2DoStepStatus)“ -- jedná se o~novou návratovou hodnotu oproti \zk{zkFMI} 1.0.
\end{itemize}
\smallskip \par
K vytvoření instance modelu slouží funkce \textit{„fmi2Instantiate“}. Ke smazání jedné instance modelu slouží funkce \textit{„fmi2FreeInstance“}. Další funkce pro inicializaci a~nastavení modelu jsou \textit{„fmi2SetDebugLogging“}, \textit{„fmi2SetupExperiment“}, \textit{„fmi2SetTime“},  \textit{„mi2GetVariableType“}, \textit{„fmi2SetVariableType“} a~\textit{„fmi2Reset“}. Po dokončení simulace je zapotřebí ji řádně ukončit, a~to funkcí \textit{„fmi2Terminate“}.

Detailní popis funkcí s~příklady jejich použití lze najít v~definici standardu \cite{FMIstandard}. Zde je také možné nalézt přehlednou tabulku výpisu všech dostupných funkcí pro každý typ simulace.

\section{Popis modelu}
Soubor \zk{zkXML} (\zkratkatext{zkXML}), jenž je generován modelovým prostředím, obsahuje standardizovanou definici všech proměnných uvedených v~\zk{zkXML} souboru. Díky tomu je možné spustit kód v~jazyce C uvnitř systému, do~kterého je jazyk \zk{zkXML} integrován, bez nutnosti opětovné definice proměnných prostředí. Tento způsob šetří čas, paměťový prostor a~výpočetní náročnost při simulacích.

Alternativou k~této standardizované definici je uložení těchto informací do~kódu jazyka C a~umožnění přístupu k~nim prostřednictvím volání funkcí. To ovšem není praktické ani pro vestavěné systémy, ani pro obsáhlé modely.

Variabilní definice je složitou datovou strukturou, a~nástroje by proto měly mít určitou volnost ve způsobech, kterými ji lze reprezentovat ve svých programech. Tento způsob definice dovoluje nástroji ukládat a~přistupovat k~modelovým proměnným v~programovacím jazyce simulačního prostředí jako je C++, C\#, Java nebo Python. Tímto způsobem je možné se vyhnout paměťově neefektivním režiím, které by bylo nutno použít v~případě standardních přístupových funkcí. \cite{FMIstandard}

Ke čtení \zk{zkXML} souborů s~nejrůznějšími datovými strukturami existuje mnoho bezplatných, ale také komerčních knihoven určených různým programovacím jazykům. Mezi výhody souborů \zk{zkXML} formátu patří zejména jejich čitelnost pro osobu i~stroj. Díky jazyku \zk{zkXML}, který vychází z~otevřeného standardu, je možné standardizovaný popis modelu po jeho otevření v~kterémkoliv z~mnoha volně dostupných nástrojů přečíst. Některým z~těchto nástrojů pak může být například internetový prohlížeč, editor textových dokumentů nebo komerční WordPad. Ne však každý nástroj, který dokáže \zk{zkXML} soubor zobrazit, musí být nejvhodnější pro jeho interpretaci. Ukázkový příklad výpisu \zk{zkXML} souboru lze zhlédnout na~obrázku \ref{obr:XML.struktura}.

\begin{figure}[!hb]
	\begin{center}
	\includegraphics[trim={1.7cm 15cm 2.5cm 2cm}, clip, width=1 \linewidth]{obrazky/XMLexample}
	\caption{Příklad \zk{zkXML} souboru z~prostředí webového prohlížeče}
	\label{obr:XML.struktura}
	\end{center}
\end{figure}
Při pohledu na~strukturu \zk{zkXML} souboru \ref{obr:XML.struktura} si můžeme všimnout několika položek \textit{TypeDefinitions}, \textit{ModelVariables} a~dalších, které jsou definovány souborem \textit{fmiModelDescription.xsd} standardu \zk{zkFMI} verze 2.0.

Níže uvedené elementy popisu modelu lze najít pod položkou \textit{fmiModelDescription} v~příslušném \zk{zkXML} souboru. Výčet všech dostupných elementů určených k~popisu modelu je následující:
\begin{itemize}
\item ModelExchange
\item CoSimulation
\item UnitDefinitions
\item TypeDefinitions
\item LogCategories
\item DefaultExperiment
\item VendorAnnotations
\item ModelVariables
\item ModelStructure
\end{itemize} \par

Z výše uvedeného seznamu parametrů \zk{zkXML} souboru spadá pouze jedna položka do~skupiny takzvaných povinných parametrů, kterými musí být každý \zk{zkXML} vybaven. Jedná se o~jednu z~položek \textit{ModelExchange} nebo \textit{Cosimulation}, které jsou podkategorií popisu modelu \textit{fmiModelDescription}.

Mezi obecné položky z~kategorie \textit{fmiModelDescription} patří atributy \textit{fmiVersion}, \textit{modelName}, \textit{guid}, \textit{description}, \textit{author}, \textit{version}, \textit{copyright}, \textit{license}, \textit{generationTool}, \textit{generationDateAndTime}, \textit{variableNamingConvention} a~\textit{numberOfEventIndicators}. Význam mnohých těchto parametrů je na~první pohled zřejmý. Za zmínku stojí snad jen atribut \textit{guid}, tedy \textit{„Globally Unique IDentifier“}, což je řetězec, který je používán ke kontrole kompatibility \zk{zkXML} souboru s~funkcemi jazyka C. Zápis do~toho řetězce je prováděn automaticky, vždy při generaci \zk{zkXML}. Význam tohoto parametru můžeme rovněž chápat jako jedinečný otisk prstu, který má v~jednom parametru vypovědět o~informacích obsažených uvnitř jednotky \zk{zkFMU}.

Oproti \zk{zkFMI} verze 1.0 byl atribut \textit{numberOfContinuousStates} z~verze \zk{zkFMI} 2.0 odstraněn s~odůvodněním, že informace v~něm obsažené mohou být dedukovány ze zbývajících dat obsažených v~\zk{zkXML} souboru.

Pokud je v~popisu modelu přítomen element \textit{ModelExchange}, znamá to, že \zk{zkFMU} je založeno na~módu \textit{ModelExchange}. Mimo jiné \zk{zkFMU} také obsahuje model nebo komunikační rozhraní nástroje, který poskytuje prostředí pro vytváření modelu a~jeho simulaci. Naproti tomu element \textit{CoSimulation}, pokud je definován, obsahuje jak samotný model, tak i~simulační nástroj, anebo komunikační rozhraní pro tento nástroj, jenž poskytuje prostředí a~prostředky pro souběžnou simulaci více \zk{zkFMU} jednotek současně.

Element \textit{UnitDefinitions} obsahuje globální list s~definicí všech fyzikálních jednotek a~jednotek, které mají být v~\zk{zkFMU} zobrazeny. Tento soupis parametrů se používá například k~převodu zobrazovaných jednotek na~základní jednotky soustavy SI používaných v~rovnicích modelu.

\textit{TypeDefinitions} je element obsahující soupis všech typů proměnných použitých v~\zk{zkFMU}. Obdobně je tomu u~elementu \textit{LogCategories}, který obsahuje parametr definující rozsah logovaných zpráv při práci s~\zk{zkFMU}. Oproti verzi 1.0 standardu \zk{zkFMI} je zde možné jednoduše nastavit rozsah nebo kategorii, které mají být zapisované do~logovacího souboru.

Element \textit{DefaultExperiment} poskytuje prostor pro definici nastavení parametrů simulace. Mezi parametry simulace patří atributy \textit{startTime}, \textit{stopTime}, \textit{tolerance} a~\textit{stepSize}. Tyto parametry nejsou striktně vyžadovány, nicméně pro mód \textit{Cosimulation} atribut \textit{stepSize} udává preferovanou rychlost komunikace mezi modelem a~simulačním nástrojem.

Méně významný element \textit{VendorAnnotations} tvoří prostor vysvětlivek, které může libovolný simulační nástroj pod jeho unikátním identifikátorem zanechat v~popisu modelu. Významnější element ModelVariables, který tvoří prostřední sekci popisu modelu, poskytuje statické informace o~všech použitých proměnných. Proměnné použité v~popisu modelu mohou nabývat pouze těchto hodnot: \textit{Real}, \textit{Integer}, \textit{Boolean}, \textit{String} a~\textit{Enumeration}. Více informací ohledně parametrů a~příkladu jejich použití se nachází ve standardu \zk{zkFMI} \cite{FMIstandard}.

Nezávisle na~tom, jak jsou rovnice modelu řešeny, definuje element \textit{ModelStructure} strukturu parametrů, ve které zohledňuje základní rovnice modelu. Přínosem této struktury je logicky uspořádaný a~seřazený soupis výstupů, stavů a~derivací, které jsou použity při simulaci nezávisle na~simulačním nástroji, a~to vždy ve stejném pořadí. Volitelná část tohoto elementu pak definuje, jakým způsobem jsou derivace a~výstupy závislé na~vstupech a~stavech modelu. 

Rozdílů \zk{zkFMI} verze 2.0 je oproti \zk{zkFMI} verzi 1.0 celá řada. Jejich výčet a~následné vysvětlení by svým obsahem splynul s~definicí standardu \zk{zkFMI} 2.0, proto zde byly zmíněny pouze hlavní změny, které byly do~standardu \zk{zkFMI} 2.0 implementovány. Další důležité informace o~\zk{zkFMI} 2.0 se nacházejí v~definici standardu \zk{zkFMI} \cite{FMIstandard}.

%Příklad popisu vytvořeného elektromechanického systému viz příloha XY.