Herausforderungen bei IoT- und Smart Products Projekten

Heutzutage ist Embedded Software Entwicklung nicht mehr vergleichbar mit dem, was noch vor 10 Jahren Stand der Technik war. Die IoT-Produkte werden immer komplexer und die IoT-Hardware immer leistungsfähiger. Steigende Komplexität beim Embedded Software Design führt aber aber zwangsweise auch zu einer höheren Fehleranfälligkeit.

Gerade bei Smart Products ist aber die Robustheit des Embedded Software Designs ein ganz entscheidendes Kriterium. Denn die IoT-Devices müssen häufig über sehr lange Zeiträume laufen, haben aber kein User Interface, um das Gerät neu zu starten, wenn es mal hängt.

Mit klassischen Software-Entwicklungs-Methoden lässt sich aber die Komplexität bei der Entwicklung eines robusten Embedded Software Designs kaum mehr beherrschen. Zahlreiche von uns durchgeführte Code-Review-Projekte zeigen das immer wieder schmerzlich aufs Neue.

Doch wie erreicht man nun einen anderen Level bei der Embedded Software Entwicklung für Smart Products mit einem Real Time OS wie z.B. RTOS oder ThreadX?

 

Quality by Design: Das Standard Finite State Machine Framework

Das Zauberwort heißt hier: Event Driven Architecture. Durch den Einsatz eines Standard Finite State Machine Framework (http://www.state-machine.com/) erreicht man einen neuen Level an Stabilität und Robustheit im Embedded Software Design. Dabei geht die Architektur weg von klassischen Thread-Syncronisations-Methoden hin zu Event gesteuerten Programmabläufen.

Dieses Schaubild verdeutlich diesen Paradigmenwechsel sehr gut:

Embedded Software Design Paradigm Shift

http://embedded-computing.com/eletter-products/asynchronous-event-driven-architecture-for-high-reliability-systems/

Doch warum ist nun eine Event Driven Architecture so viel besser als „klassische“ Embedded Software Entwicklungs-Methoden?

Dafür gibt es zwei Gründe:

 1. Threads

Threads sind eine große Hilfe bei der Entwicklung komplexer Embedded Software. Allerdings gestaltet sich die Synchronisation und Kommunikation schwierig und erfordert vom Entwickler ein sehr hohes Maß and Disziplin, Erfahrung und Überblick über den Code. Mit wachsender Komplexität der Anwendung wird das Thread Handling aber immer anfälliger für Fehler. Die üblichen damit einhergehenden Probleme sind Race Conditions, Deadlocks, Performance Probleme, usw. Fehler in diesem Bereich sind in der Regel auch am schwersten zu finden und zu reproduzieren.

Um diese Probleme beim Embedded Software Design zu adressieren, hat man entsprechende Regeln für die Software Entwickler erdacht.

Siehe: https://herbsutter.com/2010/07/12/effective-concurrency-prefer-using-active-objects-instead-of-naked-threads/


  1. Don’t block inside your code. Instead communicate among threads asynchronously via event objects → This makes threads run truly independently, without blocking on each other
  2. Don’t share any data or resources among threads. Keep data and resources encapsulated inside threads (“share-nothing” principle) and instead use events to share information
  3. Organize your threads as “message pumps” (event queue + event loop)

Wenn man es schafft, diese Regeln konsequent umzusetzen, erhält man entsprechend robusten Embedded Software Code. Die Erfahrung zeigt aber, dass Menschen immer wieder Fehler machen bzw. sich aufgrund von Komplexität Fehler einschleichen.

Die Lösung:
Durch den Einsatz des Standard Finite State Machine Framework erzwinge ich die Einhaltung der oben genannten Regeln einfach durch eine Umkehr der Kontrolle. Das Framework sorgt mit dem Design dafür, dass die Spielregeln bei der Embedded Software Entwicklung eingehalten werden und ich kann als Entwickler keine solchen Fehler mehr einbauen.

 2. Spaghetti Code

In der Regel fängt alles immer ganz harmlos an und der Entwickler schreibt eine Methode, um Events zu verarbeiten. Mit der Zeit kommen jedoch immer mehr neue Events und immer komplexere Bedingungen hinzu. Die if-then-else Statements werden mehr und mehr und immer verschachtelter – bis zu dem Punkt, dass ein Außenstehender nicht mehr versteht, was eigentlich passiert. Dieses Problem lässt sich dann durch entsprechendes Refactoring zwar wieder eindämmen – besser wäre es aber, wenn es erst gar nicht entstehen kann.

Die Lösung:
Auch dafür sorgt das Standard Finite State Machine Framework, weil hier gänzlich anders an die Problemstellung heran gegangen werden muss. Das führt nachweislich zu besseren Ergebnissen bei der Entwicklung eines robusten Embedded Software Designs. Eine sehr schöne Beschreibung (englisch) gibt es hier:
https://www.state-machine.com/doc/Modern_Programming_Slides.pdf


Wenn auch Sie Probleme mit unzuverlässigem Embedded Software Code haben, sprechen Sie uns an! Unsere Spezialisten prüfen gerne gemeinsam mit Ihnen, wie ein Re-Design Ihrer Lösung aussehen kann. Sie profitieren dabei von unserem speziellen Architektur- und Entwicklungs-Know-how für robustes Embedded Software Design und der langjährigen Erfahrung aus zahlreichen IoT- und Smart Products Projekten.

Auch für die Entwicklung neuer Smart Products und in neuen IoT-Projekten hat sich diese Vorgehensweise mit dem Standard Finite State Machine Framework als sehr erfolgversprechend gezeigt.


Vielleicht auch interessant:

Das MQTT Protokoll – Hintergründe (Teil 1)

Das MQTT Protokoll – Praxis (Teil 2)

IoT Protokolle – MQTT vs. AMQP

MQTT Protokoll – Anwendungsbeispiele

Modbus über MQTT – wie geht das?

 

Modbus über MQTT – wie geht das?

Im Zeitalter der Digitalisierung und im Rahmen von Industrie 4.0 Anwendungen kommt zwangsläufig die Frage auf, wie bestehende Anlagen zukunftsfähig gemacht werden können. Die Grundlage hierfür sind die am Markt gängigen Systeme für die Vernetzung und den Informationsaustausch von Industrie-Steuerungen und angeschlossenen Sensoren und Aktoren.

Dieser Artikel beschäftigt sich mit der Möglichkeit, vorhandene Systeme zu vernetzen, um Industrie 4.0 Anwendungen überhaupt erst zu ermöglichen. Ganz konkret soll es in diesem Artikel um das Thema „Modbus“ und dessen Vernetzung gehen.

Modbus ist eines von mehreren gängigen Kommunikationsprotokollen für industrielle Anlagen und in der Automationstechnik. Modbus hält zusammen mit der TCP Variante immerhin einen Anteil von 11% am Gesamtmarkt der industriellen Netzwerke.

Quelle: http://www.elektroniknet.de/markt-technik/automation/feldbusse-und-ethernet-im-zeitalter-von-industrie-4-0-128660.html

Modbus ist ein relativ einfaches Master/Slave-Protokoll (https://de.wikipedia.org/wiki/Modbus), welches über verschiedene Leitungswege übertragen werden kann.
Die Frage, wie bestehende Modbus-Systeme mit einer Remote-Überwachung ausgestattet werden können, bzw. wie sich in solchen Systemen eine Predictive-Maintenance-Lösung aufbauen lässt, begegnet uns in Projekten immer häufiger.

Grund genug, hier ein paar grundlegende Gedanken zu diesem Thema zu Papier zu bringen.
Für die Übertragung der Daten in eine Cloud-Lösung á la Azure oder IBM Watson braucht es ein modernes Protokoll, welches auch dafür gemacht ist, mit geringem Ballast relevante Daten zu übermitteln. Ein in diesem Umfeld bewährtes Protokoll ist das MQTT Protokoll, welches wir in früheren Beiträgen schon ausführlich beschrieben haben, siehe:

Das MQTT Protokoll & Hintergründe (Teil 1)

Das MQTT Protokoll & Praxis (Teil 2)

Die Frage die sich nun stellt, ist: Wie kommen die Daten aus einem Modbus in MQTT? Eine kurze Internetrecherche bringt hier einige Ansätze, wie den von Oliver Wagner (https://github.com/owagner/modbus2mqtt) zum Vorschein. Allerdings ist diese Lösung genau wie viele andere für den Einsatz in bestehenden Installation ungeeignet. Der Grund liegt einfach in der Konzeption, denn die meisten gehen davon aus dass Sie ein Modbus Master sind und dann die Daten in MQTT übersetzen.

Das würde allerdings bedeuten, dass die MQTT Implementierung z.B. auf der bestehenden SPS erfolgen müsste, was in der Praxis nicht realisierbar ist.
Der Weg für bestehende Anlagen kann nur über einen Modbus Slave erfolgen. Einen solchen Slave könnte man relativ leicht auf einem Gateway implementieren. Dieses Gateway kann als normaler Busteilnehmer am Modbus arbeiten, ohne den Betrieb zu beeinflussen und alle Daten, die über den Bus laufen, mithören.
Eingriffsmöglichkeiten gibt es in dieser Konstellation zwar keine, aber das ist bei bestehenden Anlagen auch nicht wirklich gewollt.
Sollte man auch Steuerungsmöglichkeiten benötigen, könnte das Gateway als Busteilnehmer Register setzen, welche dann von der SPS in entsprechende Befehle für die anderen Busteilnehmer umgesetzt werden müssen.

Wie man einen solches Gateway aufbaut und welche Komponenten (Software/Hardware) zum Einsatz kommen können, wird der nächste Artikel beleuchten.


Vielleicht auch interessant:

Das MQTT Protokoll – Hintergründe (Teil 1)

Das MQTT Protokoll – Praxis (Teil 2)

IoT Protokolle – MQTT vs. AMQP

MQTT Protokoll – Anwendungsbeispiele

Embedded Software Entwicklung mit dem Standard Finite State Machine Framework

 

Viele Leser unseres Blogs haben uns nach dem Studium unseres Grundlagenartikels zum MQTT-Protokoll nach Anwendungsbeispielen gefragt. Diesem Wunsch wollen wir gerne entsprechen und präsentieren Ihnen nachfolgend eine kleine Sammlung einiger interessanter Projekte, bei denen das MQTT-Protokoll zum Einsatz kommt.

Wir bei SIC! Software setzen das MQTT Protokoll im Bereich von Embedded Projekten sehr häufig ein, da dieses Protokoll einfach zu handhaben ist und sich dank breiter Unterstützung zum DeFacto-Standard im Bereich von Internet of Things (IoT) und Industrie 4.0 entwickelt hat.

Wie z.B. beim Forschungsprojekt IMPROVE, bei dem das MQTT Protokoll dazu eingesetzt wird, um Echtzeitdaten vom Fahrzeug zu übertragen.
/forschungsprojekte/improve-automotive/

 

Da unsere Kundenprojekte der Vertraulichkeit unterliegen, listet die nachfolgende Sammlung beispielhaft öffentlich zugängliche Projekte mit MQTT-Support auf.

 

Beispiel 1: Übermittlung von Temperatursensor-Daten

Implementierung von MQTT auf dem  ESP8266 WIFI Funkmodul mit einer „einfachen“ publish / subscribe Routine.

http://www.s6z.de/cms/index.php/homeautomation-homecontrol/hardwareplattformen/esp8266/113-mqtt-basic-esp8266-mqtt-example

Beispiel 2: Übertragung des Haustürklingel-Signals

Installation des Moskito MQTT Broker auf einem Raspberry Pi. Ein ESP8266 nimmt das Klingelsignal an der Haustür auf und sendet es drahtlos an Fhem via MQTT.

http://blog.wenzlaff.de/?p=6487

Beispiel 3: Temperatur-Überwachung (Englisch)

Eine Musterhafte Lösung zur Überwachung von Temperaturen mit dem ESP8266 WIFI Funkmodul und der Anbindung an einen MQTT-Broker-Dienst unter Ubuntu:

http://www.instructables.com/id/Remote-Temperature-Monitoring-Using-MQTT-and-ESP82/

Beispiel 4: Basis-Plattform für Home-Automation (Englisch)

Implementierung eines MQTT-Stacks auf einem ATMEL  ATmega328p

http://blog.atx.name/building-avr-board-with-mqtt-support-for-iot/

Beispiel 5: Steuerung einer LED-Beleuchtung (Englisch)

Steuerung einer LED-Beleuchtung mit einem WS2812 LED Controller über das MQTT-Protokoll.

http://www.instructables.com/id/ESP8266-Led-Strip-MQTT-Control-Lights-WS2812/?ALLSTEPS

Beispiel 6: Regelung der CPU-Kühlung eines Raspberry Pi (Englisch)

Regelung der CPU-Kühlung eines Raspberry Pi über einen mit dem MQTT-Protokoll konfigurierbaren PID Regler:

http://www.instructables.com/id/PID-Control-for-CPU-Temperature-of-Raspberry-Pi/

Beispiel 7: Steuerung eines LCD-Displays (Englisch)

Applikationsbeispiel zur Steuerung eines LCD-Displays am INTEL Edison über das MQTT-Protokoll:

http://www.instructables.com/id/MQTT-what-is-this/

Weitergehende Grundlagen und Informationen zur MQTT-Standardisierung sind auf der Webseite http://mqtt.org/ beschrieben.


Vielleicht auch interessant:

Das MQTT Protokoll – Hintergründe (Teil 1)

Das MQTT Protokoll – Praxis (Teil 2)

IoT Protokolle – MQTT vs. AMQP

Modbus über MQTT – wie geht das?

Embedded Software Entwicklung mit dem Standard Finite State Machine Framework

Das „Internet of Things“ – kurz „IoT“ – ist im Moment das große Thema in der Industrie und Softwarebranche. Nachdem wir schon in einem etwas älteren Blockartikel das Thema MQTT aufbereitet und analysiert haben, ist es Zeit, sich einem zweiten wichtigen Protokoll im Umfeld von IoT anzunehmen. In diesem Artikel werden wir die beiden Protokolle vergleichen und mögliche Unterschiede bei den Einsatzszenarien beschreiben.

Wer heute ein IoT-Projekt umsetzen möchte, muss sich vor allem Gedanken darum machen, wie er die auszutauschenden Daten möglichst effizient und standardisiert übertragen kann. Zu diesem Zweck gibt es verschiedenste Protokollstandards, die entwickelt wurden, damit Plattform und Technologie übergreifend miteinander kommunizieren können.

Speziell im IoT Umfeld erfüllen die entwickelten Protokolle vor allem noch die Aufgabe möglichst mit wenigen Ressourcen auszukommen.

Was ist also AMQP und was kann es leisten?

AMQP steht für Advanced Message Queuing Protocol und wurde durch ein Konsortium von großen Unternehmen aus verschiedenen Branchen – u.a. VMware, Microsoft und Cisco – entwickelt. Bereits in 2010 gab es den ersten Draft des Protokolls.

Im Kern handelt es sich um ein asynchrones Protokoll zur Nachrichtenübertragung. Die bisher beste Erklärung zur Idee hinter AMQP findet man auf der Seite von RabbitMQ (https://www.rabbitmq.com/tutorials/amqp-concepts.html).

AMQP funktioniert demnach nach folgendem Prinzip:
Nachrichten werden an sogenannte Börsen (Exchanges) übertragen (vergleichbar mit einem Postamt). Die Börsen verteilen dann Nachrichtenkopien in Warteschlangen (Queue) basierend auf Regeln, sogenannten Bindings.

Die Nachrichten werden dann vom Empfänger direkt abgeholt, wenn er das möchte. Alternativ kann der Empfänger die Nachrichten auch bei einer Warteschlange abonnieren und bekommt diese dann direkt zugestellt.

Wenn die Nachrichten publiziert werden, kann der Herausgeber der Nachricht diese noch mit Attributen (Meta-Daten) versehen. Diese Metadaten können vom Empfänger beliebig genutzt werden.

Nachrichten bleiben so lange in den Warteschlangen, bis der Empfänger bestätigt hat, die Nachricht auch wirklich empfangen zu haben. Damit ist auch bei schlechtem Netz und Abbrüchen bei der Verbindung sichergestellt, dass die Nachricht den Empfänger erreicht.

Wenn eine Nachricht nicht zugestellt werden kann, erhält der Sender eine entsprechende Nachricht.
Die Umsetzung der Börse und der Warteschlange erfolgt innerhalb des sogenannten Brokers. Ein Broker ist z.B. der freie Server von RabbitMQ.

Die Börse ist dafür zuständig, die Nachrichten in eine oder mehrere Warteschlangen zu übertragen. Die Regeln dafür leiten sich aus den vordefinierten Austauschformaten (exchange types) und den Bindings ab.

Es gibt vier solche Austauschformate:

  • Direct –> Stellt eine feste Verbindung zwischen einer Börse und einer Warteschlange dar. Wenn eine Nachricht mit einem entsprechenden Schlüssel ankommt, wird diese gleich an die verknüpfte Warteschlange zugestellt.
  • Fanout –> Wird für sogenannte Broadcast Nachrichten verwendet. Die Nachricht wird von der Börse an alle angeschlossenen Warteschlangen zugestellt
  • Topic –> Wird für Publish/Subscribe Szenarien verwendet. Die Nachrichten werden an eine oder mehrere Warteschlangen ausgeliefert, abhängig vom Binding Key. Folgendes Bild von RedHat veranschaulicht das sehr schön.

    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_MRG/2/html-single/Messaging_Programming_Reference/index.html
  • Headers –> Die Zustellung der Nachricht zur Warteschlange erfolgt hier über den Nachrichten-Header und nicht den Routing Key. Es ist vergleichbar mit dem Direct Routing – nur mit etwas mehr Möglichkeiten zur Regelerstellung.

Neben den Austauschformaten gibt es eine Reihe von Attributen für die Nachrichten. Die wichtigsten sind:

  • Name
  • Durability (gibt an, ob die Börse einen Neustart des Broker übersteht)
  • Auto-delete (Börse wird gelöscht, wenn keine Warteschlange diese benötigt)

AMQP vs. MQTT im Vergleich

Der größte Unterschied der beiden Protokolle besteht in den Möglichkeiten für die Nachrichtenzustellung. Während MQTT ausschließlich auf Publish/Subscribe basiert, lassen sich mit AMQP auch andere Zustellungsformen realisieren.

Außerdem ist der Unterschied bei der Implementierung nicht zu unterschätzen. MQTT ist mit seinen 5 Methoden relativ schnell und einfach umzusetzen, während AMQP schon einen vergleichsweise großen Umfang mit sich bringt. Das betrifft sowohl die Definition des eigenen Protokoll wie auch die Implementierung und Test.

Die kleinste Paketgröße bei AMQP ist mit 60 Byte auch nicht zu vernachlässigen. MQTT begnügt sich im besten Fall mit 2 Byte. Das beeinflusst insbesondere bei einer großen Zahl von Geräten und Nachrichten den aufzuwendenden Aufwand erheblich. Dazu kommen größer Laufzeiten der Pakete die je nach Anwendungsfall auch kritisch zu betrachten sind.

Es gilt also abzuwägen, ob der Funktionsumfang von AMQP im jeweiligen Anwendungsfall wirklich benötigt wird oder nicht. Wenn man mit dem Publish/Subscribe Model von MQTT auskommen kann, hat man in jedem Fall eine einfacher umzusetzende und auch ressourcenschonende Lösung.


Vielleicht auch interessant:

Das MQTT Protokoll – Hintergründe (Teil 1)

Das MQTT Protokoll – Praxis (Teil 2)

MQTT Protokoll – Anwendungsbeispiele

Modbus über MQTT – wie geht das?

Embedded Software Entwicklung mit dem Standard Finite State Machine Framework

 

Während unser erster Blog-Artikel zum Thema MQTT eher theoretischer Natur war, möchten wir uns nun dem praktischen Teil widmen.

Alles was wir dazu benötigen ist eine MQTT-Client Library sowie einen Broker. Eine große Auswahl an verschiedenen Client- und Broker Implementierung bietet das Eclipse Paho Projekt. Zur Zeit stellt es Implementierungen für C, Java, Javascript, Python, Lua, C++, Embedded C und bald auch Objective-C bereit. Als Broker empfehlen wir die kostenlose Lösung von Mosquitto. Wer Probleme mit der Installation hat, sollte sich diesen Link zu Gemüte führen: Guide to Installing Mosquitto MQTT. Zu Demonstrationszwecke oder einfachen Versuchen, lohnt es sich allerdings die sogennanten Public-Brokers zu verwenden. Eine kleine Auswahl an solchen ist hier zu finden: Public Brokers.
Weiterlesen

Internet of things: Viele haben schon mal was davon gehört, aber nur wenige können so richtig beschreiben was es überhaupt ist… dieses „Internet of things“? Wikipedia beschreibt es folgendermaßen:

The Internet of Things refers to the interconnection of uniquely identifiable embedded computing like devices within the existing Internetinfrastructure. 

Weiterlesen