IOT2000 und die Arduino-Welt
Bei der Erstellung meines neuen Buches zur IOT2000 ist mir zur Programmierung der Arduino-Anwendung aufgefallen, dass die Programme, welche auf einem UNO-Board entwickelt wurden, nicht ohne Anpassungen fehlerfrei übersetzt wurden. Dazu nachfolgend ein Ausschnitt aus dem Buch zu Kapitel 8:
8 Der
Arduino-Sketch in der
SIMATIC IOT2000 für Ardu_IOsim
Die Anwendung der IO-Simulation Ardu_IOsim hat den Vorteil, dass vorerst
keine digitalen und analogen Eingänge verdrahtet sein müssen und der Sketch trotzdem
getestet werden kann, bevor man sich ein passendes Shield für die IOT2000
suchen muss.
Der Programmzusatz für den Test mit Ardu_IOsim muss für das eigene Anwenderprogramm
so gering wie möglich sein. Die Programmierung des Sketchs darf auch nach dem
Einsatz eines Shields für die digitalen und analogen Eingänge keine
Programmänderung erfordern.
Diese Forderung ist mit einem kleinen Trick ohne großen Aufwand
erfüllbar. Betrachten wir die kleine Softwarestruktur zum Sketch in Bild
8.1.
Das Anwenderprogramm verbindet sich mit einem #include “Ardu_IOsim.h“ mit der Klasse Ardu_IOsim_PLC.cpp und kann so die
Eigenschaften dieser Klasse anwenden. Dies ist aber nur dann der Fall, wenn der
Anwender dies wünscht. Das wird durch die #define
_IOSIM_ festgelgt. Ist das der Fall, dann wird innerhalb serialEvent die Schnittstelle zu Ardu_IOsim (PC) aktiv und kann für das
Anwenderprogramm nicht mehr genutzt werden. Auch werden innerhalb des
Anwenderprogrammes bestimmte #define-Anweisungen
aktiv (nicht im Bild abgebildet). Existiert das Define _IOSIM_ nicht, wird das Anwenderprogramm ohne die Simulation
abgearbeitet. Wie sieht das nun in der Praxis aus?
In Bild
8.2
ist das Grundgerüst für das Einbinden der Simulation ersichtlich. Leider
verfügt der Editor über keine Zeilen-Nummerierung (Version 1.6.9). Dazu nun
folgende Erklärungen:
Die #define _IOSIM_-Anweisung sorgt dafür, dass die Zeilen nach
#ifdef _IOSIM_ ausgeführt werden. Soll die Simulation abgeschaltet werden, so
ist die Zeile #define _IOSIM_ in
Kommentare zu setzen (//#define _IOSIM_).
Im Falle der Simulation wird mit Ardu_IOsim iosim; die Instanz der
Klasse Ardu_IOsim instanziiert und
die darauffolgenden #define-Anweisungen
bedeuten, dass die im Programm üblichen Funktionen digitalRead, analoRead und pinMode
umgeleitet werden in iosim.DigitalRead,
iosim.AnalogRead und ioSim.PinMode.
Somit können in der Anwendersoftware diese Anweisungen wie gewohnt benutzt
werden.
Im setup werden wie gewohnt die Pin konfiguriert. Hier im Beispiel sind die Pins 2 und 3 als Ausgänge deklariert. Danach wird die serielle Schnittstelle auf 115200 Baud eingestellt und falls Zeichen vorhanden sind, gleich der Buffer geleert.
Die Funktion serialEvent
ist eine Systemfunktion und wird
automatisch aufgerufen, sobald sich Zeichen an der seriellen Schnittstelle befinden. Nur
hier muss die #ifdef _IOSIM_-Anweisung
eingefügt werden, damit die Methode iosim.SerialEvent
nur dann aufgerufen wird, wenn _IOSIM_
auch tatsächlich definiert worden ist.
Damit soll das Prinzip über die Anwendung einer IO-Simulation
programmtechnisch ausreichend erklärt sein.
Aufgefallen ist mir, dass das Programm Ardu_IOsim, welches auf dem Arduino UNO
entwickelt wurde nicht in der SIMATIC IOT2000 fehlerfrei übersetzt wurde. Damit
ist die IOT2000 nicht unbedingt 100% kompatibel zum Arduino-Konzept!
Aus diesem Grunde wurde die Software für die Anwendung in
der SIMATIC IOT2000 angepasst. Der Arduino-Kenner sollte sich also nicht
wundern, wenn hier einige cast
gesetzt wurden, die sonst nicht verwendet werden. Auch die Register zum
Atmel-Prozessor (z. B. DDRD, PORTA usw.) wurde durch Funktionen künstlich
ersetzt. Zudem auch serialEvent() auch nicht funktioniert, sind einige Anpassungen notwendig (naja - ist ja auch kein Arduino-Board!).
So jagt eine Überraschung die andere.
Im folgenden Kapitel 8.1 wird die IOT2000-Arduino-Version vorgestellt. Die ursprünglich entwickelte Arduino-Version für das UNO-Board befindet sich auch auf der Buch-CD.
Besonders interessant ist, dass beide Module
(Arduino-IDE und Eclipse) gleichzeitig
lauffähig sind! Das kann zu Überraschungen führen, wenn die Programme bezüglich
der Pins konkurrierend sind J.