Skip to content
Snippets Groups Projects
Select Git revision
  • 0ba264323975d1dc4dd71499afc9d06ee4ce3d5e
  • master default
2 results

dynmem-5.c

Blame
  • Forked from Peter Gerwinski / hp
    Source project has a limited visibility.
    dynmem-5.c 493 B
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
      char **name = malloc (3 * sizeof (char *));
      name[0] = "Anton";
      name[1] = "Berthold";
      name[2] = "Caesar";
    
      char **new_name = malloc (4 * sizeof (char*));
      for (int i = 0; i < 3; i++)
        new_name[i] = name[i];
      free (name);
      name = new_name;
    
      name[3] = "Dieter";
    
      for (int i = 0; i < 4; i++)
        printf ("%s\n", name[i]);
      free (name);
      free (new_name);   /* Fehler: Array wurde bereits freigegeben! */
      return 0;
    }
    
      \url{https://gitlab.cvh-server.de/aco/smart-grid-modell/-/tree/ss19}.
      Dieser Tag stellt eine GUI bereit mit der verschieden Parameter des Modells angepasst werden können und ein Tageszeiten-Simulationsmodus ausgeführt werden kann.
      Diese Software bot jedoch keine Möglichkeit, um einen OPC UA Server sinvoll zu integrieren, daher wurde die Software zur Ansteuerung des Modells in gänze neu geschrieben.
    
      \section{Entwicklungen}
      
      Als Vorbereitung zu den folgenden Entwicklungen wurde der Raspberry Pi aktualisiert, da das Betriebsystem zu sehr gealtert war, sodass die Software nicht auf den akutellen Stand
      geupdated werden konnte.
    
      \subsection{I2C}
      Als erstes wurde eine I2C Modul entwickelt, welches es ermöglicht auf die I2C Schnittstelle des Raspberry-Pis und dadurch auf den Arduino zuzugreifen.
      Hierbei wurde im Gegensatz zu vorher auf die Verwendung von der Bibliothek WiringPi verzichtet, sondern es wurden direkt die von Linux bereitgestellten Schnittstellen genutzt.
      Eine Beispielanwendung, wie die Schnittstelle zu verwenden ist ist in der Datei \textit{ComTest.cpp} bereitgestellt.
      Die zugehörige kompilierte Anwendung ist \textit{manual\_control.exe}.
      Mit dieser Anwendung können die Ausgängen des Arduinos gestuert werden.
      Die Verwendung ist folgendermaßen:
    
      \begin{lstlisting}[language=C]
        // ./manual_control $register $value
        // for example
        ./manual_control 2 50
    
        // Sets the windmill to the speed of 50 (of max 255).
      \end{lstlisting}
    
      Darauf aufbauen wurde ein \textit{HardwareController} geschrieben, der eine leichtere Steuerung des Modells 
      erlaubt. Erfasst die einezelnen Bereiche des Netzes zu logischen Gruppen zusammen die dann gemeinsam gesteutert werden können.
    
      \subsection{Smart Grid Modell}
    
      In Anlehnung an den bereits bestehenden Tagszeiten-Simulationsmodus wurde eine neue Simulation entwicklet,
      die ebenfalls einen Tagesablauf, mit Tageszeit abhängigem Verbrauch und Energieerzeugung, sodass zu verschiedenen Tagszeiten
      mal ein Überschuss an erneuerbaren Energien besteht und mal die Versorgung ausschließlich durch die konventionelle Energie gedeckt ist.
      Abhängig von der Energieverteilung innerhalb des Netz werden die LEDs geschaltet, um den Zustand zu visualiesieren.
    
      Die Uhrzeit kann von außen, aus Softwaresicht, eingestellt werden. Genauso kann das berechnen des Zustands für die nächste Stunde angestoßen
      werden, sodass sich das Modell von außen steuern lässt.
    
      Darauf aufbauend wurde das SGM in einen Zustandsautomaten gekapselt, dieser verwaltet lediglich die zwei Zustände Simulation oder Manuelle-Steuerung.
      Im Simulationsmodus, wird in einem regelmäßigen Zeitintervall der Zustand für die nächste Stunde des Modells berechnet und eingestellt.
      Im manuellen Modus, wird die Zeit festgehalten und das Modell verweilt in diesem Zustand. 
      Von außen kann jedoch die Uhrzeit manuell geändert werden, wodurch sich der Zustand des Modells ändert.
    
      \subsection{OPC UA Server}
       
      Für die Ergänzung des SGM wurde auf die Bibliothek \textit{FreeOpcUa} \url{https://github.com/FreeOpcUa/freeopcua} zurückgegriffen.
      Dies ist eine unter LGPL stehende Software, mit der sowohl OPC UA Server als auch Clients geschrieben werden könne.
      Die Bibliothek wurde als Git-Submodule eingebunden.
    
      Es werden auch Code-Beispiele z.B. \url{https://github.com/FreeOpcUa/freeopcua/blob/master/src/examples/example_server.cpp} für einen Server bereitgestellt.
      Aufbauen auf diesem Beispiel wurde der OPC UA Server für das SGM implementiert.
    
      Der OPC UA Server soll es ermöglichen, den Simulationszustand zu simulieren und gleichzeitig Verbraucher im Modell ein und ausschalten können.
      Zur Steuerung stellt der OPC UA Server daher drei Steuerungs-Variablen zur Verfügung.
    
      \begin{description}
        \item[sim\_mode\_enabled] Über diese Variable vom Typ \lstinline{boolean} ist es möglich zwischen den Modi Simulation und manueller Steuerung zu wählen.
        \item[time] Über diese Variable vom Typ \lstinline{int} lässt sich eine Uhrzeit zwischen 0 und 23 Uhr einstellen.
        \item[producing] Über diese Variable vom Typ \lstinline{boolean} kann im Modell gesteuert werden, ob ein zusätzlicher Verbraucher (zum Beispiel eine Industrieanlage) eingeschaltet oder ausgeschaltet werden soll   
      \end{description}
      
      
      Darüber hinaus gibt der OPC UA Server auch den Zustand der Simulation nach außen frei.
      Diese veröffentlichten Variablen können jedoch nicht manipuliert werden.
      
      \begin{description}
        \item[excess\_power] Im Netz verfügbare (überschüssige) erneuerbare Energie.
        \item[power\_production] Insgesamt bereitgestellte Energei, sowohl erneuerbar als auch konventionell.
        \item[renewable\_pwer] Produzierte erneuerbare Energie.
        \item[sun\_power] Durch den Photovoltaikpark erzeugte Energie.
        \item[used\_power] Kommulierte Energie aller Verbraucher.
        \item[wind\_power] Druch das Windrad erzeugte Energie.  
      \end{description}
      
        \begin{figure}[h!]
          \centering{
          \includegraphics[scale=0.5]{Bildschirmfoto vom 2020-10-28 10-19-00.png}
          }
          \caption[]{OPC UA Server SGM Variablen}
          \label{abb:opc_vat}
        \end{figure}
      
      \section{Installation}
    
      Für die Entwicklung der Software kann jeglicher Linux-Desktop verwendet werden.
      Für Debian basierte Linux-Distributionen ist die Installation am einfachsten.
    
      Die zu dem Projekt gehörende Quellcode befindet sich im CVH GitLab unter: \url{https://gitlab.cvh-server.de/aco/smart-grid-modell}.
    
      Zur Enwicklung werden die fogenden Tools benötigt:
      \begin{itemize}
        \item git
        \item gcc
        \item make
        \item cmake
      \end{itemize}
    
      Für das Testen des OPC Server bietet sich darüber hinaus noch das Tool \textit{opcua-client} an.
      Dieses kann über die Python Paketverwaltung pip mit dem Befehl \lstinline{pip install opcua-client}
      installiert werden.
    
      Das Projekt kann mit dem foglenden Befehl heruntergeladen werden.
      \begin{lstlisting}
        git clone --recurse-submodules https://gitlab.cvh-server.de/aco/smart-grid-modell
      \end{lstlisting}
    
      Für die Installation wurde das Skript \lstinline{install.sh} bereitgestellt.
      Sind alle nötigen Abhängigkeiten installiert wird hiermit das gesamte Projekt bebaut.
      Auf dem Raspberry-Pi kann das Kompilieren einige Minuten dauern.
    
      Der Grund dafür ist, dass die FreeOpcUa Bibliothek mitgebaut werden muss.
      Die Abhängigkeiten, die für die Bibliothek installiert werden müssen, sind in der
      Datei \textit{debian.soft} der FreeOpcUa Biblithek aufgelistet.
    
      Die Schritte die das Installations Skript übernimmt sind die folgenden.
      Als erstes wird das Verzeichnis \textit{build} angelegt und in dieses gewechselt.
      Darin wird der Befehlt \lstinline{cmake ..} ausgeführt.
      Damit werden die GNU Makefiles generiert, mit denen das Projekt kompiliert werden kann.
      Das Kompilieren kann dann mit dem Befehl \lstinline{make} angestoßen werden.
      Beschleunigt werden kann der Vorgang, indem mit der Option \lstinline{-j2}
      die Anzahl der Threads angegeben werden, mit denen parallel kompiliert wird.
    
      Beim manuellen kompilieren ist darauf zu achten, dass die ausführbaren Datein 
      in dem Verzeichnis \textit{build/libs/freeopcua/bin/} abgelegt werden.
      Das Installations-Skript kopiert die \textit{smart\_grid.exe} zurück in das \textit{build} Verzeichnis.
    
    
      \section{Ausführen}
    
      Gestartet werden kann der OPC Server indem die ausführbare Datei gestartet wird.
      Beim beenden des Servers, werden die Ausgänge des Modells nicht wieder zurück gesetzt.
      Daher leuchten die LEDs weiter und auch das Windrad dreht sich weiter.
      
      Zum ausschalten der LEDs können zwei Skripte benutzt werden die auf das oben genannte Tool
      \textit{manual control} zurückgreifen.
      Damit können entweder alle Komponeten ausgeschaltet werden, oder nur das Windrad.
      \begin{itemize}
        \item windmill\_off.sh
        \item all\_off.sh
      \end{itemize}
    
      Alternativ kann das Skript \textit{start\_server.sh} verwendet werden.
      Mit dem Skript wird nach dem dem Beenden, durch das Drücken das Taste \textit{q} alle Ausgänge wieder
      ausgeschaltet.
    
      Der OPC Server ist anschließend unter der lokalen IP Adresse (vergeben über DHCP) oder wenn möglich
      über den Hostnamen raspberrypi und dem Port 4840.
    
      Um sich per ssh mit dem Raspberry-Pi zu verbinden werden die Zugangsdaten Benutzername: pi und Passwort: pi benötigt.
    
      In dem OPC UA client können dann zum Beispiel die Daten betrachtet werden.
      So wie in Abbildung \ref{abb:excess_pwr} dargestellt.
    
      \begin{figure}[h]
        \centering{
          \includegraphics[scale=0.5]{Bildschirmfoto vom 2020-10-28 10-20-32.png}
        }
        \caption[]{Überschüssige Energie im Zeitverlauf}
        \label{abb:excess_pwr}
      \end{figure}
      
    
    
      \newpage
    
      \section{Ressourcen}
      \begin{itemize}
        \item \url{https://gitlab.cvh-server.de/aco/smart-grid-modell}
        \item \url{https://www.raspberrypi.org/}
        \item \url{https://github.com/FreeOpcUa/freeopcua}
        \item \url{https://cmake.org/}
      \end{itemize}
    
    
      \vfill
    
      \begingroup
    
        \small
    
        \setlength{\leftskip}{3cm}
    
    
        Copyright \copyright\ 2020\quad Armin Co\\
        Lizenz: \mylicense
    
        Sie können diesen Text einschließlich \LaTeX-Quelltext
        herunterladen unter:\\
        \url{https://gitlab.cvh-server.de/aco/smart-grid-modell}
    
      \endgroup
    
    \end{document}