Mini-SPS mit dem Uno

In Arbeit ....

Eine kleine Speicher-Programmierbare-Steuerung - eine "Mini-SPS" - mit einem Arduino Uno zu entwickeln, für einfache, schnell und kostengünstig zu realisierende Steuerungsaufgaben, ist meine Motivation, mich mit diesem Thema zu beschäftigen. Programmiert soll die Mini-SPS über Anweisungslisten werden, ähnlich wie man es früher in "vorgraphischer Zeit" auch größere und große Steuerungen programmiert hat.

Mit dem hier vorgestellten Projekt möchte ich die Entwicklung und den aktuellen Stand meiner Mini-SPS, die derzeit in einer Beta-Version bereits funktioniert, präsentieren und auch laufend auf den neuesten Stand aktualisieren. Software-Basis der Mini-SPS ist meine Library "MyMiniSPS", die ich auch demnächst unter Meine Libraries einstellen möchte.


Auslegung der Mini-SPS:

Ausgehend von den Möglichkeiten eines Uno's habe ich die Mini-SPS derzeit folgend ausgelegt:

Ein- und Ausgänge:

  • 6 Digital-Eingänge DIn1 - DIn6
  • 4 Analog-Eingänge AIn1 - AIn4
  • 4 Digital-Ausgänge DOut1 - DOut4 davon 2 auf Relaisausgabe umsteckbar
  • 2 Digital-Ausgänge DOut5 und DOut6, die wahlweise auch als PWM-Ausgänge PWMOut1 - PWMOut2 verwendet werden können (PWM-Frequenz: 1,953 kHz, Auflösung: 10 Bit)

Achtung: Die Nummern der Ein- bzw. Ausgänge sind nicht identisch mit den Pin-Nummern beim Uno! (Siehe Pin-Zuordnung in Tabelle 1).


Zykluszeiten:

Das Anwenderprogramm kann in drei Zyklen laufen:

  • Schneller Zyklus mit 10 ms Zykluszeit
  • Standardzyklus mit 100 ms Zykluszeit
  • Hintergrundzyklus mit 1 s Zykluszeit

Zusätzlich gibt noch einen Einmalzyklus (Setup) der nur einmal beim Programmstart durchlaufen wird


Befehlssatz für:

  • Logische Funktionen
  • Funktionen für Analogwertbearbeitung
  • Uhrzeitfunktionen
  • Funktionen zur Ausgabe von Werten und Zykluszeiten am Seriellen Monitor (Debug-Anzeige)


Testaufbau der Mini-SPS:

Verwendete Bauteile und Komponenten:

  •   1 Arduino Uno oder Nano
  •   1 RTC DS3231
  •   1 Relaismodul 2-Kanal mit Optokoppler-Ansteuerung
  •   1 DC-DC Wandler
  • 14 LEDs rot 3 mm 1,7 V, 2 mA
  • 14 Widerstände 1,5 kOhm (Vorwiderstände der LEDs)
  •   6 Widerstände 10 kOhm
  • 42 Leiterplattenklemmen
  •   2 Stiftleisten 3-polig mit 2 Brücken
  •   1 DC-Anschlussbuchse

Zusätzlich für die Beschaltung der SPS zu Testzwecken:

  •   4 Taster
  •   2 Potis
  •   1 Impulsgenerator
  •   2 LEDs rot 5 mm, 20 mA
  •   2 Widerstände 470 Ohm
  •   1 Analog-Servo
  •   1 Netzteil +5 bis 6 V DC



Beschreibung der Hardware der Mini-SPS:

Herzstück der Mini-SPS ist also ein Arduino Uno (oder Nano), der über einen DC-DC Wandler mit Strom versorgt wird. Für Ein- bzw. Ausgabe von digitalen und analogen Signalen werden praktisch alle verfügbaren Pins herangezogen, mit Ausnahme von A4 und A5, die für den I2C-Bus und D0 und D1, die für die Kommunikation mit dem Seriellen Monitor benötigt werden.

Wie im Testaufbau ersichtlich, weichen die Pin-Bezeichnungen, mit denen die Ein- bzw. Ausgangspins im Anwenderprogramm bezeichnet werden, von den Pin-Bezeichnungen des Uno ab. Die Zuordnung der Pins ist auch in der nachfolgenden Tabelle ersichtlich:


Tabelle 1: Pin-Zuordnung SPS-Pins zu Uno-Pins

Der Zustand der digitalen Ein- und Ausgänge wird über LEDs signalisiert, wobei ich LEDs ,it geringer Stromaufnahme (2 mA) einsetze, um speziell die Ausgangspins mit max. 40 mA pro Pin nicht zu sehr - zusätzlich zum benötigten Ausgangsstrom - zu belasten. Von den 4 Digitalausgängen DOut1-DOut4 können 2 (nämlich DOut3 und DOut4) über Stiftleistenbrücken auf Relaisausgang umgesteckt werden. Zusätzlich stehen noch 2 Digitalausgänge DOut5 und DOut6 zur Verfügung, die auch als PWM-Ausgänge PWM0ut1 und PWMOut2 (PWM-Frequenz 1,953 kHz, Auflösung 10 Bit), z.B. für Helligkeitssteuerung von LEDs oder für Drehzahlsteuerung von DC-Motoren verwendet werden können. Für Uhrzeitfunktionen habe ich eine Real-Time-Clock (RTC) DS3231 in Verwendung, die über den I2C-Bus angesteuert wird.


