ROBO Pro Coding (DE)

Allgemeine Benutzung

Allgemeine Benutzung

Allgemeine Benutzung

ROBO Pro Coding ist eine Entwicklungsumgebung zur Programmierung des neuen TXT 4.0 Controllers und damit zur Programmierung von fischertechnik-Modellen. ROBO Pro Coding ist verfügbar für Windows, macOS, Linux, iOS und Android und kann aus diesen Quellen bezogen werden.

Google_Play_Badge_DE_230x67.png    App_Store_Badge_DE_230x67.png    Microsoft_Badge_De_230x67.png   Linux_Badge.png

Doku_RPC.pngimage-1623839044249.22.21.png  

Der abgebildete Code könnte für dieses Modell (links) genutzt werden. Die Weboberfläche von ROBO Pro Coding hat den folgenden Aufbau (die Ziffern verweisen auf die gekennzeichneten Bereiche in der Abbildung):

  1. Hier steht das, was in Blöcken programmiert wurde, in Python
  2. Das ist das Feld, in das die Blöcke hineingezogen werden, um zu programmieren
  3. In der Konsole wird der Ablauf des Programms dokumentiert 
    • Haltepunkte werden für das Debuggen von Programmen genutzt. Sie definieren bestimmte Stellen im Code, bei denen das Programm angehalten wird. Diese werden über den Editor gesetzt und bestehen aus dem Dateinamen + Nummer der Zeile.
    • Unter Ausdruck kann man sich Variableninhalte anschauen.
    • Der Aufrufstapel zeigt die Verschachtelung der Aufrufe. Insbesondere bei Einsatz von Funktionen ist das hilfreich.
  4. Hier findet man alle Blöcke zum Programmieren sortiert in die Kategorien Aktoren, Sensoren und Verarbeitung
  5. Diese Zeile wird separat unter Kopfzeile erläutert
  6. Hier kann man das Lernniveau an den Nutzer anpassen. Je nach Niveau werden z.B. nur die allerwichtigsten Blöcke angezeigt.

Kopfzeile

image-1623793979375.19.18.png

In der Kopfzeile befinden sich (v.l.n.r.) die Bedienungselemente für das Starten des Programms, das Stoppen des Programms, das Starten des Debugger, den Aufruf des Schnittstellentests, das Hochladen des aktuellen Programms und das Verbinden mit dem Controller.

Starten von Programmen

Möchte man sein Programm von ROBO Pro Coding aus starten, klickt man auf dieses Symbol.

Stoppen von Programmen 

Möchte man sein Programm stoppen, bevor es von selbst endet, tippt man auf dieses Symbol.

Der Debugger

Der Debugger soll das Finden von Fehlern im Programm erleichtern. Über das Menü in der oberen rechten Ecke kann man den Code Schritt für Schritt durchgehen und so einen Programmdurchlauf simulieren. Das Programm reagiert dabei trotzdem auf Interaktion mit Sensoren, wie z.B. das Drücken eines Tasters. Während man das Programm durchläuft, kann man links im großen Feld sehen, in welchem Block man sich befinden und rechts an welcher Stelle im Python-Code.

Der Schnittstellentest

Klickt man auf das Symbol, mit den drei Reglern, öffnet sich dieses Fenster:

image-1623794821356.06.43.png

Hier kann man alle angeschlossenen Geräte sehen. Bei Aktoren kann man über die Schieberegler überprüfen, ob sie funktionieren. Bei den Sensoren wird der gemessene Wert angegeben (bei dem Taster steht z.B. eine 1, weil er gedrückt ist). Über das Dropdown-Menü (kleines Dreieck) kann angegeben werden, was angeschlossen ist.

Hochladen von Programmen

Hat man ein Programm geschrieben und möchte, dass es autark auf dem Controller läuft, kann man es über dieses Symbol auf den Controller laden. Es taucht dann unter den Dateien auf dem Controller auf. Tippt man dort auf den Programmnamen, landet man in den Unterorder des Programms. Hier findet sich eine Datei, die "main.py" heißt. Klicke auf diese und der "open"-Knopf unten rechts sollte grün aufleuchten. Drücken den "open"-Knopf und es öffnet sich ein weiteres Menü mit vier Optionen:

  1. Laden: Lade das Programm, dann kannst du es vom Homebildschirm aus starten
  2. Auto load: Das Programm wird beim nächsten Starten des Controllers automatisch wieder geladen
  3. Auto start: Das Programm wird beim nächsten Starten des Controllers automatisch wieder geladen und direkt gestartet
  4. Delete project: Das Programm wird vom Controller gelöscht
Verbinden mit dem Controller 

Wie man sich mit dem Controller verbindet, wurde hier erklärt.

Controllerkonfiguration

Um Bauteile, wie Sensoren und Aktoren, im Programm nutzen zu können, muss man sie an den Controller anschließen und das nicht nur physisch, sondern auch in der Software. Die Controllerkonfiguration ist immer automatisch geöffnet und kann oben direkt neben dem Hauptprogramm erreicht werden.

Im linken Bereich werden jetzt der Controller und sämtliche mögliche Bauteile, die sich an den Controller anschließen lassen, angezeigt. Den Controller zieht man auf die Programmierfläche. Anschließend kann man die gewünschten Bauteile per Drag-and-drop an den Controller anschließen.

image-1623796138151.28.13.png

Speichern von Programmen

 Wenn du ein Programm speichern möchtest, klicke auf die drei Striche oben links auf der ROBO Pro Coding Website. Tippe hier auf die Option "Exportieren". Jetzt kannst du auswählen, ob du dein Programm lokal auf deinem Gerät oder bei GitLab speichern möchtest.

Lokal: Nachdem du den Namen deines Programms eingegeben hast, klicke einfach auf "Exportieren" und die Programmdatei ist auf deinem Gerät.

GitLab: Nachdem du den Namen deines Programms eingegeben hast und den angegebenen Schritten gefolgt bist, um den persönlichen Zugriffstoken einzugeben, klicke einfach auf "Exportieren" und die Programmdatei ist in deinem GitLab-Account gespeichert.

Aktoren

Aktoren

Ausgang

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623612674466.png

ist eine Abkürzung für folgendes Konstrukt:

image-1638372346043.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Ausgänge alle Bedingungen aus ebendieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Block sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

LEDs

image-1623745844016.42.50.png

LEDs (Licht emittierende Dioden) sind kleine Leuchtmittel, die in einer Vielzahl von Geräten zum Einsatz kommen.

Setzen

Mit den Blöcken "setze LED [] []" und "setze LED [] Helligkeit ..." kann man die LED an- und ausstellen beziehungsweise ihre Helligkeit auf einen bestimmten Wert (von 0 bis 512) setzen.

Im Beispiel wird die LED eingeschaltet und ihre Helligkeit auf den maximal möglichen Wert eingestellt. Dies ermöglicht es, die LED in ihrem hellsten Zustand zu betreiben.

image.png

Abrufen

Mit dem Block "hole LED [] Helligkeit" lässt sich die Helligkeit einer LED abrufen und als Wert weiterverarbeiten.

Im Beispiel wird die aktuelle Helligkeit der LED abgefragt und in einer Variable Helligkeit gespeichert:

image.png

Abfragen

Mit den Blöcken "ist LED [] []" und "ist LED [] Helligkeit [] ..." kann man die Aktivität beziehungsweise die Helligkeit einer LED als Bedingung nutzen.

Im Beispiel wir die Helligkeit der LED auf 512 gesetzt, sofern sie nicht schon diese Helligkeit hat.

image-1623504193890.46.06.png

Motoren

Das Symbol auf den Motorblöcken steht stellvertretend für alle Motoren, die nicht Encoder- oder Servomotoren sind.

image.png

Setzen

Mit dem Block "setze Motor [] Geschwindigkeit …" kann man die Geschwindigkeit eines Motors auf einen bestimmten Wert (von 0 bis 512) setzen.

image.png

Abrufen

Mit dem Block "hole Motor [] Geschwindigkeit" lässt sich die Geschwindigkeit eines Motors abrufen und als Wert weiterverarbeiten.

image.png

Abfragen

Mit den Blöcken "läuft Motor []" und "ist Motor [] Geschwindigkeit …" kann man die Aktivität beziehungsweise die Geschwindigkeit eines Motors als Bedingung nutzen.

Stoppen

Mit dem Block "stoppe Motor []" ist es möglich einen Motor zu stoppen.

Magnetventil

image.png

Ein Magnetventil ist wie ein elektrisch gesteuerter Wasserhahn. Statt ihn von Hand aufzudrehen oder zuzumachen, benutzt man Strom. Wenn Strom durch das Ventil fließt, aktiviert sich ein Magnet, der das Ventil öffnet oder schließt. So kann man den Fluss von Flüssigkeiten oder Gasen kontrollieren, ohne direkt am Ventil zu sein. Das ist praktisch für Systeme, die automatisch laufen sollen.

Setzen

Mit dem Block "setze Magnetventil [] []" kann man das Magnetventil ein- oder ausschalten.

Dieser Block ermöglicht das Ein- oder Ausschalten des Magnetventils. Durch Auswahl im Dropdown-Menü kann das Magnetventil entweder aktiviert (an) oder deaktiviert (aus) werden.

image.png

Abfragen

Mit dem Block "ist Magnetventil [] []" kann man die Aktivität eines Magnetventils als Bedingung nutzen.

In dem Beispiel wird geprüft, ob das Magnetventil eingeschaltet ist, und wenn ja, wird das Magnetventil ausgeschaltet.

image.png

Kompressor

image-1623746227574.40.52.png

Ein Kompressor ist ein Gerät, das dazu dient, Luft oder ein anderes Gas zu komprimieren und so den Druck zu erhöhen. Kompressoren werden zum Beispiel Aufpumpen von Reifen verwendet.

Setzen

Mit dem Block "setze Kompressor [] []" kann man den Kompressor ein- oder ausschalten.

image.png

Abfragen

Mit dem Block "ist Kompressor [] []" kann man die Aktivität eines Kompressors als Bedingung nutzen.

image.png

Aktoren

Motor

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623672133513.png

ist eine Abkürzung für folgendes Konstrukt:

image-1638372436179.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Motor alle Bedingungen aus eben dieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Block sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Motor

Das Symbol auf den Motorblöcken steht stellvertretend für alle Motoren, die nicht Encoder- oder Servomotoren sind.

image.png

Setzen

Mit dem Block "setze Motor [] Geschwindigkeit [] ..." kann man die Geschwindigkeit eines Motors auf einen bestimmten Wert (von 0 bis 512) setzen. Über das Dropdown-Menü (kleines Dreieck) kann die Drehrichtung gewählt werden.

Abrufen

Mit dem Block "hole Motor [] Geschwindigkeit" lässt sich die Geschwindigkeit eines Motors abrufen und als Wert weiterverarbeiten.

Abfragen

Mit den Blöcken "läuft Motor []" und "ist Motor [] Geschwindigkeit  [] ..." kann man die Aktivität beziehungsweise die Geschwindigkeit eines Motors als Bedingung nutzen.

Stoppen

Mit dem Block "stoppe Motor [] []" ist es möglich einen Motor zu stoppen. Dabei bietet der Block "stoppe Motor [] []" die Optionen, einen Motor direkt oder auslaufend zu stoppen. Die gewünschte Option kann über das Dropdown-Menü (kleines Dreieck) ausgewählt werden.

image-1623613980654.51.51.png

Encodermotor

image-1623746341213.40.14.png

Der Encodermotor hat die gleichen Funktionen wie ein normaler Motor, bietet aber zusätzlich die Möglichkeit, die Umdrehungen zu zählen und mehrere Motoren synchron anzusteuern. Eine Umdrehung wird dabei in ~64 Schritte unterteilt.

Setzen

Mit dem Block

image.png

kann man die Geschwindigkeit eines Motors auf einen bestimmten Wert (von 0 bis 512) setzen. Über das Dropdown-Menü (kleines Dreieck) kann die Drehrichtung gewählt werden. Zusätzlich kann man die Anzahl an Schritten eingeben, die der Motor zurücklegen soll. In diesem Beispiel dreht sich der Motor 100 Schritte, also eine und eine 36/64 Umdrehungen. Wie am Beispiel zu sehen, hat dieser Block ein Pluszeichen, mithilfe dessen sich mehrere Motoren synchron ansteuern lassen. Es ist möglich Motoren am Master oder an einer Extension zu synchronisieren, eine übergreifenden Synchronisierung bspw. zwischen Motoren des Masters und einer Extension ist nicht möglich.

Hinweis: Schnell aufeinanderfolgende Synchronisierungsaufrufe, wie sie z. B. durch eine Schleife möglich sind (siehe Beispiel), können die Synchronität beeinträchtigen oder sogar komplett verhindern.

image-1638196438212.png

Stoppen

Mit dem Block "stoppe Motor []" stoppt man einen Motor. Möchte man mehrere Motoren gleichzeitig stoppen, kann man über das Plus links am Block bis zu drei weitere Motoren hinzufügen.

image-1623517630278.05.46.png

Abfragen

Der Block "hat Motor [] Position erreicht" wird genutzt, um das Erreichen der Position als Bedingung zu nutzen. Mit Position ist hier die Endposition eines Encodermotors nach vollendeter Schrittweite gemeint.

Servomotor

image-1623746331741.42.25.png

Ein Servomotor ist ein spezieller Motor, der für präzise Steuerung seiner Position ausgelegt ist. Er kann auf exakte Winkel positioniert werden und verfügt über ein eingebautes Feedback-System, das es ermöglicht, die gewünschte Position genau zu erreichen und zu halten.

Setzen

Mit dem Block "setze Servomotor [] Position ..." kann man die Position eines Servomotors auf einen bestimmten Wert (von 0 bis 512) setzen. 0 und 512 sind die Werte für die maximale Auslenkung rechts und links. Bei dem Wert 256 steht der Servomotor dementsprechend in der Mitte.

Abrufen

Mit dem Block "hole Servomotor [] Position" lässt sich die Position eines Servomotors abrufen und als Wert weiterverarbeiten.

Aktoren

Sound

Der TXT 4.0 Controller hat einen eingebauten Lautsprecher und bietet somit die Möglichkeit, Sounds abzuspielen.

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623843106834.30.30.png

ist eine Abkürzung für folgendes Konstrukt:

image-1638372436179.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Sound alle Bedingungen aus eben dieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Block sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Abspielen

Vorinstallierte Audiodateien

