\chapter{Import FMU do~prostředí LabVIEW}
Pro zahájení práce s~modelem v~prostředí \zk{zkLabVIEW} a~na platformě \zkratkatext{zkcRIO} bylo nutné zjistit možnosti, kterými by bylo možné import modelu ve formátu \zkratkatext{zkFMU} zrealizovat. Po prozkoumání možností, kterými by bylo možné vygenerované \zk{zkFMU} naimportovat do~prostředí \zk{zkLabVIEW}, připadaly v~úvahu dvě nalezené varianty řešení.

První varianta směřovala k~použití \zkratkatext{zkDLL}, jinak také označovaných jako \zk{zkDLL} knihovny. Druhá varianta, která byla zvolena pro import modelu ve formátu \zk{zkFMU} do~prostředí \zk{zkLabVIEW}, používala add-on, který byl doinstalován do~prostředí \zk{zkLabVIEW}. Druhá zmíněná varianta byla nalezena na~webových stránkách diskuzního fóra výrobce programu \zk{zkLabVIEW} dostupného z~\cite{labviewaddonFMI}.

% ---------------------------- ADD-ON ------------------------------------------------
\section{FMI add-on pro LabVIEW}
Rozšíření s~názvem \textit{„LabVIEW support for FMI for Model Exchange“} obsahuje již vytvořenou knihovní funkci, která zjednodušuje import modelu do~prostředí \zk{zkLabVIEW}. Podle popisu tohoto rozšíření v~\cite{labviewaddonFMI} podporuje tento volně dostupný add-on import modelu \zk{zkFMU} v~módu ModelExchange, a~to jak pro verzi standardu \zk{zkFMI} 1.0, tak i~pro verzi \zk{zkFMI} 2.0. Tento doplněk však nedokáže vygenerovat model v~Co-simulation podobě a~s jeho pomocí tak není možný export \zk{zkFMU} z~prostředí \zk{zkLabVIEW}.

Vzhledem k~tomu, že se však práce zabývá problémem, jak vytvořený model naimportovat do~prostředí \zk{zkLabVIEW}, nejsou výše uvedené nedostatky doplňku překážkou, pro kterou by toto řešení nemohlo být použito. Při dalším studiu použití tohoto rozšíření byly nalezeny video návody, na~kterých byla demonstrována jednoduchost importu modelu ve formátu \zk{zkFMU} do~prostředí \zk{zkLabVIEW}.

Další kroky práce směřovaly tedy k~instalaci a~následné implementaci rozšíření, které se na~první pohled zdálo být jednoduše použitelné a~realizovatelné.

\subsection{Instalace FMI ad-onu do~prostředí LabVIEW}
V rozšíření \zk{zkFMI} pro \zk{zkLabVIEW}, které bylo vystaveno na~stránkách diskuzního fóra společnosti NI \cite{labviewaddonFMI}, se nacházely celkem tři archivační soubory typu *.zip. První soubor s~názvem \textit{„NI Labs FMI for Model Exchange Tutorial with sample FMU.zip“} obsahoval dokument ve formátu \textit{*.pdf}, který popisoval postup práce s~nainstalovaným rozšířením. Součástí tohoto adresáře byl také ukázkový model ve formátu \zk{zkFMU}, na~kterém byl podle tutoriálu uveden postup jeho importu. Druhý archivační soubor s~názvem \textit{„NI Labs--FMI For Model Exchange.zip“} obsahoval instalační soubory k~rozšíření. Třetí a~poslední archiv s~názvem \textit{„NI Labs--FMI For Model Exchange v2.zip“} obsahoval stejně jako předešlý archiv instalační soubory rozšíření, jen s~tím rozdílem, že se jednalo o~novou verzi rozšíření. V~nové verzi rozšíření označené 2.0 bylo vypnuto detailní protokolování a~opraveno nesprávné nastavení v~konfiguračním souboru s~názvem „EMI\_FMI Configuration.txt“.

Po úspěšné instalaci nastal problém se zobrazením ikony nainstalovaného add-onu. I~když byl add-on správně nainstalován, nezobrazil se v~paletě knihovních bloků a~dostupných VI. Při hledání řešení bylo nejprve nutné zjistit, do~které palety knihovnách bloků měl být doplněk pro \zk{zkLabVIEW} zobrazen. Ukázalo se, že doplněk měl být zobrazen v~paletě \textit{„External Models“} pod knihovnou \textit{„Control\&Simulations“}. Zobrazena měla být ikona s~názvem \textit{„\zk{zkFMI}“}. V~knihovně \textit{„External Models“} se blok \zk{zkFMI} však nenacházel.

Po prozkoumání složek programu \zk{zkLabVIEW} v~adresáři \textit{„Program Files/National Instruments“} bylo zjištěno, že rozšíření je sice nainstalováno v~\zk{zkLabVIEW} správně, ale je umístěno ve špatném adresáři. Namísto toho, aby bylo rozšíření nainstalováno do~aktuální verze \zk{zkLabVIEW} (tedy 2017), bylo nainstalováno ve verzi 2012. Oprava této chyby byla provedena vyjmutím rozšíření a~souvisejících souborů z~chybného adresáře a~umístěním vyjmutých položek do~adresáře s~aktuální verzí \zk{zkLabVIEW}~2017.

Po restartování počítače a~opětovném spuštění vývojového prostředí \zk{zkLabVIEW} již byla paleta doplňku zobrazena v~paletě knihovních funkcí \textit{„Control\&Simulations“}. Po úspěšném vyřešení tohoto problému byl dále importován ukázkový model podle nalezeného návodu.

\subsection{Import ukázkového FMU}
Poté, co byly odstraněny potíže se zobrazením palety doplňku, byl prostudován návod obsahující postup importování modelu \zk{zkFMU} do~prostředí \zk{zkLabVIEW}.

Postup ověření správné funkčnosti nainstalovaného rozšíření byl následující:
\begin{enumerate}
\item Vytvoř nové VI a~ulož ho
\item Do~grafického prostředí vlož „Control\&Simulation Loop“ z~palety „Control Design\&Simulation“
\item Z~palety „Simulation“ zvol „External Models“ a~přetáhni blok „FMI“ do~vytvořené smyčky
\item Automaticky je vyvoláno dialogové okno, které vyzývá k~výběru modelu uloženého ve formátu FMU v~defaulním systémovém průzkumníku souborů
\item Procházením složek vyber model “MSD.fmu„
\item V~případě potřeby vyber možnost nastavení některého parametru modelu jako „tunable“
\item Potvrď import FMU
\end{enumerate}
\smallskip \par
Ještě před potvrzením importu \zk{zkFMU} lze vybrat, hodnotu kterých proměnných modelu bude možné v~navazující práci v~prostředí \zk{zkLabVIEW} měnit. Po potvrzení importu modelu \zk{zkFMU} byly do~smyčky „Control\&Simulation Loop“ vloženy bloky \textit{StepSignal}, \textit{BuildArray}, \textit{SimTime Waveform} a~\textit{Waveform Chart}. Výsledné propojení ukázkového modelu „MSD.fmu“ je zobrazeno na~obrázku \ref{obr:fmuMSDzadratovani}.

\begin{figure}[!ht]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/fmuMSDexample}
	\caption{Vytvoření ukázkového modelu MSD.fmu}
	\label{obr:fmuMSDzadratovani}
	\end{center}
\end{figure}
Spuštěním VI s~naimportovaným modelem \textit{„MSD“} byla provedena jeho simulace a~vypočítané průběhy byly zobrazeny v~grafu na~\textit{„FrontPanelu“}. Nasimulované průběhy odpovídaly průběhům uvedeným v~\cite{labviewaddonFMI}. Detailní postup importu modelu včetně názorných obrázků a~dosažených výsledků je možné najít v~tutoriálu dostupném z~\cite{labviewaddonFMI}.

Úspěšně se tedy podařilo naimportovat vzorový model ve formátu \zk{zkFMU} do~prostředí \zk{zkLabVIEW}. Další kroky směřovaly k~importu vlastního modelu \zk{zkBLDC} motoru pomocí tohoto rozšíření.

\subsection{Import vlastního FMU}
Vlastní model \zk{zkBLDC} motoru byl již vytvořen, zbývalo importovat jej do~prostředí \zk{zkLabVIEW}. Při pokusu o~import vlastního modelu \zk{zkFMU} však došlo při potvrzení vložení vytvořeného modelu vždy k~chybě, po jejímž zobrazení bylo okno, které umožňovalo výběr modelu \zk{zkFMU}, zavřeno a~nedošlo k~výměně předchozího vzorového modelu za model nový.

Bylo zjištěno, že chyba, která nastala, byla způsobena použitým typem \zk{zkFMU}. Použitý doplněk totiž umožňuje import modelů \zk{zkFMU} pouze ve formátu \textit{ModelExchange}. Po detailním prozkoumání vygenerovaného XML souboru vlastního modelu bylo zjištěno, že typ \zk{zkFMU}, ve kterém je současný model \zk{zkBLDC} motoru vyexportován, je nastaven jako \textit{„Co-simulation“} namísto \textit{„ModelExchange“}. Pokud by byl ponechán Co-simulační mód jednotky \zk{zkFMU}, nebylo by možné model do~prostředí \zk{zkLabVIEW} tímto nástrojem naimportovat. Na~základě tohoto zjištění byla provedena oprava výstupního formátu modelu, který je generován z~prostředí \zkratkatext{zkOMEdit}.

V \zk{zkOMEdit}oru byl nastaven v~menu „Tools $ \rightarrow $ Options $ \rightarrow $ FMI“ typ výstupního formátu modelu na~\textit{„ModelExchange“}. Dále zde byla nastavena verze \zk{zkFMI} z~1.0 na~\zk{zkFMI} 2.0. Změny byly uloženy a~program znovu spuštěn. Model elektromechanického systému byl znovu otevřen v~prostředí \zk{zkOMEdit}u a~následně znovu vyexportován jako \zk{zkFMU} v~add-onem podporovaném formátu.

Znovu vyexportovaný model ve formátu \zk{zkFMU} verze 2.0 typu \textit{„ModelExchange“} byl následně použit k~importu do~prostředí \zk{zkLabVIEW}. Úspěšně se podařilo poupravený model načíst do~prostředí dialogového okna add-onu (doinstalovaného \zk{zkFMI} bloku). V~tomto dialogovém okně se také zobrazily veškeré vstupní a~výstupní terminály modelu, které byly definovány jazykem Modelica v~prostředí \zk{zkOMEdit}oru. Nicméně ani po úspěšném vyřešení dosavadních nesnází neproběhla po potvrzení tlačítka \textit{„OK“} náhrada původního vzorového modelu za model nový. 

Po smazání knihovního bloku \zk{zkFMI} z~kontrolní smyčky a~jeho opětovném vložení přes rozhraní add-onu se již ve vytvořeném modelu terminály zobrazily. Avšak ani v~tomto případě nebylo možné úkol importu vlastního modelu prohlásit za zcela splněný. Blok VI sice obsahoval vlastní model \zk{zkFMU} a~také zobrazil („viděl“) vstupy a~výstupy modelu definované jazykem Modelica v~dialogovém okně zobrazeném při importu modelu, nicméně doplněk \zk{zkLabVIEW} z~neznámých důvodů nezobrazil vstupní a~výstupní terminály na~bloku naimportovaného modelu. Bez zobrazení terminálových svorek na~tomto bloku nebylo možné dále s~modelem v~\zk{zkLabVIEW} pracovat.

