Einführung in ROBO Pro

Vorbemerkungen

ROBO Pro ist eine grafische Programmierumgebung (IDE: Integrated Development Environment), die aus „Lucky Logic for Windows“ (LLWin) hervorgegangen ist und von fischertechnik seit den 90er Jahren (weiter)entwickelt wird. Leider gibt es sie bisher nur in einer Windows-Variante (bzw. als Android-App für den BT Smart Controller). Programme werden in ROBO Pro in Form eines Programmablaufplans aus Funktionsblöcken zusammengesetzt.

Mit ROBO Pro können alle Controller von fischertechnik angesprochen und programmiert werden. Die Controller werden in der Regel via USB-Kabel, die neueren alternativ via Bluetooth (BT Smart Controller, TX, TXT) mit dem PC verbunden. Für die "Einsteiger"-Controller, den LT und den BT Smart Controller, gibt es eine IDE-Variante namens "ROBO Pro Light" mit einem reduzierten Befehlssatz und sehr eingeschränkten Möglichkeiten, die für Einsteiger aber zunächst vollauf genügen.

ROBO Pro-Programme für die "größeren" Controller mit eigenem Speicher (den TX und den TXT) können kompiliert und in das RAM bzw. den Flash-Speicher des Controllers geladen werden, wo sie dann unabhängig von einer Verbindung mit dem PC (via USB-Kabel oder Bluetooth) gestartet werden können.

So einfach die Programmiersprache ROBO Pro auf den ersten Blick erscheint, so überraschend mächtig ist sie jedoch - sie beherrscht arithmetische Funktionen, Unterprogramme, parallele Prozesse, kann analoge und digitale (bei TX und TXT sogar via I²C-Protokoll angeschlossene) Sensoren sowie die Bilder einer USB-Kamera auswerten. Auch wenn das "Zeichnen" der Verbindungslinien vielleicht etwas gewöhnungsbedürftig ist, so erlaubt ROBO Pro doch die Programmierung sehr komplexer Aufgabenstellungen.

Im Folgenden werden einige wichtige Eigenschaften von ROBO Pro kurz vorgestellt. Eine ausführliche Erläuterung der einzelnen Funktionen findet sich in der sehr guten Online-Hilfe. Mit der jeweils aktuellen ROBO Pro-Version wird auch ein etwa 150seitiges pdf-Handbuch mitgeliefert, das allerdings in Sachen Aktualität meist hinter der Online-Hilfe zurückbleibt. Sehr hilfreich sind auch die zahlreichen Beispielprogramme, die fischertechnik mit dem Softwarepaket installiert.

Installation

Mit jedem Computing-Kasten wird ROBO Pro auf CD mitgeliefert oder, wie bei ROBO Pro Light, im didaktischen Begleitmaterial ein Download-Link angegeben. Grundsätzlich sollte nicht die CD-Version, sondern die jeweils aktuelle Update-Vollversion von ROBO Pro von der Webseite von fischertechnik heruntergeladen und installiert werden. Die jeweils aktuelle Version der Android-App ROBO Pro Smart findet sich im Google Playstore.

Achtung: ROBO Pro-Programme sind nur "aufwärts-", aber nicht "abwärtskompatibel", sprich: mit einer jüngeren ROBO Pro-Version erstellte Programme lassen sich mit einer älteren Version nicht öffnen. Ein Programm-Update sollte daher zugleich auf allen Rechnern vorgenommen werden, die für die ROBO Pro-Programmierung genutzt werden.

Nach der Installation der Programmierumgebung ROBO Pro müssen darin noch der verwendete Controller und die Verbindung ("Umgebung", "COM/USB") ausgewählt und konfiguriert werden. Beim ersten Kontakt mit dem Controller, z.B. beim Aufruf des "Test"-Fensters, wird dann (falls nötig) die Firmware des angeschlossenen TX- oder TXT-Controllers aktualisiert.

Funktionsumfang

In ROBO Pro (der "großen" Version) können fünf verschiedene Level ausgewählt und eingestellt werden. Einige Eigenschaften (wie z.B. Unterprogramme oder Variablen) stehen erst ab höheren Leveln zur Verfügung. Für Programmieranfänger ist meist der "Einsteiger"-Level (Level 1) sinnvoll, da die zahlreichen Funktionen und Möglichkeiten am Anfang schnell verwirren können. Der Leistungsumfang entspricht etwa dem von ROBO Pro Light.