Mit dem folgenden Block kann man einen von 29 vorinstallierten Sounds abspielen. Die gewünschte Audiodatei kann über das Drop-down-Menü (kleines Dreieck) ausgewählt werden. Außerdem ist es möglich, den Ton in Dauerschleife abzuspielen. Dafür muss man das Kästchen hinter dem Dauerschleife-Symbol ankreuzen.

image.png

Eigene Audiodateien

Möchte man einen eigenen Sound abspielen, kann man den Block "spiele eigene Audiodatei" nutzen. Um seinen eigenen Sound in den Block einzubetten, muss man:

  1. Mit dem Controller verbunden sein
  2. Die IP-Adresse des Controllers in den Browser eingeben (hierbei muss die IP gewählt werden, die auch zum Verbinden mit dem Controller genutzt wurde)
  3. Auf der aufgerufenen Seite USER: ft, PASSWORD: fischertechnik eingeben
  4. Ordner sounds öffnen und dort über das Plus die gewünschte Audiodatei auf den Controller laden (wichtig: die Audiodatei muss im wav-Format vorliegen)
  5. Im ROBO Pro Coding-Block unter Pfad "./dateiname.wav" angeben

Auch hier gibt es die Option, den Sound in Dauerschleife abzuspielen.

image.png

Abfragen

Um abzufragen, ob eine Audiodatei abgespielt wird, nutzt man den Block "spielt Audiodatei ab". Dieser kann als Bedingung im Programm genutzt werden.

image.png

Stoppen

Um einen Ton zu stoppen, wird einfach der Block "stoppe Wiedergabe Audiodatei" im Programm verwendet.

image.png

Aktoren

Anzeige

Mit den Blöcken der Kategorie Display lässt sich der Bildschirm des TXT 4.0 Controllers gestalten und nutzbar machen. Dies geschieht in zwei Schritten:

  1. Konfigurieren, das heißt:
    • Eine neue Datei der Kategorie Display öffnen, über das Seitensymbol mit dem Plus oben links
    • Die gewünschten Elemente auf den gerasterten Bereich ziehen (er stellt den konfigurierbaren Teil des Displays dar)
    • Bei Bedarf Spezifikationen anpassen.
  2. Programmieren, das heißt:
    • Im Hauptprogramm mit den Blöcken der Kategorie Display die Wirkung von Interaktion mit dem Display programmieren.

Blöcke

Beschriftungsfeld

Mit dem Element "Beschriftungsfeld" kann man einen Text auf dem Bildschirm platzieren. Das Symbol im Anzeigekonfigurator ist das Etikett. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Beschriftungsfeld [] Text ..." lässt sich der abgebildete Text im Laufe des Programms ändern. Um den aktuellen Text des Beschriftungsfelds zu erhalten, kann der Block "hole Beschriftungsfeld [] Text" verwendet werden. Dies ist nützlich, um den Text zu lesen und in anderen Teilen des Programms zu verwenden oder zu überprüfen.

Eingaben

Das Element "Eingabe" erlaubt es, dass Nutzer*innen über den Controller Text eingeben. Das zugehörige Symbol im Anzeigekonfigurator ist das "T" Zeichen. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Eingabefeld [] Text ..." lässt sich der abgebildete Text im Laufe des Programms ändern. Um den Text aus dem Eingabefeld abzurufen, wird der Block "hole Eingabefeld [] Text" verwendet.

Eingabe-Programm

Das Eingabe-Programm läuft ab, wenn eine Eingabe abgeschlossen wurde. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Eingabe-Programm läuft im Block "wenn Eingabe [] abgeschlossen" ab. Der "Ereignis []"-Block wird im Eingabe-Programm auf "text" gesetzt. In diesem Beispiel wird die Variable "Name" auf den eingegebenen Text gesetzt, sie wird dann im Hauptprogramm genutzt, um den eingegebenen Text auszugeben:

image-1623752961393.png

Ereignisabfrage

Der Block "Ereignis []" ruft den Rückgabewert eines Elements ab. Dieser Block kann nur in den Ereignisprogrammen genutzt werden. In diesen Ereignisprogrammen bezieht sich der Block automatisch auf das Ereignis, in dessen Programm er verwendet wird. Der geeignete Typ für den Rückgabewert kann über das Dropdown-Menü (kleines Dreieck) gewählt werden:

image-1623752625042.png

Messinstrument

Die "Messinstrument"-Funktion kann Werte (keine Werte kleiner 1) darstellen. Das zugehörige Symbol im Displaykonfigurator ist die Skalierung. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Messinstrument [] auf Wert ..." lässt sich das Messinstrument auf den eingegebenen Wert setzen. Dieser Wert sollte im vorher definierten Wertebereich liegen. Liegt der Wert außerhalb des Wertebereichs, wird, je nachdem, ob der Wert zu groß oder zu klein ist, eine der Grenzen des Wertebereichs dargestellt. Um den aktuellen Wert des Messinstruments abzurufen, wird der Block "hole Messinstrument [] Wert" verwendet.

Statusanzeige

Der Statusindikator zeigt die Aktivität von etwas an. Je nach Status leuchtet er ("aktiv") oder tut dies nicht ("inaktiv"). Das Symbol im Displaykonfigurator ist eine leuchtende Diode. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Statusanzeige [] aktiv ..." lässt sich die Statusanzeige aktivieren bzw. deaktivieren. Im Dropdown-Menü (kleines Dreieck) lässt sich wählen, ob die Statusanzeige auf aktiv oder inaktiv gesetzt werden soll. Um den aktuellen Status der Statusanzeige zu überprüfen, kann der Block "ist die Statusanzeige [] aktiv" verwendet werden.

Schieberegler

Der Schieberegler gibt Werte abhängig von seiner Position zurück. Die Position kann dabei vom Nutzer*innen über den Touchscreen verändert werden. Der Wert kann über den "Ereignis []"-Block abgerufen werden, sobald der Schieberegler ruht. Der abgerufene Wert ist eine Dezimalzahl. Will man den Wert des Schiebereglers ganzzahlig haben, muss man den "runde"-Block einsetzen. Das zugehörige Symbol für den Schieberegler ist der Strich mit dem Kreis. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Schieberegler [] Wert ... " kann der Wert des Schiebereglers geändert werden. Mit dem Block "Setze Schieberegler aktiviert" kann die Aktivität des Schiebereglers über das Dropdown-Menü geändert werden, wobei zwischen "aktiviert" und "deaktiviert" gewählt werden kann.

Um den aktuellen Wert des Schiebereglers zu erhalten, wird der Block "hole Schieberegler [] Wert ..." verwendet. Dieser Block gibt den aktuellen Wert des Schiebereglers als Dezimalzahl zurück. Um den Aktivitätsstatus des Schiebereglers zu überprüfen, kann der Block "ist Schieberegler []  aktiv" verwendet werden. Dieser Block gibt einen Booleschen Wert zurück, der angibt, ob der Schieberegler aktiv ist.

Schieberegler-Programm

Das Schieberegler-Programm läuft ab, nachdem der Schieberegler verschoben wurde. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Schieberegler-Programm läuft im Block "wenn Schieberegler [] bewegt" ab. Der "Ereignis []"-Block wird im Schieberegler-Programm auf "value" gesetzt. In diesem Beispiel wird die Geschwindigkeit des Motors über den Schieberegler gesteuert. Der Wert des Schiebereglers muss gerundet werden, da der Motor nur ganze Zahlen als Drehzahl akzeptiert:

image-1623752981018. beispiel.png

Schaltfläche

Die Schaltfläche ist ein beschriftetes Feld, das gedrückt werden kann. Drückt man die Schaltfläche, läuft das Schaltflächen-Programm ab, sobald sie wieder losgelassen wird. Das zugehörige Symbol für die Schaltfläche ist das Quadrat mit der "OK" Beschriftung. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Mit dem Block "setze Schaltfläche [] aktiviert ..." kann man die Aktivität über das Dropdown-Menü (kleines Dreieck) wechseln. Um zu überprüfen, ob die Schaltfläche aktiv ist, kann der Block "ist Schaltfläche aktiviert" verwendet werden.

Schaltflächen-Programm

Das Schaltflächen-Programm läuft ab, sobald die Schaltfläche nicht mehr gedrückt ist. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Schaltflächen-Programm läuft im Block "wenn Schaltfläche [] angeklickt" ab. Der "Ereignis []"-Block kann im Schaltflächen-Programm nicht verwendet werden, da die Schaltfläche keinen Rückgabewert hat. In diesem Beispiel wird die LED aktiviert, wenn die Schaltfläche gedrückt wurde.

image-1623753071835.png

Schalter

Der Schalter kann zwei Positionen einnehmen und befindet sich immer in genau einer dieser beiden Positionen. Je nach Position gibt er wahr oder falsch zurück. Das zugehörige Symbol für den Schalter ist das Oval mit dem Punkt. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

angepasst werden.

Der Block

image-1623753195948.png

image-1623753186716.png

übernimmt zwei Funktionen. Man kann entweder die Aktivität (enabled im Dropdown-Menü wählen) oder den Zustand (checked im Dropdown-Menü wählen) auf wahr oder falsch setzen. Um den aktuellen Zustand des Schalters abzufragen, wird der Block "ist Schalter [] []" verwendet.

Schalter-Programm

Das Schalter-Programm läuft jedes Mal ab, wenn der Schalter umgelegt wird. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Schalter-Programm läuft im Block "wenn Schalter [] umgeschaltet" ab. Der "Ereignis []"-Block wird im Schalter-Programm auf "checked" gesetzt, er gibt wahr oder falsch zurück. Dieses Beispielprogramm schaltet die LED ein, wenn der Schalter umgelegt ist, andernfalls wird die LED ausgeschaltet:

image-1623760118876.png

Kontrollkästchen

Das Kontrollkästchen kann zwei Zustände annehmen und befindet sich immer in genau einem dieser beiden. Je nach Zustand gibt es wahr oder falsch zurück. Das Symbol für das Kontrollkästchen ist das Quadrat mit dem Haken. Zieht man dieses Symbol in den gerasterten Bereich, öffnet sich rechts ein Fenster. Hier kann unter Inspektor

festgelegt werden.

Der folgende Block übernimmt zwei Funktionen. Über das Dropdown-Menü (kleines Dreieck) kann gewählt werden, welche man nutzt. Man kann entweder die Aktivität (enabled im Dropdown-Menü wählen) oder den Zustand (checked im Dropdown-Menü wählen) auf wahr oder falsch setzen.

image-1623753478781.png

image-1623753448613.png

Um den aktuellen Zustand des Kontrollkästchens abzufragen, wird der Block "ist Kontrollkästchen [] []" verwendet.

Kontrollkästchen-Programm

Das Kontrollkästchen-Programm läuft jedes Mal ab, wenn das Kontrollkästchen gedrückt wird. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren über beide Programme hinweg. Das Kontrollkästchen-Programm läuft im Block "wenn Kontrollkästchen [] umgeschaltet" ab. Der "Ereignis []"-Block wird im Schalter-Programm auf "checked" gesetzt, er gibt wahr oder falsch zurück. Dieses Beispielprogramm schaltet die LED ein, wenn das Kontrollkästchen angehakt ist, andernfalls wird die LED ausgeschaltet.

image-1623760160179.png

Bild

Der "setze Bild [] Base64-Bild ... " Block erlaubt es, ein Bild zu ändern, indem ein Base64-codierter Bildstring verwendet wird. Der Vorteil dieses Blocks ist die Fähigkeit, dynamisch verschiedene Bilder anzeigen zu können, indem einfach der Base64-String geändert wird. Dies ermöglicht eine flexible Anpassung der Bildinhalte zur Laufzeit.

image.png

Hinweis: Base64 ist eine Kodierungsmethode, die dazu dient, binäre Daten in eine Zeichenkette aus lesbaren ASCII-Zeichen zu konvertieren. Diese Kodierung wird häufig verwendet, um Daten, die ursprünglich in einem binären Format vorliegen, wie z.B. Bilder oder Audiofiles, in Formate zu übertragen, die ausschließlich Text verarbeiten können.

Sensoren

Sensoren

Eingang

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zu lassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablaufs des Programms. Der "Starte jedes Mal"-Block:

image-1623613328262.png

ist eine Abkürzung für folgendes Konstrukt:

image-1638372436179.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Eingaben alle Bedingungen aus ebendieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Blocks sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Taster

image-1623679995498.03.59.png

Der Taster ist ein digitaler Sensor, der "Es fließt Strom" von "Es fließt kein Strom" unterscheidet. Ob Strom fließt, hängt dabei sowohl von der Verkabelung, als auch davon ab, ob der Taster gedrückt ist. Man kann den Taster also auf zwei verschiedenen Arten verwenden:

image-1623592536466.48.54.png

Als "Schließer":
Kontakte 1 und 3 werden angeschlossen.

Taster gedrückt: Es fließt Strom.
Taster nicht gedrückt: Es fließt kein Strom.

Als "Öffner":

Kontakte 1 und 2 werden angeschlossen.

Taster gedrückt: Es fließt kein Strom.
Taster nicht gedrückt: Es fließt Strom.

Abrufen

Mit "hole Mini-Taster [] Status" erhält man Information darüber, ob durch den Taster Strom fließt oder nicht. Fließt Strom, wird 1 zurückgegeben, fließt kein Strom, 0.

Abfragen

Um abzufragen, ob der Taster in einem bestimmten Zustand ist, wird der Block "ist Taster [] []" genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, nach welchem Zustand gefragt wird. Dieser Block kann als Bedingung genutzt werden.

Reedkontakt

image.png

Der Reedkontakt ist ein magnetisch betätigter Schalter, der verwendet wird, um die Anwesenheit eines magnetischen Feldes zu erkennen. Der Kontakt schließt sich, wenn ein Magnet in der Nähe ist, und öffnet sich, wenn der Magnet entfernt wird.

Abrufen

Mit "hole Reedkontakt [] Status" erhält man Informationen darüber, ob der Reedkontakt geschlossen oder offen ist. Ist der Kontakt geschlossen, wird 1 zurückgegeben, ist er offen, 0.

Abfragen

Um abzufragen, ob der Reedkontakt in einem bestimmten Zustand ist, wird der Block "ist Reedkontakt [] []" genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, nach welchem Zustand gefragt wird. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der Kontakt geöffnet ist.

image.png

Ultraschallsensor

image-1623680004750.04.35.png