Při řešení problémů spojených se zobrazením terminálových svorek na~bloku naimportovaného modelu a~po mnoha provedených experimentech zaměřených na úpravu vlastního modelu došlo k~pochybnostem o~tom, zda je vlastní model vůbec vyexportován v~souladu se standardem \zkratkatext{zkFMI} 2.0, neboť jeho XML popis obsahoval formálně vše, co vzorový model \textit{„MSD.fmu“}. Jako vhodný nástroj pro kontrolu souladu vlastního vyexportovaného \zk{zkFMU} se standardem \zk{zkFMI} 2.0 je organizací OpenModelica doporučován \textit{„FMU compliancy checker“}, který je volně dostupný z~\cite{FMIstandard} v~sekci \textit{Downloads}. Následující kapitola \ref{sec:fmu_checker} se zaměřuje na~to, zda vlastnoručně vytvořený model \zk{zkFMU} opravdu vyhovuje požadavkům standardu \zk{zkFMI}. Kapitola \ref{sec:fmu_checker} tak vysvětluje a~demonstruje použití nástroje \textit{„FMU compliancy checker“}.

% ------------------------------ COMPLIANCE CHECKER -------------------------------

\section{FMU Compliance Checker 2.0}
\label{sec:fmu_checker}
%\chapter{Terminálové svorky na~bloku FMI}
Stěžejním bodem této práce je importování vlastního modelu, který je definován jazykem Modelica, do~prostředí \zk{zkLabVIEW}. Import vzorového modelu s~názvem \textit{MSD.fmu} proběhl zcela úspěšně. Při importování vlastního modelu elektromechanického systému se však nedařilo zobrazit terminálové svorky na~knihovním bloku add-onu v~prostředí \zk{zkLabVIEW}, ve kterém měl být vytvořený model dále rozdělen tak, aby mohly jednotlivé části modelu spolupracovat s~Real-Time i~s \zk{zkFPGA} čipy osazenými v~platformě \zkratkatext{zkcRIO}.

Problém mohl pravděpodobně nastat z~těchto důvodů:

\begin{itemize}
\item Nesprávný popis modelu vytvořený v~\zk{zkOMEdit}oru
\item Model byl vyexportován do~formátu \zk{zkFMU} správně, ale nevyhovuje \zk{zkFMI} 2.0
\item Model i~FMU je v~pořádku, chyba doplňku \zk{zkLabVIEW}
\item Kombinace výše uvedených případů
\item Další možnosti
\end{itemize}
\smallskip \par
Při hledání řešení problému se zobrazením terminálových svorek na~knihovním bloku naimportovaného modelu byla nejprve věnována pozornost doplňku doinstalovanému do~\zk{zkLabVIEW}. Na~serveru společnosti OpenModelica \cite{OpenModelicaGitHub} byly nalezeny hotové modely ve formátu \zk{zkFMU}. Tyto modely byly společností OpenModelica otestovány a~prohlášeny za vyhovující standardu \zk{zkFMI}. Se získanými modely byla provedena celá řada experimentů, které se zaměřovaly hlavně na~jejich import. Bohužel se však nepodařilo ani jeden ze získaných modelů úspěšně naimportovat add-onem do~takové míry, aby byl problém se zobrazením terminálů na~bloku \zk{zkLabVIEW} odstraněn nebo alespoň částečně vyřešen.

Po řadě neúspěšných pokusů o~nalezení řešení problémů spojených s~importem \zk{zkFMU} se pozornost práce začala zaměřovat spíše na~popis vlastního modelu. Vytvořený model elektromechanického systému obsahoval větší množství bloků, a~proto byl vytvořen nový a~jednodušší model za účelem minimalizace případných chyb, které by mohly být způsobené větším množstvím různorodých bloků.

\begin{figure}[!hb]
	\begin{center}
	% trim={<left> <lower> <right> <upper>}
	\includegraphics[trim={5cm 10cm 5cm 6cm}, width=1 \linewidth]{obrazky/Sum}
	\caption{Model Sumator v~\zkratkatext{zkOMEdit}u}
	\label{obr:Sumator_sch}
	\end{center}
\end{figure}
Byl vytvořen nový experimentální model (viz obrázek \ref{obr:Sumator_sch}), který byl pojmenován \textit{Sumator}. Jednalo se o~popis prostého součtu dvojice čísel. Vstupem modelu byly dvě číselné hodnoty. Výstupem modelu byla suma vstupních hodnot. K~vytvoření tohoto modelu bylo použito pouze čtyř knihovních bloků z~\zk{zkOMEdit}oru s~tím, že každý z~těchto bloků byl celočíselného datového typu \textit{Inteeger}, a~to proto, aby se předešlo případným dalším problémům s~reprezentací desetinného čísla v~různých vývojových prostředích.

Jednoduchý model sumátoru byl v~prostředí \zk{zkOMEdit}oru úspěšně odsimulován (viz obrázek \ref{obr:Sumator_sim}) a~následně vyexportován do~jednotky \zk{zkFMU}. Byl proveden pokus o~naimportování modelu sumátoru ve formě \zk{zkFMU} do~prostředí \zk{zkLabVIEW}, který se však nezdařil.

\begin{figure}[!hb]
	\begin{center}
	\includegraphics{obrazky/SumatorOMEdit_simulation_2}
	\caption{Simulace modelu Sumatoru v~\zkratkatext{zkOMEdit}u}
	\label{obr:Sumator_sim}
	\end{center}
\end{figure}
Následně byla provedena kontrola další výše nastíněné možnosti řešení vzniklé situace, a~sice zda je vyexportovaný model sumátoru zcela v~souladu se standardem \zk{zkFMI} verze 2.0. Za tímto účelem byl z~oficiálních webových stránek věnujících se standardu \zk{zkFMI} \cite{FMIstandard} ze sekce \textit{Downloads} získán nástroj \textit{FMU Compliance Checker}.

Tento volně dostupný software, který poskytuje Modelica Association, byl touto společností vytvořen především pro navrhování a~vývoj nových modelů. \textit{FMU Compliancy Checker} disponuje možnostmi kontroly a~ověření správnosti vyexportovaného modelu ve formátu \zk{zkFMU} v~souladu se standardem \zk{zkFMI} 1.0 i~\zk{zkFMI} 2.0. Tento program případné nalezené chyby hlásí uživateli, a~to podle nastavení podmínek kontroly.

V současné době je k~dispozici FMU Compliance Checker 2.0, který kontroluje, zda je předložený model \zk{zkFMU} v~souladu se standardem \zk{zkFMI}. Výhodou FMU Compliance Checker verze 2.0 je, že umožňuje kontrolu předloženého \zk{zkFMU} podle standardu \zk{zkFMI} 1.0 i~\zk{zkFMI} 2.0.

Mezi základní funkce FMU Compliance Checker 2.0 patří:
\begin{itemize}
\item Automatické rozbalení \zk{zkFMU} do~dočasně vytvořeného adresáře
\item Kontrola XML popisu modelu
	\begin{itemize}
	\item Chyby syntaxe
	\item Pořadí prvků
	\item Křížové odkazy
	\item Sémantická konzistentnost
	\end{itemize}
\item Kontrola binárních souborů v~\zk{zkFMU}
	\begin{itemize}
	\item Načtení binárního modulu
	\item Kontrola dostupnosti všech požadovaných funkcí
	\item Test, zda může být \zk{zkFMU} typu ModelExchange simulováno dopřednou Eulerovou metodou
	\item Test, zda může být \zk{zkFMU} typu Co-Simulation simulováno s~pevnou velikostí kroku simulace
	\item Logování vypočítaných řešení do~CSV souboru
	\item Poskytnutí vstupních hodnot uložených v~CSV souboru simulaci
	\end{itemize}
\item Zápis logovacích zpráv do~zvláštního souboru
\end{itemize}
\smallskip \par
V následující kapitole je uvedeno, jakým způsobem je možné s~programem Compliance Checker 2.0 pracovat.

\subsection{Práce s~FMU Compliance Checker 2.0}
FMU Compliance Checker 2.0 je dostupný pro celou řadu \zk{zkOS} včetně \zk{zkOS} Linux, Mac a~také Windows. FMU Compliance Checker 2.0 byl nejprve stažen pro 64b verzi \zk{zkOS} Windows. Vzhledem k~tomu, že tento nástroj je distribuován ve formě zip souboru, bylo nutné tento soubor nejprve rozbalit. Obsah rozbaleného adresáře checkeru:

{\small
%
\dirtree{%.
.1 /\DTcomment{kořenový adresář dočasné složky}.
.2 include\DTcomment{adresář se standardem FMI}.
.3 FMI1\DTcomment{adresář s~hlavičkovými soubory FMI 1.0}.
.3 FMI2\DTcomment{adresář s~hlavičkovými soubory FMI 2.0}.
.2 ACKNOWLEDGEMENTS.md\DTcomment{poznámky}.
.2 BUILD.md\DTcomment{pokyny pro aplikaci FMU Compliance Checker 2.0}. 
.2 fmuCheck.win64.exe\DTcomment{spustitelný program FMU Compliance Checker 2.0}. 
.2 HOW-TO-RELEASE.md\DTcomment{pokyny pro uvolnění nové verze}. 
.2 LICENCE.md\DTcomment{licenční podmínky}. 
.2 README.md\DTcomment{informace o~použití FMU Compliance Checker 2.0}. 
.2 RELEASE-NOTES.md\DTcomment{změny provedené ve verzích FMU Compliance Checker 2.0}. 
% NAZEV S~PODTRZITKEM -> .2 ModelName\_FMU.libs\DTcomment{knihovna modelu FMU}.
}
}
\smallskip
Kromě spustitelného programu \textit{fmuCheck.win64.exe} obsahuje rozbalený archiv také soubor README, ve kterém je uveden návod, jak nástroj spustit a~použít. V~souboru \textit{README.md}, který lze otevřít v~libovolném textovém editoru, je uveden detailní popis všech funkcí, kterými tento nástroj disponuje. Nedílnou součástí tohoto souboru je také popis jednotlivých přednastavení, které je možné při kontrole modelu \zk{zkFMU} použít.

Základní předpis použití Compliace Checkeru je následující:
%\ref{lst:FMU.predpis.pouziti}.
\begin{small}
\begin{lstlisting}[caption={Předpis použití FMU Compliance Checker 2.0},captionpos=b,label={lst:FMU.predpis.pouziti}]
fmuCheck.<platform> [options] <model.fmu>
\end{lstlisting}
\end{small}

