Mittwoch, 4. Januar 2017

Ist die IOT2000-Arduino kompatibel zur Arduino-Welt?

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.
Der loop zeigt ein kleines Beispiel zur Anwendung der digitalen und analogen Befehle. Ist die Simulation aktiv, werden die digitalen und analogen Eingänge simuliert, ohne dass der Programmierer der Anwender-Software etwas dazu berücksichtigen muss. Im Beispiel wird der digitale Pin_2 auf den digitalen Pin_3 kopiert und der Ana_0 entsprechend bei >=127 der Pin_3 gesetzt oder gelöscht.

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.