Funktionsprinzip der Mini-SPS:

Vom Prinzip her, funktionieren SPS-Steuerungen alle gleich. In einem oder mehreren festgelegten Zyklen finden kontinuierlich folgende Vorgänge statt:

  1. Einlesen der digitalen und analogen Eingänge
  2. Durchführen der im Anwenderprogramm enthaltenen logischen Verknüpfungen und analogen Berechnungen
  3. Beschreiben der digitalen und analogen Ausgänge mit den Verknüpfungs- und Berechnungsergebnissen
  4. Zwischendurch Durchführung von systemnotwendigen Berechnungen, z.B. Zykluszeitüberwachung, Fehlererkennung, etc.

Auch bei meiner Mini-SPS habe ich mich nach diesem Prinzip orientiert. Ich habe dabei 3 verschiedene Zyklen realisiert, die jeweils für bestimme Aufgabenzwecke vorgesehen sind:

  • Schneller Zyklus mit 10 ms Zykluszeit
  • Standardzyklus mit 100 ms Zykluszeit
  • Hintergrundzyklus mit 1 s Zykluszeit

Außerdem gibt es noch den Einmalzyklus, der nur beim Start des Anwenderprogramms einmal durchlaufen wird. Die Zyklusbearbeitung ist im nachfolgenden Bild 1 dargestellt:

Bild 1: Darstellung der Zyklen meiner Mini-SPS


Schneller Zyklus:

Der schnelle Zyklus mit einer Zykluszeit von 10 ms läuft im Fast_Network und soll nur jene Teile des Anwenderprogramms enthalten, die wirklich eine schnelle Bearbeitung erfordern. Dazu zählen z.B. die Bearbeitung von Pulsweitenmodulation (PWM), die Ansteuerung von max. 2 Servos oder das Zählen von exteren Impulsen (max. Frequenz ca. 50 Hz). Bei jedem Durchlauf des Fast_Network laufen ebenfalls die Vorgänge

  • Einlesen der Eingänge
  • Durchführung der logischen Verknüpfungen und Berechnungen
  • Beschreiben der Ausgänge

in dieser Reihenfolge ab. Ob Ein- und Ausgänge im schnellen Zyklus bearbeitet werden sollen, wird beim Programmstart im Ex_Setup_Network festgelegt.


Standardzyklus:

Der Standardzyklus mit einer Zykluszeit von 100 ms läuft in den Netzwerken Network_0 bis Network_6, Network_8 und System_Network und beinhaltet dort das hauptsächliche Anwenderprogramm mit Ausnahme jener Programmteile, die im Fast_Network ablaufen, sowie Programmteile des Systems.

  • Network_0: Hier werden vom System alle digitalen und analogen Eingänge eingelesen, sofern diese nicht im Fast_Network eingelesen werden. Vom Anwender kann hier nichts eingegeben werden.
  • Network_1 bis Network_6: In diese Netzwerke können vom Anwender das Anwenderprogramm in Form von Anweisungslisten eingeben werden.
  • Network_8:  Hier werden vom System alle digitalen und analogen Ausgänge geschrieben, sofern diese nicht im Fast_Network geschrieben werden. Vom Anwender kann hier nichts eingegeben werden.
  • System_Network: In diesem Netzwerk werden vom System z.B. die Zykluszeiten überwacht und bei Überschreitung eine Fehlermeldung am Seriellen Monitor ausgegeben. Vom Anwender kann hier nichts eingegeben werden.

Hintergrundzyklus:

Der Hintergrundzyklus mit einer Zykluszeit von 1 s läuft im Slow_Network. Hier können vom Anwender Programmteile eingegeben werden, die keine besonders häufige Bearbeitung erfordern, z.B. Bearbeitung von sich nur langsam ändernden Analogsignalen, Bearbeitung von Uhrzeitfunktionen, Debug-Ausgaben am Seriellen Monitor, etc.


Einmalzyklus:

Der Einmalzyklus wird, wie der Name schon sagt, nur einmal beim Programmstart durchlaufen und befindet sich im Ex_Setup_Network. Hier kann der Anwender z.B. festlegen, ob eine Debug-Ausgabe am Seriellen Monitor erfolgen soll oder welche Ein- und Ausgänge im Fast_Network gelesen bzw. geschrieben werden sollen.


Maximale Zyklusdauer:

Wie im Bild 1 ersichtlich, wird alle 10 ms - jeweils nach Durchlauf des Fast_Network -  ein Network_0 bis Network_8 bzw. System_Network durchlaufen. Das bedeutet aber, dass jeweils die Dauer des Fast_Network, plus dem folgenden Network_x, maximal 10 ms betragen darf. Bei der Abarbeitung von Network_0, Network_8 und System_Network wird das von mir sichergestellt. In jenen Netzwerke, wo aber der Anwender das Anwengungsprogramm eingibt, also in Network_1 bis Network_6 und Slow_Network, muss der Anwender sicherstellen, dass die maximalen Bearbeitungszeiten nicht überschritten werden. Die Bearbeitungszeiten können im Seriellen Monitor im Debugmodus angezeigt werden, es wird aber auch eine Meldung angezeigt, wenn man in die Nähe einer Zeitüberschreitung kommt.


Weiter zu Programmierung