Ke spuštění kontroly předloženého modelu \zk{zkFMU} nebylo nutné díky spustitelnému programu Checkeru cokoliv instalovat. Spuštění Checkeru bylo však nutné realizovat z~prostředí příkazového řádku. Ještě před samotným spuštěním bylo nutné se přesměrovat do~adresáře, kde byl Checker rozbalen a~kde se také nacházel jeho spustitelný program. Do~stejného adresáře bylo na~základě obsahu souboru README.md zkopírováno dříve vyexportované \zk{zkFMU} modelu sumátoru. Teprve nyní bylo možné provést kontrolu samotného \zk{zkFMU}.

Pro spuštění kontroly modelu \textit{Sumator.fmu} byla podle \cite{FMUComplianciChecker} zadána následující sekvence:
%\ref{lst:FMU.pouziti}.
%\Suppressnumber
%\Reactivatenumber
\begin{small}
\begin{lstlisting}[breaklines=true, caption={Použití FMU Compliance Checker 2.0},captionpos=b,label={lst:FMU.pouziti}]
fmuCheck.win64 -e log.txt -o result.csv -c , -s 2 -h 1e-3 -l 5 -t . Sumator.fmu
\end{lstlisting}
\end{small}

Použité nastavení kontroly modelu sumátoru zajistily, že model \textit{Sumator.fmu} byl zkontrolován na~64b platformě. Při kontrole byl vytvořen a~uložen logovací soubor \textit{log.txt}. Výsledky simulace byly uloženy v~souboru \textit{result.csv}, ve kterém byly jednotlivé hodnoty odděleny znakem čárky \textit{","}. Předložené \zk{zkFMU} bylo simulováno po dobu 2~s s~pevným krokem simulace 1~ms. Byly zobrazeny podrobné zprávy o~průběhu kontroly. Všechny dočasně vytvořené soubory byly vytvořeny v~aktuálně používaném adresáři.

Při testování modelu bylo možné volit z~celkem 6~úrovní zápisu chybových zpráv do~logovacího souboru. Byly použity všechny dostupné úrovně zápisu do~logovacího souboru, avšak dosavadní výsledky testování jednoduchého modelu \textit{Sumator.fmu} nikterak nenasvědčovaly tomu, že by model byl jakkoliv v~rozporu se standardem \zk{zkFMI} 2.0. Jestliže byl tedy model v~souladu se standardem \zk{zkFMI} 2.0, jedinou možnou příčinou, pro kterou by nebylo možné naimportování vlastního modelu do~prostředí \zk{zkLabVIEW}, mohlo být nesprávné fungování doplňku.

Řešení problému se zobrazením terminálů na~bloku VI, které nastalo v~souvislosti s~použitím původně zamýšleného add-onu \textit{LabVIEW support for FMI for Model Exchange}, bylo zaměřeno na~ověření funkčnosti samotného doplňku. Je nutné podotknout, že až do~této chvíle nebyly žádné důvody k~pochybnostem o~funkčnosti tohoto doplňku.

Mimo ověřování funkčnosti samotného add-onu byl pomocí nástroje FMU Compliance Checker 2.0 otestován vzorový model \textit{MSD.fmu}, který se podařilo add-onem úspěšně naimportovat do~prostředí \zk{zkLabVIEW}. Výsledky testů vzorového modelu \textit{MSD} byly překvapivé. FMU Compliance Checker 2.0 sice nevyhodnotil žádné chyby, nicméně při detailním rozboru obsahu XML popisu vzorového a~vlastního modelu \zk{zkFMU} bylo zjištěno, že XML popis vzorového modelu, na~rozdíl od popisu vlastního modelu, neobsahuje mnohé parametry. Tyto parametry sice nejsou podle \zk{zkFMI} standardu povinné, OpenModelica je však při exportu vlastního modelu \zk{zkFMU} vkládá do~jeho XML popisu. Protože parametry, které OpenModelica vkládá do~vlastního modelu nejsou podle standardu \zk{zkFMI} povinné, FMU Comliance Checker nemohl chybějící parametr vyhodnotit jako chybu.

Další nesrovnalost, která byla nalezena, se nacházela v~záhlaví XML popisu modelu, kde byl jako generationTool (tvůrčí nástroj vzorového modelu \textit{MSD}) uveden řetězec \textit{"By Hand"}. Uvedením tohoto řetězce napovídalo tomu, že tento, byť vzorový model, byl vytvořen ručně, namísto toho, aby byl vygenerován z~některého nástroje jako je například OpenModelica nebo častěji používaná Dymola. Přestože add-on ve svém popisu zaručoval možnost použít i~pro verzi \zk{zkFMI} 2.0, byla ve vzorovém modelu \textit{MSD.fmu} překvapivě použita verze \zk{zkFMI} 1.0. Následně byl v~diskuzním fóru National Instrument nalezen příspěvek dostupný z~\cite{LabVIEWaddon}, kde jeden z~uživatelů popisoval totožný problém se zobrazením terminálů na~knihovním bloku add-onu v~souvislosti s~jeho použitím a~importem vlastního modelu \zk{zkFMU}.

Vzhledem k~množství překážek spojených s~aplikací doplňku \textit{LabVIEW support for FMI for Model Exchange} bylo nakonec od na~první pohled jednoduchého řešení importu vlastních modelů \zk{zkFMU} do~prostředí \zk{zkLabVIEW} za použití tohoto doplňku, od této možnosti upuštěno. Mezi hlavní důvody, které vedly k~tomuto kroku patří absence úplné dokumentace add-onu, problémy s~diakritikou českých znaků, které byly vkládány do~přístupových cest jednotlivých souborů, a~také ztráta důvěryhodnosti add-onu vlivem „podezřelého“ popisu modelu \textit{MSD.fmu}, který byl uveden v~jeho XML souboru.

Řešením všech výše popsaných problémů s~importováním vlastních modelů \zk{zkFMU} do~prostření \zk{zkLabVIEW} by mohl být společností National Instrument komerčně nabízený doplněk \textit{FMI Add-On for NI~VeriStand \& LabVIEW}, který je však určen výhradně pro vývojové prostředí NI~VeriStand, nikoliv pro \zk{zkLabVIEW}.

Jako nejvhodnější řešení importu vlastního \zk{zkFMU} do~prostředí \zk{zkLabVIEW} RealTime bylo za vzniklé situace vyhodnoceno použití vývojového prostředí Eclipse, jehož zásuvný modul umožňoval překlad libovolného programu jazyka C/C++ do~podoby spustitelného souboru, který bylo následně možné spustit a~ladit na~RealTime platformě systému \zk{zkcRIO}.

% ---------------------------- ECLIPSE ------------------------------------
\section{OpenModelica na~OS Linux}
\label{sec:OMLinux}
Po dosavadních zkušenostech s~OpenModelicou provozovanou pod operačním systémem Windows, která měla mimo jiné problémy s~vkládáním české diakritiky do~přístupové cesty některých souborů, byla dále v~této práci použita OpenModelica na~systému Linux. Konkrétně se jednalo o~poslední dostupnou verzi operačního systému Ubuntu~16.04~LTS, která byla dostupná z \cite{downloadUbuntu}. Vzhledem k~tomu, že systém Linux je open-source, tak i~jeho distribuce jsou nelicencované, a~tedy volně dostupné. Aby bylo možné na~jedné výpočetní jednotce, na~které se nacházel operační systém Windows, simultánně pracovat i~na operačním systému Ubuntu, byl nainstalován pod operační systém Windows program VirtualBox od společnosti Oracle.

\subsection{Oracle VM VirtualBox a~instalace Ubuntu 16.04 LTS}
VirtualBox je multiplatformní virtualizační nástroj, který byl po jeho instalaci použit pro virtualizaci výše zmíněného operačního systému Ubuntu. Prostředí VirtualBoxu je přehledné, díky čemuž je ovládání naprosto intuitivní. K~vytvoření virtualizovaného operačního systému Ubuntu bylo nutné provést několik kroků:

\begin{enumerate}
\item Spustit Oracle VM VirtualBox
\item V~Menu/Počítač vybrat Nový

	\begin{enumerate}
	\item Zadat vlastní název virtualizovaného OS
	\item Vybrat Typ: Linux
	\item Vybrat Verzi: Ubuntu (64-bit)
	\end{enumerate}
\item Přiřadit velikost operační paměti pro OS
\item Vybrat Vytvořit nyní virtuální disk
\item Vybrat typ souboru s~pevným diskem jako VDI
\item Přiřadit velikost úložiště na~fyzickém pevném disku
	\begin{enumerate}
	\item Vybrat Pevná velikost
	\item Zvolit umístění nového virtuálního pevného disku
	\item Nastavit velikost nového virtuálního pevného disku minimálně 10~GB
	\end{enumerate}
\item Potvrdit vytvoření virtualizovaného OS
\end{enumerate}
\smallskip \par
\textit{Poznámka: V~případě již vytvořeného virtuálního obrazu disku je možné na~místě položky č.4 zvolit „Použít existující virtuální disk“ namísto „Vytvořit nyní virtuální disk“. Poté je nutné z~adresářové struktury vybrat umístění virtuálního disku.}

Výsledkem posloupnosti těchto kroků je v~levé části okna VirtualBoxu vytvořený operační systém, který bylo následně možné virtualizovat. Spuštění virtualizace se provede dvojklikem na~vytvořenou ikonu operačního systému umístěnou v~levé části okna. Po spuštění virtualizovaného operačního systému Linux musí být z~adresářové struktury současného operačního systému vybrán image soubor \textit{*.iso}, který obsahuje instalační soubory operačního systému Ubuntu. Po výběru místa uložení image souboru OS Ubuntu proběhne spuštění samotného uživatelského prostředí.

Následně je možné vybrat příslušný jazykový balíček, který má být použit. Dále je na~výběr ze dvou variant spuštění operačního systému:
\begin{enumerate}
\item Vyzkoušet Ubuntu
\item Nainstalovat Ubuntu
\end{enumerate}
\smallskip \par
První varianta ihned spustí OS Ubuntu. Je možné pracovat se všemi funkcemi OS, ale při práci s~programy není možné ukládat některá data. Příkladem může být vytvořený projekt v~Eclipse studiu, který po opětovném spuštění vývojového prostředí neuchová informace o~jeho nastaveních. Výhodnější je zvolit možnost \textit{Nainstalovat Ubuntu} a~pokračovat kompletním nainstalováním Ubuntu, které zmíněný nedostatek zcela odstraňuje.

Během instalace OS Ubuntu je možné vybrat, zda mají být nainstalovány nejnovější dostupné aktualizace pro systém. Dále je nutné vybrat možnost, aby před samotnou instalací byl disk zformátován. Jedná se o~formátování pouze virtuálního disku přiřazeného k~tomuto virtualizovanému operačnímu systému, tudíž ke ztrátě dat na~disku ani k~poškození OS Windows nedojde. Mezi poslední kroky úplné instalace OS Ubuntu patří výběr místní časové zóny, rozložení klávesnice a~založení uživatelského účtu. Po potvrzení zadaných údajů systém stáhne svoji nejaktuálnější verzi a~proběhne instalace, po níž se virtuální OS restartuje.

Následně bylo možné pod virtuální OS Ubuntu 16.04 LTS nainstalovat OpenModelicu a~vygenerovat opět \zk{zkFMU} sumátoru.

