Vom MCP23017/MCP3008 IO Board zur CODESYS Soft-SPS

  • Vom MCP23017/MCP3008 IO Board zur CODESYS Soft-SPS

    Rückblick

    Wer >>> diesen Artikel <<< gelesen hat, der kennt die Odysee von der Klein-SPS bis hin zum Hubo-IO Board, um letztendlich eine Heizung zu regeln. Die SPS als Steuerungshardware war eher dem Fehlen einer erschwinglichen und programmierbaren Hardware geschuldet, als daß ich Verlangen auf eine graphische Programmierung per IEC 61131-3 gehabt hätte.

    Mit den neuen Möglichkeiten wie sie heute für SPS’e zur Verfügung stehen, einer objektorientierten Sprache, mächtigen Debugmöglichkeiten und einem integrierten WEB-Frontend für die Anwendung, hat sich das nun grundlegend geändert.


    Was ist CODESYS?

    CODESYS ist eine Entwicklungsumgebung und SPS-Runtime der Firma 3S-Smart Software Solutions GmbH welche nicht nur SPS-Hardware namhafter SPS-Hersteller unterstützt, sondern auch den Raspberry Pi in eine Soft-SPS verwandelt.

    Die Entwicklungsumgebung erlaubt die Erstellung von Programmen gemäß der IEC 61131-3 in allen gängigen Sprachen wie KOP, FUP, AS, CFC oder objektorientiert per ST (Structured Text). Der in die Entwicklungsumgebung integrierter Debugger, Watches, Callstacks oder auch Tracelogs unterstützen bei der Fehlersuche über das Netzwerk auf dem Raspberry Pi.

    Zur Visualisierung bietet CODESYS ein Web-Frontend mit etlichen Controls zur einfachen Fernbedienung über den PC, das Smartphone oder Tablet.


    Was liegt also näher, als eine modulare Hardware wie die des Hubo dieser Soft-SPS zugänglich zu machen?


    „Hubo Library for Raspberry Pi“ stellt das Bindeglied zwischen den Hubo Hardwarevarianten und CODESYS her und verwandelt den Raspberry Pi in eine Soft-SPS, mit der sich die folgenden Funktionen realisieren lassen:

    • bis zu 64 digitale Eingänge (als Schalter oder als 24V AC/DC Schnittstelle mit galvanischer Trennung),
    • bis zu 64 Ausgänge, entweder als Relaisausgang oder als Transistorausgang,
    • 8 analoge Eingänge für die AD-Wandler MCP3008 (10 Bit) und MCP3208 (12 Bit),
    • Zugriffs auf 1wire Sensoren der Typen DS18x20 sowie
    • Optionen zur Nachrüstung von DS3132 Echtzeituhrmodulen bzw. 433MHz Sendemodulen z.B. zum schalten von Funksteckdosen.


    An dieser Stelle soll gezeigt werden, wie die Hardware des Hubo auf einfache Weise in CODESYS integriert werden kann. Das folgende Bild zeigt die CODESYS Entwicklungsumgebung während des Debugging im ST-Code.



    Installation

    Die Installation zerfällt in zwei Teile. Zum einen in die Installation und Vorbereitung der Entwicklungsumgebung auf dem PC, zum anderen in die Installation der SPS-Runtime auf dem Raspberry Pi. Letzteres geschieht per Download direkt über die Entwicklungsumgebung.

    Die Installation der Entwicklungsumgebung „CODESYS Development System V3“ erfolgt wie für PC Applikationen „üblich“ und bedarf keiner weiteren Erklärung. Erhältlich ist sie nach kostenfreier Anmeldung im CODESYS Store.

    Die nachfolgende Installation der SPS-Runtime wird ausführlich im „Erste Schritte“ Artikel der Downloadseite beschrieben. Um sich zunächst einen Überblick zu verschaffen, reicht die kostenfreie Demolizenz, welche den vollen Funktionsumfang bietet, die Runtime (auf dem Raspberry Pi) jedoch nach 2 Stunden Laufzeit abschaltet. Da die Entwicklungsumgebung eine Startmöglichkeit der Runtime vorsieht, schränkt das die Evaluierung jedoch in keiner Weise ein.


    Der Treiber „Hubo Library for Raspberry Pi“ wird, wie für CODESYS Erweiterungen üblich, als Package geliefert und ist >>> hier <<< verfügbar.

    Das Package installiert je einen Funktionsblock für die MCP3008/3208 AD-Wandler, den MCP23017 Port-Expander, die Onlinehilfe zur Treiberbibliothek sowie die folgenden vier Demoprogramme:

    • Hubo_Analogeingang-1.project (einlesen der AD raw-Werte, sowie der gewandelten Spannungen)
    • Hubo_Analogeingang-2.project (einlesen aller 8 AD raw-Werte)
    • Hubo_Digital-IO.project (einfaches lesen und schreiben auf dem MCP23017)
    • Hubo_Webvisu.project- lesen und schreiben mehrerer MCP23017 Portexpander aus mehreren Tasks heraus;
      - gleichzeitiges lesen des MCP3x08 AD-Wandlers aus mehreren Tasks;
      - Visualisierung der Werte und Schalten einzelner Kanäle über die Webvisualisierung;
      - schalten einer Funksteckdose über die Webvisualisierung


    Beim schalten der Funksteckdose wird auf die C++-Beispielimplementierungen RCSocket der Hubo C++-Library zurückgegriffen. Zudem bedarf es einer einmaligen Konfiguration in der CODESYS Runtime. Diese kann der Dokumentation entnommen werden, bzw. ist auch im CODESYS Forum beschrieben.


    Nach der Installation ist die Web-Visualisierung wie folgt zu erreichen: http://raspberrypi:8080/webvisu.htm.


    SPS-Datenaustausch zwischen Software und Hardware

    SPS Geräte arbeiten in Zyklen. Deren Takt kann in vielen Fällen vorgegeben werde, so auch in CODESYS (siehe Task-Konfiguration). Eine Task ist ein Programm, geschrieben in einer der vielen SPS Sprachen, welches im o.g. Zyklus wiederkehrend aufgerufen wird. Im Folgenden wird die Verwendung von ST (Strukturierter Text, eine objektorientierte Programmiersprache mit Pascal ähnlicher Syntax) beschrieben. Ein Zyklus besteht aus den folgenden 3 Schritten:

    • einlesen sämtlicher Werte von der Hardware,
    • Verarbeitung der Daten (also die „eigentliche“ Applikationslogik) sowie
    • schreiben der Werte auf die Hardware.

    Die Verwendung der Treiber erfolgt über entsprechenden FB (Funktionsbausteine), deren Objekte (!bei dieser Library!) einerseits aus mehreren Tasks heraus verwendet werden dürfen (z.B. als globale Objekte), andererseits aber auch Mehrfachinstanziierung erlauben. Dies ist z.B. erforderlich, wenn bis zu 8 MCP23017-Portexpander bedient werden sollen. Mittels interner Synchronisation verhindert die Library Buskollisionen auf den verwendeten Bussen (I2C und SPI).


    Digitale Ein- und Ausgänge

    Die digitalen Eingänge des Hubo sollen über CODESYS eingelesen und direkt auf den Ausgängen ausgegeben werden.


    HuboDigitalIO ist der zur Steuerung der MCP23017 Portexpander zu verwendende FB. Während der Deklaration übergibt man die I2C-Adresse des Bausteins (0x20…0x27), das I2C Busmasterobjekt (das ist ein Standardobjekt bei Raspberry Pi Projekten unter CODESYS) sowie optional zwei Invertierungsmasken zur logischen Invertierung der Ein- und/oder Ausgänge.



    Jeder der FB der Library bedarf einer einmaligen Initialisierung per Initialize(). Diese erfolgt zum Start des Programmes und verwirft Folgeaufrufe nach dem ersten Zyklus. Mittels ReadBuffer() werden die Eingänge des MCP23017 sowie die Werte des Output-Latchregisters gelesen.

    Von nun an kann frei mit diesen Werten gearbeitet werden. Im vorliegenden Fall erfolgt eine einfache Zuweisung der Eingangswerte an die Variable masterAusgang. Mittels des Aufrufes von SetOutputPortA(masterAusgang) wird der Ausgangswert nun in den Puffer zur Übermittlung an die Ausgänge übertragen.

    Der Aufruf von WriteBuffer() überträgt letztendlich die gepufferten Werte auf den MCP23017.


    Analoge Eingänge

    Ähnlich den digitalen Eingängen sollen die analogen Eingänge des Hubo eingelesen werden.


    Dazu wird der FB HuboAnalogInput instanziiert. Dabei können der Typ des zu verwendenden AD-Wandlers (MCP3208/12Bit oder MCP3008/10Bit) und andere Betriebsparameter spezifiziert werden.


    Auch hier erfolgt die Umsetzung dem Muster Initialisierung, Eingangspuffer lesen und dem anschließenden Zugriff auf die Werte. Ein Schreiben der Werte entfällt natürlich.


    1Wire Temperatursensoren

    Es sollen die Temperaturen der 1Wire Sensoren (DS18x20) eingelesen werden.


    CODESYS bietet bereits von Haus aus Treiberunterstützung für DS18x20 1Wire Sensoren an. Insofern bedarf es keiner weiteren expliziten Unterstützung seitens der Library (siehe das folgende Bild).




    Anmerkung: Da die CODESYS Runtime synchron auf das 1wire Filesystem zugreift, was zum blockieren der aufrufenden Task führt, empfiehlt es sich, 1Wire Zugriffe in eine separate Task auszulagern und auf gepufferte Variablenwerte zuzugreifen.


    Funksteckdosen per 433MHz Sendemodul steuern

    Mittels der 433MHz Senderoption des Hubo lassen sich diverse Geräte per Funk steuern.


    Im folgenden Beispiel wurde auf das in der Hubo C++-Library enthaltene Demoprogramm „RCSwitch“ einer Funksteckdosensteuerung zurückgegriffen, um den Sender zu steuern. Das Programm muß sich demnach im Usermode ausführbar, und im Standardsuchpfad des Betriebssystems (z.B. unter „/usr/bin/“) befinden. Zudem bedarf es einer Anpassung der CODESYS Runtime Konfiguration (siehe “/etc/CODESYSControl_User.cfg”) um die Einträge:


    [SysProcess]

    Command.0=RCSocket


    Das Vorgehen ist ebenfalls in der Onlinehilfe der Bibliothek beschrieben.


    Der FB RCSocket wird entsprechend der Konfiguration der Steckdose mit Familycode und Steckdosennummer konfiguriert.



    Ein puffern der Werte entfällt hier. Stattdessen wird eine Variable „bSocketOn“ von der Webvisualisierung geändert und der jeweils geänderte Wert gesendet.


    Webvisualisierung

    Parameter und Werte der Steuerung sollen per PC, Smartphone oder Tablet sichtbar gemacht und verändert werden können.


    CODESYS bietet hier eine ganze Palette von Steuerelementen angefangen von einfachen Zeichenelementen über Schalter, Lampen, Bitmaps, Fortschrittsbalken, Meßgeräte, Trendverläufen, Controlpanel usw.. Das folgende Bild zeigt eine einfache Visualisierung des mitgelieferten Beispiels „Hubo_Webvisu.project“.




    Viel Spaß beim basteln wünscht...


    schnasseldag