Der folgende Überblick über den Leistungsumfang von ROBO Pro (im höchsten Level 5) zeigt deren Mächtigkeit:
  • Programmablauf:
    • Verzweigungen (Wert eines Schleifenzählers, Vergleich einer Variablen mit einem Zahlenwert, Vergleich zweier Variablenwerte, Auswerten eines Befehls)
    • Unterprogramme (mit Parametern, Rückgabewerten und mehreren Ausgängen!)
    • Warten (Pause in Sekunden, Minunten, Stunden)
    • Parallele Prozesse
  • Variablen:
    • Vorzeichenbehaftete Ganzzahlen (16 bit)
    • Fließkommazahlen (48 bit)
    • Listenvariable („Array“ aus Ganzzahlen oder Fließkommawerten)
  • Eingänge (acht analog/digital, vier Zähler, Bedienfeld, USB-Eingang):
    • Auslesen eines digitalen Signals (Taster, Fototransistor, Reed-Kontakt, Spur-/IR-Sensor, Ultraschall-Abstandssensor)
    • Auslesen eines analogen Signals (Farbsensor, Fotowiderstand, Wärmesensor)
    • Auslesen (und Rücksetzen) eines Zählereingangs
    • Schieberegler auf Bedienfeld (Controller/PC)
    • Schaltknopf auf Bedienfeld (Controller/PC)
    • Auswertung von Bild und Mikrofon einer USB-Kamera (nur TXT)
  • Ausgänge (vier Motor- oder acht Schaltausgänge):
    • Motor (Drehrichtung, Geschwindigkeit 1..8 oder 1..512)
    • Lampe, Magnetventil, Elektromagnet, Summer (Stärke 1..8 oder 1..512)
    • Formatierte Textausgabe auf Display (Controller/PC)
    • Graphische Werteanzeige auf Display (nur PC)
    • Ausgabe in CSV-Datei (nur PC)
  • Kommunikation:
    • Senden/Empfangen eines Befehls über Bluetooth
    • Senden/Empfangen eines Befehls über I²C (Sensorbus, Anschluss an EXT2)
  • Funktionen und Operatoren:
    • Vergleichsoperationen (<, >, =, <>, <=, >=)
    • Logische Operationen (and, or, not)
    • Mathematische Funktionen (+, -, *, /, abs, exp, ln, sqrt, exp10, log10)
    • Trigonometrische Funktionen (sin, cos, tan, arcsin, arccos, arctan)
    • Binäre Operationen (AND, OR, NOT, XOR, Shift Right, Shift Left, Arith. Shift Right)

Da die einzelnen Funktionen in der Online-Hilfe von ROBO Pro ausführlich erläutert werden konzentriert sich die folgende Darstellung auf einige Möglichkeiten von ROBO Pro, die bei der ersten Verwendung leicht zu Schwierigkeiten führen, über die Hilfe schlecht zu entdecken oder nicht immer auf Anhieb richtig zu verstehen sind.

Unterprogramme

Unterprogramme erscheinen in ROBO Pro als separater "Reiter" neben dem Hauptprogramm. Sie beginnen und enden mit einem eigenen Eingangs- und Ausgangs-Befehl. Parameter werden als Ein- und Ausgabewert wie Konstanten behandelt. Sie müssen denselben Typ (Ganzzahl oder Fließkommawert) haben wie die Werte oder Variablen, die an das Unterprogramm beim Aufruf übergeben werden.

Im Hauptprogramm erscheinen die Unterprogramme als grüne "Kästchen", die links die Eingabe- und rechts die Ausgabeanschlüsse für die Datenflussverbindungen enthalten, oben und unten die Anschlüsse für den Programmfluss. Alle Unterprogramme können über das linke obere Menu der IDE unter "Geladene Programme" ausgewählt und verwendet werden.

Unterprogramme in ROBO Pro haben eine besondere Eigenschaft: Sie können mehrere Ausgänge haben. Damit ist die sehr elegante Programmierung Endlicher Automaten möglich - perfekt für Steuerungen eines Mikro-Controllers.

Operatoren und Funktionen

Eine Besonderheit von RoboPro sind die Operatoren. Sie verarbeiten Variablen und Eingabewerte unabhängig vom Programmfluss – und berechnen quasi parallel Ein- oder Ausgabeparameter. Dabei stehen zahlreiche Funktionen zur Auswahl: Arithmetische Operationen, Binäroperationen, Logische Operationen, Vergleiche – für Ganze Zahlen und Fließkommazahlen, und für bis zu 24 Eingabeparameter (Abb.).
RoboPro: Operatoren
RoboPro: Operatoren