\subsection{Instalace OpenModelicy na~OS Ububtu}
Operační systémy Linux k~instalaci softwaru používají na~rozdíl od operačních systémů Windows správce balíků. Tento správce je připojen k~repozitáři, který si lze představit jako server, kde jsou uloženy některé balíčky, které je možné do~OS Linux doinstalovat. Pokud si uživatel vybere některý z~balíků, správce ho sám stáhne a~nainstaluje. Uživatel se nemusí o~nic starat.

Vzhledem k~tomu, že bylo nutné doinstalovat OpenModelicu do~Ubuntu, musel být správce balíků prohledán. Správce balíků však požadovaný software ve svých repozitářích nenašel a~nebylo tedy možné tímto nejbezpečnějším možným způsobem OpenModelicu doinstalovat. Další možností, jak doinstalovat software, který není v~aktuálním repozitáři, je rozšíření repozitáře například o~adresu některého serveru. Správu repozitářů lze provést v~položce Software \& Akutalizace v~menu Nastavení systému.

Vzhledem k~tomu, že OpenModelicu je možné nainstalovat také pro OS Linux, byla otevřena webová stránka dostupná z \cite{OMlinuxdownload}, na~které byl uveden postup instalace. Instalování tohoto softwaru je zjednodušeno do~takové míry, že stačí otevřít terminál systému a~do něj překopírovat uvedené příkazy.

Prvním příkazem je výběr buildu (česky sestavení) programu. Na~výběr je ze tří možností, a~sice možnosti: \textit{nightly}, \textit{stable} a~\textit{release}.
\begin{small}
\begin{lstlisting}[language={C},breaklines=true, caption={Příkazy výběru verzí sestavení programu OpenModelica},captionpos=b,label={lst:OMLinux.build}]
for deb in deb deb-src; do~echo "$deb http://build.openmodelica.org/apt `lsb_release -cs` nightly"; done | sudo tee /etc/apt/sources.list.d/openmodelica.list
for deb in deb deb-src; do~echo "$deb http://build.openmodelica.org/apt `lsb_release -cs` stable"; done | sudo tee /etc/apt/sources.list.d/openmodelica.list
for deb in deb deb-src; do~echo "$deb http://build.openmodelica.org/apt `lsb_release -cs` release"; done | sudo tee /etc/apt/sources.list.d/openmodelica.list
\end{lstlisting}
\end{small}
\par
V této práci byl vybrán řádek s~položkou \textit{release}, který byl následně zkopírován pomocí pravého tlačítka myši do~terminálu. Po vložení příkazu do~terminálu byl příkaz potvrzen klávesou \textit{Enter}.

Druhou sérií příkazů je importování GPG (GNU Privacy Guard) klíče, kterým byla podepsána příslušná verze sestavení instalovaného programu.
\begin{small}
\begin{lstlisting}[breaklines=true, caption={Příkaz importování GNU Privacy Guard klíče},captionpos=b,label={lst:OMLinux.GPGkey}]
wget -q http://build.openmodelica.org/apt/openmodelica.asc -O- | sudo apt-key add - 
# To verify that your key is installed correctly
apt-key fingerprint
# Gives output:
# pub   2048R/64970947 2010-06-22
#      Key fingerprint = D229 AF1C E5AE D74E 5F59  DF30 3A59 B536 6497 0947
# uid                  OpenModelica Build System 
\end{lstlisting}
\end{small}

Třetím a~posledním krokem instalace OpenModelicy do~prostředí OS Ubuntu byla následující série příkazů:
\begin{small}
\begin{lstlisting}[breaklines=true, caption={Příkaz aktualizace a~instalace OpenModelicy pro OS Ubuntu},captionpos=b,label={lst:OMLinux.updateandinstall}]
sudo apt update
sudo apt install openmodelica
sudo apt install omlib-.* # Installs optional Modelica libraries (most have not been tested with OpenModelica)
\end{lstlisting}
\end{small}

Kteroukoliv z~výše uvedených sekvencí je možné zadat do~terminálu naráz, a~není tudíž nutné zadávat příkazy postupně, což značně urychluje instalaci. Na~druhou stranu, pokud je zadána sekvence příkazů v~jednom bloku, který je následně potvrzen klávesou enter, je nutné mít na~paměti, že kterýkoliv dotaz položený uživateli rozlišuje malá a~velká písmena (case sensitive). Tento případ nastane obzvlášť při zadávání poslední sekvence příkazů, kdy je uživatel vyzván k~souhlasu s~provedením změn a~stažením některých knihovních souborů OpenModelicy. Uživatel má v~tu chvíli na~výběr z~možností \textit{[Y/n]}, pokud však zadá pouze znak \textit{'y'} nikoliv \textit{'Y'}, který následně potvrdí klávesou enter, dojde k~přerušení vykonávání příkazu uvedeného na~řádku 2 ve výpisu \ref{lst:OMLinux.updateandinstall} a~následující příkaz (příkazy) pokračující od řádku 3 a~dále je ignorován.

Po úspěšné instalaci bylo prostředí OpenModelica připraveno k~vytvoření jednoduchého modelu sumátoru pod OS Linux.

\subsection{Model sumátoru v~OpenModelica verze Linux}
Zadrátovaný model sumátoru měl totožnou podobu, jaká je znázorněna na~obrázku \ref{obr:Sumator_sch}. Vytvořený model byl pro kontrolu odsimulován ve vestavěném simulačním prostředí \zk{zkOMEdit}oru. Nasimulované průběhy korespondovaly s~\ref{obr:Sumator_sim}. Před vygenerováním samotného modelu do~\zkratkatext{zkFMU} bylo nutné v~menu \zk{zkOMEdit}oru - položka \textit{Tools/Options} - záložka FMI nastavit verzi exportu \zk{zkFMU} na~hodnotu 2.0 a~také změnit typ \zk{zkFMU} na~Co-simulation.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/OM_sumator_nastaveni_exportu}
	\caption{Nastavení exportu modelu Sumator}
	\label{obr:Sumator_export_setup}
	\end{center}
\end{figure}
Po vyexportování modelu sumátoru pod operačním systémem Linux byly v~adresářové struktuře modelu ve složce \textit{sources} vyexportovány zdrojové soubory \textit{ModelName.c, ModelName.h, ModelName.lib, Makefile.in} a~další, které byly následně použity ke kompilaci \zk{zkFMU} pro cílovou platformu.

\section{Kompilace vygenerovaného FMU pro cílovou platformu}
\label{sec:Kompilace_FMU_pro_cilovou_platformu}
Cílovou platformou pro vyexportované \zk{zkFMU} se stalo osmislotové \zkratkatext{zkcRIO} se sériovým označením NI~\zk{zkcRIO}~9068. Uvnitř této platformy se nachází Zynq~7020, který disponuje dvoujádrovým procesor ARM Cortex A9 taktovaným na~667~MHz a~především \zk{zkFPGA}. Dále je k~dipozici 512~MB operační paměti typu DRAM a~1~GB úložného místa. Nedílnou součástí \zk{zkcRIO}~9068 je také Linux RealTime operační systém.

Aby bylo možné na~této platformě simulovat \zk{zkFMU}, bylo nutné nejdříve vyexportované \zk{zkFMU} zkompilovat. OpenModelica při exportu \zk{zkFMU} používá svůj přednastavený kompilátor, který bohužel žádným nastavením v~prostředí OpenModelica není možné zaměnit za jiný typ. Bez toho, aniž by bylo vygenerované \zk{zkFMU} zkompilováno pro cílovou platformu, není možné vytvářet instance z~\zk{zkFMU}, a~ty následně testovat na~reálném HW.

Ke kompilaci \zk{zkFMU} pro jinou platformu bylo nutné použít odpovídající cross compiler. Jako vhodný cross compiler pro platformu NI~\zk{zkcRIO}~9068 byl zvolen \textit{GNU C \& C++ Compilers for ARMv7 Linux (Linux host) 2014-2016}, který je dostupný z~\cite{ARMcompiler}. Tento kompilátor je uložen rovněž na~datovém nosiči, který je přiloženém v~této práci.

Z uvedeného odkazu byl stažen soubor \textit{oecore-x86\_64-armv7a-vfp-neon-toolchain-2.0.sh}. Jedná se o~Bourne Shell soubor, který interpretuje programovací jazyk tím, že čte příkazy z~terminálu nebo souboru a~provádí je. Posloupnost příkazů v~souboru se také označuje jako skript. Spuštění staženého skriptu bylo provedeno z~terminálu.

Po spuštění terminálu bylo nutné se nejdříve přesměrovat do~místa uložení skriptu. Poté byl skript spuštěn příkazem uvedeným ve výpisu \ref{lst:Install_cross_compiler}. Po potvrzení příkazu bylo možné nastavit umístění cílové složky, kam měl být \zkratkatext{zkSDK} (cross compiler) nainstalován.

\begin{small}
\begin{lstlisting}[breaklines=true, caption={Příkaz instalace GNU C \& C++ cross compileru},captionpos=b,label={lst:Install_cross_compiler}]
sudo bash oecore-x86_64-armv7a-vfp-neon-toolchain-2.0.sh
\end{lstlisting}
\end{small}

V případě že by nebylo možné nainstalovat \zk{zkSDK} cross compileru z~důvodů nedostatečného oprávnění, je možné příslušné oprávnění změnit pomocí příkazu \textit{chmod}, který je uveden ve výpisu \ref{lst:zmena_pristupovych_prav}.

\begin{small}
\begin{lstlisting}[breaklines=true, caption={Změna přístupových práv k~souboru cross compileru},captionpos=b,label={lst:zmena_pristupovych_prav}]
chmod -x oecore-x86_64-armv7a-vfp-neon-toolchain-2.0.sh
\end{lstlisting}
\end{small}

\begin{figure}[!ht]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Terminal_GNU_instalace_orez_uprava}
	\caption{Instalace GNU C \& C++ cross compileru z~terminálu}
	\label{obr:Install_cross_compiler}
	\end{center}
\end{figure}
\subsection{Nastavení Eclipse studia}
Vývojových prostředí, kterými lze zkompilovat vyexportované \zk{zkFMU} pro jinou platformu, je velké množství. V~zásadě všechny však používají stejnou metodiku a~liší se pouze svým uživatelským rozhraním, které do~značné míry závisí na~použitém vývojovém prostředí.

Pro prvotní zkompilování vygenerovaného \zk{zkFMU} bylo použito vývojové prostředí \textit{C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition 2014-2016}, které je založeno na~Eclipse studiu. Na~stránkách NI byl nalezen návod dostupný z~\cite{NInavod14625}, který se zabývá úvodem do~problematiky vývoje vlastních aplikací pro platformy NI Linux RealTime. Na~této stránce je možné nalézt také pokyny pro instalaci Eclipse studia, jeho konfiguraci a~postup vytvoření a~spuštění vzorového projektu \textit{Hello world}.