Der Ultraschallsensor wird genutzt, um Entfernungen zu messen.

Abrufen

Mit "hole Ultraschallsensor [] Abstand" erhält man die Information, wie weit der Sensor vom nächsten Gegenstand entfernt ist. Der Abstand wird in cm zurückgegeben.

Abfragen

Um abzufragen, ob der Sensor einen bestimmten Abstand zum nächsten Gegenstand hat, wird der Block "ist Ultraschallsensor [] Abstand [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, wie der gemessene Abstand mit einem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der gemessene Abstand kleiner als 2 cm ist.

image.png

Farbsensor

image-1623680014794.04.56.png

Der Farbsensor sendet rotes Licht aus und misst, wie viel davon zurück reflektiert wird. Je nachdem, wie stark die Reflexion ist, gibt der Farbsensor Werte von 0 bis 2000 zurück. Er eignet sich gut, um vorher kalibrierte Farben zu erkennen.

Abrufen

Mit "hole Farbsensor [] Wert" erhält man die Information, wie stark eine Oberfläche das Licht reflektiert.

Abfragen

Um abzufragen, ob der Sensor eine bestimmte Farbe vor sich hat, wird der Block "ist Farbsensor [] Wert  [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, wie der gemessene Farbwert mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der gemessene Farbwert kleiner als 1000 ist.

image-1623612093355.png

IR-Spursensor

image-1623680023473.04.45.png

Der Infrarot-Spursensor ist ein digitaler Sensor zur Erkennung einer schwarzen Spur auf weißem Untergrund, der bei einem Abstand von 5 bis 30 mm von Sensor zu Untergrund arbeitet.

Abrufen

Mit "hole IR-Spursensor [] Status" erhält man 0, wenn der Sensor keine Spur erkennt. Erkennt der Sensor eine Spur, wird 1 zurückgegeben.

Abfragen

Um abzufragen, ob der IR-Spursensor eine Spur erkennt, vergleicht man den aktuellen Spurstatus mit 0 oder 1. Hierzu eignet sich der Block "ist IR-Spursensor [] Status [] ..." Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, wie der Spurstatus mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der Spurstatus 0 ist.

image-1623612106503.png

Fototransistor

image-1623680417014.17.52.png

Der Fototransistor ist ein digitaler Sensor, der hell von dunkel unterscheidet.

Abrufen

Mit "hole Fototransistor [] Status" erhält man 0, wenn der Sensor kein Licht erkennt. Erkennt der Sensor ausreichend Licht, wird "1" zurückgegeben.

Abfragen

Um abzufragen, ob der Fototransistor hell oder dunkel erkennt, vergleicht man den Helligkeitsstatus mit 0 oder 1. Hierzu eignet sich der Block "ist Fototransistor [] Status []". Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt werden, ob hell oder dunkel abgefragt werden soll.

Eine mögliche Verwendung für einen Fototransistor ist in einer Lichtschranke, wie diesem Modell.

image-1623844705358.57.11.png

Fotowiderstand

image-1623680434602.04.18.png

Der Widerstand des Fotowiderstands sinkt, wenn er mehr Helligkeit ausgesetzt ist. Der ausgegebene Wert des Fotowiderstands ist also ein Maß für Helligkeit.

Abrufen

Mit "hole Fotowiderstand [] Wert" erhält man die Information, wie hell es ist. Je kleiner der ausgegebene Wert, desto heller ist es.

Abfragen

Um abzufragen, ob der Fotoresistor einen bestimmten Helligkeitswert misst, wird der Block "ist Fotowiderstand [] Wert [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie der Helligkeitswert mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der Helligkeitswert kleiner als 3000 ist.

image-1623612126447.png

NTC-Widerstand

image-1623680448576.05.31.png

Der NTC-Widerstand ist ein nichtbinärer Temperatursensor. Sein elektrischer Widerstand sinkt, wenn die Temperatur steigt, und ist damit ein Maß für die Temperatur.

Abrufen

Mit "hole NTC-Widerstand []" erhält man entweder einen Widerstandswert oder die daraus errechnete Temperatur. Was zurückgegeben werden soll, kann über das Dropdown-Menü (kleines Dreieck) gewählt werden.

Abfragen

Um abzufragen, ob der NTC-Widerstand einen bestimmten Wert misst, wird der Block "ist NTC-Widerstand [] [] [] ..." genutzt. Über die Dropdown-Menüs (kleines Dreieck) kann gewählt werden, was und mit welchem Vergleichsoperator verglichen werden soll. Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Temperatur kleiner als 20 ist.

image-1623612134832.png

Sensoren

Zähler

image-1623684174534.40.14.png

Der Encodermotor kann als Zähler eingesetzt werden. Gezählt wird die Anzahl seiner Umdrehungen, und zwar nicht nur, wenn er sich selbst als Motor dreht, sondern auch, wenn er von außen mechanisch angetrieben wird.

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623684422356.25.07.png

Ist eine Abkürzung für folgendes Konstrukt:

image-1638372436179.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Zähler alle Bedingungen aus ebendieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Block sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Abrufen

Mit "hole Zähler [] Wert" erhält man den vom Zähler gezählten Wert.

Abfragen

Um abzufragen, ob der Zähler einen bestimmten Wert gezählt hat, wird dieser Block

image-1623684214512.png

genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie der gezählte Wert mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >).

Zurücksetzen

Der Zähler beginnt wieder bei 0, wenn der Block "setze Zähler zurück []" ausgeführt wird.

Sensoren

I2C

Die in diesem Kapitel beschriebenen I2C-Sensoren werden über ein geeignetes Flachbandkabel mit dem TXT-4.0-Controller verbunden.

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623699269854.33.13.png

Ist eine Abkürzung für folgendes Konstrukt:

image-1638372436179.png

Man kann in den "Starte jedes Mal"-Block der Kategorie I2C alle Bedingungen aus ebendieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Block sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Gestensensor

image.png

Der Gestensensor kombiniert Funktionen zur Erkennung von Handgesten, Farbmessung, Umgebungshelligkeit und Distanzmessung in einem Bauteil.

Aktivieren / Deaktivieren

Der Block "Gestensensor [] [] []" ermöglicht das Ein- und Ausschalten spezifischer Funktionen des Gestensensors. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, ob das Licht, die Entfernungsmessung oder die Gestenerkennung aktiviert oder deaktiviert werden soll.

image.png

Abrufen

Der Block "hole Gestensensor [] []" ermöglicht es, viele verschiedene Daten vom Gestensensor abzurufen. Je nach Auswahl im Dropdown-Menü können folgende Informationen erhalten werden:

image.png

Abfragen

Der Block "ist Gestensensor [] [] [] ...", der als Bedingung dient, übernimmt folgende Funktionen:

Das folgende Beispiel zeigt, wie der Block "ist Gestensensor" verwendet wird, um auf einen spezifischen Zustand zu reagieren. Im dargestellten Fall wird geprüft, ob der Rotwert (RGB red) des Gestensensors gleich 0 ist. Ist diese Bedingung erfüllt, führt das Programm eine Aktion aus - hier das Stoppen eines Motors.

image.png

Umweltsensor

image-1623698078892.05.11.png

Der Umweltsensor vereint die vier Funktionen Luftqualitätssensor, Luftfeuchtigkeitssensor, Barometer und Thermometer in einem Bauteil.

Luftfeuchtigkeitssensor

Abrufen

Mit dem Block "hole Umweltsensor [] Luftfeuchtigkeit" kann man die Luftfeuchtigkeit messen.

Abfragen

Um abzufragen, ob man eine bestimmte Luftfeuchtigkeit misst, wird der Block "ist Umweltsensor [] Luftfeuchtigkeit [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie die Luftfeuchtigkeit mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Luftfeuchtigkeit größer als 10 ist.

image-1623698885254.png

Luftqualitätssensor

Abrufen

Mit dem Block "hole Umweltsensor [] Luftqualität als []" kann man die Luftqualität messen. Über das Dropdown-Menü (kleines Dreieck) kann gewählt werden, ob die Luftqualität als Zahlenwert (von 0 bis 500) oder als Text zurückgegeben werden soll. 

Abfragen

Um abzufragen, ob man eine bestimmte Luftqualität misst, wird der Block "ist Umweltsensor [] Luftqualität [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie die Luftqualität mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Luftqualität größer als 10 ist.

image-1623698959786.png

Barometer

Abrufen

Mit dem Block "hole Umweltsensor [] Luftdruck" kann man den Luftdruck messen.

Abfragen

Um abzufragen, ob man einen bestimmten Luftdruck misst, wird der Block "ist Umweltsensor [] Luftdruck [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie der Luftdruck mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der Luftdruck größer als 10 ist.

image-1623699106255.png

Thermometer

Abrufen

Mit dem Block "hole Umweltsensor [] Temperatur" kann man die Temperatur messen.

Abfragen

Um abzufragen, ob man eine bestimmte Temperatur misst, wird der Block "ist Umweltsensor [] Temperatur [] ..." genutzt. Über das Dropdown-Menü (kleines Dreieck) kann ausgewählt, wie die Temperatur mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >). Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Temperatur größer als 10 ist.

image-1623698910824.png

Kalibrierungsmanagement

Genauigkeit abrufen

Der Block "hole Umweltsensor [] Genauigkeit" ermöglicht das Abrufen der Genauigkeitsstufe der Luftqualitätsmessung des Umweltsensors. Die Genauigkeit wird auf einer Skala von 0 bis 3 bewertet, wobei jede Zahl eine spezifische Bedeutung hat:

In dem Beispiel wird, wenn die Genauigkeit der vom Umweltsensor gemessenen Daten gleich 3 ist, d.h. der Sensor stabilisiert ist, eine Aktion ausgelöst.

image.png

Prüfen, ob Kalibrierung erforderlich ist

Der Block "ist Kalibrierung von Umweltsensor [] erforderlich" dient spezifisch dazu, zu prüfen, ob die Genauigkeit des Umweltsensors den Wert 1 erreicht hat, was anzeigt, dass eine Kalibrierung erforderlich ist.

image.png

Kalibrierungsprozess starten

Der Block "kalibriere Umweltsensor []" startet den Kalibrierungsprozess des Sensors. Dieser Vorgang soll die Genauigkeit des Sensors verbessern und sicherstellen, dass die gemessenen Umweltdaten verlässlich sind.

Kombisensor

image-1623698066081.05.44.png

Der Kombisensor vereint die drei Funktionen Beschleunigungssensor, Gyroskop und Kompasssensor in einem Bauteil.

Beschleunigungssensor

Initialisierung

Der Block "Init Accelerometer [] Bereich: [] (g) Bandbreite: [] (Hz) Kompensation: []" dient zur Initialisierung des Beschleunigungssensors mit bestimmten Konfigurationen. Die Einstellungen dieses Blocks legen fest, wie der Sensor Daten erfasst und wie sensibel er auf Bewegungen reagiert. Hier sind die spezifischen Einstellungen erklärt:

image.png

Abrufen

Mit "hole Kombisensor [] Beschleunigung in []" erhält man die Beschleunigung in einer Raumrichtung. Die gewünschte Raumrichtung kann über das Dropdown-Menü (kleines Dreieck) gewählt werden. Die Beschleunigung wird in g angegeben. 

Abfragen

Um abzufragen, ob man eine bestimmte Beschleunigung misst, wird der Block "ist Kombisensor Beschleunigung in [] [] ..." genutzt. Über die Dropdown-Menüs (kleines Dreieck) kann ausgewählt, wie die Beschleunigung mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >) und welche Raumrichtung abgefragt werden soll. Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Beschleunigung in x-Richtung größer als 10 ist.

image-1623698042461.png

Kompasssensor

Initialisierung

Der Block "Init Magnetometer" initialisiert das Magnetometer mit einer spezifischen Datenaktualisierungsrate. Diese Rate bestimmt, wie oft das Gerät magnetische Felder misst und Daten aktualisiert, in diesem Beispiel 2 Hz, was einer Messung alle 0,5 Sekunden entspricht.

image.png

Abrufen

Mit "hole Kombisensor Magnetfluss in []" erhält man den magnetischen Fluss in einer Raumrichtung. Die gewünschte Raumrichtung kann über das Dropdown-Menü (kleines Dreieck) gewählt werden. Der magnetische Fluss wird in μT angegeben. 

Abfragen

Um abzufragen, ob man einen bestimmten magnetischen Fluss misst, wird der Block "ist Kombisensor Magnetfluss in [] [] ..." genutzt. Über die Dropdown-Menüs (kleines Dreieck) kann ausgewählt, wie der magnetische Fluss mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >) und welche Raumrichtung abgefragt werden soll. Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der magnetische Fluss in x-Richtung größer als 10 ist.

image-1623688475892.30.53.png

Gyroskop

Initialisierung

Der Block "Init Gyroskop [] Bereich: [] (°/s) Bandbreite: [] (Hz) Kompensation: []" dient zur Initialisierung des Gyroskops mit spezifischen Einstellungen, die festlegen, wie es Drehbewegungen erfasst und darauf reagiert. Hier sind die spezifischen Einstellungen erklärt:

  1. Bereich:

    • Diese Einstellung definiert den maximalen Messbereich des Gyroskops. Ein Bereich von 125 Grad pro Sekunde bedeutet, dass das Gyroskop Drehbewegungen bis zu dieser Geschwindigkeit präzise erfassen kann.
  2. Bandbreite:

    • Die Bandbreite bestimmt die Frequenz, mit der das Gyroskop seine Messungen aktualisiert. Eine Bandbreite von 12 Hz bedeutet, dass das Gyroskop Daten etwa alle 83 Millisekunden aktualisiert (entsprechend der Umkehrung der Frequenz: 1/12 Hz ≈ 83 ms). Diese Einstellung beeinflusst die Reaktionsfähigkeit des Gyroskops auf Änderungen in der Drehbewegung.
  3. Kompensation:

    • Das Kontrollkästchen für die Kompensation ermöglicht es, Fehler und Abweichungen in den Messungen des Gyroskops automatisch zu korrigieren. Durch das Aktivieren der Kompensation werden Messungenauigkeiten, die durch Umgebungseinflüsse oder Geräteimperfektionen verursacht werden, ausgeglichen, was zu präziseren und zuverlässigeren Daten führt.

image.png

Abrufen

Mit "hole Kombisensor [] Rotation in []" erhält man die Rotation in einer Raumrichtung. Die gewünschte Raumrichtung kann über das Dropdown-Menü (kleines Dreieck) gewählt werden. Die Rotation wird in °/s angegeben. 

