Doku fertig
This commit is contained in:
parent
28470a46a5
commit
17e2e31d10
|
@ -27,7 +27,6 @@ anchorcolor = black]{hyperref}
|
||||||
\RequirePackage[nolist, footnote]{acronym}
|
\RequirePackage[nolist, footnote]{acronym}
|
||||||
\RequirePackage{enumitem}
|
\RequirePackage{enumitem}
|
||||||
\RequirePackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
|
\RequirePackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
|
||||||
\RequirePackage{titlesec}
|
|
||||||
\RequirePackage{tikz}
|
\RequirePackage{tikz}
|
||||||
\RequirePackage[bottom=5em]{geometry}
|
\RequirePackage[bottom=5em]{geometry}
|
||||||
\RequirePackage{svg}
|
\RequirePackage{svg}
|
||||||
|
@ -43,18 +42,21 @@ anchorcolor = black]{hyperref}
|
||||||
|
|
||||||
\usetikzlibrary{positioning, shapes.geometric}
|
\usetikzlibrary{positioning, shapes.geometric}
|
||||||
|
|
||||||
\RequirePackage[]{draftwatermark}
|
\RequirePackage[final]{draftwatermark}
|
||||||
|
|
||||||
%watermark
|
%watermark
|
||||||
\SetWatermarkText{Preview}
|
\SetWatermarkText{Preview}
|
||||||
\SetWatermarkColor{red}
|
\SetWatermarkColor{red}
|
||||||
\SetWatermarkFontSize{35.83pt}
|
\SetWatermarkFontSize{35.83pt}
|
||||||
|
|
||||||
\titlespacing\section{0pt}{12pt}{10pt}
|
%\titlespacing\section{0pt}{12pt}{10pt}
|
||||||
\titlespacing\subsection{0pt}{5pt}{5pt}
|
%\titlespacing\subsection{0pt}{5pt}{5pt}
|
||||||
\titlespacing\subsubsection{0pt}{5pt}{5pt}
|
%\titlespacing\subsubsection{0pt}{5pt}{5pt}
|
||||||
\titlespacing*{\paragraph}{0pt}{12pt}{5pt}[50pt]
|
%\titlespacing*{\paragraph}{0pt}{12pt}{5pt}[50pt]
|
||||||
\titlespacing*{\subparagraph}{0pt}{12pt}{5pt}[50pt]
|
%\titlespacing*{\subparagraph}{0pt}{12pt}{5pt}[50pt]
|
||||||
|
|
||||||
|
\RedeclareSectionCommand[beforeskip=0pt,afterindent=false]{section}
|
||||||
|
\RedeclareSectionCommand[beforeskip=0pt,afterindent=false]{subsection}
|
||||||
|
|
||||||
\setitemize{noitemsep,topsep=0pt,parsep=0pt,partopsep=0pt}
|
\setitemize{noitemsep,topsep=0pt,parsep=0pt,partopsep=0pt}
|
||||||
\setlist[enumerate]{noitemsep, topsep=0pt, parsep=0pt, partopsep=0pt}
|
\setlist[enumerate]{noitemsep, topsep=0pt, parsep=0pt, partopsep=0pt}
|
||||||
|
@ -82,7 +84,7 @@ autogobble
|
||||||
%https://tex.stackexchange.com/a/391042
|
%https://tex.stackexchange.com/a/391042
|
||||||
\newcommand{\und}{\\ & & }
|
\newcommand{\und}{\\ & & }
|
||||||
|
|
||||||
\graphicspath{{include/}}
|
\graphicspath{{include}}
|
||||||
|
|
||||||
\newcommand{\link}[1]{\footnote{\url{#1}}}
|
\newcommand{\link}[1]{\footnote{\url{#1}}}
|
||||||
|
|
||||||
|
@ -135,7 +137,7 @@ autogobble
|
||||||
\vspace*{50pt}
|
\vspace*{50pt}
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[scale=1.0]{hsel-logo}
|
\includegraphics{hsel-logo}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\vspace*{200pt}
|
\vspace*{200pt}
|
||||||
|
@ -164,4 +166,4 @@ autogobble
|
||||||
\end{titlepage}
|
\end{titlepage}
|
||||||
}
|
}
|
||||||
|
|
||||||
\endinput
|
\endinput
|
||||||
|
|
52
index.tex
52
index.tex
|
@ -11,8 +11,6 @@
|
||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
|
|
||||||
%\tableofcontents
|
|
||||||
|
|
||||||
\section{Tasks}\label{sec:tasks}
|
\section{Tasks}\label{sec:tasks}
|
||||||
|
|
||||||
Um einen konsistenten Startpunkt zu erhalten werden bei allen Tasks zu Beginn sämtliche vom entsprechenden
|
Um einen konsistenten Startpunkt zu erhalten werden bei allen Tasks zu Beginn sämtliche vom entsprechenden
|
||||||
|
@ -183,7 +181,53 @@
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
\section{Hilfsfunktionen}\label{sec:functions}
|
\section{Hilfsfunktionen}\label{sec:functions}
|
||||||
\lipsum[2-4]
|
Zur Vereinfachung des Leseflusses und der besseren Nachvollziehbarkeit des Codes werden wiederkehrende Programmteile in Hilfsfunktionen ausgelagert.
|
||||||
|
Passiert während des Durchlaufens der einzelnen Funktionen ein Fehler,
|
||||||
|
so wird die erste hier beschriebene Hilfsfunktion aufgerufen.
|
||||||
|
|
||||||
|
\subsection{void end(bool fail)}\label{subsec:void end(bool fail)}
|
||||||
|
Bei Aufruf dieser Hilfsfunktion werden sämtliche Taks, Mailboxen, Modbus-Verbindungen und Semaphoren deinitialisiert und der Timer gestoppt.
|
||||||
|
Falls der Übergabeparameter \mintinline{c}{fail == true} ist, so wird eine entsprechende Nachricht auf der Konsole ausgegeben.
|
||||||
|
|
||||||
|
\subsection{int readAll(int type, int *result)}\label{subsec:int readAll(int type, int *result)}
|
||||||
|
Das Auslesen aller zur Verfügung stehenden Bits, abhängig vom Typ der Verbindung, erfolgt mithilfe der nicht Thread-sicheren Funktion readAll.
|
||||||
|
Dabei wird dieser Funktion sowohl der Verbindungs-Typ (\mintinline{c}{DIGITAL_IN, DIGITAL_OUT, ANALOG_IN, ANALOG_OUT}),
|
||||||
|
als auch ein Pointer auf den Speicherplatz übergeben, an welchem das Ergebnis gespeichert wird.
|
||||||
|
Bei erfolgreichem Durchlaufen dieser Funktion wird eine 0 zurückgegeben, ansonsten eine 1.
|
||||||
|
|
||||||
|
\subsection{int readData(int part)}\label{subsec:int readData(int part)}
|
||||||
|
Im Gegensatz zur Hilfsfunktion \mintinline{c}{readAll()} liest die Funktion readData nur ein einzelnes Bit aus und gibt dieses zurück.
|
||||||
|
Damit die Richtigkeit der Daten während des Auslesens gewährleistet werden kann,
|
||||||
|
ist diese Funktion mithilfe einer Semaphore Thread-sicher gemacht worden.
|
||||||
|
Nach dem Auslesen aller Bits des Modbus wird der Wert der Funktion \mintinline{c}{readAll()} mit der in \mintinline{c}{part} übergebenen Bitmaske verundet und somit isoliert.
|
||||||
|
Dieses einzelne Bit wird nun in \mintinline{c}{result} gespeichert und die Semaphore wieder freigegeben.
|
||||||
|
Bei fehlerfreiem Aufruf der \mintinline{c}{readAll()}-Funktion wird das spezifizierte einzelne Bit zurückgeben, falls nicht,
|
||||||
|
so wird in die \mintinline{c}{end()}-Hilfsfunktion gesprungen und alle Tasks, Mailboxen, etc deinitialisiert und gestoppt.
|
||||||
|
|
||||||
|
\subsection{void disable(int actor)}\label{subsec:void disable(int actor)}
|
||||||
|
Diese Funktion deaktiviert den im Übergabeparameter spezifizierten Aktor.
|
||||||
|
Da auch in diesem Fall die Daten aus dem Modbus während des Lesezugriffs nicht verändert werden dürfen ist diese Funktion Thread-sicher.
|
||||||
|
Zur Kommunikation mit dem jeweiligen Aktor wird die gesamte Bitfolge über \emph{readAll()} ausgelesen.
|
||||||
|
Ist dies ohne Fehler geschehen, so wird die empfangene Bitfolge mit der negierten Bitmaske des anzusprechenden Aktors verundet.
|
||||||
|
Diese neue, sich nur in einem Bit unterscheidende Bitfolge wird auf den Modbus geschrieben und die Semaphore freigegeben.
|
||||||
|
|
||||||
|
\subsection{void sendMail(MBX * mailbox, int msg)}\label{subsec:void sendMail(MBX * mailbox, int msg)}
|
||||||
|
Das Senden einer blockierenden Nachricht (\mintinline{c}{msg}) an eine über mailbox spezifierte Mailbox wird mithilfe dieser Funktion realisiert.
|
||||||
|
|
||||||
|
\subsection{void sendMailNonBlocking(MBX * mailbox, int msg)}\label{subsec:void sendMailNonBlocking(MBX * mailbox, int msg)}
|
||||||
|
Im Unterschied zur Funktion \mintinline{c}{sendMail()} wird hier eine nicht-blockierende Nachricht (msg) an die in mailbox spezifizierte Mailbox gesendet.
|
||||||
|
|
||||||
|
\subsection{int receiveMail(MBX * mailbox)}\label{subsec:int receiveMail(MBX * mailbox)}
|
||||||
|
Diese Hilfsfunktion fasst das Erhalten einer blockierenden Nachricht an der im Übergabeparameter spezifizierten Mailbox
|
||||||
|
zusammen und gibt den Nachrichteninhalt zurück.
|
||||||
|
|
||||||
|
\subsection{int receiveMailNonBlocking(MBX * mailbox)}\label{subsec:int receiveMailNonBlocking(MBX * mailbox)}
|
||||||
|
Analog zu \mintinline{c}{receiveMail()} wird auch hier einen Nachricht an der im Übergabeparamter spezifizierten Mailbox erhalten und deren Inhalt zurückgegeben,
|
||||||
|
jedoch ist diese nicht blockierend.
|
||||||
|
|
||||||
|
\subsection{void sleepMs(int ms)}\label{subsec:void sleepMs(int ms)}
|
||||||
|
Da bei der Kommunikation der Tasks untereinander oder der Abarbeitung an den einzelnen Stationen teilweise Pausen benötigt werden,
|
||||||
|
ist diese Funktion unerlässlich. Dabei wird mithilfe des Übergabeparameters festgelegt, für wie viele Millisekunden ein Tasks pausieren soll.
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
Loading…
Reference in New Issue