Před započetím instalace Eclipse studia pro OS Windows je nutné nejdříve nainstalovat Java SE 6 nebo její novější verzi. Tímto krokem je možné předejít mnohým problémům s~instalací a~provozem Eclipse studia. Eclipse studio 2014 je možné volně stáhnout z~\cite{EclipseLink}.
\begin{figure}[!b]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/CDT_install}
	\caption{Instalace CDT Visual C++ Support z~Eclipse studio}
	\label{obr:Install_CDT}
	\end{center}
\end{figure}
V případě této práce bylo zprvu provozováno Eclipse studio pod OS Linux Ubuntu. Instalace vývojového prostředí byla právě díky OS Linux velmi usnadněna díky Ubuntu software center. Software center pracuje na~základě dříve zmíněných repozitářů, ve kterých se požadovaná verze Eclipse studia také nacházela. Stačilo tedy vyhledat požadovanou verzi Eclipse studia a~nechat si software automaticky nainstalovat. Díky dependency systému implementovaném v~Linuxových systémech nebylo nutné potřebnou Javu 6 SE ručně doinstalovávat, neboť tento systém sám rozpoznává případný dodatečný software potřebný k~instalaci hlavního SW, který potom sám doinstaluje.

Poté, co byl potřebný software nainstalován bez ohledu na~OS, bylo nutné z~prostředí Eclipse studia provést instalaci a~aktualizaci CDT. Instalace a~aktualizace C\/C++ Development Tool byla provedena podle části dokumentace nástroje Eclipse dostupné z~\cite{EclipseonlineHelp}. Zjednodušený postup instalace CDT lze shrnout do~těchto kroků:

\begin{enumerate}
\item Menu$ \rightarrow $Help$ \rightarrow $Install new software
\item V~rolovacím okně Work with vybrat --All Available Sites--
\item Do~vyhledávacího pole zadat CDT $ \rightarrow $ Hledat
\item Zaškrtnout CDT Visual C\/C++ Support
\item Přejít na~Next
\item Potvrdit Instalaci
\end{enumerate}
\smallskip
Po instalaci byla podle pokynů uvedených v~návodu otestována funkčnost vzorového projektu \textit{Hello world ANSI C project}, který byl dodán spolu s~vývojovým studiem Eclipse. Před jeho sestavením (buildem) bylo nutné provést několik nastavení, která jsou detailně popsána v~návodu.

\subsection{Kompilace FMU v~Eclipse studiu}
\label{sec:kompilace_FMU_eclipse}
Po úspěšném otestování vzorového příkladu \textit{Hello world}, při kterém byla mimo jiné vytvořena SSH komunikace mezi PC a~platformou \zk{zkcRIO}, byla vytvořena kopie vygenerovaného \zk{zkFMU}. U~této kopie byla následně změněna přípona z~\textit{*.fmu} na~\textit{*.zip}. Zip archiv byl extrahován a~všechny zdrojové soubory se tak staly přístupnými. Rozbalení archivu je nutné provést i~v případě OS Linux, který má vestavěný průzkumník zip souborů v~defaultním správci souborů, a~to z~důvodu importu některých souborů do~nového projektu.

Po vytvoření kopie modelu \zk{zkFMU} byl v~Eclipse studiu vytvořen nový projekt typu \textit{Makefile Project with Existing code}. Při založení projektu bylo nutné vybrat extrahovanou složku \textit{sources} z~modelu \zk{zkFMU}, ze které byl proveden import zdrojových souborů do~nového projektu. Názorný příklad je uveden na~obrázku \ref{obr:Import_makefileproject}. 
\begin{figure}[!h]
	\begin{center}
	\includegraphics[trim={0.25cm 0.25cm 0.25cm 0.5cm}, clip, width=1 \linewidth]{obrazky/Eclipse_makeproj_include}
	\caption{Import zdrojových souborů do~Makefile projektu}
	\label{obr:Import_makefileproject}
	\end{center}
\end{figure}
Po vytvoření projektu a~naimportování souborů z~adresáře \textit{sources} obsaženém v~extrahovaném adresáři kopie modelu \zk{zkFMU} bylo nastaveno chování kompilace překladu a~slinkování projektu. Veškerá nastavení byla provedena v~okně nastavení projektu, které je možné zvolit výběrem položky \textit{Project settings} v~rolovací nabídce vyvolané kliknutím pravého tlačítka myši na~složku aktivního projektu umístěného v~hierarchii adresářové struktury samotného vývojového prostředí.

V položce \textit{C/C++ Build} v~kartě \textit{Builder Settings} bylo zaškrtnuto nastavení \textit{Use default build command} (viz obrázek \ref{obr:Eclipse_projsetting1}). Na~kartě \textit{Behaviour} bylo zaškrtnuto \textit{Stop on first build error}, \textit{Build (Incremental build)} a~položka \textit{Clean} (viz obrázek \ref{obr:Eclipse_projsetting2}). Pro zrychlení kompilace je možné použít více vláken a~využít tak více jader procesoru PC.
\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_makeproj_settings1}
	\caption{Nastaveni Makefile projektu 1 z~3}
	\label{obr:Eclipse_projsetting1}
	\end{center}
\end{figure}
\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_makeproj_settings2}
	\caption{Nastaveni Makefile projektu 2 z~3}
	\label{obr:Eclipse_projsetting2}
	\end{center}
\end{figure}
Poslední nastavení projektu, které bylo nutné provést, se nacházelo v~položce \textit{C/C++ Build $ \rightarrow $ Settings} v~kartě \textit{Binnary parsers}. Zde byla zatržena pouze položka \textit{Elf Parser} (viz obrázek \ref{obr:Eclipse_projsetting3}).
\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_makeproj_settings3}
	\caption{Nastavení Makefile projektu 3 z~3}
	\label{obr:Eclipse_projsetting3}
	\end{center}
\end{figure}
To, jak bude makefile projekt přeložen, čím bude zkompilován, a~jakým způsobem bude slinkován, řídí soubor makefile, který byl vyexportován spolu se zdrojovými soubory z~nástroje OpenModelica. Vyexportovaný soubor z~nástroje OpenModelica nese název \textit{Makefile.in} a~jeho obsah zachycuje obrázek \ref{obr:Eclipse_makefileproj_puvodnimake}. Kromě souboru \textit{Makefile.in} byl ve zdrojových souborech obsažen také soubor \textit{NazevModelu.makefile}, který importuje soubor Makefile pomocí příkazu \textit{include Makefile}.
\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Linux_makefileproj_makefile_puvodni}
	\caption{Vyexportovaný Makefile.in z~nástroje OpenModlica}
	\label{obr:Eclipse_makefileproj_puvodnimake}
	\end{center}
\end{figure}
Aby mohlo Eclipse studio při sestavení projektu pracovat s~makefile, bylo nutné původně vygenerovaný soubor \textit{Makefile.in} buď přejmenovat na~\textit{Makefile} bez přípony, anebo lépe vytvořit kopii původního souboru \textit{Makefile.in} a~následně vytvořenou kopii přejmenovat na~\textit{Makefile} bez přípony. Pokud by nebyl soubor přejmenován, nemohlo by vývojové prostředí tento soubor nalézt a~provést kompilaci projektu. Kromě přejmenování původního souboru makefile bylo nutné provést ještě několik změn uvnitř samotného souboru. Popis všech změn, které byly před kompilací v~makefile souboru provedeny, jsou uvedeny v~kapitole \ref{sec:uprava_makefile}.

Další ruční úprava, která byla nezbytná ke kompilaci \zk{zkFMU}, spočívala v~přejmenování souboru \textit{config.log} na~název \textit{config.sub}. Do~tohoto souboru byly při sestavování projektu zapisovány některé důležité informace.

Aby se v~předešlo pozdějším komplikacím při překladu projektu, které se při vypracování této práce později vyskytly, bylo důležité zajistit dostatečná uživatelská oprávnění k~adresáři projektu. Změna uživatelského oprávnění složky makefile projektu byla provedena pomocí příkazu uvedeného ve výpisu \ref{lst:Linux_change_usr_acess}. Ještě před zadáním tohoto příkazu do~terminálu bylo nutné se přesměrovat do~místa uložení adresáře makefile projektu s~použitím známých příkazů \textit{ls, ls -l, cd} a~popřípadě i~\textit{cd..}.

\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Změna přístupových práv k~adresáři makefile projektu},captionpos=b,label={lst:Linux_change_usr_acess}]
sudo chmod 777 Nazev_slozky
\end{lstlisting}
\end{small}

Teprve po přejmenování makefile a~konfiguračního souboru a~po úpravě přístupových práv ke složce makefile projektu, bylo možné zdrojové soubory bez problémů zkompilovat pro cílovou platformu. Při kompilaci byla v~adresářové struktuře projektu ve vývojovém prostředí vytvořena dočasná složka \textit{binaries}, která obsahovala soubor ve formátu \textit{Nazev\_Modelu.so}. Tento soubor používá pouze samotné vývojové prostředí Eclipse za účelem ladění a~spuštění spustitelného souboru na~cílové platformě.

Je důležité podotknout, že kromě vytvořených binárních souborů v~prostředí Eclipse workspace, byly také aktualizovány binární soubory v~adresáři dříve extrahovaného archivu modelu \zk{zkFMU}. Proto bylo nutné změnit přístupová práva, a~proto bylo taktéž důležité před vytvořením makefile projektu vytvořit kopii \zk{zkFMU}, tu posléze přejmenovat na~zip archiv, a~ten následně extrahovat. Tento postup zajistil, že bude zachován původní soubor \zk{zkFMU} obsahující model beze změny s~tím, že všechny provedené změny budou provedeny pouze v~jeho kopii.

\subsection{Kompilace FMU pomocí make}
Druhou možností, jak zkompilovat vyexportované \zk{zkFMU} pro jinou cílovou platformu, bylo spuštění samotného souboru makefile ze systémového terminálu. Tento způsob měl oproti kompilaci \zk{zkFMU} z~prostředí vývojového studia Eclipse uvedeného v~kapitole \ref{sec:kompilace_FMU_eclipse} několik výhod, ale zároveň i~nevýhod. V~některých případech by bylo přesnější označit některé nevýhody spíše za vlastnosti.

Jedním ze základních předpokladů pro práci s~makefile z~prostředí terminálu je alespoň základní znalost Linuxových systémů. Dalším předpokladem by měla být také znalost terminálových příkazů, které je možné najít také v~tzv. Linux man pages.

Jak již bylo uvedeno dříve, soubor makefile vždy řídí a~automatizuje proces kompilace, tudíž nezáleží na~tom, kterým vývojovým nástrojem nebo prostředím je spuštěn. Z~prostředí terminálu je soubor Makefile (bez přípony) možné spustit příkazem \textit{make}.

Výhodou spuštění makefile souboru z~prostředí terminálu je, že není nutné instalovat jiný software. Stačí vyexportované \zk{zkFMU} znovu uložit a~extrahovat v~průzkumníku souborů a~následně se přesměrovat v~terminálu do~extrahované složky \textit{sources}, která obsahuje zmíněný soubor \textit{Makefile.in}. Soubor \textit{Makefile.in} musí být stejně jako v~případě kompilace v~prostředí Eclipse přejmenován, aby neobsahoval příponu.