Abfragen

Um abzufragen, ob man eine bestimmte Winkelgeschwindigkeit misst, wird der Block "ist Kombisensor [] Rotation in [] [] ..." genutzt. Über die Dropdown-Menüs (kleines Dreieck) kann ausgewählt, wie die Rotation mit dem eingegebenen Wert verglichen werden soll (<, ≤, =, ≠, ≥, >) und welche Raumrichtung abgefragt werden soll. Der Vergleichswert wird in das Zahlenfeld am Ende des Blocks eingegeben. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Rotation in x-Richtung größer als 10 ist.

image-1623698247608.16.22.png

Sensoren

USB

Über den USB-Anschluss kann die Kamera mit integriertem Mikrofon angeschlossen werden. Kamera und Mikrofon werden hier getrennt betrachtet. Um die Funktionen der Kamera zu nutzen, muss man sie erst im Kamera Konfigurator konfigurieren. Wie man zum Kamerakonfigurator gelangt, wird hier erklärt. 

Kamera

image.png

Die Kamera kann insbesondere als Bewegungsdetektor, als Farbdetektor, als Balldetektor und als Liniendetektor genutzt werden.

Bewegungsdetektor

Um die Kamera als Bewegungsdetektor zu nutzen, muss man im Kamerakonfigurator das Männchen-Symbol in die gerasterte Fläche ziehen, dann öffnet sich rechts ein Fenster in dem man unter Inspektor

festlegen kann.

Bewegungsdetektor Programm

Das Bewegungsdetektor-Programm läuft ab, wenn eine Bewegung erkannt wurde. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Eingabe-Programm läuft im Block "wenn Bewegung erkannt" ab. 

Farbdetektor

Um die Kamera als Farbdetektor zu nutzen, muss man im Kamerakonfigurator das Pipetten-Symbol in die gerasterte Fläche ziehen, dann öffnet sich rechts ein Fenster in dem man unter Inspektor

festlegen kann.

Abrufen

Mit "hole Farbe als []" erhält man die erkannte Farbe im Hexadezimal oder im RGB Format. Das Format kann über das Dropdown-Menü (kleines Dreieck) eingestellt werden.

Abfragen

Um abzufragen, ob der Detektor eine Farbe wahrgenommen hat, wird der Block "ist Farbe detektiert" genutzt. Dieser Block kann als Bedingung genutzt werden.

Um abzufragen, ob der Detektor eine bestimmte Farbe wahrnimmt, wird dieser Block 

image-1623701156100.png

genutzt. Mit dem Block kann man die aufgenommene Farbe mit einer eingegeben vergleichen. Über das Dropdown-Menü (kleines Dreieck) kann gewählt werden, ob die eingestellte Farbe gleich oder ungleich der gefilmten Farbe seien soll. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die aufgenommene Farbe Grün ist.

image-1623701210798.png

Farbdetektor Programm

Das Farbdetektor-Programm läuft ab, wenn eine Farbe erkannt wurde. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Eingabe-Programm läuft im Block "wenn Farbe erkannt" ab. 

Balldetektor 

Um die Kamera als Balldetektor zu nutzen, muss man im Kamerakonfigurator das Bälle-Symbol in die gerasterte Fläche ziehen, dann öffnet sich rechts ein Fenster in dem man unter Inspektor

festlegen kann.

Abrufen

Mit "hole [] des Balls" erhält man x-Position, y-Position, Radius oder Durchmesser, des Balles.

Abfragen

Um abzufragen, ob der Detektor einen Ball wahrgenommen hat, wird der Block "ist Ball detektiert" genutzt. Dieser Block kann als Bedingung genutzt werden.                                                                  

Um abzufragen, ob der Detektor einen Ball mit einer bestimmten x-Position, y-Position, Radius oder Durchmesser wahrnimmt, wird dieser Block 

image-1623701230404.png

genutzt. Mit dem Block kann man Spezifikationen, des aufgenommenen Balles, mit einem eingegebenen Wert vergleichen. Über die Dropdown-Menüs (kleines Dreieck) kann gewählt werden, was und mit welchem Vergleichsoperator verglichen werden soll. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn der Durchmesser, des aufgenommenen Balles, 5 ist.

image-1623701241638.png

Balldetektor Programm

Das Balldetektor-Programm läuft ab, wenn eine Farbe erkannt wurde. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Eingabe-Programm läuft im Block "wenn Ball erkannt" ab. 

Liniendetektor

Um die Kamera als Liniendetektor zu nutzen, muss man im Kamerakonfigurator das Symbol mit den Punkten auf einer Linie in die gerasterte Fläche ziehen, dann öffnet sich rechts ein Fenster in dem man unter Inspektor

festlegen kann.

Abrufen

Mit "hole [] der Linie []" erhält man Position oder Breite einer der maximal fünf Linien ab.

Mit "hole Farbe der Linie [] als []" erhält die Farbe einer Linie im Hexadezimal oder im RGB Format ausgeben lassen. Das Format kann über das Dropdown-Menü (kleines Dreieck) eingestellt werden.

Abfragen

Um abzufragen, ob der Detektor eine Linie wahrgenommen hat, wird der Block "ist Linie detektiert" genutzt. Dieser Block kann als Bedingung genutzt werden.                                                                  

Um abzufragen, ob der Detektor eine Linie mit einer bestimmten Position oder Breite wahrnimmt, wird dieser Block 

image-1623701284810.png

genutzt. Mit dem Block kann man Spezifikationen, der aufgenommenen Linie(n), mit einem eingegebenen Wert vergleichen. Über die Dropdown-Menüs (kleines Dreieck) kann gewählt werden, was und mit welchem Vergleichsoperator verglichen werden soll. Dieser Block kann als Bedingung genutzt werden. Im Beispiel wird der Motor gestoppt, wenn die Breite, der aufgenommenen Linie, kleiner als 2 ist.

image-1623701313549.png

Um abzufragen, ob der Detektor eine Linie mit einer bestimmten Farbe wahrnimmt, wird dieser Block 

image-1623701416074.png

genutzt. Mit dem Block kann man die aufgenommene Linienfarbe mit einer eingegeben vergleichen. Über das Dropdown-Menü (kleines Dreieck) kann gewählt werden, ob die eingestellte Farbe gleich oder ungleich der gefilmten Farbe seien soll. Dieser Block kann als Bedingung genutzt werden.

Liniendetektor Programm

Das Liniendetektor-Programm läuft ab, wenn eine oder mehrere Linien erkannt wurden. Es wird separat vom Hauptprogramm geschrieben. Variablen funktionieren global über beide Programme hinweg. Das Eingabe-Programm läuft im Block "wenn Linien erkannt" ab. 

Bild

Bild holen

Mit dem "Bild von [] holen"-Block kann das neueste Bild in Binärformat von der angeschlossenen Kamera abgerufen werden.

image.png

Bild nach Base64 konvertieren

Der Block "Bild [] nach base64 konvertieren" wandelt ein Bild vom Binärformat in das Base64-Format um. Base64 ist eine Kodierung, die Binärdaten in eine ASCII-String-Repräsentation umwandelt,

image.png

Bild geändert Ereignis

Der Block "wenn Bild ... geändert: Ereignis" reagiert auf ein Ereignis, dass ausgelöst wird, wenn sich das Bild der Kamera ändert.

Im Beispiel wird bei jedem neuen Bild von der Kamera das Bild neu geholt, in Base64 konvertiert und schließlich auf der Anzeige aktualisiert.

image.png

Mikrofon

Das in der Kamera integrierte Mikrofon kann als Lautstärkedetektor genutzt werden.

Der "Starte jedes Mal"-Block

Der "Starte jedes Mal"-Block bietet die Möglichkeit ein Programm ablaufen zulassen, wenn eine Bedingung erfüllt ist. Er funktioniert also ähnlich wie eine Fallunterscheidung, wird aber nicht nur einmal durchlaufen, sondern jedes Mal, wenn die Bedingung erfüllt ist, während des gesamten Ablauf des Programms. Der "Starte jedes Mal"-Block:

image-1623775420535.43.06.png

Ist eine Abkürzung für folgendes Konstrukt:

image-1623612945065.png

Man kann in den "Starte jedes Mal"-Block der Kategorie Mikrofron alle Bedingungen aus ebendieser Kategorie einsetzen.

Hinweis: Der Programmabschnitt innerhalb des "Starte jedes Mal"-Blocks sollte kurz gehalten werden und keine blockierenden Aufrufe oder Endlosschleifen enthalten, sodass dieser Teil des Programms schnell abgearbeitet werden kann.

Lautstärkedetektor

Abrufen

Mit "Mikrofon [] Lautstärke [] ..." erhält man die Lautstärke in Dezibel.

Abfragen

Um abzufragen, ob der Lautstärkedetektor eine bestimmte Lautstärke wahrnimmt, wird dieser Block

image-1623701429707.png

genutzt. Mit dem Block kann man die aufgenommene Lautstärke mit einer eingegebenen vergleichen. Über das Dropdown-Menü (kleines Dreieck) kann gewählt werden, mit welchem Vergleichsoperator verglichen werden soll. Dieser Block kann als Bedingung genutzt werden.

Verarbeitung

Verarbeitung

Logik

Bedingte Anweisungen

Bedingte Anweisungen sind zentral für die Programmierung. Sie machen es möglich, Fallunterscheidungen zu formulieren wie:

"wenn"-Block

Die einfachste Bedingung ist ein "wenn"-Block:

Bild1_d.PNG

Wenn dieser ausgeführt wird, wird der Wert der Variable x mit 100 verglichen. Wenn er größer ist, wird "Was für eine große Zahl!" ausgegeben. Andernfalls passiert nichts.

"wenn-sonst"-Block

Es ist auch möglich, anzugeben, dass etwas passieren soll, wenn die Bedingung nicht wahr ist, wie in diesem Beispiel:

Bild2_d.PNG

Wie beim vorherigen Block wird "Was für eine große Zahl!" ausgegeben, wenn x > 100 ist. Andernfalls wird "Das ist nicht sehr groß." angegeben.

Ein "wenn"-Block kann einen "sonst"-Abschnitt haben, aber nicht mehr als einen.

"wenn-sonst-wenn"-Block

Es ist auch möglich, mehrere Bedingungen mit einem einzigen "wenn"-Block zu testen, indem "sonst-wenn"-Klauseln hinzugefügt werden:

Bild3_d.PNG

Der Block prüft zuerst, ob x > 100 ist, und gibt "Was für eine große Zahl!" aus, wenn das der Fall ist. Ist dies nicht der Fall, prüft er weiter, ob x = 42 ist. Wenn ja, gibt er "Das ist meine Glückszahl!" aus. Andernfalls passiert nichts.

Ein "wenn"-Block kann eine beliebige Anzahl von "sonst-wenn"-Abschnitten haben. Die Bedingungen werden von oben nach unten ausgewertet, bis eine erfüllt ist oder bis keine Bedingung mehr übrig sind.

"wenn-sonst-wenn-sonst"-Block

"wenn"-Blöcke können sowohl "sonst-wenn" als auch "sonst"-Abschnitte haben:

Bild4_d.PNG

Der "sonst"-Abschnitt garantiert, dass eine Aktion ausgeführt wird, auch wenn keine der vorherigen Bedingungen wahr ist.

Ein "sonst"-Abschnitt kann nach einer beliebigen Anzahl von "sonst-wenn"-Abschnitten auftreten, einschließlich Null, dann erhält man einen ganz normalen "wenn-sonst"-Block.

Blockmodifikation

In der Werkzeugleiste erscheint nur der einfache "wenn"-Block und der "wenn-sonst"-Block:

image-1638372839221.png

Um "sonst-wenn" - und "sonst"-Klauseln hinzuzufügen, kann man auf das (+) Symbol klicken. Mit (-) Symbol lassen sich "sonst-wenn" -Klauseln wieder entfernen:

image-1638373059561.png

Beachte, dass die Formen der Blöcke das Hinzufügen einer beliebigen Anzahl von "sonst-wenn"-Unterblöcken erlauben, aber nur bis zu einem "wenn"-Block.

Boolesche Logik

Boolesche Logik bildet die Grundlage für die Implementierung bedingter Anweisungen. Sie basiert auf einem einfachen mathematischen System mit zwei Zuständen:

Logikblöcke in ROBO Pro Coding sind in der Regel dafür da, Bedingungen und Schleifen zu kontrollieren.

Hier ein Beispiel:

Bild1_d.PNG

Wenn der Wert der Variable x größer als 100 ist, gilt die Bedingung als wahr und "Was für eine große Zahl!" wird ausgegeben. Ist der Wert nicht größer als 100, ist die Bedingung falsch und es wird "Das ist nicht sehr groß." ausgegeben. Boolesche Werte können in Variablen gespeichert und an Funktionen übergeben werden, ähnlich wie Zahlen, Texte und Listenwerte.

Wenn ein Block einen Booleschen Wert als Eingabe erwartet und keine Eingabe erfolgt, wird dies als falsch interpretiert. Es ist technisch möglich, jedoch nicht empfohlen, nicht boolesche Werte in Bedingungseingaben zu verwenden. Diese Methode wird nicht empfohlen, und ihr Verhalten kann sich in zukünftigen Versionen von ROBO Pro Coding ändern.

Werte

Ein einzelner Block mit einer Dropdown-Liste, die entweder wahr oder falsch angibt, kann verwendet werden, um einen Booleschen Wert abzurufen:

Vergleichsoperatoren

Es gibt sechs Vergleichsoperatoren. Jedem werden zwei Eingaben (normalerweise zwei Zahlen) übergeben und der Vergleichsoperator gibt wahr oder falsch zurück, je nachdem, wie die Eingaben miteinander verglichen werden.

image-1623518116706.pngimage-1623518117182.png

image-1623518116894.pngimage-1623518116802.png

image-1623518116985.pngimage-1623518166030.png

Die sechs Operatoren sind: gleich, nicht gleich, kleiner als, größer als, kleiner als oder gleich, größer als oder gleich.

image.png

Logische Operatoren

Der "und"-Block gibt dann und nur dann wahr zurück, wenn seine beiden Eingangswerte wahr sind.

image-1623518251877.png

Der "oder"-Block gibt wahr zurück, wenn mindestens einer seiner beiden Eingangswerte wahr ist.

image-1623518258449.png

"nicht"-Block

