Makro-Programmierung
Die Programmiersprache des Systems ermöglicht es jedem Anwender ohne spezielle Programmierkenntnisse komplexe Steuerungsfunktionen zu realisieren. Für jedes Objekt kann ein Makro erstellt werden, welches durch die Änderung von Zuständen bzw. Werten die mit den Objekten verbundenen Aktoren steuert. Zustände und Werte von Objekten und Variablen sowie Zeiten können mit vielfältigen Bedingungen abgefragt und durch Zuweisungen verändert werden.
Makros von Sensor-Objekten werden normalerweise immer ausgeführt, wenn eine Meldung von dem Sensor empfangen wird, beispielsweise also wenn eine Taste einer Fernbedienung gedrückt wird oder die aktuelle Temperatur eines Temperatursensors empfangen wird. Dazu wird beim Anlegen eines Sensor-Objekts standardmässig automatisch das Optionsfeld “Ausführen bei Empfang“ aktiviert.
Makros von Aktoren werden üblicherweise immer in einem bestimmten Zeitintervall aktiviert, beispielsweise um den Aktor nach einer bestimmten Zeit auszuschalten oder zu bestimmten Situationen und Abhängigkeiten von den Zuständen mehrerer anderer Objekten oder Zeiten zu steuern. Nach Möglichkeit sollte das gewählte Zeitintervall für die Makroausführung nicht kleiner als nötig gewählt werden. Üblicherweise reicht eine Minute, wenn jedoch Uhrzeitabfragen im Makro vorkommen, bei denen keine ganzen Minuten sondern Sekunden abgefragt werden muss das Zeitintervall kleiner, normalerweise auf 5 Sekunden eingestellt werden. Bitte beachten Sie dabei, dass die normale Uhrzeit im 5-Sekundentakt aktualisiert wird, die Uhrzeitangabe in den Bedingungen also ebenfalls eine Uhrzeit im 5-Sekundenintervall sein muss.
Die Makros können bei der Studio-Version wahlweise durch Menüs automatisch erstellt werden oder über die Tastatur eingegeben werden. Anstelle der in der Beschreibung der einzelnen Anweisungen verwendeten Syntax kann auch die bei der automatischen Erstellung von Makro-Anweisungen verwendete Syntax über die Tastatur eingegeben werden verwendet werden.
In jeder Zeile eines Programms darf nur eine Anweisung stehen, Kommentarzeilen müssen mit 2 Schrägstrichen (//) beginnen, diese werden dann bei der Generierung des Codes ignoriert.
In den Beispielen sind Programmanweisungen eingerückt, dies ist nicht erforderlich, aber aufgrund besserer Übersichtlichkeit empfehlenswert.
Wenn während der Code-Erstellung Fehler auftreten, wird der fehlerhafte Quelltext mit einer entsprechenden Fehlermeldung angezeigt. Die fehlerhafte Zeile wird soweit möglich markiert, hier kann es eventuell zu Verschiebungen kommen, da Fehler im Quell-Code nicht immer einer Zeile zugeordnet werden können. Wenn in der markierten Zeile kein Fehler erkennbar ist, müssen die vorangegangenen Zeilen geprüft werden.
Anweisungsteile, die bei der Erklärung der Syntax in < spitzen Klammern > stehen sind optional und können weggelassen werden.
Die Uhrzeit wird nicht jede Sekunde, sondern alle 5 Sekunden aktualisiert. Bei Zeitvergleichen ist also zu beachten, dass die Sekunden immer durch 5 teilbar sein müssen.
Wenn Schaltmodule eingeschaltet werden, kann die Einschaltdauer angegeben werden.
Die Elemente der Programmiersprache sind die
• Objekte mit ihren Zuständen, Werten und Variablen. Zustände und Werte von Objekten (und somit die zugehörige Hardware) können abgefragt und verändert werden.
• Operatoren für logische Verknüpfungen und Vergleiche
• Schlüsselwörter, die in der Programmiersprache definierte Bedeutungen haben
• Anweisungen, die in der Programmzeile beschreiben was getan werden soll
• Funktionen, die in der Programmzeile Werte liefern, z.B. für Vergleiche.
Objekte
Hardwareobjekte
sind Objekte, die bestimmter Hardware zugeordnet sind und zum Schalten, Messen, Regeln etc. benutzt werden. Man unterscheidet zwischen Sensoren und Aktoren.
Sensoren sind Eingabeelemente wie Taster von Fernbedienungen, Bewegungsmelder, Fensterkontakte, Temperatursensoren, Wassermelder, Rauchmelder usw. In den Makros der Sensoren stehen üblicherweise Anweisungen um Aktionen auszuführen wenn eine Meldung von der zugehörigen Hardware empfangen wird. Eine Makroanweisung zu einem Taster könnte also z.B. einen Aktor schalten wird, das sieht z.B. so aus:
Stehlampe umschalten
Aktoren sind Schaltmodule, an die Endgeräte wie Beleuchtung, Rollläden, Schalter, Markisen etc. angeschlossen werden. Wenn Makros von Aktoren benutzt werden, werden diese normalerweise in bestimmten Zeitintervallen ausgeführt. So kann z.B. ein Licht immer nach einer bestimmten Zeitdauer ausgeschaltet werden durch folgendes Makro:
wenn Badventilator eingeschaltet und
Schaltdauer(Badventilator) groesser "00:10:00" dann
Badventilator ausschalten
endewenn
Virtuelle Objekte
sind Objekte, die keiner Hardware zugeordnet und z.B. nur zur Bildschirm-Ein- oder Ausgabe benutzt werden.
Im Fenster Einstellungen können über den Button "Neues Objekt" virtuelle Objekte erstellt werden. Dabei wird der Name, die Bezeichnung und der Typ festgelegt: z.B. Name: Anzeige, Bezeichnung: Anzeige, Typ: Zeichen.
In einem Makro kann dem virtuelle Objekt Anzeige dann ein Wert zugewiesen werden, z.B:
Anzeige:="aktuelle Temperatur ist " + WandthermostatWohnzimmer.Temperatur+" Grad C"
Variablen
Variablen dienen der Zwischenspeicherung von Werten. Variablen werden wie die Objektprogramme auf der Seite Programmierung der Objektdefinition definiert. Einer Variablen kann im Objektprogramm ein Wert zugewiesen werden. Dieser Wert kann der Inhalt einer anderen Variablen, ein Objektzustand oder eine Konstante sein. Die in einem Objektprogramm definierten Variablen können von allen anderen Objektprogrammen benutzt werden, wenn der Name des Objekts, in dem die Variable definiert wurde, der Variablen getrennt durch einen Punkt vorangestellt wird.
Beispiel:
Anzeige:=RaumthermostatWohnen.Temperatur
Für jede Variable muss ein Typ festgelegt werden. Es können die gleichen Typen wie für Objekte verwendet werden.
Typen sind z.B.: Licht, Schalter, Zeichen, Zahl
Zusätzlich zu diesen Typen können für Variablen auch Zeittypen (Uhrzeit, Datum) benutzt werden.
Bei Zuweisungen zwischen nicht gleichen Typen erfolgt die Zuweisung entsprechend der Reihenfolge der für diesen Typ definierten Zustände, unabhängig von der Bezeichnung des Zustands. Intern werden Zustande als Zahl entsprechend der Reihenfolge in der Definition des Typs behandelt. Bei Zuweisungen wird diese Zahl zugewiesen.
Es gibt eine vordefinierte Variable des Typs Uhrzeit für jedes Objekt. Der Name der Variablen ist CT (für ChangeTime). In dieser Variablen wird die jeweils letzte Änderungszeit eines Objekts gespeichert. Mit der Funktion STOPPUHR(Objektname.CT) kann ermittelt werden wie lange ein Objekt sich in seinem aktuellen Zustand befindet.
Bitte beachten Sie:
Wenn Sie eine Variable vom Typ Zahl definieren, gibt es zwei unterschiedliche Typen von Zahlen:
Zahlen ohne Komma (Ganzzahl) und Zahlen mit Komma (Gleitkommazahl). Von welchem Typ die Zahl ist, wird durch den Startwert festgelegt. Wird als Startwert eine Zahl mit Komma angegeben (z.B. 1,0) so wird die Variable als Gleitkommazahl behandelt, andernfalls als Ganzzahl.
Es macht bei Rechenoperationen und Zuweisungen einen großen Unterschied wie eine Zahl definiert ist.
Wenn einer Ganzzahl eine Gleitkommazahl zugewiesen wird, werden die Kommastellen einfach abgeschnitten.
Wenn eine Rechenoperation nicht das gewünschte Ergebnis liefert, prüfen Sie wie die in der Anweisung verwendeten Zahlen definiert sind.
Beispiel:
Die Minimal und Maximal-Temperatur sollen täglich auf einer Anzeige ausgegeben werden.
Im Objektprogramm des Objekts TempAussen (das Thermometer im Garten) sind die Variablen MIN und MAX als Zahl definiert. Das Makro des Objekts TempAussen lautet:
wenn TempWG > MAX dann
MAX:=TempWG
endewenn
wenn TempWG < MIN dann
MIN:=TempWG
endewenn
Das Makro des Objekts Anzeige, das zu jedem Tageswechsel aktiviert wird:
AnzeigeMinMax:="Min: "+TempWG.MIN+" Max: "+TempWG.MAX
Zuweisungen
Zustände bzw. Werte von Objekten oder Variablen können durch Zuweisungen geändert werden.
Die grundsätzliche Form einer Zuweisung im Programm ist
Ziel := Quelle
wobei Ziel ein Objekt oder eine Variable sein kann. Quelle kann ein Objekt, eine Variable oder eine Konstante
sein kann. Bei Zuweisungen von Werten unterschiedlichen Typs wird soweit möglich automatisch eine
Konvertierung entsprechend des Typs des Ziels vorgenommen.
Bei Zuweisungen zwischen nicht gleichen selbst definierten Typen erfolgt die Zuweisung entsprechend der Reihenfolge der für diesen Typ definierten Zustände, unabhängig von der Bezeichnung des Zustands. Zum Beispiel muss bei der Definition neuer Typen mit den Zuständen AUS/AN darauf geachtet werden, dass der Zustand AUS immer zuerst definiert wird, damit bei Zuweisung an andere AUS/AN - Objekte der richtige Zustand übertragen wird.
Bei der Verwendung von Schlüsselwörtern wie einschalten bei Zuweisungen oder ausgeschaltet in Wenn-Bedingungen ist es erforderlich, dass AUS immer als erster Zustand definiert wird, da intern mit der numerischen Reihenfolge der Zustände gearbeitet wird. Durch diese Verfahrensweise ist es möglich, auch Zuweisungen zwischen Typen mit unterschiedlicher Bezeichnung für gleiche Zustände durchführen zu können. Bei der Definition der Zustände von Fenstern und Türen muss offen als erster Zustand und zu als zweiter Zustand definiert werden, damit die entsprechenden Schlüsselwörter bei Zuweisungen und
Bedingungen benutzt werden können.
Schlüsselwörter für Zuweisungen
Für Schalter: an, aus, einschalten, ausschalten
Bei Lichtern oder Geräten: einschalten für
Für Rollladen: rauffahren, runterfahren
Beispiele für Zuweisungen:
LichtBad:=SchalterBad hat die gleiche Wirkung wie
LichtBad wie SchalterBad
Licht1Garten einschalten hat die gleiche Wirkung wie
Licht1Garten:=an oder Licht1Garten:=1
Die besonderen Schlüsselwörter AN und AUS können bei einer Zuweisung mit dem Zuweisungsoperator := ohne Hochkommas verwendet werden.
Wird einem Objekt ein anderer Zustand als Text zugewiesen, so muss dieser in Hochkommas gesetzt werden und genau der Schreibweise der Typdefinition entsprechen, auch Groß - / Kleinschreibung muss berücksichtigt werden.
Beispiel:
Anstatt
Rolllade runterfahren
Könnte man auch die Anweisung
RollladeWohnen:= "unten"
verwenden, das Wort unten muss genau wie in der Typdefinition geschrieben sein und in Hochkommas gesetzt werden.
Eine besondere Anweisung zum Einschalten von Lichtern oder Geräten ist die Anweisung
Objekt einschalten für Zeitdauer
als Zeitdauer kann die Zeit in Hochkommas oder als Variable angegeben werden.
Beispiel:
Stehlampe einschalten für "00:30:00"
oder:
Dauer1:="00:10:00"
Gartenlicht einschalten für Dauer1
wobei Dauer1 eine Variable vom Typ Uhr oder Zeichen sein muss.
Rechenfunktion bei Zuweisungen numerischer Werte
Bei Zuweisungen an ein Objekt bzw. eine Variable des Typs Zahl können die vier Grundrechenarten benutzt werden. Damit ist es z.B. möglich Eingabewerte von Sensoren für die weitere Verarbeitung zu verändern.
Beispiel:
NeuTemp:=AltTemp-5
Rechenfunktion bei Zuweisungen von Uhrzeiten
Uhrzeiten können mit Hilfe der Operatoren + und - addiert bzw. subtrahiert werden.
Beispiel:
Sie wollen, dass ein Makro alle morgendlichen Aktivitäten um eine Viertelstunde verzögert. Dies könnte so
aussehen:
RollRaufZeit:= RollRaufZeit + "00:15:00"
KaffeeEinZeit:= KaffeeEinZeit + "00:15:00"
Rechenfunktion bei Zuweisungen von Datumswerten
Es ist auch möglich ein Datum durch eine Rechenoperation zu ermitteln.
Das Datum 11 Tage nach dem aktuellen Tag kann man z.B. einfach ermitteln mit der Anweisung:
Zukunft:=Datum+11
wobei die Variable Zukunft natürlich vom Typ Datum sein muss.
Verknüpfungsfunktion bei Zuweisungen von Texten
Mit Hilfe von Zuweisungen können zwei oder mehr Zeichenketten verbunden werden. Wenn in der Anweisung
Operanden eines anderen Typs als Zeichenkette benutzt wird, werden diese soweit möglich automatisch
konvertiert.
Beispiel:
AnzeigeKueche:="Garage ist "+Garagentor
Wenn das Objekt Garagentor die Typen auf und zuhat, und das Garagentor auf ist erscheint in der Anzeige
Garage ist auf
AnzeigeBad:=Uhrzeit+" Uhr"
Der Text in der Anzeige sieht dann so aus: 22:30:00 Uhr
wenn - Bedingungen
In Wenn-Anweisungen wird aufgrund von Bedingungen entschieden, welche weiteren Anweisungen ausgeführt werden. Eine Bedingung ist entweder WAHR oder FALSCH.
Vergleichsoperatoren
= oder gleich
<> oder ungleich
< oder kleiner
> oder groesser
<= (kleiner oder gleich)
>= (größer oder gleich)
Logische Operatoren
UND (im Sinne von und zugleich), ODER (im Sinne von oder auch),
NICHT (zur Negation der nachfolgenden Bedingung)
Bedingungen sind folgendermaßen aufgebaut:
WENN <NICHT> Bedingung <UND/ODER> Bedingung DANN
Anweisungen
<SONST>
Anweisungen
ENDEWENN
Die Wenn-Anweisung ist eine Anweisung, die sich über mehrere Zeilen erstreckt.
Mit der WENN-Anweisung ist es möglich, den weiteren Programmablauf von einer oder mehreren Bedingungen abhängig zu machen. Wenn-Anweisungen können auch verschachtelt werden, d.h. zwischen dem wenn und dem endewenn (bzw. SONST) können weitere Wenn-Anweisungen stehen. Jede Wenn-Anweisung muss mit einer endewenn-Anweisung beendet werden, ansonsten wird bei der Code-Generierung eine entsprechende Fehlermeldung ausgegeben.
Beispiel:
WENN LichtBad eingeschaltet UND
SCHALTDAUER(LichtBad) groesser "00:00:30" DANN
Ventilator einschalten
ENDEWENN
Vor jeder Bedingung kann ein NICHT gesetzt werden, dann wird die Anweisung hinter dann ausgeführt wenn
die Bedingung nicht zutrifft. Bitte beachten Sie:
Das Wort NICHT muss vor der eigentlichen Bedingung stehen, es darf nicht in der Bedingung stehen.
Beispiel:
Falsch wäre die umgangsprachliche Formulierung:
wenn LichtBad NICHT ausgeschaltet oder Tag NICHT=“Montag“ dann
es würde ein Syntaxfehler angezeigt.
Richtig ist:
wenn NICHT LichtBad ausgeschaltet oder NICHT Tag=“Montag“ dann
Bitte beachten Sie:
Häufige Syntaxfehler in wenn-Anweisungen sind, dass das Wort dann vergessen wird und dass die
Anweisung nicht mit einem endewenn abgeschlossen wird.
Da wenn-Anweisungen sich immer über mehrere Zeilen erstrecken, kann die Zeile für einen Syntaxfehler oft
nicht bestimmt werden. Wenn in einem Makro mit einer wenn-Anweisung ein Syntaxfehler ohne
Fehlerbeschreibung auftritt, prüfen Sie alle Elemente der wenn-Anweisung um den Fehler zu finden.
Beispiel:
WENN Temperatur < 21,5 DANN
Wenn die Operanden unterschiedlichen Typs sind, findet soweit möglich eine automatische Konvertierung statt.
Wenn einer der Operanden eine Konstante ist, muss diese als Operand2 stehen, damit eine korrekte Konvertierung durchgeführt werden kann.
Beispiel:
Richtig: wenn Uhrzeit = "15:15:00" dann
Falsch: wenn "15:15:00" = Uhrzeit dann
Besondere Vergleichsbedingungen
wenn Objekt eingeschaltet hat die gleiche Wirkung wie
wenn Objekt = 1 bzw. wenn Objekt = "an"
wenn Objekt ausgeschaltet hat die gleiche Wirkung wie
wenn Objekt = 0 bzw. wenn Objekt = "aus"
Schlüsselwörter für Bedingungen
Für Schalter: eingeschaltet, ausgeschaltet
Für Türen und Fenster: geoeffnet, geschlossen
Beispiel:
wenn Fenster geoeffnet dann
…
Zeit-Vergleiche
Bei Zeitvergleichen mit Uhrzeiten ist zu beachten, dass die Uhrzeit im 5-Sekunden-Takt aktualisiert wird, die Sekunden der Uhrzeit bei der Prüfung auf Zeitgleichheit also immer durch 5 teilbar sein müssen.
wenn Uhrzeit = "HH:MM:SS" dann
bei dieser Bedingung ist auch zu beachten, dass die Uhrzeit in Hochkommas gesetzt wird
wenn Datum = "TT.MM.JJJJ" dann
bei dieser Bedingung ist zu beachten, dass das Datum in Hochkommas gesetzt wird und die Jahreszahl 4-stellig angegeben wird. Beispiel:
wenn Datum = "24.12.2023" dann
wenn Wochentag = "Sonntag" dann
Prüfung auf einen Wochentag. Der Wochentag wird in Hochkommas gesetzt und muss mit einem
Großbuchstaben und nachfolgenden Kleinbuchstaben geschrieben werden.
wenn Monatstag = 29 dann
Prüfung auf den Tag eines Datums.
wenn Monat > 4 und Monat < 10 dann
bewirkt, dass die folgenden Anweisungen nur zwischen Mai und September ausgeführt werden.
Vergleichsoperator =* für Vergleiche mit Jokerzeichen
Beim Vergleich von Uhrzeit und Datum mit einer Konstanten können auch Jokerzeichen verwendet werden.
Als Vergleichsoperator muss =* verwendet werden. Operand2 muss eine Konstante in Hochkommas sein.
Beispiele:
Um Anweisungen jede volle und halbe Stunde auszuführen:
wenn Uhrzeit =* "**:00:00" oder Uhrzeit =* "**:30:00" dann
......
Um Anweisungen immer am Ersten eines Monats auszuführen:
wenn Datum =* "01.**.****" dann
......
Bedingung für Zeiträume
Manchmal ist es erforderlich Aktionen nur innerhalb bestimmter Zeiträume auszuführen.
Dies ist möglich mit der Bedingungsanweisung :
wenn Uhrzeit/Datum zwischen "Zeitkonstante" und "Zeitkonstante" dann
......
Beispiel:
wenn Uhrzeit zwischen "23:00:00" und "05:00:00" dann
......
Vergleichsoperator =+ für Vergleiche mit Wochenmaske
Mit diesem Vergleichsoperator ist es möglich, Anweisungen nur an bestimmten Wochentagen ausführen zu
lassen. Als Operand2 muss eine 7-stellige Konstante bestehend aus Nullen und Einsen in Hochkommas
verwendet werden. Jede Stelle der Konstanten steht für einen Wochentag, beginnend mit Sonntag. Die
Bedingung ist wahr wenn an der Stelle des aktuellen Wochentags eine Eins steht.
Beispiel: Es soll geprüft werden, ob der aktuelle Tag ein Freitag, Samstag oder Sonntag ist.
wenn Wochentag =+ "1000011" dann
|