Posledním krokem kompilace \zk{zkFMU} z~prostředí terminálu bylo spuštění makefile souboru pomocí příkazu uvedeného v~následujícím výpisu \ref{lst:Linux_run_makefile_terminal}.

\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Spuštění kompilace makefile projektu z~terminálu},captionpos=b,label={lst:Linux_run_makefile_terminal}]
make
\end{lstlisting}
\end{small}

Za příkazem \textit{make} může následovat parametr v~podobě kteréhokoliv řetězce, který je uveden v~Makefile souboru, a~za nímž se nachází dvojtečka. Jedním ze způsobů, kterými lze přiblížit význam parametru za příkazem make, je návěští. Navěští, které je voláno po zadání příkazu \textit{make} bez parametru, se nazývá \textit{all:}. V~něm je v~podobě příkazů určeno, jakým způsobem kompilace proběhne.

Výsledek kompilace z~nástroje Eclipse a~ze systémového terminálu v~případě použití příkazu \textit{make} je totožný. Výhodou vývojového studia Eclipse může být větší přehlednost projektu a~lepší report případných chyb vzniklých při kompilaci, které jsou pro méně znalé uživatele procesu \textit{make} výhodné. S~použitím Eclipse studia je ale nutné počítat s~větším množstvím nastavení, než v~případě kompilace \zk{zkFMU} prostřednictvím systémového terminálu a~příkazu \textit{make}.

Ani jedna z~uvedených metod kompilace by však nebyla funkční, aniž by byl soubor \textit{Makefile} adekvátně upraven. Úpravě \textit{Makefile} souboru se věnuje odstavec \ref{sec:uprava_makefile}, ve kterém jsou popsány jednotlivé změny procesu kompilace \zk{zkFMU} pro platformu \zk{zkcRIO}~9068.

\subsection{Úprava souboru makefile}
\label{sec:uprava_makefile}
Původně vygenerovaný soubor \textit{Makefile.in} je zachycen na~obrázku \ref{obr:Eclipse_makefileproj_puvodnimake} a~tvoří také obsah přiloženého CD. Při bližším pohledu do~souboru \textit{Makefile.in} bylo možné v~první části souboru spatřit deklaraci několika proměnných.

\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Původní deklarace proměnných v~souboru Makefile.in},captionpos=b,label={lst:Makefile_part_one}]
# Makefile generated by OpenModelica
CC=@CC@
AR=@AR@
CFLAGS=@CFLAGS@
LD=$(CC) -shared
LDFLAGS=@LDFLAGS@ @LIBS@
DLLEXT=@DLLEXT@
NEED_RUNTIME=@NEED_RUNTIME@
NEED_DGESV=@NEED_DGESV@
FMIPLATFORM=@FMIPLATFORM@
# Note: Simulation of the fmu with dymola does not work with -finline-small-functions (enabled by most optimization levels)
CPPFLAGS=@CPPFLAGS@
OMC_NUM_LINEAR_SYSTEMS=0
OMC_NUM_NONLINEAR_SYSTEMS=0
OMC_NUM_MIXED_SYSTEMS=0
OMC_NDELAY_EXPRESSIONS=0
OMC_NVAR_STRING=0
\end{lstlisting}
\end{small}

První proměnná, která byla v~přejmenované kopii souboru \textit{Makefile} modifikována, se nacházela na~třetím řádku tohoto souboru a~také na~tomtéž řádku výpisu \ref{lst:Makefile_part_one}. Její původní tvar byl upraven tak, aby proměnná \textit{CC} měla v~makefile význam přístupové cesty k~externímu compileru. Tento compiler byl již v~OS Linux nainstalován podle postupu uvedeného v~kapitole \ref{sec:Kompilace_FMU_pro_cilovou_platformu}, pomocí příkazu uvedeného ve výpise \ref{lst:Install_cross_compiler} shodné kapitoly.

Deklarace proměnné \textit{AR} byla odstraněna a~zůstala zde pouze definice této proměnné. V~proměnné \textit{CFLAGS} byly nastaveny parametry kompilace. Proměnná \textit{LD} určovala, jakým způsobem budou načteny knihovny. V~\textit{LDFLAGS} byly nastaveny parametry pro načtené knihovny. Proměnná \textit{DLLEXT} určovala, jakého typu bude externí dynamicky linkovaná knihovna. Hodnoty proměnných \textit{NEED\_RUNTIME} a~\textit{NEED\_DGESV} byly nastaveny na~\textit{1} z~důvodů řízení procesu kompilace. Proměnná \textit{FMIPLATFORM} určovala OS cílové platformy, pro který mělo být \zk{zkFMU} zkompilováno. V~\textit{CPPFLAGS} byla provedena nastavení precompileru. Zbytek proměnných zůstal v~původní nezměněné podobě. Hodnoty jednotlivých proměnných z~první sekce souboru makefile jsou uvedeny ve výpisu \ref{lst:Makefile_part_one_modificated}.

\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Modifikovaná deklarace proměnných v~souboru Makefile},captionpos=b,label={lst:Makefile_part_one_modificated}]
# Makefile generated by OpenModelica
CC=/usr/local/oecore-x86_64/sysroots/x86_64-nilrtsdk-linux/usr/bin/armv7a-vfp-neon-nilrt-linux-gnueabi/arm-nilrt-linux-gnueabi-gcc
AR=
CFLAGS=-g -s -O2 -fno-stack-protector -Wno-parentheses-equality -Wno-unused-variable -fPIC
LD=$(CC) -shared -g
LDFLAGS= -shared -static-libgcc -lm -lpthread -shared
DLLEXT=.so
NEED_RUNTIME=1
NEED_DGESV=1
FMIPLATFORM=linux64
# Note: Simulation of the fmu with dymola does not work with -finline-small-functions (enabled by most optimization levels)
CPPFLAGS= -fdollars-in-identifiers -DOMC_MINIMAL_RUNTIME=1 -DCMINPACK_NO_DLL=1
OMC_NUM_LINEAR_SYSTEMS=0
OMC_NUM_NONLINEAR_SYSTEMS=0
OMC_NUM_MIXED_SYSTEMS=0
OMC_NDELAY_EXPRESSIONS=0
OMC_NVAR_STRING=0
\end{lstlisting}
\end{small}

Poslední změny, které byly v~makefile provedeny, se týkaly především řízení kompilace \zk{zkFMU}. Původní proces kompilace měl podobu uvedenou ve výpisu \ref{lst:Makefile_part_two}.

\lstset{firstnumber=39}
\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Původní proces kompilace FMU v~souboru Makefile},captionpos=b,label={lst:Makefile_part_two}]
PHONY: Sum_FMU
Sum_FMU: $(MAINOBJ) Sum_functions.h Sum_literals.h $(OFILES) $(RUNTIMEFILES)
	mkdir -p ../binaries/$(FMIPLATFORM)
ifeq (@LIBTYPE_DYNAMIC@,1)
	$(LD) -o Sum$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES) -L"/home/spravce/Documents/OpenModelica/Sum"   $(LDFLAGS)
	cp Sum$(DLLEXT) Sum_FMU.libs config.sub ../binaries/$(FMIPLATFORM)/
endif
ifeq (@LIBTYPE_STATIC@,1)
	rm -f Sum.a
	$(AR) -rsu Sum.a $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
	cp Sum.a Sum_FMU.libs config.sub ../binaries/$(FMIPLATFORM)/
endif
	$(MAKE) distclean
	cd .. && rm -f ../Sum.fmu && zip -r ../Sum.fmu *
distclean: clean
	rm -f Makefile config.status config.log
clean:
	rm -f Sum.def Sum.o Sum.a Sum$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
\end{lstlisting}
\end{small}

Změny provedené na~řádcích 42 a~46 ve výpisu \ref{lst:Makefile_part_two_modificated} byly provedeny z~důvodu provedení části kompilace, kterou bylo nutné provést vždy při spuštění kompilace. Použití komentáře na~řádcích 47 a~54 totožného výpisu způsobilo přeskočení příkazů uvedených na~těchto řádcích při spuštění procesu kompilace. Důležité bylo především zabránění odstranění souborů \textit{Makefile}, \textit{config.status} a~\textit{config.log}. Tyto soubory by včetně modifikovaného souboru makefile byly po spuštění kompilace smazány a~pro další kompilaci by bylo nutné vytvořit a~následně modifikovat nový makefile. Upravená část procesu kompilace \zk{zkFMU} je uvedena ve výpisu \ref{lst:Makefile_part_two_modificated}.

\lstset{firstnumber=39}
\begin{small}
\begin{lstlisting}[language=bash, breaklines=true, caption={Modifikované proces kompilace FMU v~souboru Makefile},captionpos=b,label={lst:Makefile_part_two_modificated}]
PHONY: Sum_FMU
Sum_FMU: $(MAINOBJ) Sum_functions.h Sum_literals.h $(OFILES) $(RUNTIMEFILES)
	mkdir -p ../binaries/$(FMIPLATFORM)
ifeq (1,1)
	$(LD) -o Sum$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES) -L"/home/spravce/Documents/OpenModelica/Sum"   $(LDFLAGS)
	cp Sum$(DLLEXT) Sum_FMU.libs config.sub ../binaries/$(FMIPLATFORM)/
endif
ifeq (0,1)
	# rm -f Sum.a
	$(AR) -rsu Sum.a $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
	cp Sum.a Sum_FMU.libs config.sub ../binaries/$(FMIPLATFORM)/
endif
	$(MAKE) distclean
	cd .. && rm -f ../Sum.fmu && zip -r ../Sum.fmu *
distclean: clean
	# rm -f Makefile config.status config.log
clean:
	rm -f Sum.def Sum.o Sum.a Sum$(DLLEXT) $(MAINOBJ) $(OFILES) $(RUNTIMEFILES)
\end{lstlisting}
\end{small}
\lstset{firstnumber=1}

Poté, co bylo vygenerované \zk{zkFMU} z~nástroje OpenModelica zkompilováno pro cílovou platformu \zk{zkcRIO}~9068, byl zkompilován binární soubor \textit{Sum.so} následně použitý k~vytvoření a~simulaci instance \zk{zkFMU} na~cílové platformě \zk{zkcRIO}.
% -------------------------------------------------------------------------------------

\section{Vytvoření a~simulace instance FMU}
K vytvoření a~následné simulaci instance \zk{zkFMU} na~RealTime platformě \zk{zkcRIO} bylo použito stejného vývojového prostředí Eclipse jako v~případě kompilace \zk{zkFMU}. V~tomto vývojovém prostředí byl založen nový spustitelný projekt jazyka C. Vytvořený projekt bylo dále nutné správně nakonfigurovat, aby bylo následně možné vytvořit instanci \zk{zkFMU} a~spustit ji na~RealTime části platformy \zk{zkcRIO}. Část nastavení projektu vychází z~návodu s~titulem \textit{Getting Started with C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition} nalezeného na~webových stránkách NI dostupných z~\cite{NInavod14625}.