Der "nicht"-Block wandelt eine boolesche Eingabe in ihr Gegenteil um. Zum Beispiel ist das Ergebnis von:

image-1623518278596.png

falsch. 

Wenn keine Eingabe erfolgt, wird der Wert wahr angenommen, sodass der folgende Block den Wert falsch erzeugt:

image-1623518270686.png

Es wird jedoch nicht empfohlen, eine Eingabe leer zu lassen.

"dreier Operator"-Block

Der dreier Operator verhält sich wie ein Miniatur-"wenn-sonst"-Block. Er nimmt drei Eingangswerte entgegen, der erste Eingangswert ist die zu testende boolesche Bedingung, der zweite Eingangswert ist der Wert, der zurückgegeben werden soll, wenn der Test wahr ergibt, der dritte Eingangswert ist der Wert, der zurückgegeben werden soll, wenn der Test falsch ergibt. Im folgenden Beispiel wird die Variable Farbe auf Rot gesetzt, wenn die Variable x kleiner als 10 ist, andernfalls wird die Variable Farbe auf Grün gesetzt.

image-1623518297713.png

Ein dreier Block kann immer durch einen "wenn-sonst"-Block ersetzt werden. Die folgenden zwei Beispiele sind genau gleich.   

image-1638450294773.png   

    Bild14_d.PNG

Verarbeitung

Schleifen

Der Bereich "Schleifen" enthält Blöcke, die steuern, ob andere Blöcke, die in ihrem Inneren platziert sind, ausgeführt werden. Es gibt zwei Arten von Steuerungsblöcken: "wenn-sonst"-Blöcke (die auf einer eigenen Seite beschrieben werden) und Blöcke, die steuern, wie oft ihr Inneres ausgeführt wird. Letztere werden Schleifen genannt, da ihr Inneres, auch als Schleifenkörper oder Körper bezeichnet, (möglicherweise) mehrfach wiederholt wird. Jeder Durchlauf einer Schleife wird als Iteration bezeichnet.

Blöcke zur Erstellung von Schleifen

"dauerhaft wiederholen"-Schleife

Der "dauerhaft wiederholen"-Block führt den Code in seinem Körper so lange aus, bis das Programm endet.

"wiederhole"-Schleife

Der "wiederhole"-Block führt den Code in seinem Körper, so häufig wie angegeben aus. Der folgende Block gibt zum Beispiel zehnmal "Hallo!" aus:

image-1623518566418.png

"wiederhole-solange"-Schleife

Stelle dir ein Spiel vor, bei dem ein Spieler einen Würfel wirft und alle geworfenen Werte addiert, solange die Summe kleiner als 30 ist. Die folgenden Blöcke implementieren dieses Spiel:

  1. Eine Variable namens insgesamt erhält einen Anfangswert von 0.
  2. Die Schleife beginnt mit einer Überprüfung, ob insgesamt kleiner als 30 ist. Wenn ja, werden die Blöcke im Körper durchlaufen.
  3. Eine Zufallszahl im Bereich von 1 bis 6 wird erzeugt (um einen Würfelwurf zu simulieren) und in einer Variablen namens gewürfelt gespeichert.
  4. Die gewürfelte Zahl wird ausgegeben.
  5. Die Variable insgesamt wird um gewürfelt erhöht.
  6. Wenn das Ende der Schleife erreicht ist, geht die Steuerung zurück zu Schritt 2.

image-1623518580740.png


Nach Beendigung der Schleife werden alle nachfolgenden Blöcke (nicht dargestellt) durchlaufen. Im Beispiel endet der Schleifendurchlauf, nachdem eine gewisse Anzahl von Zufallszahlen im Bereich von 1 bis 6 ausgegeben wurde, und die Variable insgesamt hat dann als Wert die Summe dieser Zahlen, die mindestens 30 beträgt.

"wiederhole-bis"-Schleife

"wiederhole solange"-Schleifen wiederholen ihren Körper, "solange" eine Bedingung erfüllt ist. "wiederhole bis"-Schleifen sind ähnlich, mit dem Unterschied, dass sie ihren Körper so lange wiederholen, "bis" eine bestimmte Bedingung erfüllt ist. Die folgenden Blöcke sind äquivalent zum vorherigen Beispiel, weil die Schleife läuft, bis insgesamt größer oder gleich 30 ist.

image-1623518591524.png

"zählen-von-bis"-Schleife

Die "zählen-von-bis"-Schleife erhöht einer Variable den Wert, beginnend mit einem ersten Wert, endend mit einem zweiten Wert und in Schritten von einem dritten Wert, wobei der Körper für jeden Wert der Variable einmal ausgeführt wird. Das folgende Programm gibt zum Beispiel die Zahlen 1, 3 und 5 aus.

image-1623518609859.png

Wie die beiden folgenden Schleifen zeigen, die jeweils die Zahlen 5, 3 und 1 ausgeben, kann dieser erste Wert größer sein als der zweite. Das Verhalten ist das gleiche, egal ob der Inkrementbetrag (dritter Wert) positiv oder negativ ist.

image-1623518616934.png

image-1623518630361.png

"für jeden"-Schleife

Der "für jeden"-Block ist ähnlich wie die "zählen-von-bis"-Schleife, nur dass er statt der Schleifenvariable in einer numerischen Reihenfolge die Werte aus einer Liste der Reihe nach verwendet. Das folgende Programm gibt jedes Element der Liste "alpha", "beta", "gamma" aus:

Bild7_d.PNG

Schleifenabbruchblöcke

Die meisten Schleifen werden so lange durchlaufen, bis die Abbruchbedingung (bei "wiederhole"-Blöcken) erfüllt ist oder bis alle Werte der Schleifenvariable angenommen wurden (bei "zählen mit"- und "für jeden"-Schleifen). Zwei selten benötigte, aber gelegentlich nützliche Blöcke bieten zusätzliche Möglichkeiten zur Steuerung des Schleifenverhaltens. Sie können bei jeder Art von Schleife verwendet werden, auch wenn die folgenden Beispiele ihre Verwendung bei der "für jeden"-Schleife zeigen.

"sofort mit nächstem Schleifendurchlauf fortfahren"-Block

Der "sofort mit nächstem Schleifendurchlauf fortfahren"-Block bewirkt, dass die restlichen Blöcke im Schleifenkörper übersprungen werden und die nächste Iteration der Schleife beginnt.

Das folgende Programm gibt bei der ersten Iteration der Schleife "alpha" aus. Bei der zweiten Iteration wird der Block "fahre mit nächster Integration fort" ausgeführt, wodurch die Ausgabe von "beta" übersprungen wird. Bei der letzten Iteration wird "gamma" gedruckt.

Bild8_d.PNG

"die Schleife abbrechen"-Block

Der "die Schleife abbrechen"-Block ermöglicht einen vorzeitigen Ausstieg aus einer Schleife. Das folgende Programm gibt bei der ersten Iteration "alpha" und bricht bei der zweiten Iteration aus die Schleife ab, wenn die Schleifenvariable gleich "beta" ist. Der dritte Punkt in der Liste wird nie erreicht.

Bild9_d.PNG

Verarbeitung

Mathematik

Die Blöcke der Kategorie Mathematik werden genutzt, um Berechnungen anzustellen. Die Ergebnisse der Berechnungen können zum Beispiel als Werte für Variablen verwendet werden. Die meisten Mathematik-Blöcke beziehen sich auf allgemeine mathematische Berechnungen und sollten selbsterklärend sein.

Blöcke

Zahlen

Nutze den "Zahl"-Block, um eine beliebige Zahl in dein Programm hinzuzufügen oder einer Variable diese Zahl als Wert zuzuweisen. Dieses Programm weist der Variablen Alter die Zahl 12 zu:

image-1623519243602.png

Einfache Rechnungen

Dieser Block hat die Struktur Wert-Operator-Wert. Als Operatoren stehen die Rechenarten +, -, ÷, × und ^ zur Verfügung. Der Operator kann über das Dropdown-Menü ausgewählt werden. Er kann unmittelbar auf Zahlen oder auch auf Werte von Variablen angewendet werden. Beispiel:

image-1623519253344.png

Dieser Block gibt Ergebnis 144 (12^2) aus.

Bitoperationen

Dieser Block ermöglicht es, Bitoperationen zwischen zwei Werten durchzuführen. Der Operator für die Operation kann über ein Dropdown-Menü ausgewählt werden, das eine Reihe von Bitoperationen wie Links-Shift (<<), Rechts-Shift (>>), AND, OR, XOR und NOT anbietet. Diese Operatoren können auf Zahlen sowie auf Variablenwerte angewendet werden. Im gezeigten Beispiel wird die Links-Shift-Operation << verwendet, um die Zahl 10 um 2 Stellen nach links zu verschieben. Das Ergebnis ist 40, da die Bits der Zahl 10 (binär 1010) um zwei Stellen verschoben werden, was zu 101000 binär oder 40 dezimal führt.

image.png

Spezielle Rechnungen

Dieser Block wendet die, über das Dropdown-Menü ausgewählte Rechenart auf die dahinter platzierte Zahl oder auf den Wert der dahinter platzierten Variable an. Die zur Verfügung stehenden Rechenoperationen sind:

e ist hierbei die Euler'sche Zahl. Dieser Block zieht die Quadratwurzel aus 16 und setzt die Variable i auf das Ergebnis.

Bild3_d.PNG

Trigonometrische Funktionen

Dieser Block funktioniert ähnlich wie der zuvor beschriebene Block, mit dem Unterschied, dass als Rechenoperationen die trigonometrischen Funktionen Sinus, Cosinus, Tangens und ihre Umkehrfunktionen genutzt werden. Die angegebene Zahl oder der Wert der angegebenen Variable wird also in die im Dropdown-Menü gewählte Funktion eingesetzt und das Ergebnis kann dann im Programm weiterverarbeitet werden. Zusätzlich gibt es noch den Block "arctan2 of X: … Y: ..., der es erlaubt, sich mithilfe von zwei reellen Zahlen (einzusetzen als X und Y) einen Funktionswert des arctan2 im Bereich von 360° ausgeben zu lassen.

Häufig verwendete Konstanten

Dieser Block funktioniert genauso wie der "Zahl"-Block, jedoch gibt man hier den Zahlenwert nicht selbst an. Stattdessen sind häufig verwendete Konstanten (z.B. π) vorgespeichert. Die Konstante kann über das Dropdown-Menü ausgewählt werden.

Prüfen auf Eigenschaften

Der Block "... ist ..." wird verwendet, um mathematische Eigenschaften einer gegebenen Zahl zu überprüfen. Im gezeigten Beispiel wird beispielsweise geprüft, ob die Zahl x eine Primzahl ist.

Eigenschaften, die der Block prüfen kann:

image.png

Konvertierung

Der Block "konvertiere zu ..." ermöglicht die Umwandlung einer Zahl aus dem Dezimalsystem in eine andere numerische Basis, wie Hexadezimal (hex), Binär (bin), Integer (int), Grad und Radiant. Dieser Vorgang ist besonders nützlich, wenn Daten in unterschiedlichen Darstellungsformen benötigt werden.

image.png

Runden

Mit dem "runde ..."-Block lässt sich eine angegebene Dezimalzahl oder der Wert einer angegebenen Variablen auf eine ganze Zahl runden. Dabei kann man im Dropdown-Menü drei Optionen wählen:

Auswertung von Listen

Mit dem "der Liste"-Block kann man sich

ausgeben lassen. Alle diese Optionen können über das Dropdown-Menü des Blocks ausgewählt werden:

image-1623519297555.png

Rest einer Division

Der "Rest von ..."-Block wird genutzt, um den Rest einer Division auszugeben. Dieses Programm weist der Variable "Rest" den Rest der Division von 3:2, also 1, zu:

image-1623519275420.png

Eingabewerte einschränken

Der "beschränke ... von ... bis ..." Block erlaubt es, Eingabewerte auf ein bestimmtes Intervall zu beschränken. Bevor ein Eingabewert weiterverarbeitet wird, wird getestet, ob er im festgelegten Intervall liegt. Es gibt drei Optionen, wie mit einem eingegebenen Wert verfahren wird:

In diesem Beispiel wird der Block genutzt, um den Wert der Variable "Geschwindigkeit" auf die vom Motor unterstützten Drehzahlen einzuschränken:

image-1623519284259.png

Zufällige Werte generieren

Die beiden Blöcke "zufällige Zahl von ... bis …" und "zufälliger Bruch" geben einen zufälligen Wert aus. Dabei gibt der "zufällige Zahl von ... bis …"-Block eine Zahl aus dem definierten Intervall aus. Der Block "zufälliger Bruch" gibt hingegen einen Wert zwischen 0,0 (eingeschlossen) und 1,0 (ausgeschlossen) aus.

Wertebereiche mappen

Der Block "verteile ... von niedrig ... von hoch ... zu niedrig ... zu hoch" nimmt den ersten Wert und transformiert ihn von einem durch die Parameter 2 und 3 definierten Ursprungsbereich auf einen durch die Parameter 4 und 5 festgelegten Zielbereich ab. Dies ermöglicht es, den Eingabewert entsprechend einer linearen Skalierung in den neuen Wertebereich zu überführen.

In dem gezeigten Beispiel des Programmblocks wird der Wert 5 verwendet. Dieser Wert 5 wird von einem definierten Ursprungsbereich von 0 bis 8 in einen Zielbereich von 0 bis 512 transformiert. Die Transformation erfolgt nach einer linearen Skalierungsregel, sodass der ursprüngliche Wert proportional in den neuen Wertebereich übertragen wird. Konkret bedeutet dies, dass der Wert 5 – der etwas über der Mitte des Ursprungsbereichs liegt – in einen entsprechenden Wert im Zielbereich umgerechnet wird. Da 5 genau 62.5 % des Weges von 0 bis 8 darstellt, wird dieser Prozentsatz auf den neuen Bereich von 0 bis 512 angewendet, was zu einem umgerechneten Wert von 320 führt (62.5 % von 512).

image.png

Verarbeitung

Text

Text kann Buchstaben (klein oder großgeschrieben), Zahlen, Satzzeichen, andere Symbole und Leerzeichen enthalten.

Beispiele für Texte sind:

Blöcke

Erstellung von Text

Der folgende Block erzeugt den Text "Hallo" und speichert ihn in der Variablen namens "Gruß":

image-1622457260803.png