Der Datenfluss zwischen Variablen, Operatoren und den Kommandos, die einen Eingabewert erwarten, wird mit braun-orange-farbigen Verbindungen dargestellt. Damit lassen sich auch komplexe Zwischenberechnungen übersichtlich durchführen – die folgende Abbildung zeigt beispielhaft die binäre Auswertung einer Eingabe.
Beispiel: Binäre Auswertung einer Eingabe mit Operatoren
Beispiel: Binäre Auswertung einer Eingabe mit Operatoren


Besonders elegant ist, dass man neue, komplexe Operatoren auch selbst erstellen kann – als "Unterprogramm", das aber später wie ein Operator mit Datenein- und -ausgängen, aber ohne Programmfluss, verwendet werden kann. Die folgende Abbildung zeigt ein "Operator-Unterprogramm", das die Konvertierung eines BCD-Wertes in eine Dezimalzahl realisiert und später als Operator "BCD2DEC" im Programm eingesetzt werden kann.
Operator BCD2DEC
Operator BCD2DEC


Auch trigonometrische Funktionen sind in ROBO Pro als Operatoren realisiert. Sie umfassen die Exponential- und Logarithmusfunktion, Sinus und Cosinus (und Umkehrfunktionen – in Grad und Radiant), Tangens und die Bestimmung der Quadratwurzel (Abb.).
Trigonometrische Funktionen als Operatoren (RoboPro)
Trigonometrische Funktionen als Operatoren (RoboPro)


Datenspeicherung

Listenelemente können im Online-Modus im CSV-Format in Dateien gespeichert und aus Dateien eingelesen werden. Der Speicherort wird über das Menu ("Datei"/".scv Speicher für Listen laden/speichern") ausgewählt. Dort kann auch das gewünschte Trennzeichen (Komma, Semikolon, Tabulator) gewählt werden. Im entsprechenden Listenelement muss ein Häkchen bei "Vom Speicher laden" bzw. "In CSV Speicher schreiben" gesetzt werden; außerdem sind die Felder und deren Position in der CSV-"Tabelle" anzugeben. Das Laden bzw. die Speicherung der Werte erfolgt jeweils zu Programmstart bzw. nach Programmende.

Über diese CSV-Dateien können Messwerte eines Programms gespeichert oder Steuerdaten (z.B. Koordinaten) eingelesen werden.

Parallele Prozesse

Eine der beeindruckendsten Möglichkeiten von ROBO Pro ist die Programmierung paralleler Prozesse. Fast beliebig viele Prozesse werden in ROBO Pro quasi gleichzeitig (via Multithreading) ausgeführt. Das macht viele Programmabläufe wesentlich übersichtlicher – statt komplexer Abfragen kann man Funktionen, die voneinander weitgehend unabhängig sind, komplett trennen. Ein simples Beispiel dafür ist ein Blinklicht an einem ferngesteuerten Fahrzeug - es wird lediglich ein- oder ausgeschaltet, blinkt dann aber unabhängig von den Steuerungsbefehlen des Fahrzeugs.

Die Programmierung solcher paralleler Prozesse in ROBO Pro ist unglaublich einfach: Jedes Startsymbol (das grüne "Ampelmännchen") im Hauptprogramm startet einen eigenen Prozess. Parallele Prozesse sind auch in Unterprogrammen möglich; sie werden automatisch beendet, wenn das Unterprogramm verlassen wird.

Die "Kommunikation" zwischen parallelen Prozessen, also ein Datenaustausch oder die Synchronisation von Abläufen, kann – wenn erforderlich – über Variablen ("Semaphore") erfolgen, die als "Trigger" fungieren: Sobald sie von einem Prozess auf einen bestimmten Wert gesetzt werden, lösen sie eine Aktion in einem parallelen Prozess aus (im Beispiel das Ein- oder Ausschalten des Blinklichts).

I²C-Sensoren und -Aktoren