\subsection{Založení spustitelného projektu jazyka C}
Postup vytvoření nového spustitelného projektu jazyka C korespondoval se sekcí číslo 4 označené jako Creating a~C/C++ Project, která byla uvedena v~návodu umístěného na~webových stránkách společnosti NI. Návod je dostupný z~\cite{NInavod14625}.

Oproti postupu uvedeném v~sekci číslo 4 tohoto návodu byla provedena změna typu projektu, kde byla pod složkou \textit{Executable} zvolena položka \textit{Empty project}, namísto \textit{Hello World ANSI C Project}.

V bodě číslo 13, který se věnuje výběru \textit{Cross compiler prefix} uvedenému v~téže sekci, byla vybrána volba \textit{ARM-based targets, 2014 software stack}. Její hodnota \textit{arm-nilrt-linux-gnueabi-} včetně pomlčky na~konci byla vložena do~stejnojmenného řádku dialogového okna \textit{Cross GCC Command}. 

Jako \textit{Cross compiler path} byla vybrána stejná verze jako v~případě \textit{Cross compiler prefix}, tedy \textit{ARM-based targets, 2014 software stack}, a~podle následující sekvence \path{\<National Instruments>\Eclipse\14.0\arm\sysroots\i686-nilrtsdk-mingw32\usr\bin\armv7a-vfp-neon-nilrt-linux-gnueabi} bylo v~adresářové struktuře PC označeno umístění compileru.

Výběrem a~zadáním jiných parametrů v~dialogovém okně \textit{Cross GCC Command} je možné provést nastavení pro kteroukoliv jinou RealTime platformu.

\subsection{Nastavení projektu}
Ještě před spuštěním překladu uživatelem vytvořeného řídicího programu bylo nutné provést některá nastavení vytvořeného projektu. Kontextová nabídka nastavení projektu byla vyvolána označením vrcholové složky projektu z~okna \textit{Project Explorer} pravým tlačítkem myši, kde byla vybrána položka \textit{Properties}. Jiný způsob, kterým je možné vyvolat okno nastavení projektu, je stisknutím kombinace kláves \textit{Alt+Enter}.

V levém sloupci nabídky nastavení projektu byla vybrána položka	\textit{C/C++ Build}. Na~kartě \textit{Builder Settings} byl z~rozbalovací nabídky \textit{Builder type} vybrán \textit{Internal builder} (viz obrázek \ref{obr:Eclipse_proj_sett_C_Build_obecne_orez}). Pro zrychlení procesu překladu projektu je možné v~záložce \textit{Behaviour} navolit maximální počet vláken, které smí Eclipse studio pro překlad projektu využít. V~případě, že je k~dispozici výkonný PC, je vhodné povolit více vláken. Při řešení této práce však využití tohoto nastavení nebylo nezbytné.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_proj_sett_C_Build_obecne}
	\caption{Obecné nastavení projektu}
	\label{obr:Eclipse_proj_sett_C_Build_obecne_orez}
	\end{center}
\end{figure}
Další velmi důležitá nastavení překladu projektu byla provedena v~položce \textit{Settings}, která je dostupná po rozbalení rolovací nabídky položky \textit{C/C++ Build} v~levém sloupci nastavení projektu. Po otevření nabídky \textit{Settings} pod položkou \textit{C/C++ Build} je k~dispozici adresářový strom, jehož jednotlivé položky představují nastavení překladu projektu. Adresářový strom byl rozdělen na~celkem čtyři části. První část, která je zachycena na~obrázku \ref{obr:Eclipse_proj_sett_C_Build_CrossCompiler_orez}, se nazývá \textit{Cross Settings}. Atributy této položky říkají, jaký překladač má být pro překlad projektu použit, a~také definují jeho absolutní přístupovou cestu na~disku. Výběr použitého Cross Compileru bylo možné provést již při založení projektu. Pokud by však byl, ať už omylem, anebo cíleně vybrán jiný typ compileru, na~tomto místě je možné použitý compiler libovolně změnit.

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=0.95 \linewidth]{obrazky/Eclipse_proj_sett_C_Build_CrossCompiler}
	\caption{Výběr Cross Compileru projektu}	\label{obr:Eclipse_proj_sett_C_Build_CrossCompiler_orez}
	\end{center}
\end{figure}
Z druhé části adresářového stromu nazvané \textit{Cross GCC Compiler} byla důležitá úprava atributu \textit{Other flags} pod položkou \textit{Miscellaneous} (viz obrázek \ref{obr:Eclipse_proj_sett_C_Build_Miscellaneous_orez}).

\begin{figure}[!h]
	\begin{center}
	\includegraphics[width=0.95 \linewidth]{obrazky/Eclipse_proj_sett_C_Build_Miscellaneous}
	\caption{Nastavení zlepšení výkonnosti operací s~pohyblivou desetinnou čárkou}	\label{obr:Eclipse_proj_sett_C_Build_Miscellaneous_orez}
	\end{center}
\end{figure}
Za původní řetězec \textit{-c -fmessage-length=0} byl přidán další \textit{ -mfpu=vfpv3 -mfloat-abi=softfp}, kterému musí nutně předcházet mezera. Přidaný řetězec zlepšuje výkonnost provádění operací s~plovoucími desetinnými čísly. Zlepšení výkonnosti operací s~plovoucími desetinným čísly je možné provést pouze v~případě použití platformy založené na~procesoru ARM.

Pro účely překladu programu uvedeného ve výpise \ref{lst:mainc_SSH_test}, který byl vytvořen k~otestování funkčnosti SSH komunikace mezi PC a~\zk{zkcRIO}, byla všechna potřebná nastavení projektu hotova. K~přenosu dat mezi PC a~vzdáleným systémem byl vytvořen SSH komunikační kanál, jemuž se věnuje následující bod kapitoly.

\subsection{Konfigurace SSH komunikace s~cRIO}
Vytvoření SSH komunikace mezi Elcipse studiem a~RealTime částí \zk{zkcRIO}~9068 bylo provedeno na~základě 6. sekce výše uvedeného návodu. Vytvoření SSH komunikace lze shrnout do~sekvence následujících kroků:

\begin{enumerate}
\item Připoj \zk{zkcRIO} ethernetovým kabelem k~PC
\item Pomocí NI-MAX ověř komunikaci PC s~\zk{zkcRIO}
\item Z~prostředí NI-MAX nastav uživatelské jméno a~heslo
\item Dále pokračuj s~konfigurací v~Eclipse
\item V~Menu Window$ \rightarrow $Open Perspective$ \rightarrow $Other vyvolej dialogové okno Open Perspective
\item Z~dialogového okna Open Perspective vyber Remote System Explorer
\item Vyber položku Define a~connection to remote system
\item Vyber SSH only
\item Pojmenuj připojení a~vyber hosta (platforma \zk{zkcRIO})
\item Pravým tlačítkem myši klikni na~vytvořené připojení a~z kontextového menu vyber connect
\item Pokud budeš dotázán, zadej uživatelské jméno a~heslo pro přístup do~platformy \zk{zkcRIO}
\end{enumerate}
\smallskip \par
Po vytvoření SSH komunikačního rozhraní byl vytvořen nový soubor \textit{main.c}, ve kterém byl vytvořen jednoduchý testovací program, který je uveden ve výpisu \ref{lst:mainc_SSH_test}.

Jak je možné vidět z~výpisu \ref{lst:mainc_SSH_test}, jednalo se o~program, který měl při spuštění vypsat řádek textu do~terminálu vývojového prostředí. Smyslem vytvoření tohoto programu bylo jednoduché otestování funkčnosti komunikace mezi Eclipse studiem a~platformou \zk{zkcRIO}.

Nyní byl vytvořený testovací program sestaven (build) a~mohl být dále otestován na~reálném HW. Před spuštěním testovacího programu musela být provedena nastavení ve vzdálené platformě \zk{zkcRIO} pomocí procesu vzdálené konfigurace.
\begin{small}
\lstset{language={C}}
\begin{lstlisting}[breaklines=true, caption={Program testu SSH komunikace mezi Eclipse studiem a~cRIO},captionpos=b,label={lst:mainc_SSH_test}]
#include <stdio.h>
#include <stdlib.h>

int main(viod){
	printf("\nSSH communications test\n");
	return 0;
}
\end{lstlisting}
\end{small}
\subsection{Spuštění projektu jazyka C na~NI Linux RealTime}
Vzdálená konfigurace \zk{zkcRIO} byla provedena podle sekce číslo 7 \textit{Running a~C/C++ Executable on Your NI Linux Real-Time Target} uvedené v~návodu \textit{Getting Started with C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition}, který je dostupný z~\cite{NInavod14625}.

Při vytvoření nové konfigurace spuštění testovacího programu bylo vybráno již nakonfigurované SSH spojení se stanicí \zk{zkcRIO}. V~adresářově struktuře vzdálené stanice byl vybrán adresář \textit{My Home}, ve kterém byla vytvořena nová složka pojmenovaná stejně jako název projektu. Tato složka slouží při procesu spuštění testovacího programu jako úložiště zdrojového nebo zdrojových souborů ve vzdálené stanici. Při každém novém spuštění testovacího programu jsou soubory, které byly změněny ve vytvořeném adresáři v~systému \zk{zkcRIO}, aktualizovány.

Kromě spuštění vytvořeného programu na~cílové platformě bylo možné vytvořený program také ladit. Pro účely ladění vytvořeného programu bylo vytvořeno nové nastavení vzdálené konfigurace z~menu \textit{Run$ \rightarrow $Debug Configurations}, která byla pojmenována \textit{FMU13apr2018 Debug}. V~kartě konfigurace režimu ladění byl v~poli \textit{GDB debugger} učiněn výběr debugeru \textit{arm-nilrt-linux-gnueabi-gdb.exe} ze systémové složky \path{<National Instruments>\Eclipse\14.0\arm\sysroots\i686-nilrtsdk-mingw32\usr\bin\armv7a-vfp-neon-nilrt-linux-gnueabi}. Tento debugger byl podle výše zmíněného návodu určen pro \textit{ARM-based targets, 2014 software stack}, a~tedy i~pro cílovou platformu \zk{zkcRIO}~9068, která byla použita v~této práci.

Po spuštění vytvořeného programu pomocí tlačítka \textit{Run} byl do~okna terminálu vývojového prostředí Eclipse proveden výpis řetězce uvedeného v~testovacím programu \ref{lst:mainc_SSH_test}. S~úspěchem byla otestována SSH komunikace mezi vývojovým prostředím Eclipse (PC) a~systém \zk{zkcRIO}.

Při spuštění debugovacího režimu testovacího programu došlo ve vývojovém prostředí Eclipse k~automatickému přepnutí perspektivy z~C\/C++ do~perspektivy Debug. Rozložení uživatelského rozhraní perspektivy debugu bylo obdobné perspektivě C\/C++. Navíc se zde nacházely kontrolní prvky jako krokování programu, procházení programu, nastavení break pointů a~tlačítka spuštění programu, které byly použity k~ovládání krokování programu. Díky této vlastnosti mohl být program prováděn po jednotlivých řádcích a~s pomocí monitorovacích nástrojů bylo možné zobrazit stav a~hodnoty jednotlivých proměnných vytvořených v~programu.