Der Block "erstelle Text aus" kombiniert den Wert der Variable "Gruß" und den neuen Text "Welt" zu dem Text "HalloWelt". Beachte, dass zwischen beiden Texten kein Leerzeichen steht, da in den beiden ursprünglichen Texten keines vorhanden war.

Bild2_d.PNG

Um die Anzahl der Texteingaben zu erhöhen, klicke auf das (+) Symbol. Um die letzte Ausgabe zu entfernen, klicke auf das (-) Symbol.

Text ausgeben

Der "gib aus"-Block bewirkt, dass der Eingabewert im Konsole-Fenster ausgegeben wird:

image-1622457983310.png

Auf keinen Fall wird er an den Drucker geschickt, wie der Name vielleicht vermuten lässt.

Änderung von Text

Der Block "an ... anhängen" fügt den angegebenen Text an die angegebene Variable an. In diesem Beispiel ändert er den Wert der Variable "Gruß" von "Hallo" in "Hallo, da!":

image-1622457625975.png

Textlänge

Der "Länge von"-Block zählt die Anzahl der Zeichen (Buchstaben, Zahlen usw.), die in einem Text enthalten sind. Die Länge von "Wir sind #1!" ist 12, und die Länge des leeren Textes ist 0.

image-1622457652114.png

image-1622457663982.png

Prüfen auf leeren Text

Der Baustein "ist leer" prüft, ob der angegebene Text leer ist (die Länge 0 hat). Das Ergebnis ist im ersten Beispiel "wahr" und im zweiten Beispiel "falsch".

image-1622457716467.png

image-1622457723214.png

Suchen von Text

Diese Blöcke können verwendet werden, um zu prüfen, ob ein Text in einem anderen Text vorkommt und wenn ja, wo er vorkommt. Zum Beispiel wird hier nach dem ersten Vorkommen von "a" in "Hallo" gefragt, das Ergebnis ist 2:

image-1622457756718.png

Dies fragt nach dem letzten Vorkommen von "a" in "Hallo", was ebenfalls 2 ergibt:

image-1622457776109.png

Unabhängig davon, ob das erste oder letzte Vorkommen ausgewählt wird, liefert dieser Block das Ergebnis 0, da "Hallo" kein "z" enthält.

image-1622457784026.png

Extrahieren von Text

Extrahieren eines einzelnen Zeichens

Dies ergibt "b", den zweiten Buchstaben in "abcde":

image-1622457803297.png

Dies liefert "d", den vorletzten Buchstaben in "abcde":

image-1622457812143.png

Dies liefert "a", den ersten Buchstaben in "abcde":

image-1622457821692.png

Dies erhält "e", den letzten Buchstaben in "abcde":

image-1622457838180.png

Dies erhält jeden der 5 Buchstaben in "abcde" mit gleicher Wahrscheinlichkeit:

image-1622457860335.png

Keiner von ihnen verändert den Text, aus dem extrahiert wird.

Extrahieren eines Textbereichs

Mit dem "im Text ... liefer Zeichenkette"-Block kann ein Textbereich extrahiert werden, der entweder mit:

startet und mit:

endet.

Im folgenden Beispiel wird "abc" extrahiert:

image-1622457902845.png

Anpassen der Groß-/Kleinschreibung des Textes

Dieser Block erzeugt eine Version des Eingabetextes, die entweder in

Das Ergebnis des folgenden Blocks ist "HALLO":

image-1622457924068.png

Nicht-alphabetische Zeichen sind davon nicht betroffen. Beachte, dass dieser Block auf Text in Sprachen ohne Groß- und Kleinschreibung, wie z. B. Chinesisch, nicht wirkt.

Trimmen (Entfernen) von Leerzeichen

Der folgende Block entfernt, je nachdem, was im Dropdown-Menü (kleines Dreieck) eingestellt wird, Leerzeichen:

Das Ergebnis des folgenden Blocks ist "Hi du".

image-1622457939507.png

Leerzeichen in der Mitte des Textes sind nicht betroffen.

Text mit Formatierung ausgeben

Mit dem "formatiere text"-Block können Textausgaben mit Variableninhalt formatiert ausgegeben werden. Dabei werden alle Platzhalter "{}" im Text durch den Inhalt der nach dem Text angehängten Variablen ersetzt. In den geschweiften Klammern kann eine Formatierung angegeben werden. Die Formatierung "{:.1f}" gibt z.B. nur die erste Nachkommastelle der Kommazahl in der Variablen "t" aus.

image-1638517232662.png

Verarbeitung

Datei

In ROBO Pro Coding werden Ordner als spezielle Arten von Dateien betrachtet, die zur Organisation und Strukturierung von Projektdaten dienen. Daher werden in diesem Abschnitt sowohl Dateien als auch Ordner behandelt.

Dateien

Datei öffnen

Der Block "Datei ... mit Modus ... öffnen" ermöglicht das Öffnen einer Datei in einem ausgewählten Modus. Dieser Block ist in zwei Varianten verfügbar:

Mögliche Modi zum Öffnen sind:

Bei Ausführung gibt der Block einen Dateideskriptor zurück, der in nachfolgenden Befehlen genutzt werden kann, um die Datei zu lesen, zu schreiben oder Daten anzuhängen.

Das folgende Beispiel illustriert die Verwendung des Blocks, um die Datei meineDatei.json im Lesemodus zu öffnen, die sich im data-Verzeichnis befindet. Der Dateideskriptor wird in der Variable datei gespeichert:

image.png

Überprüfung der Existenz einer Datei

Der Block "existiert" ermöglicht es zu prüfen, ob eine spezifische Datei bereits existiert. Auf Basis dieser Prüfung können unterschiedliche Aktionen ausgeführt werden.

In dem Beispiel wird der "existiert"-Block genutzt, um zu prüfen, ob die Datei bereits vorhanden ist:

image.png

Datei als Text einlesen

Der Block "Datei ... als Text lesen" ermöglicht es, den Inhalt einer Datei einzulesen. Dieser Prozess ist besonders nützlich, um Daten aus einer Datei zu extrahieren und sie weiterzuverarbeiten.

Im Beispiel wird die Datei zunächst im Lesemodus geöffnet, dann wird der Inhalt der Datei in eine Variable namens inhalt geladen. Anschließend wird dieser Inhalt ausgegeben. Schließlich wird die Datei wieder geschlossen, um die Ressourcen ordnungsgemäß freizugeben.

image.png

Datei zeilenweise als Liste einlesen

Der Block "Datei ... zeilenweise als Liste lesen" ermöglicht es, den Inhalt einer Datei zeilenweise in Form einer Liste einzulesen, wobei jedes Listenelement eine Zeile repräsentiert. Dieser Prozess ist besonders nützlich, um die Zeilen aus einer Datei zu extrahieren und sie weiterzuverarbeiten.

Im dargestellten Beispiel wird der Prozess zur Verwendung dieses Blocks demonstriert. Zunächst wird die Datei meineDatei.json im Lesemodus (read) geöffnet. Der Inhalt der Datei wird dann zeilenweise gelesen und in einer Liste gespeichert. Jede Zeile der Datei wird als ein separates Element in der Liste liste gespeichert. Es folgt eine Schleife, in der jedes Element der Liste (jede Zeile) durchlaufen und mittels "gib aus" ausgegeben wird. Nachdem alle Zeilen verarbeitet wurden, wird die Datei geschlossen, um die Ressourcen freizugeben.

image.png

Schreiben in einer Datei

Der Block "Schreibe ... in Datei ... neue Zeile am Ende" ermöglicht das Schreiben von Text in eine Datei. Optional kann ein Zeilenumbruch (\n) am Ende des Textes eingefügt werden, um die Lesbarkeit bei mehreren Schreibvorgängen zu verbessern.

Im Beispiel wird die Datei meineDatei.json im Anhäng-Modus (append) geöffnet. Anschließend wird der Text „Hallo Welt“ in die Datei geschrieben. Dies führt dazu, dass der Inhalt an das Ende der bestehenden Daten in der Datei angehängt wird, ohne die vorhandenen Inhalte zu überschreiben. Nach dem Schreiben werden die Änderungen gespeichert und die Datei geschlossen.

image.png

Liste zeilenweise in die Datei schreiben

Der Block "Liste ... zeilenweise in die Datei ... schreiben" ermöglicht das Schreiben einer Liste in eine Datei, wobei jedes Element der Liste in eine eigene Zeile geschrieben wird. Dies ist besonders nützlich für ein strukturiertes Speichern von Daten, bei denen jedes Listenelement klar von den anderen getrennt ist.

Im dargestellten Beispiel wird die Datei meineDatei.json zunächst im Schreibmodus geöffnet. Dies bedeutet, dass, falls die Datei bereits vorhanden ist, alle existierenden Inhalte überschrieben werden. Anschließend wird eine Liste mit den Elementen "Erste Zeile!" und "Zweite Zeile!" erstellt. Diese Elemente werden dann zeilenweise in die Datei geschrieben, sodass jede Zeile der Datei einem Element der Liste entspricht. Nachdem die Liste in die Datei geschrieben wurde, werden die Änderungen übernommen, um die neu geschriebenen Daten zu sichern. Zum Abschluss des Prozesses wird die Datei geschlossen, um den Zugriff ordnungsgemäß zu beenden.

image.png

Änderungen in die Datei schreiben

Dieser Block "Änderungen in Datei ... übernehmen" stellt sicher, dass alle Änderungen, die an der geöffneten Datei vorgenommen wurden, auch tatsächlich gespeichert werden. Er führt im Wesentlichen einen Flush-Vorgang aus, bei dem alle bislang gepufferten Daten in den permanenten Speicher der Datei geschrieben werden. Nachdem Inhalte in die Datei geschrieben oder modifiziert wurden, sollte dieser Block verwendet werden, um die Änderungen festzuschreiben.

image.png

Datei schließen

Der Block "Datei ... schließen" wird verwendet, um eine geöffnete Datei ordnungsgemäß zu schließen.

image.png

Ordner

Ordner erstellen

Der Block "Verzeichnis ... erstellen" ermöglicht es, ein neues Verzeichnis zu erstellen, falls es bisher nicht existiert.

image.png

Überprüfung der Existenz eines Ordners

Der Block "existiert" ermöglicht es zu prüfen, ob ein spezifischer Ordner bereits existiert. Auf Basis dieser Prüfung können unterschiedliche Aktionen ausgeführt werden.

In dem Beispiel wird der "existiert"-Block genutzt, um zu prüfen, ob der Ordner bereits vorhanden ist:

image.png

Verarbeitung

Datenstrukturen

Listen

Wie in der Alltagssprache ist auch in ROBO Pro Coding eine Liste eine geordnete Sammlung von Elementen, wie z. B. eine "To-do"-Liste oder eine Einkaufsliste. Elemente in einer Liste können von beliebigem Typ sein, und derselbe Wert kann mehrmals in einer Liste erscheinen.

Erstellen einer Liste

erzeuge Liste mit

Mit dem Block "erzeuge Liste mit" kann man die Anfangswerte in einer neuen Liste angeben. In diesem Beispiel wird eine Liste von Wörtern erstellt und in einer Variablen namens "Buchstaben" abgelegt:

Bild1_d.PNG

Wir bezeichnen diese Liste als ["alpha", "beta", "gamma"].

Dies zeigt die Erstellung einer Liste von "Zahlen":

Bild2_d.PNG

So wird eine Liste von "Farben" erstellt:

Bild3_d.PNG

Es ist weniger üblich, aber möglich, eine Liste mit Werten unterschiedlichen Typs zu erstellen:

Bild4_d.PNG

Anzahl der Eingänge ändern

Um die Anzahl der Eingänge zu ändern, klicke beziehungsweise tippe auf das (+) oder (-) Symbol. Dadurch werden neue Eingänge hinzugefügt oder wieder entfernt. 

Liste mit Element erstellen

Mit dem Block "erstelle Liste mit Element" kannst du eine Liste erstellen, die die angegebene Anzahl von Kopien eines Elements enthält. Die folgenden Blöcke setzen zum Beispiel die Variable "Wörter" auf die Liste ["sehr", "sehr", "sehr"].

image-1623519726714.png

Prüfen der Länge einer Liste

ist leer

Der Wert eines "ist leer"-Blocks ist "wahr", wenn seine Eingabe die leere Liste ist, und "falsch", wenn es irgendetwas anderes ist. Ist diese Eingabe "wahr"? Der Wert des folgenden Blocks wäre "falsch", weil die Variable Farben nicht leer ist: Sie hat drei Elemente.

image-1623519765930.png

Beachte die Ähnlichkeit mit dem "ist leer"-Block für Text.

Länge von

Der Wert des "Länge von"-Blocks ist die Anzahl der Elemente, die sich in der als Eingabe verwendeten Liste, befinden. Der Wert des folgenden Blocks wäre z. B. 3, da "Farbe" drei Elemente hat:

image-1623519787676.png

Beachte, dass der "Länge von"-Block angibt, wie viele Elemente in der Liste enthalten sind, und nicht, wie viele verschiedene Elemente in ihr enthalten sind. Zum Beispiel hat das Folgende den Wert 3, obwohl "Wörter" aus drei Kopien desselben Textes besteht:

image-1623519794441.png

Beachte die Ähnlichkeit mit dem Block "Länge von" für Text.

Suchen von Elementen in einer Liste

Diese Blöcke finden die Position eines Elements in einer Liste. Das folgende Beispiel hat den Wert 1, weil das erste Auftreten von "sehr" am Anfang der Wortliste steht (["sehr", "sehr", "sehr"]).

image-1623519818057.png

Das Ergebnis des Folgenden ist 3, weil das letzte Auftreten von "sehr" in "Wörter" an Position 3 ist.

image-1623519828317.png

Wenn das Element nirgendwo in der Liste vorkommt, ist das Ergebnis der Wert 0, wie in diesem Beispiel:

image-1623519839311.png

Diese Blöcke verhalten sich analog zu den Blöcken für das Finden von Buchstaben im Text.

Abrufen von Elementen aus einer Liste

Abrufen eines einzelnen Elements

Erinnere dich an die Definition der Liste "Farben":

Bild3_d.PNG

Der folgende Block erhält die Farbe Blau, weil es das zweite Element in der Liste ist (von links beginnend gezählt):

image-1623519900407.png

Dieser erhält Grün, weil es das zweite Element ist (vom rechten Ende aus gezählt):

image-1623519907684.png

Dieser erhält das erste Element, Rot:

image-1623519914276.png

Dies erhält das letzte Element, Gelb:

image-1623519919954.png

