Kontrollbefehle


Aus allen Programmiersprachen kennen wir Befehle für bedingte Abläufe oder auch Schleifen. Auch der Nextion bietet einige wenige davon. Allerdings müssen Sie dabei 2 Dinge beachten:

  • In der Originaldokumentation wird nicht erwähnt, dass diese Befehle nur intern im Nextion einsetzbar sind und nicht als Kommandos über die serielle Schnittstelle aufgerufen werden können. Das würde wohl auch nicht sehr viel Sinn machen, aber das Fehlen des Hinweises kann doch verwirren, weil die Befehle praktisch gleichberechtigt im Instruction Set aufgeführt sind. Falls es aber doch aus irgendeinem Grund erforderlich sein sollte, ein Programm über einen Befehl der seriellen Schnittstelle auslösen zu müssen, geht das mit einem Trick. Dazu erzeugen Sie einen Button, setzen die Sichtbarkeit auf "nicht sichtbar" und ordnen seinem Press- oder Release-Event ein Programm zu. Über die serielle Schnittstelle können Sie dann das entsprechende Event auslösen und somit quasi durch die Hintertür das Programm aufrufen.
  • Auch wenn die Syntax zunächst an ein C-Programm erinnert, ist sie damit nicht identisch. So fehlen die Semikolon am Ende einer jeden Anweisung und die Formatierung muss strikt eingehalten werden, z. B. darf die komplette Funktion nicht in einer Zeile untergebracht werden und die geschweiften Klammern müssen immer allein und am Anfang in einer Zeile stehen. Geben Sie also die Beispiele immer exakt genauso ein, wie unten angegeben.

if

if (bedingung)
{
anweisung
}

Mit einer if-Anweisung können Bedingungen abgefragt werden und dann gezielt auf diese Bedingung reagiert werden.

Beispiel:

Sie haben einen Button und wollen jedes Mal, wenn diese Schaltfläche 3 Mal angeklickt wurde, eine Meldung über die serielle Schnittstelle ausgeben. Dazu haben Sie eine interne Variable "buttonClicked" angelegt, die Sie beim Start des Programm mit "1" initialisieren und bei jedem Press-Event um eins erhöhen. Der Code für das "Press-Event" des Buttons wäre dann:

if (buttonClicked.val==3)
{
print "3 Mal geklickt"
}
buttonClicked.val++

Das funktioniert, allerdings nur einmal. Danach würde der Wert von buttonClicked.val weiter hochgezählt und die 3 würde in der Folge nicht mehr erreicht. Wir müssen also die Zählvariable gezielt zurücksetzen. Dazu nutzen wir den else-Zweig der Bedingungabfrage, mit dem eine Logik in der Form:

Wenn Fall a eintritt, dann tue dies, andernfalls (else) tue etwas anderes.

if (buttonClicked.val==3)
{
print "3 Mal geklickt"
buttonClicked.val=1
}
else
{
buttonClicked.val++
}

Jetzt funktioniert es so, wie wir es wollten.

Sie können die folgenden Vergleichsoperatoren nutzen:

  • == gleich
  • != ungleich
  • <= kleiner oder gleich
  • >= größer oder gleich
  • > größer
  • < kleiner
Hinweis: In der Originaldokumentation finden sich die folgenden Fehler:

 

  • Bei einigen Beispielen im Körper der if-Anweisung wird als Zuweisung anstelle von b0.txt="3" fälschlicherweise ein Vergleich b0.txt=="3"durchgeführt.
  • Die Schlüsselwort else wird direkt hinter die geschweifte Klammer gestellt: } else. Das führt zu einem Compilerfehler, weil die Klammer und else in getrennten Zeilen stehen müssen.

while

while (bedingung)
{
anweisung
}

Die while-Anweisung gehört zur Gruppe der Schleifenbefehle. So lange eine bestimmte Bedingungen erfüllt ist (d. h. das Ergebnis ungleich 0 ist) wird der Anweisungsblock in den geschweiften Klammern ausgeführt.

Wichtig:

Bei einer while-Schleife muss es einen Mechanismus geben, um die Bedingungen für die Abfrage zu ändern, ansonsten würde die Schleife entweder nie oder immer (Endlosschleife) durchlaufen. Im Bereich der Embedded-Programmierung treten hier häufig Interrupts in Erscheinung. Softwareseitig lassen sich auch Events als Interrupts betrachten, weil sie asynchron abgearbeitet werden. Man könnte also auf die Idee kommen, ein Touch-Press-Event für die Änderung der Bedingung zu nutzen. Doch hier macht uns Nextion leider einen Strich durch die Rechnung, denn während sich das Programm in einer while-Schleife befindet, werden die Events nicht abgefragt. Die Bedingung lässt sich auch dadurch nicht ändern, dass die abgefragte Variable über die serielle Schnittstelle manipuliert wird. Zwar werden die Kommandos empfangen, aber erst dann ausgeführt, wenn die while-Schleife komplett abgearbeitet wurde. Der 3. Ansatz wäre, die while-Schleife durch ein timer-event zu beenden, doch auch das wird während der while-Schleife nicht durchgereicht.

In den Beispielen auf der Itead-Homepage werden deshalb lediglich Zählschleifen genannt, die eine sichere Beendigung garantieren. Allerdings ist dazu nicht wirklich eine while-Schleife notwendig, denn das ist die eigentliche Domäne einer for-Schleife. Außerdem ist die folgende Problematik zu beachten:

while (n0.val<100)
{
n0.val++
}

 

Setzen wir voraus, dass n0.val zunächst mit einem Wert von 0 initialisiert wurde. In diesem Fall wird der Number-Komponente n0 zunächst die 0 zugewiesen, beim 2. Durchlauf die 1 und so weiter. Allerdings wird dieser Ablauf für uns nicht sichtbar, denn wie oben beschrieben wird die Komponente erst dann aktualisiert, wenn die while-Schleife komplett durchlaufen wurde. Wir können dieses Problem allerdings umgehen, in dem wir den Screen explizit mit dem "doevents" Befehl aktualisieren. Lediglich die betroffene Komponente mittels "ref n0" zu aktualisieren, funktioniert nicht :

while(n0.val<100)
{
n0.val++
doevents
}

for

for(start;bedingung;operation)
{
anweisungen
}

Die for-Schleife wird dazu verwendet, eine bestimmte Anweisung bzw. einen bestimmten Anweisungsblock mehrmals zu durchlaufen. Dazu wird in der Regel eine Zählvariable verwendet, die in "start" initialisiert und mit "operation" bearbeitet (meist hochgezählt) wird. So lange die Bedingung in der Mitte erfüllt ist, werden die Anweisungen in der for-Schleife ausgeführt.

Beispiel:
for(var.val=0;var.val<10;var.val++)
{
n0.val++
}

Zu Beginn der for-Schleife wird der Wert der Variablen "var" auf 0 gesetzt und bei jeder Schleife um 1 erhöht, so lange bis die Variable den Wert 10 hat. Im Anweisungsblock wird auch n0.val bei jedem Durchlauf erhöht und hat am Ende des 1. Aufrufs der for-Schleife den Wert 10 (wenn n0.val vor Beginn der for-Schleife den Wert 0 hatte). Wird jetzt die for-Schleife ein 2. Mal aufgerufen, startet var.val wieder mit 0 und die Schleife wird 10-mal ausgeführt. n0.val wird jetzt von 10 auf 20 hochgezählt.

Die for-Schleife unterscheidet sich von der while-Schleife im Nextion lediglich dadurch, dass die Initalisierung und die Bearbeitung der Schleifenvariable direkt im Kopf der for-Schleife vorgenommen wird. Aber auch bei der for-Schleife gilt das Gleiche wie bei der while-Schleife. Die Komponenten werden während der Ausführung nicht automatisch aktualisiert. Sie müssen also wieder den "doevents"-Befehl einsetzen, wenn Sie eine Aktualisierung wünschen.

Auch hier findet sich wieder ein kleiner Fehler in der Itead-Dokumentation. Dort werden im Schleifenkopf Leerzeichen zwischen start, bedingung und operation gesetzt. Das funktioniert allerdings nicht und löst einen Compilerfehler im Nextion-Editor aus.