Testovací program byl tímto krokem úspěšně otestován. Další část této práce byla věnována vytvoření instance \zk{zkFMU} a~její simulaci.

\subsection{Vytvoření instance FMU a~její simulace}
Vytváření instancí \zk{zkFMU} je obecně svázáno s~binárními soubory, které jsou obsaženy v~každém \zk{zkFMU}. Tyto binární soubory musí být zkompilovány pro konkrétní cílovou platformu, na~které bude vytvořená aplikace provozována. Vytvořená aplikace pak bude využívat zkompilované binární soubory k~účelům tvorby a~simulace jednotlivých instancí vlastního modelu.

Vytvoření instance \zk{zkFMU} bylo provedeno úpravou souboru \textit{main.c}, který byl původně použit pro otestování funkčnosti SSH komunikace mezi PC a~\zk{zkcRIO}. V~kapitole \ref{sec:Kompilace_FMU_pro_cilovou_platformu} byl popsán postup kompilace \zk{zkFMU} pro cílovou platformu. Jejím výsledkem byl právě binární soubor \textit{Sum.so}, který byl zkopírován do~složky projektu. V~projektu byl tento soubor pro řádné označení, že se jedná o~sdílený objekt OS Linux, přejmenován na~\textit{libSum.so}.

Přejmenovaná shared object knihovna musela být překopírována také do~cílové platformy. Aniž by byla překompilovaná sdílená knihovna fyzicky přítomna v~adresáři vzdáleného systému (\zk{zkcRIO}), do~kterého je vlastní spustitelný program při debugu nebo jeho spuštění zkopírován, nebylo možné program na~cílové platformě spustit a~vzdálený systém zahlásil \textit{segmentation fault}.

\begin{figure}[!hb]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_proj_sett_C_Build_Linker_library}
	\caption{Nastavení linkeru projektu}	\label{obr:Eclipse_proj_sett_C_Build_Linker_library_orez}
	\end{center}
\end{figure}
Mimo to, že byla sdílená knihovna vložena do~projektu a~následně překopírována do~cílové platformy, bylo nutné linkeru oznámit, že má sdílenou knihovnu přilinkovat k~ostatním výstupním souborům. Nastavení linkeru je ukázáno na~obrázku \ref{obr:Eclipse_proj_sett_C_Build_Linker_library_orez}.

Přestože sdílená knihovna \textit{libSum.so} obsahovala všechny funkce definované standardem \zk{zkFMI}, nebylo možné použít našeptávač (Ctrl + mezerník) vývojového prostředí pro zefektivnění práce při psaní programu. Mimo to nebyly v~projektu přístupné ani definice, popřípadě deklarace funkcí, které popisuje samotný \zk{zkFMI} standard. Bez toho, aby byla známa alespoň deklarace jednotlivých funkcí, nebylo možné vytvářet program jinak, než na~základě dokumentace standardu. Často se však stává, že dokumentace obsahuje chyby, které by mohly následně vést k~chybám vlastního programu.

Při tvorbě vlastního programu nebylo možné tento nedostatek pro komplikovanost řešení ignorovat, a~proto musel být odstraněn. Následně bylo zjištěno, že všechny funkce \zk{zkFMI} standardu jsou zakomponovány v~\zk{zkFMU} vygenerovaném z~nástroje OpenModelica. Funkce standardu \zk{zkFMI} byly umístěny v~\zk{zkFMU} v~adresáři \textit{Jmeno\_modelu$ \slash $sources$ \slash $include}. Obsah složky byl překopírován do~dočasného adresáře. V~dočasném adresáři byly vyfiltrovány všechny zdrojové soubory s~příponou \textit{*.c} a~\textit{*.cpp} tak, aby zbyly pouze hlavičkové soubory. Tyto hlavičkové soubory byly vloženy do~nového adresáře \textit{inc} vytvořeného v~projektu Eclipse studia.

\begin{figure}[!hb]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_proj_sett_C_Build_Includes}
	\caption{Vložení hlavičkových souborů FMI standardu do~projektu}	
	\label{obr:Eclipse_proj_sett_C_Build_Includes_orez}
	\end{center}
\end{figure}
Po vložení hlavičkových funkcí \zk{zkFMI} standardu do~vlastního projektu bylo provedeno další nastavení v~\textit{Project settings} (klávesová zkratka Alt+Enter). Na~obrázku \ref{obr:Eclipse_proj_sett_C_Build_Includes_orez} je možné vidět, jak byly přidány vložené hlavičkové soubory do~zdrojových cest cross compileru.

Tímto byla funkce našeptávače zprovozněna a~nebylo nutné dále používat dokumentaci \zk{zkFMI} standardu, ve které se mohly vyskytovat chyby. Navíc byl umožněn přístup k~deklaracím jednotlivých funkcí ve vývojovém prostředí Eclipse.

K tomu, aby bylo vůbec možné jakoukoliv funkci z~\zk{zkFMI} standardu použít ve vlastním programu, musela být příslušná funkce před jejím použitím prvně deklarována. Tím, že byly deklarace funkcí \zk{zkFMI} standardu vloženy do~projektu, bylo možné deklarace použitých funkcí ve vlastním programu do~vlastního programu zkopírovat.

Mimo doposud provedených nastavení byla nastavena ještě proměnná prostředí na~cílové platformě, a~to z~důvodu chyby \textit{segmentation fault}, kterou hlásilo \zk{zkcRIO} po spuštění vlastního programu, který používal funkce \zk{zkFMI} standardu. Hlášení chybového stavu bylo logické, neboť RealTime OS Linux, který běžel na~cílové platformě, hledal binární soubor \textit{libSum.so} na~jiném (defaultním) místě ve své adresářové struktuře.

\begin{figure}[!hb]
	\begin{center}
	\includegraphics[width=1 \linewidth]{obrazky/Eclipse_deb_sett_LD_lib_path}
	\caption{Nastavení proměnné prostředí na~OS Linux}	\label{obr:Eclipse_deb_sett_LD_lib_path_orez}
	\end{center}
\end{figure}
Po nastavení všech doposud zmíněných parametrů projektu, vložení knihovních souborů \zk{zkFMI} standardu, vložení překompilovaného shared object souboru, jak do~projektu, tak i~do cílového zařízení, a~po nastavení hodnoty proměnné cesty prostředí na~cílové platformě byl vytvořen jednoduchý stavový automat pro simulaci modelu sumátoru (viz obrázek \ref{obr:StateMachineCoSimulation}).

\begin{figure}[!h]
	\begin{center}3
	\includegraphics[width=1 \linewidth]{obrazky/StateMachineCoSimulation}
	\caption{Obecný stavový automat \zk{zkFMU} pro CoSimulaci \cite{FMIstandard}}	\label{obr:StateMachineCoSimulation}
	\end{center}
\end{figure}
Vytvořený stavový automat vycházel z~obrázku stavového automatu uvedeného ve standardu \zk{zkFMI} \cite{FMIstandard}. Samozřejmě nebylo použito všech dostupných funkcí, protože model sumátoru obsahoval dvě vstupní proměnné a~jednu výstupní proměnnou. Všechny proměnné přitom byly celočíselného datového typu integer. Vytvořený stavový automat je možné rozdělit do~třech částí, tak jako je uvedeno na~obrázku \ref{obr:StateMachineCoSimulation}.

V první části vlastního stavového automatu vytvořeného v~souboru \textit{main.c}, která je ve stavovém automatu označena jako \textit{slaveSetableFMUstate}, byly inicializovány proměnné, které byly použity pro řízení stavového automatu. Dále byla vytvořena jedna instance modelu sumátoru pomocí funkce \textit{fmi2Instantiate}. Návratovou hodnotou funkce \textit{fmi2Instantiate} byla nově vytvořená proměnná \textit{s1} datového typu \textit{fmi2Component}. Pro kontrolu korektnosti vytvoření instance \zk{zkFMU} slouží podmínka testující návratovou hodnotu z~funkce \textit{fmi2Instantiate}. Pokud je návratová hodnota funkce \textit{fmi2Instantiate} rovna \textit{NULL}, potom nebyla instance vytvořena a~program musí být ukončen.

Ve stejné části programu byla nastavena hodnota proměnných \textit{startTime}, \textit{stopTime} a~\textit{h}. První dvě proměnné slouží pro nastavení počátečního a~koncového času simulace. Proměnná \textit{h} slouží pro nastavení kroku simulace. K~nastavení počátečního a~koncového času simulace vytvořené instance byla použita funkce \textit{fmi2 Setup Experiment} z~\zk{zkFMI} standardu.

Ke vstupu do~inicializační části instance modelu byla použita funkce \textit{fmi2 Enter Initialization Mode (s1)}. V~tomto stavu byly nastaveny hodnoty proměnných instance modelu sumátoru v~čase nastaveném proměnnou \textit{startTime}. Po nastavení hodnot vstupních proměnných v~čase rovném hodnotě proměnné \textit{startTime} byl funkcí \textit{fmi2 Exit Initialization Mode (s1)} opuštěn stav inicializace instance.

Ve třetí části stavového automatu, v~obrázku \ref{obr:StateMachineCoSimulation} označené \textit{slaveInitialized}, byla s~použitím case struktury a~smyčky while vytvořena část programu, která zajišťuje simulaci instance \zk{zkFMU}. Ve smyčce while jsou cyklicky volány funkce pro vyčítání výstupů, nastavení vstupů a~provedení jednoho kroku simulace. K~získání hodnot výstupu modelu sumátoru byla použita funkce \textit{fmi2GetInteger}. Pro nastavení nových vstupních hodnot instance modelu byla použita funkce \textit{fmi2SetInteger}, a~pro vykonání jednoho kroku simulace s~velikostí kroku definovaného proměnnou \textit{h} byla použita funkce \textit{fmi2DoStep}. Návratová hodnota funkce \textit{fmi2DoStep} byla dále pomocí case struktury testována na~všechny možné návratové hodnoty, které mohla tato funkce po jejím zavolání vrátit. Pokud hodnota návratové funkce \textit{fmi2DoStep} byla rovna hodnotě \textit{fmi2Error}, \textit{fmi2Discard} nebo \textit{fmi2Fatal}, bylo nutné okamžitě řádně ukončil simulační část a~ukončit, popřípadě i~odalokovat paměť vytvořené instance.

Vytvořený stavový automat modelu sumátoru byl uložen společně s~celou složkou projektu studia Eclipse na~CD nosič, který byl přiložen k~této práci. Ve standardu \zk{zkFMI} byl rovněž vysvětlen způsob použití všech ostatních funkcí, které nebyly ve vytvořeném stavovém automatu použity.

Ke splnění posledního bodu zadání, který měl realizovat propojení výše vytvořené instance modelu, která běžela v~RealTimové části platformy \zk{zkcRIO} s~její \zk{zkFPGA} částí, byl vytvořen komunikační kanál mezi oběma částmi platformy \zk{zkcRIO}, jemuž se věnuje kapitola \ref{sec:cAPI_rozhrani}.
