Dies wählt zufällig ein Element aus der Liste aus, wobei mit gleicher Wahrscheinlichkeit eines der Elemente Rot, Blau, Grün oder Gelb zurückgegeben wird.

Abrufen und Entfernen eines Elements

Mit dem Dropdown-Menü wird der Block "aus Liste ... abrufen" in den Block "aus Liste ... abrufen und entfernen" geändert, der die gleiche Ausgabe liefert, aber auch die Liste verändert:

image-1623519937988.png

Dieses Beispiel setzt die Variable "erster Buchstabe" auf "alpha" und lässt die restlichen Buchstaben (["beta", "gamma"]) in der Liste.

Bild19_d.PNG

Entfernen eines Eintrags

Wenn du im Dropdown-Menü "entfernen" wählst, verschwindet die Nase links vom Block:

image-1623519978282.png

Damit wird das erste Element aus "Buchstaben" entfernt.

Eine Subliste abrufen

Der Block "aus Liste ... Subliste abrufen" ähnelt dem Block in "aus Liste ... abrufen" mit dem Unterschied, dass er eine Subliste extrahiert und nicht ein einzelnes Element. Es gibt mehrere Optionen, den Anfang und das Ende der Subliste anzugeben:

image-1623520006699.png

image-1623520012453.png

In diesem Beispiel wird eine neue Liste "erster Buchstabe" erstellt. Diese neue Liste hat zwei Elemente: ["alpha", "beta"].

Bild23_d.PNG

Beachte, dass dieser Block die ursprüngliche Liste nicht verändert.

Hinzufügen von Elementen an eine Liste

Elemente in einer Liste ersetzen

Der Block "in Liste ... ersetze" ersetzt das Element an einer bestimmten Stelle einer Liste durch ein anderes Element.

image-1623520033391.png

Die Bedeutung der einzelnen Dropdown-Optionen findest du im vorherigen Abschnitt.

Das folgende Beispiel bewirkt zwei Dinge:

  1. Die Liste "Wörter" wird mit 3 Elementen erstellt: ["sehr", "sehr", "sehr"].
  2. Das dritte Element in der Liste wird durch "gut" ersetzt. Der neue Wert von "Wörter" ist ["sehr", "sehr", "gut"]

image-1623520051581.png

Elemente an einer bestimmten Stelle in eine Liste einfügen

Der "in Liste ... einfügen bei"-Block wird über das Dropdown-Menü des "in Liste ... ersetze"-Blocks aufgerufen:

image-1623520061020.png

Er fügt ein neues Element an der angegebenen Stelle in die Liste ein, und zwar vor dem Element, das sich zuvor an dieser Stelle befand. Das folgende Beispiel (das auf einem früheren Beispiel aufbaut) tut drei Dinge:

  1. Die Liste "Wörter" wird mit 3 Elementen erstellt: ["sehr", "sehr", "sehr"].
  2. Das dritte Element in der Liste wird durch "gut" ersetzt. Der neue Wert von "Wörter" ist somit ["sehr", "sehr", "gut"].
  3. Das Wort "Sei" wird am Anfang der Liste eingefügt. Der endgültige Wert von "Wörter" ist somit ["Sei", "sehr", "sehr", "gut"].

image-1623520068498.png

Zeichenketten aufteilen und Listen zusammenfügen

Eine Liste aus einem Text erstellen

Der Baustein "erstelle Liste aus Text" zerlegt den angegebenen Text mithilfe eines Begrenzungszeichens in Teile:

image-1623520094323.png

Im obigen Beispiel wird eine neue Liste zurückgegeben, die drei Textstücke enthält: "311", "555" und "2368".

Ein Text aus einer Liste erstellen

Der Baustein "erstelle Text aus Liste" fügt eine Liste mithilfe eines Trennzeichens zu einem einzigen Text zusammen:

Bild29_d.PNG

Im obigen Beispiel wird ein neuer Text mit dem Wert zurückgegeben: "311-555-2368".

Eine Liste sortieren

Der "Sortieren"-Block ist ein flexibles Werkzeug, das es ermöglicht, Listen anhand verschiedener Kriterien zu ordnen, die basierend auf dem Typ der Elemente in der Liste ausgewählt werden.

Im gezeigten Beispiel wird eine Liste mit den numerischen Werten 20, 10 und 100 erstellt und einer Variablen namens "liste" zugewiesen. Anschließend wird der "Sortieren"-Block verwendet, um die Daten numerisch in aufsteigender Reihenfolge zu ordnen. Die sortierten Daten werden dann einer neuen Variablen namens "sortiereListe" zugewiesen. Nach der Sortierung enthält "sortiereListe" die Werte in folgender Reihenfolge: 10, 20, 100. Die Reihenfolge der Liste "liste" ist unverändert.

image.png

Verwandte Blöcke

Drucken einer Liste

Der "drucken"-Baustein in der Kategorie Text kann Listen ausgeben. Das Ergebnis des folgenden Programms ist die abgebildete Konsolenausgabe:

Bild30_d.PNG

image-1623679163053.png

Etwas für jedes Element in einer Liste durchführen

Der "für-jeden"-Block in der Kategorie Steuerung führt eine Operation für jedes Element in einer Liste aus. Dieser Block druckt zum Beispiel jedes Element in der Liste einzeln aus:

Bild31_d.PNG

Dadurch werden die Elemente nicht aus der ursprünglichen Liste entfernt.

Map

Eine Map, auch bekannt als Dictionary oder Assoziatives Array, ist eine Sammlung von Schlüssel-Wert-Paaren, bei der jeder eindeutige Schlüssel direkt auf einen Wert verweist.

Alle Schlüssel einer Map zurückgeben

Der Block "in der Map ... gib alle Schlüssel" kann dazu verwendet werden, alle Schlüssel aus einer Map zurückzugeben.

In dem Beispiel holt der Block aus der Map "map" alle Schlüssel und gibt jeden in einer Schleife aus. Dies könnte genutzt werden, um zu sehen, welche Schlüssel überhaupt in der Map gespeichert sind:

image.png

Elements zurückgeben

Der Block "in der Map ... gib Element des Schlüssel ..." kann dazu verwendet werden, um den Wert eines bestimmten Schlüssels aus der Map zurückzugeben.

In dem Beispiel holt der Block, nachdem alle Schlüssel der Map "map" abgerufen wurden, für jeden Schlüssel den entsprechenden Wert. Dieser wird anschließend mit dem "gib aus"-Block ausgegeben. Dies demonstriert, wie man sequenziell durch eine Map iteriert und sowohl Schlüssel als auch Werte verarbeitet.

image.png

Element zu einer Map setzen

Der Block "in der Map ... zum Schlüssel ... setze Element ..." fügt einer Map ein neues Schlüssel-Wert-Paar hinzu oder aktualisiert den Wert eines bestehenden Schlüssels. Dies ist grundlegend für das Hinzufügen oder Modifizieren von Daten in einer Map.

Im Beispiel werden zwei Schlüssel-Wert-Paare in die Map "map" eingefügt:

Falls diese Schlüssel bereits in der Map existieren, werden ihre Werte mit den neuen Einträgen überschrieben. Andernfalls werden die Schlüssel und ihre zugehörigen Werte neu hinzugefügt. Es ist wichtig zu beachten, dass die Werte in einer Map nicht auf Zeichenketten beschränkt sind; sie können vielfältige Datentypen umfassen, einschließlich, aber nicht beschränkt auf, Zahlen, Listen oder sogar andere Maps.

image.png

JSON

JSON (JavaScript Object Notation) ist ein textbasiertes Datenformat, das für den Datenaustausch im Web genutzt wird. Es ist leicht lesbar und einfach zu handhaben. JSON strukturiert Daten als Sammlung von Schlüssel-Wert-Paaren, ähnlich wie Dictionaries oder Maps.

Konvertierung JSON zu Map

Der "JSON zu Map"-Block nimmt einen JSON-String als Eingabe und konvertiert diesen in eine Map. Jedes Schlüssel-Wert-Paar im JSON-String wird zu einem Eintrag in der Map.

Im Beispiel wird der JSON-String {"name": "Max", "age": 25} in eine Map umgewandelt. Diese Map enthält dann die Schlüssel "name" mit dem Wert "Max" und "age" mit dem Wert "25".

image.png

Konvertierung Map zu JSON

Der "Map zu JSON"-Block ermöglicht die Umwandlung von Map-Datenstrukturen in einen JSON-String. Dieser Vorgang ist besonders nützlich, wenn die strukturierten Daten einer Map für eine Datenübertragung oder als Konfigurationsdatei in einem standardisierten Format benötigt werden.

image.png

Verarbeitung

Util

Die Kategorie Util beinhaltet bei ROBO Pro Coding Blöcke folgender Art:

Farbauswahl

Dieser Block dient als Eingabewert, wenn nach einer Farbe gefragt wird (z.B. beim Farbabgleich durch die Kamera). Durch Klicken bzw. Tippen auf die Farbe kann aus einer Farbpalette ausgewählt werden.

image.png

Warten

Warten, bis die Zeit abgelaufen ist

Der Block "warte ... " hindert das Programm für die angegebene Wartezeit daran, weiterzulaufen. Dabei kann im Dropdown-Menü (kleines Dreieck) die Zeiteinheit und im Eingabefeld dahinter die gewünschte Länge der Pause gewählt werden. Im untenstehenden Beispiel wird beispielsweise eine Wartezeit von einer Sekunde festgelegt.

image.png

Warten mit Bedingung

Beim "warte bis"-Block ist die Pause nicht an die Zeit, sondern an die Erfüllung einer Bedingung (z.B. ob ein Taster gedrückt ist) geknüpft. Die Bedingung wird an den "warte bis"-Block angehängt.

Im gezeigten Beispiel lautet die Bedingung "ist Mini-Taster RX_L1 geöffnet". Das führt dazu, dass das Programm anhält und wartet, dass der Mini-Taster RX_L1 in den Zustand "geöffnet" übergeht, bevor das Programm weitermacht.

image.png

Python-Code

Möchte man bestehenden Python-Code in ROBO Pro Coding integrieren, so kann man ihn in den "Python Code"-Block einfügen. Das Programm führt dann alles aus, was in dem Block in Python geschrieben wurde. Der Block "Python-Importe" ermöglicht es, notwendige Bibliotheken zu importieren, die für die Ausführung des Codes erforderlich sind.

In dem Beispiel wird der euklidische Algorithmus zur Bestimmung des größten gemeinsamen Teilers (GGT) zweier Zahlen dargestellt. Innerhalb des Blocks wird Python-Code geschrieben. Eine while-Schleife beginnt, die solange läuft, bis b nicht gleich 0 ist. Dies ist der Kern des euklidischen Algorithmus, bei dem wiederholt der Rest der Division von a durch b berechnet wird, und a und b dann aktualisiert werden. a bekommt den Wert von b, und b den Rest der Division a % b. Sobald b 0 wird (was bedeutet, dass kein Rest mehr vorhanden ist und der Algorithmus sein Ende erreicht hat), ist der Wert in a der GGT der ursprünglich eingegebenen Werte 60 und 48, also 12.

image.png

Funktionsausführung

Mit dem "führe Funktion ... in einem Thread aus"-Block lässt sich die ausgewählte Funktion in einem separaten Thread ausführen. Ein Thread ist im Wesentlichen ein Weg für ein Programm, mehrere Aufgaben gleichzeitig (parallel) auszuführen. Diese Maßnahme kann zum Beispiel ermöglichen, dass ein Programm weiterhin auf Eingaben reagieren kann, während es andere zeitaufwendige Aufgaben ausführt.

Das unten stehende Beispiel zeigt, wie eine Python-Funktion in einem separaten Thread ausgeführt werden kann, um Mehrfachaufgaben innerhalb des Programms zu ermöglichen. Zunächst wird eine Funktion "etwas tun" definiert und diese wird dann in einem Thread gestartet. Die Funktion "etwas tun" beinhaltet Python-Code, der eine zeitaufwendige Aufgabe simuliert. Durch das Verwenden des Threads kann die zeitaufwendige Funktion im Hintergrund ausgeführt werden, während der Hauptthread weiterläuft. Dies verhindert, dass das gesamte Programm während der Ausführung der Funktion für 10 Sekunden blockiert wird. Unmittelbar nach dem Starten des Threads druckt das Hauptprogramm den Text "Der Text wird direkt ausgegeben!". Da der Hauptthread durch den Start des Nebenthreads nicht blockiert wird, erfolgt diese Ausgabe sofort, ohne auf das Ende der Funktion etwas tun zu warten.

image.png

Zeitstempel

Der Block "Zeitstempel" wird verwendet, um den aktuellen Zeitpunkt (in Sekunden oder Millisekunden seit dem Beginn der Programmausführung) zu erfassen. Dies wird typischerweise genutzt, um einen genauen Zeitpunkt zu markieren, an dem etwas im Programm beginnt oder endet. Der Zeitstempel wird in einer Variablen gespeichert und kann verwendet werden, um die Dauer von Ereignissen zu messen, indem man die Differenz zwischen einem Anfangs- und einem Endzeitstempel berechnet.

Im Beispiel wird der Zeitstempel genutzt, um die Dauer der Methode "etwas tun" zu messen. Die Verwendung der Start- und Endzeitstempel ermöglicht es, genau zu bestimmen, wie lange die durch den "etwas tun"-Block repräsentierte Aktion dauert.

image.png

Verarbeitung

Variablen

Wir verwenden den Begriff Variable so, wie er in der Mathematik und in anderen Programmiersprachen verwendet wird: ein benannter Wert, der verändert (variiert) werden kann. Variablen können auf verschiedene Arten erstellt werden.

Dropdown-Menü

Wenn du auf das Dropdown-Symbol (kleines Dreieck) einer Variable klickst, erscheint das folgende Menü:

image-1623590853546.png

Das Menü bietet die folgenden Optionen.

Blöcke

Festlegen

Der "setze"-Block weist einer Variablen einen Wert zu und legt die Variable an, falls sie bisher nicht existiert. Zum Beispiel wird so der Wert der Variable "Alter" auf 12 gesetzt:

image-1623590862822.png

Abrufen

Der "rufe ab"-Block liefert den in einer Variablen gespeicherten Wert, ohne ihn zu verändern:

image-1623590873177.png

Es ist möglich, aber eine schlechte Idee, ein Programm zu schreiben, in dem ein "rufe ab"-Block ohne einen entsprechenden vorherigen "setze"-Block vorkommt.