Das Inter-Integrated Circuit-Busprotokoll – kurz: I²C – wurde 1992 in der Version 1.0 spezifiziert. Entwickelt von Philips hatte es sich bereits in den 80er Jahren als serielles Protokoll für den Datenaustausch zwischen IC-gesteuerten Komponenten elektronischer Schaltungen bewährt – und war zu einem de facto-Standard geworden. Das Protokoll ist simpel: Ein "Master" kann über den Bus bis zu 127 unterschiedliche "Slave"-Devices einzeln adressieren, ihnen Befehle zusenden und Daten abfragen. Den Takt legt der Master über eine Taktleitung fest und sendet bzw. empfängt über eine Datenleitung; zwei weitere Leitungen dienen der Stromversorgung der "Slaves". Die ursprüngliche Übertragungsgeschwindigkeit lag bei 100 kBit/s (Standard Mode); sie wurde in Weiterentwicklungen des Protokolls um die Geschwindigkeiten 400 kBit/s (Fast Mode, v1.0 1992), 3,4 MBit/s (High Speed Mode, v2.0 1998), 1 MBit/s (Fast Mode Plus, v3.0 2007) und 5 MBit/s (Ultra Fast Mode, v4.0 2012) erweitert.

Inzwischen gibt es eine kaum noch überschaubare Anzahl von Sensoren und Aktoren, die über das I²C-Protokoll angesprochen werden können.

Seit der Version 3.1.3 unterstützt auch ROBO Pro im Zusammenspiel mit der Firmware des TX(T) das I²C-Protokoll im Standard Mode und Fast Mode. Dabei fungiert der TX(T) als "Master", die an den EXT2-Ausgang angeschlossenen Sensoren und Aktoren als "Slaves". Leider arbeiten I²C-Devices mit zwei unterschiedlichen Betriebsspannungen (5V und 3,3V), und unglücklicherweise unterstützt der TX Vcc = 5V, während der TXT mit Vcc = 3,3V arbeitet. Daher lassen sich nur solche Sensoren ohne Spannungswandler an beiden Controllern betreiben, die beide Betriebsspannungen unterstützen (zum Glück ein größerer Teil).
Dafür ist die Programmierung von I²C-Sensoren unter RoboPro ein Kinderspiel. Zwei Befehle (Level 4) aus der Befehlsgruppe "Senden, Empfangen" genügen: Der I²C-Lese- und der I²C-Schreibbefehl.
RoboPro: I²C-Lesebefehl
RoboPro: I²C-Lesebefehl


Bei beiden Befehlen wird das "Slave"-Device über die 7-Bit-Geräteadresse angesprochen. Dann kann beim Lesebefehl als "Unteradresse" ein 8 oder 16 bit langer Wert als Adresse oder Befehl übergeben werden; anschließend wird ein Byte oder ein 16 bit Wort gelesen, das das Device sendet. Lässt man den Bus "offen", können mit weiteren Befehlen weitere Bytes oder Worte empfangen werden. Als Geschwindigkeit können – je nach Fähigkeit des Sensors oder Aktors – 100 oder 400 kBit/s gewählt werden.
RoboPro: I²C-Schreibbefehl
RoboPro: I²C-Schreibbefehl


Der Schreibbefehl funktioniert entsprechend. Dabei kann der Wert, der an das Device geschickt werden soll, als Parameter übergeben werden ("Dateneingang"). Eine ausführliche Einführung in das I²C-Protokoll und die Programmierung unter ROBO Pro findet sich in ft:pedia 3/2012, S. 32-37. Dabei muss man sich in RoboPro nicht einmal mit den I²C-Befehlen beschäftigen, wenn man einen I²C-Sensor nutzen möchte: Die Treiber in der I²C-Treiberbibliothek "abstrahieren" von dieser Ebene und stellen High-Level-Kommandos zur Verfügung.

ROBO PRo-Treiber für zahlreiche I²C-Sensoren finden sich hier.

Anzeige- und Steuerelemente

Eingebettete Systeme wie die fischertechnik-Controller verfügen über keine direkte Benutzerschnittstelle. Da sie ja für Steuerungen gedacht sind, kommen Controller im Betrieb in der Regel auch ohne Benutzerschnittstellen aus: ein Aufzug interagiert nur über Sensoren (z.B. Tasten), eine Motorsteuerung benötigt höchstens eine Datenschnittstelle für die Fehlerdiagnose. Was im Betrieb die hohe Integration in eine Anlage eher fördert, kann während der Entwicklung jedoch ein erhebliches Handicap bedeuten: oft muss ein Entwickler Messwerte sehen und analysieren, Parameter ausprobieren oder Prozessschritte manuell starten.
ROBO Pro bietet daher mehrere Möglichkeiten, mit dem Controller während der Entwicklung zu interagieren (siehe auch unten zum "Debugging").