Ändern

Der "ändere"-Block fügt eine Zahl zu einer Variablen hinzu.

image-1623590887860.png

Der "ändere"-Block ist eine Abkürzung für das folgende Konstrukt:

image-1623590898726.png

Beispiel

Betrachte den folgenden Beispielcode:

Bild6_d.PNG

Die erste Reihe von Blöcken erzeugt eine Variable namens "Alter" und setzt ihren Anfangswert auf die Zahl 12. Die zweite Reihe von Blöcken ruft den Wert 12 ab, addiert 1 dazu und speichert die Summe 13 in der Variablen. In der letzten Zeile wird die Meldung ausgegeben: "Herzlichen Glückwunsch! Du bist jetzt 13".

Verarbeitung

Funktionen

Funktionen dienen dazu, Teile des Codes wiederverwendbar zu machen und dadurch den Code insgesamt zu strukturieren. Füllt man einen Funktionsblock, so erscheint im Funktionen-Menü ein neuer Block, der den gleichen Namen trägt wie ebendieser Funktionsblock. Es ist nun möglich, in das Hauptprogramm nur noch den Block mit dem Namen der Funktion einzusetzen. Wenn das Programm durchlaufen wird, leitet dieser Block zum Code in der gleichnamigen Funktion weiter und arbeitet diesen ab.

Einfache Funktion

Mit dem einfachen Funktionsblock lässt sich eine Funktion erstellen, die den im Textfeld eingegebenen Namen trägt. Die Funktion kann beliebig viele Variablen enthalten, die über das (+) Symbol hinzugefügt werden können. Diese Funktion "Altern" addiert 1 zu der Variable "Alter":

Bild1_d.PNG

Die Funktion kann dann im Hauptprogramm genutzt werden:

image-1623591778258.png

Funktion mit Rückgabewert

Dieser Block erlaubt es, eine Funktion mit Rückgabewert zu erstellen. Dieser Rückgabewert kann dann im Hauptprogramm weiterverwendet werden. Hier ein Beispiel:

image.png

Bedingtes Zurückspringen

Der Block "falls" kann verwendet werden, um vorzeitig aus einer Funktion herauszuspringen. Abhängig von der spezifischen Anforderung der Funktion kann dieser Block entweder einen Rückgabewert liefern oder keinen Rückgabewert benötigen. Im Münzwurf-Beispiel prüft der Block die Bedingung, ob die Zufallszahl x, die zwischen 1 und 100 liegt, kleiner oder gleich 50 ist. Wenn wahr (die Zahl ist 50 oder weniger): Die Funktion gibt den Wert 0 zurück. Dies kann als Symbol für Kopf bei einem Münzwurf interpretiert werden. Wenn falsch (die Zahl ist größer als 50): Die Funktion gibt den Wert 1 zurück, was als Zahl interpretiert werden kann.

image.png

Verarbeitung

Machine Learning

Die Gruppe "Machine Learning" enthält Blöcke zur Verwendung mit dem TensorFlow-Projekt und der USB-Kamera.

Erstellt eine Bildanalyse für ein Model im Pfad path auf dem TXT 4.0 Controller.

Bild1.png

Erstellt eine Objekterkennung mit einem Standardmodell "Sortierstrecke mit KI".

Bild2.png

Erstellt eine Objekterkennung für ein Model im Pfad path auf dem TXT 4.0 Controller.

Bild3.png

Analysiert ein Bild mit einer Objekt- oder Bilderkennung. Ausgegeben werden die erkannten Eigenschaften, deren Wahrscheinlichkeit und bei einer Objekterkennung deren Position. Das Ergebnis dieses Blocks kann in eine Variable geschrieben werden, um dieses später im „get value of result item [item]“ Block auszuwerten.

Bild4.png

Gibt einen einzelnen Wert einer Eigenschaft des x-ten Ergebnisses einer Bild- oder Objektanalyse aus. Item kann dabei entweder direkt der „process image“ Block oder dessen Ergebnisse aus einer Variable sein.

Bild5.png

Verarbeitung

Importe

Importe enthält alle Funktionen aus selbst definierten Modulen in "lib". Funktionen dienen dazu, Teile des Codes wieder verwendbar zu machen und dadurch den Code insgesamt zu strukturieren (siehe "Funktionen").

Eine kurze Anleitung illustriert Schritt für Schritt, wie man eine neue Datei erstellt, Funktionen definiert, diese in einer Bibliothek organisiert und anschließend in einem Hauptprogramm importiert und verwendet.

Der Prozess beginnt mit dem Klick auf das „+“-Symbol im Projektnavigator, um eine neue Datei zu erstellen.

image.png

Dies öffnet ein Dialogfenster, in dem man zwischen verschiedenen Dateitypen wählen kann.

Nach Auswahl von „Quellcode“ wird man aufgefordert, einen Namen für die Datei einzugeben. In diesem Fall wird die Datei „MeineBibliothek“ genannt.

image.png

In der neu erstellten Quellcodedatei „MeineBibliothek“ wird eine Funktion definiert. Im Beispiel wird eine einfache Funktion namens „halloWelt“ erstellt, die „Hallo Welt!“ ausgibt. Dies zeigt, wie man wiederverwendbare Codeblöcke erstellt, die in verschiedenen Teilen des Projekts oder sogar in verschiedenen Projekten genutzt werden können.

image.png

Nach der Definition der Funktion wird sie im Hauptprogramm verwendet. Dies ermöglicht den Zugriff auf die „halloWelt“-Funktion. 

image.png

Kommunikation

Kommunikation

Fernbedienung

Wenn ein Bedienfeld erstellt wurde, kann man mit den Blöcken des Abschnitts "Fernbedienung" Manipulationen an diesem Bedienfeld vornehmen und damit operieren. 

Wichtige Hinweise:

Blöcke

Beschriftungsfeld setzen

Der Block "setze Beschriftungsfeld - Text" ermöglicht es, den Text in einem Beschriftungsfeld auf deinem Bildschirm zu ändern. Er ermöglicht es also, den Text während des Programms zu aktualisieren.

image.png

Diagramm setzen

Der Block „setze Diagramm“ in deinem Beispiel wird verwendet, um ein Diagramm auf dem Bildschirm zu zeichnen, indem Punkte in definierten Koordinaten platziert werden

Im Beispiel wird der Block „setze Diagramm“ verwendet, um ein Diagramm zu zeichnen, indem Punkte systematisch platziert werden. In einer Schleife wird für jede Iteration das Diagramm aktualisiert. Dabei wird der aktuelle Wert von x und sein Quadrat (angegeben als "y: Quadrieren x") als Koordinaten für die Punkte auf dem Diagramm verwendet. Dadurch werden die Punkte in einer parabolischen Form dargestellt, die die Beziehung zwischen x und y visualisiert.

image.png

Bild setzen

Der Block "setze Bild - Base64-Bild" wird verwendet, um ein Bild auf einer Benutzeroberfläche zu setzen oder zu aktualisieren. Dies geschieht durch Angabe eines Base64-codierten Bildstrings. Der Block ermöglicht es, flexibel verschiedene Bilder zur Laufzeit des Programms anzuzeigen, was besonders nützlich ist, wenn die Bilder dynamisch basierend auf Programmbedingungen geändert werden sollen. 

image.png

Statusanzeige setzen

Der Block "setze Statusanzeige" wird verwendet, um eine einfache visuelle Statusanzeige zur Laufzeit zu aktivieren oder deaktivieren.image.png

Ereignis Schaltfläche angeklickt

Dieser Block wird verwendet, um auf das Klicken einer Schaltfläche zu reagieren. Dies kann nützlich sein, um Benutzerinteraktionen zu verfolgen oder bestimmte Aktionen auszulösen. Im Beispiel wird dann eine Meldung "Geklickt!" ausgegeben.

image.png

Ereignis Schieberegler angeklickt

Dieser Block wird verwendet, um auf Bewegungen eines Schiebereglers zu reagieren und den aktuellen Wert des Schiebereglers auszugeben. Dies ist nützlich, um kontinuierliche Anpassungen zu verfolgen und darauf zu reagieren, wie beispielsweise das Steuern der Lautstärke oder anderer variabler Parameter. Im Beispiel wird der aktuelle Wert des Reglers ausgegeben.

image.png

Ereignis Joystick angeklickt

Dieser Block wird verwendet, um auf Bewegungen eines Joysticks zu reagieren.  Dies ist nützlich für Steuerungsanwendungen, bei denen die Richtung überwacht und verwendet werden müssen, wie z.B. bei der Steuerung eines Fahrzeugs. Im Beispiel wird die aktuelle Positionen der x- und y-Achse ausgegeben.

image.png

Kommunikation

Sprachsteuerung

Blöcke für die die Kommunikation mit der App Voice Control.

wenn Befehl empfangen: Text

Wird ausgeführt, wenn ein neuer Text von App "Voice Control" empfangen wurde. 

Text

Text ist der erkannte Sprachbefehl.

Kommunikation

Cloud / MQTT

fischertechnik Cloud

Blöcke für die Kommunikation mit der fischertechnik Cloud.

Diese Blöcke werden für "Sensorstation IoT" und "Lernfabrik 4.0" verwendet.

Cloud verbinden

Dieser Block stellt eine Verbindung zur fischertechnik Cloud her. Er wird verwendet, um eine Kommunikationsverbindung zwischen dem Controller und der Cloud zu initialisieren.

image.png

Cloud verbunden

Dieser Block prüft, ob eine Verbindung zur fischertechnik Cloud besteht. Er kann verwendet werden, um zu verifizieren, dass die Verbindung aktiv ist, bevor andere Cloud-Operationen ausgeführt werden.

image.png

Cloud trennen

Dieser Block trennt die bestehende Verbindung zur fischertechnik Cloud. Er sollte verwendet werden, um die Kommunikation mit der Cloud ordnungsgemäß zu beenden.

image.png

Cloud Publish

Mit diesem Block können Textnachrichten an die fischertechnik Cloud gesendet werden. Der spezifische Pfad und die Nachricht, die veröffentlicht werden sollen, können konfiguriert werden.

image.png

Cloud Subscribe

Der Block "fischertechnik Cloud Subscribe" ermöglicht es, spezifische Nachrichten von der fischertechnik Cloud zu abonnieren. Wenn eine Nachricht am angegebenen Pfad empfangen wird, wird sie verarbeitet. Das Beispiel zeigt, wie man Nachrichten abonnieren, empfangen und verarbeiten kann.

image.png

MQTT Client

MQTT steht für "Message Queuing Telemetry Transport" Protokoll und wird oft bei IoT (Internet of Things) Anwendungen eingesetzt.

MQTT client create: websockets

Bild6.png

Erstellt einen MQTT Client, mit dem Nachrichten empfangen und gesendet werden können. Es wird empfohlen die Ausgabe des Blocks in eine Variable zu schreiben, um den Client später in anderen Blöcken mehrfach verwenden zu können.

MQTT client ... connect

Bild7.png

Verbindet einen MQTT Client mit einem MQTT Broker mit den angegebenen Einstellungen. Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Host gibt die Adresse des MQTT Brokers an. Um den lokalen MQTT Broker zu verwenden, wird als Wert localhost oder 127.0.0.1 eingetragen. Um externe MQTT Broker zu verwenden, muss dessen IP-Adresse oder Hostname verwendet werden. Port gibt den Port an, an welchem der MQTT Broker verfügbar ist. Standard ist 1883 für MQTT Broker (fischertechnik Cloud) oder 2883 (GUI Applikation). Bei Verwendung externer MQTT Broker muss dessen Port eingetragen werden. Username und Password sind standardmäßig leer, bei externen Servern müssen dessen Anmeldeinformationen hier eingetragen werden.

MQTT client ... is connected

Bild8.png

MQTT Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Gibt „true“ aus, wenn der angegebene MQTT Client mit einem MQTT Broker verbunden ist. Wenn der MQTT Client nicht verbunden ist, wird „false“ zurückgegeben.

MQTT client ... disconnect

Bild9.png

MQTT Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Trennt den angegebenen MQTT Client vom MQTT Broker.

MQTT client ... publish

Bild10.png

MQTT Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Veröffentlicht mit dem angegebenen MQTT Client eine Nachricht „payload“ in einen angegebenen Kanal „topic“. Zusätzlich kann "qos" und "retain" angegeben werden, also ob neu verbundene Clients die Nachricht nach dem Senden empfangen sollen und mit welchem Sicherheitslevel die Nachricht gesendet werden soll.

MQTT client ... publish (mit Rückgabewert)

Bild11.png

MQTT Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Veröffentlicht mit dem angegebenen MQTT Client eine Nachricht „payload“ in einen angegebenen Kanal „topic“. Zusätzlich kann "qos" und "retain" angegeben werden, also ob neu verbundene Clients die Nachricht nach dem Senden empfangen sollen und mit welchem Sicherheitslevel die Nachricht gesendet werden soll. Beim erfolgreichen Versenden wird „true“ ansonsten „false“ zurückgegeben.

MQTT client ... will set

Bild12.png

MQTT Client kann der Block „MQTT client create“ sein, oder dessen Ausgabe in einer Variablen. Setzt die Nachricht „payload“, welche nach dem Trennen des MQTT Clients in einem angegebenen Kanal „topic“ versandt werden soll, und mit welchem Sicherheitslevel die Nachricht gesendet werden soll.

MQTT client ... subscribe

Bild13.png

Abonniert mit einem MQTT Client einen Kanal. im Callback Argument wird die Funktion angegeben, welche beim Empfangen einer Nachricht ausgeführt werden soll. "Qos" gibt an, mit welchem Sicherheitslevel die Nachricht versendet werden soll.

subscribe callback ... : message

Bild14.png

Definiert eine Funktion, welche durch Empfangen einer Nachricht ausgeführt werden soll. Message enthält die empfangene Nachricht.

Kommunikation

HTTP

Blöcke zur Erstellung von HTTP-Anfragen

GET

Dieser Block ermöglicht das Senden einer GET-Anfrage an eine spezifische URL. Es können Header-Informationen hinzugefügt werden, um zusätzliche Metadaten mit der Anfrage zu senden.

image.png

POST, PUT, DELETE, PATCH

Dieser Block ermöglicht das Senden einer POST-, PUT-, DELETE- oder PATCH-Anfrage an eine spezifische URL. Neben Header-Informationen kann auch ein Payload, also die zu sendenden Daten, angegeben werden.

image.png