So ist auch eine Visualisierung der Daten während des Programmalbaufs möglich. Im Online-Modus erfolgt die Ausgabe in der IDE entweder direkt auf der Programmieroberfläche oder im Fenster „Bedienfeld“. Dazu werden entsprechende Anzeigeobjekte („Bedienelemente“) mit Ausgabebefehlen verknüpft. Als Funktionen bietet ROBO Pro die (formatierte) Ausgabe des Werts einer Variablen, die grafische Anzeige eines Wertes und die Aktivierung von „Lampen“ (siehe Abbildung). Sogar eine rudimentäre Eingabe bzw. Bedienung ist möglich: Über einen „Knopf“ im Bedienfeld kann ein Prozess ausgelöst werden, und über einen Schieberegler lassen sich Werte stufenlos in einem vorgegebenen Wertebereich einstellen.
Anzeige- und Bedienelemente von RoboPro (Online-Mode)
Anzeige- und Bedienelemente von RoboPro (Online-Mode)


Das funktioniert sogar im Offline-Mode: Die beiden roten Knöpfe des TX können zur Einstellung eines Schiebereglers oder zur Aktivierung eines Schaltknopfs (siehe Abb.) ausgewertet werden.
Anzeige- und Steuerelemente des TX-Displays (Offline-Mode)
Anzeige- und Steuerelemente des TX-Displays (Offline-Mode)


Debugging

Für die Fehlersuche bietet ROBO Pro gleich mehrere Möglichkeiten. Da sind erst einmal die üblichen Programmier-Methoden: Die Ausgabe von Statusmeldungen und die Anzeige von Werten. Solche Ausgaben erlauben während des Programmlaufs im Online-Modus (oder auch offline auf dem Display von TX oder TXT) die Kontrolle von Messwerten und Berechnungsergebnissen. Alternativ können Messdaten oder Rechenergebnisse auch in eine csv-Datei geschrieben werden (dazu unten mehr). Durch den Einbau von Taster-Abfragen an kritischen Stellen können "Breakpoints" gesetzt werden; dafür muss man allerdings einen Eingangs-Port opfern.

Variablen-Anzeige

Verwendet man Variablen im Programm, werden deren Werte (im Online-Modus) während des Programmlaufs sichtbar in der IDE aktualisiert - das funktioniert allerdings nur mit globalen Variablen und nur im Fenster des Hauptprogramms. Zur Verfolgung bestimmter Variablen-Werte muss man diese also lediglich global deklarieren und ins Hauptprogramm ziehen; die Werte werden dann in Echtzeit, ganz ohne Ausgabebefehl, direkt im Variablen-Symbol angezeigt. Bei Listenvariablen erhält man während des Programmablaufs die aktuellen Werte durch einen Klick mit der rechten Maustaste auf das Listensymbol.

Einzelschritt-Modus

Programme können im Online-Modus auch Befehl für Befehl abgearbeitet werden: dazu muss für jeden Befehlsschritt der gelbe Pfeil oben in der Menuleiste ("Schritt") gedrückt werden. Mit dem "Pause"-Knopf kann ein laufendes Programm jederzeit angehalten und mit "Weiter" fortgesetzt werden. Zusammen mit Taster-"Breakpoints" ist so eine sehr genaue Kontrolle des Programmflusses möglich.

Monitor

Darüber hinaus bietet der Interface-Monitor ("Test") die Möglichkeit, die an den Eingängen (1-I8), Zählern (C1-C4) und Ausgängen (M1-M4/O1-O8) des verwendeten Controllers anliegenden analogen und digitalen Werte mitzulesen. Über den Monitor können die Zählerstände auch zurückgesetzt, die Einstellungen der Eingangs-Typen geprüft (oder verändert) und die Ausgangs-PWM-Werte kontrolliert werden. Zusammen mit dem Einzelschritt-Modus können so die Zustände des Controllers und das Verhalten des Programms Befehl für Befehl exakt nachvollzogen werden.
Controller-/Interface-Monitor (hier: TX/TXT)
Controller-/Interface-Monitor (hier: TX/TXT)

Simulation

Zumindest einfache Programme können sogar ohne Controller gestestet werden - im "Simulations"-Modus. Dazu wählt man unter "COM/USB" in der linken Spalte "Simulation" aus. Wenn man jetzt den Monitor aufruft, können darin Einstellungen des Interfaces (z.B. an den Eingängen anliegende Signale) ausgewählt und eingestellt werden. Anschließend kann das Programm z.B. im Einzelschritt-Modus (siehe oben) gestartet und Befehl für Befehl getestet werden. Aber Achtung: Zum Schluss sollte wieder das richtige Interface ausgewählt werden, damit man sich später nicht wundert, warum das Programm nicht auf Eingänge des (echten) Controllers reagiert...