Entwicklung von HS/FS-Logikmodulen
Inhalt
1.
Haftungsausschluss
2.
Einführung
3.
Eigenes Logikmodul erstellen
4.
Aufbau der Definitionsdatei
5.
Variable
6.
Berechnung eines Bausteins
7.
Startverhalten der Logik
8.
Hinweise zur Sprachsyntax
9.
Fehlersuche
10.
Beispiele
11.
Veröffentlichung

## 1.Haftungsausschluss

Auch wenn die Unterlagen mit großer Sorgfalt erstellt und geprüft sind, können Fehler nicht vollkommen ausgeschlossen werden. Deshalb übernimmt der Inverkehrbringer bezüglich des Inhalts weder eine juristische Verantwortung, noch irgendeine Gewähr.
Technische Änderungen bleiben vorbehalten!

## 2.Einführung

Seit der Firmware 2.1 besitzt der HS/FS die Möglichkeit, durch eigene Logikmodule die Logik-Funktionalität des HS/FS zu erweitern.

### 2.1.Nummernkreise

Damit keine Überschneidungen bei der ID der Logikmodule verschiedener Entwickler auftreten, bieten wir eine zentrale Verwaltung der Nummernkreise an.
Um sich einen Nummerkreis reservieren zu lassen, senden Sie uns eine entsprechende Bitte per Email an logik [at] dacom-ha.de.

### 2.2.Weitere Quellen

Weitere wichtige Quellen sind die Logikmodule anderer Anwender. Zum besseren Verständnis sollte das Studieren anderer HSL-Dateien sehr gut dienen.

### 2.3.Support

Für selbst erstellte Logikmodule gibt es keinen Support. Anregungen können Sie jederzeit per E-Mail an uns senden: logik [at] dacom-ha.de

## 3.Eigenes Logikmodul erstellen

Jedes Logikmodul kann genau einen Baustein enthalten. Die Module werden als einzelne Dateien mit der Dateiendung HSL im HS/FS-Experte Unterverzeichnis \logic abgelegt. Wie die Definitionsdatei eines Logikmoduls auszusehen hat, wird in diesem Kapitel näher erläutert.

### 3.1.Zuweisen eines Dateinamens

Der Dateiname eines Logikmoduls besteht aus der Baustein-ID und einer Kurzbeschreibung und besitzt die Dateiendung ".hsl". ID und Kurzbeschreibung werden durch einen Unterstrich getrennt.
Achtung: Baustein-ID
Die Baustein-ID muss eine fünfstellige Nummer aus dem Nummernkreis 10.000-19.999 sein.
Hinweis: Entwicklungs-ID
Die Nummern 10.000 bis 10.999 werden nicht "öffentlich" verwendet, d.h. jeder Entwickler kann während der Entwicklungszeit (oder für Bausteine, die er nicht veröffentlichen will) diesen Nummernkreis beliebig verwenden, da diese Nummern niemals von anderen veröffentlichten Bausteinen verwendet werden.
Um möglichst doppelte Baustein-IDs zu vermeiden, gibt es die Möglichkeit, sich einen bestimmten Nummernkreis reservieren zu lassen. So kann verhindert werden, dass mehrere Benutzer die gleichen Nummern verwenden.
Hinweis: IDs für veröffentlichte Bausteine
Ein Nummernkreis, den Sie von uns erhalten, liegt immer im Bereich von 11.000 bis 19.999.
Damit ist sichergestellt, dass veröffentlichte Baustein-IDs sich nicht mit privaten (Nummernkreise von 10.000 bis 10.999) überschneiden.
Beispiel für einen Dateinamen: 11001_Sinus.hsl.
Achtung: Eindeutige Baustein-ID
Die Baustein-ID muss eindeutig sein. Dass heißt, die Baustein-ID darf im Verzeichnis \logic nicht doppelt verwendet werden. Sobald ein Baustein verwendet wird, darf die Baustein-ID nicht mehr geändert werden. Die Baustein-ID kann also nur vor einer Verwendung im Projekt beliebig geändert werden!

### 3.2.Logikmodule in Projekt einbinden

Wurde ein Logikmodul in das HS/FS-Experte Unterverzeichnis \logic kopiert, muss der HS/FS-Experte neu gestartet werden. Erst nach einem Neustart erkennt er neue Bausteine. Ab dem Neustart stehen die neuen Module im grafischen Logikeditor zur Verfügung.

#### 3.2.1.System-Pfade

Der vollständige Pfad zum \logic-Verzeichnis lautet in der Regel:

Experte Version | Pfad zum '\logic'-Verzeichnis
--- | ---
Ab Experte v2.4 | - [Öffentliche Dokumente]\HS+FS Experte\logic oder - [Öffentliche Dokumente]\HS-FS Experte\logic
Ab Experte v2.5 | - [Öffentliche Dokumente]\HS+FS Experte [version]\logic oder - [Öffentliche Dokumente]\HS-FS Experte [version]\logic
Ab Experte v2.10 | [Öffentliche Dokumente]\[Firma]\HS+FS Experte [version]\logic

Die [Öffentlichen Dokumente] finden Sie standarmäßig hier:

Windows Version | Pfad
--- | ---
Windows XP | C:\Dokumente und Einstellungen\All Users\Dokumente
Windows Vista / 7 / 8 / 10 | C:\Users\Public\Documents

Das [Programme]-Verzeichnis liegt üblicherweise hier:

Windows Version | Pfad (32-bit Windows) | Pfad (64-bit Windows)
--- | --- | ---
Windows XP | C:\Programme | C:\Programme x(86)
Windows Vista / 7 / 8 / 10 | C:\Program files | C:\Program files x(86)

## 4.Aufbau der Definitionsdatei

Für jedes Logikmodul wird eine eigene Definitionsdatei benötigt.
Eine Definitionsdatei ist zeilenweise aufgebaut und jede Zeile besteht aus einer Satzart und mehreren Eigenschaftsfeldern, welche durch das Zeichen "|" getrennt sind.

Satzart | Beschreibung | Siehe Kapitel
--- | --- | ---
5000 | Informationen für den HS/FS-Experte | siehe hier
4999 | Definition der Fremdsprachen für den HS/FS-Experte | siehe hier
5001 | Definition des Logikbausteins | siehe hier
5002 | Definition eines Eingangs | siehe hier
5003 | Definition einer internen Speichervariable | siehe hier
5004 | Definition eines Ausgangs | siehe hier
5012 | Definition einer Formel | siehe hier

Hinweis: Kommentare
Kommentare werden innerhalb der Definitionsdatei mit einem "#" eingeleitet.

### 4.1.Satzart 5000 – Definition für HS/FS-Experte

Die folgenden Einstellungen haben noch keinen Einfluss auf die Funktionalität des Logikmoduls. Die Zeile mit der Satzart 5000 definiert lediglich Informationen, die vom HS/FS-Experte benötigt werden.
Diese Zeile darf nur einmal im Logikmodul vorkommen und muss als erstes innerhalb der Datei definiert werden. Alle Felder vom Typ Text werden in Hochkommata angegeben.

Feld | Typ | Beschreibung
--- | --- | ---
5000 | Zahl | Satzart
Bezeichnung | Text | Bezeichnung des Bausteins im HS/FS-Experte. Die Struktur im HS/FS-Experte ermöglicht eine Kategorisierung der Bausteine. Bis HS/FS-Experte Version 2.3: Es darf maximal eine Kategorie verwendet werden! (Bsp: Kategorie a\Kategorie b\Baustein wäre ungültig) Ab HS/FS-Experte Version 2.4: Es darf eine beliebige Kategorietiefe verwendet werden! (Bsp: Kat1\Kat2\Kat3\Kat4\Baustein wäre gültig) Beispiel ohne Kategorie: UND-Gatter (2 Eingänge) Beispiel mit einer Kategorie: Weitere Bausteine\Telegrammgenerator
Remanent | Zahl | Ist dieser Baustein als remanent definiert: 1 = ja 0 = nein Achtung: Remanent-Kennzeichnung Ist der Baustein hier nicht als remanent gekennzeichnet, so sind als remanent gekennzeichnete Variablen trotzdem flüchtig! (vgl. Satzart 5003).
Anzahl Eingänge | Zahl | Anzahl der definierten Eingänge. (mindestens 1 Eingang muss definiert sein!)
Bezeichnung Eingang n | Text | Alle Bezeichnungen der Eingänge. Enthält ein Baustein 4 Eingänge, werden vier Bezeichnungen benötigt. Die einzelnen Eingangs-Bezeichnungen werden wiederum durch ein "|"-Zeichen voneinander getrennt.
Anzahl Ausgänge | Zahl | Anzahl der definierten Ausgänge. (mindestens 1 Ausgang muss definiert sein!)
Bezeichnung Ausgang n | Text | Alle Bezeichnungen der Ausgänge. Enthält ein Baustein 4 Ausgänge, werden vier Bezeichnungen benötigt. Die einzelnen Ausgangs-Bezeichnungen werden wiederum durch ein "|"-Zeichen voneinander getrennt.
Versions-Nr. (ab Experte-Version 2.7) | Text | Der hier angegebene Text wird im GLE als Versions-Nr. angezeigt
Nr. eines Eingangs oder 0 (ab Experte-Version 4.7) | Zahl | Verwendung nur für HSL 2.0 Bausteine! HSL 2.0: Eingang, mit dem der Ziel-Port bei einer Port-Weiterleitung festgelegt wird. Sonst: 0
Nr. eines Eingangs oder 0 (ab Experte-Version 4.7) | Zahl | Verwendung nur für HSL 2.0 Bausteine! HSL 2.0: Eingang, mit dem der Basis-Pfad bei einer Port-Weiterleitung festgelegt wird. Sonst: 0

Beispiel anhand eines UND-Gatters:
#5000|Bezeichnung+Pfad im GLE|Remanent(1/0)|Anzahl Eingänge|(Namen der Eingnge)|Anzahl Ausgänge|(Namen der Ausgänge)
5000|"UND-Gatter\2 Eingänge"|0|2|"E1"|"E2"|4|"A1"|"A2 neg"|"A3 (sbc)"|"A4 neg (sbc)"|"v1.23"|0|0
Beispiel anhand der Ein-/Ausschaltverzögerung:
#5000|Bezeichnung+Pfad im GLE|Remanent(1/0)|Anzahl Eingänge|(Namen der Eingnge)|Anzahl Ausgänge|(Namen der Ausgänge)
5000|"Verzögerung\Ein/Ausschaltverzögerung"|0|3|"E1 EIN (Sek.)"|"E2 AUS
(Sek.)"|"E3 Signal"|2|"A1"|"A1 neg"|"v2.7.110721"|0|0

#### 4.1.1.Satzart 4999 – Definition mehrerer Sprachen

Hinweis: Optionale Angabe
Diese Satzart ist optional und wird nur bei Verwendung mehrerer Sprachen im HS/FS-Experte benötigt.
Es brauchen nur die Fremdsprachen definiert zu werden! Für die Sprache, die in der Satzart 5000 verwendet wurde (üblicherweise Deutsch ("de")), muss keine 4999er Zeile angelegt werden!
Sollte der HS/FS-Experte eine Sprache verwenden, die nicht im Logikbaustein mittels der Satzart 4999 definiert ist, werden die Texte aus Satzart 5000 angezeigt.
Der Logikbaustein kann nur in Sprachen, die im Experte eingestellt werden können, angezeigt werden. Daher können Sprachdefinitions-Zeilen anderer Sprachen nicht vom Baustein verwendet werden!
Für jede Fremdsprache muss genau eine 4999er-Zeile angelegt werden!
Achtung: Position der Definitionszeile!
Falls diese Satzart verwendet wird, muss die Definitionszeile immer nach der Definitionszeile von Satzart 5000 angelegt werden!

Feld | Typ | Beschreibung
--- | --- | ---
4999 | Zahl | Satzart
Sprachkürzel | Text | 2-stelliges Sprachkürzel der jeweiligen Sprache. Allgemein gilt: Für jede Sprache wird das TLD (Top-Level-Domain) Kürzel des Landes verwendet, in dem die Sprache beheimatet ist. Ausnahme: Englisch, da an vielen Stellen im HS/FS Experte historisch bereits das Kürzel "en" für Englisch verwendet wurde.
Bezeichnung | Text | Bezeichnung des Bausteins in der o.g. Sprache im HS/FS-Experte. Die Struktur im HS/FS-Experte ermöglicht eine Kategorisierung der Bausteine. (siehe Satzart 5000)
Bezeichnung Eingang n | Text | Alle Bezeichnungen der Eingänge. Enthält ein Baustein 4 Eingänge, werden vier Bezeichnungen benötigt. Die einzelnen Eingangs-Bezeichnungen werden wiederum durch ein "|"-Zeichen voneinander getrennt.
Bezeichnung Ausgang n | Text | Alle Bezeichnungen der Ausgänge. Enthält ein Baustein 4 Ausgänge, werden vier Bezeichnungen benötigt. Die einzelnen Ausgangs-Bezeichnungen werden wiederum durch ein "|"-Zeichen voneinander getrennt.

Beispiel anhand eines UND-Gatters (Sprache "Englisch" = "en"):
#4999|Sprach-Kürzel|Bezeichnung+Pfad im GLE|(Namen der Eingänge)|(Namen der Ausgänge)
`4999|"en"|"AND gate\2 inputs"|"i1"|"i2"|"o1"|"o2 neg"|"o3 (sbc)"|"o4 neg (sbc)"`
Beispiel anhand der Ein-/Ausschaltverzögerung (Sprache "Englisch" = "en"):
#4999|Sprach-Kürzel|Bezeichnung+Pfad im GLE|(Namen der Eingänge)|(Namen der Ausgänge)
`4999|"en"|"Delay\Switch on/off delay"|"i1 ON (sec.)"|"i2 OFF (sec.)"|"i3 Signal"|"o1"|"o1 neg"`
Beispiel anhand eines UND-Gatters (Sprache "Französisch" = "fr"):
#4999|Sprach-Kürzel|Bezeichnung+Pfad im GLE|(Namen der Eingänge)|(Namen der Ausgänge)
`4999|"fr"|"Porte\ET, 2 entrées"|"e1"|"e2"|"s1"|"s2 neg"|"s3 (sbc)"|"s4 neg (sbc)"`
Beispiel anhand der Ein-/Ausschaltverzögerung (Sprache "Italienisch" = "it"):
#4999|Sprach-Kürzel|Bezeichnung+Pfad im GLE|(Namen der Eingänge)|(Namen der Ausgänge)
`4999|"it"|"Ritardo\Ritardo di accensione/spegnimento"|"i1 ON (sec.)"|"i2 OFF (sec.)"|"i3 segnale"|"u1"|"u1 neg"
`

### 4.2.Satzart 5001 – Definition des Bausteins

Definiert die Eigenschaften des Bausteins.
Folgende Eigenschaften sind notwendig um einen Baustein zu definieren:

Feld | Typ | Beschreibung
--- | --- | ---
5001 | Zahl | Satzart
Anzahl Eingänge | Zahl | Mindestens ein Eingang muss vorhanden sein. Siehe hierzu auch Satzart 5002.
Anzahl Ausgänge | Zahl | Mindestens ein Ausgang muss vorhanden sein. Siehe hierzu auch Satzart 5004.
Anzahl Zeitspeicher | Zahl | Anzahl der vom Baustein verwendeten Zeitspeicher. Zeitspeicher sind dazu gedacht, die Berechnung eines Bausteins nach einer bestimmten Zeit erneut zu starten. Die Ausführungszeit eines Zeitspeichers kann während einer Berechnung überschrieben werden. Hier ist der Wert 0 möglich. Die Verwendung von Zeitspeichern ist optional.
Anzahl Speichervariablen | Zahl | Anzahl der vom Baustein verwendeten internen (lokalen) Speichervariablen. Eine Speichervariable kann remanent sein. Siehe hierzu auch Satzart 5003. Hier ist der Wert 0 möglich. Die Verwendung von Speichervariablen ist optional.
Berechnung bei Initialisierung | Boolean (Zahl) | Gibt an, ob der Baustein bei der Initialisierung berechnet wird. Siehe hierzu auch Berechnung eines Bausteins. Erlaubte Werte: 1 = ja 0 = nein
Kodierter Formel-Block (optional) | Boolean (Zahl) | Gibt an, ob der Baustein kodierte Zeilen vom Typ 5012 enthält. Erlaubte Werte: 1 = ja 0 = nein nicht angegeben = nein Hinweis Dieser Parameter wird im Zusammenhang mit dem Programm "Logikbaustein_AES256.exe" (Doku) verwendet. Hinweis Dieser Parameter wird vom HS/FS Experte benötigt, damit bei kodierten Bausteinen der kodierte Teil auf den HS/FS übertragen wird!

Beispiel ohne Angabe zum KFB anhand eines UND-Gatters:
#5001|Anzahl Eingänge|Anzahl Ausgänge|Anzahl Zeitspeicher|Anzahl Speichervariable|Berechnung bei Init.(j/n)|KFB(j/n)
5001|2|4|0|0|1|0
Beispiel mit Angabe zum KFB anhand der Ein-/Ausschaltverzögerung:
#5001|Anzahl Eingänge|Anzahl Ausgänge|Anzahl Zeitspeicher|Anzahl Speichervariable|Berechnung bei Init.(j/n)|KFB(j/n)
5001|3|2|2|2|0|0|0

### 4.3.Satzart 5002 – Definition eines Eingangs

Satzart 5002 definiert die Eigenschaften eines Eingangs. Für jeden in Satzart 5000 definierten Eingang muss eine Zeile der Satzart 5002 definiert sein.

Feld | Typ | Beschreibung
--- | --- | ---
5002 | Zahl | Satzart
Eingang | Zahl | Der Index des Eingangs. (Beginnend mit 1, fortlaufend)
Init.-Wert | Zahl / Text | Wert, mit dem der Eingang bei der Initialisierung belegt wird. Ist der Eingang vom Typ "Text", muss der Init.-Wert in Hochkommata gesetzt werden. Achtung Der Typ des Init.-Wertes muss mit der Angabe im Feld "Datenformat" übereinstimmen!
Datenformat | Zahl | Definiert das Format des Eingangs. Erlaubte Werte: 0 = Numerisch (Standard) 1 = Text Numerisch bedeutet Integer- oder Floatwert. Eingänge, die als Text-Eingang definiert werden, können im HS/FS-Experte nur mit K.-Objekten bzw. Ausgängen belegt werden, die ebenfalls vom Typ Text (z.B. 14-Byte) sind. Achtung Der Typ des Init.-Wertes muss mit der Angabe im Feld "Datenformat" übereinstimmen! Die Angabe des Datenformats ist nur für den HS/FS-Experte von Bedeutung. Der HS/FS erkennt das Datenformat anhand des Init.-Wertes. Die beiden Angaben müssen also übereinstimmen!

Beispiel anhand eines UND-Gatters:
#5002|Eingang|Init.Wert|Datenformat
5002|1|1|0
5002|2|1|0
Beispiel anhand der Textlängen-Berechnung:
#5002|Eingang|Init.Wert|Datenformat
5002|1|""|1

### 4.4.Satzart 5003 - Definition einer Speichervariable

Die Verwendung von Speichervariablen ist optional. Speichervariablen dienen zur Zwischenspeicherung von Werten. Speichervariablen können auch remanent sein, das heißt, sie behalten ihren Wert auch nach einem Neustart.

Feld | Typ | Beschreibung
--- | --- | ---
5003 | Zahl | Satzart
Speicher | Zahl | Der Index der Variable. (Beginnend mit 1, fortlaufend)
Init.-Wert | Zahl / Text | Wert, mit dem die Variable initialisiert wird. Bei einem leeren Text muss "" angegeben werden.
Remanent (j/n) | Boolean (Zahl) | Gibt an, ob der Wert der Variable remanent gespeichert wird. Bei remanenter Speicherung bleibt der Wert der Variable auch nach dem Neustart erhalten. Erlaubte Werte: 1 = ja 0 = nein Werden remanente Speichervariablen verwendet, muss dies in Satzart 5000 ebenfalls definiert werden! Achtung: Remanent-Kennzeichnung Ist in Satzart 5000 der Baustein nicht als remanent gekennzeichnet, so ist die Variable auch bei in diesem Feld gesetzter 1 nicht remanent! Hinweis: Anzahl der remanenten Speichervariablen ändern Wird die Anzahl an Remanentspeichern in der Definition eines Logikbausteins verändert und das Projekt mit dem geänderten Baustein auf den HS übertragen, werden sämtliche remanente Daten der projektierten Logikbausteininstanzen dieses Bausteins verworfen!

Hinweis
Speichervariablen sind lokal. Globale Variablen können wie folgt realisiert werden:

- Ausgänge mit Eingängen im grafischen Logikeditor verbinden.
- Interne oder externe K.-Objekte mit Ein- und Ausgängen verbinden.

Beispiel anhand eines UND-Gatters:
Ein UND-Gatter benötigt keine Speichervariablen.
Beispiel anhand der Ein-/Ausschaltverzögerung:
#5003|Speicher|Init.Wert|Remanent
5003|1|0|0
5003|2|1|0

### 4.5.Satzart 5004 - Definition eines Ausgangs

Satzart 5004 definiert das Verhalten eines bestimmten Ausgangs. Für jeden in Satzart 5000 definierten Ausgang muss eine Zeile der Satzart 5004 definiert sein.

Feld | Typ | Beschreibung
--- | --- | ---
5004 | Zahl | Satzart
Ausgang | Zahl | Der Index des Ausgangs. (Beginnend mit 1, fortlaufend)
Init.-Wert | Zahl/Text | Wert, mit dem der Ausgang initialisiert wird. Ist der Ausgang vom Typ "Text", muss der Init.-Wert in Hochkommata gesetzt werden. Achtung Der Typ des Init.-Wertes muss mit der Angabe im Feld "Datenformat" übereinstimmen!
Runden auf binär | Boolean | Wandelt einen Wert in die Binärform (0 oder 1) um. Bei jedem Wert <> 0 wird der Ausgang mit 1 belegt. Erlaubte Werte: 1 = ja 0 = nein
Ausgang-Typ | Zahl | Send / Send by Change Erlaubte Werte: 1 = Ausgabe bei Berechnung (send). Der Wert wird bei jeder Berechnung auf den Ausgang gesendet. 2 = Ausgabe nur bei Änderung (send by change). Der Wert wird nur dann auf den Ausgang gesendet, wenn der Wert am Ausgang sich dadurch ändern würde.
Datenformat | Zahl | Definiert das Format des Ausgangs. Erlaubte Werte: 0 = Numerisch (standard) 1 = Text Numerisch bedeutet Integer- oder Floatwert. Ausgänge, die als Text-Ausgang definiert werden, können im HS/FS-Experte nur mit K.-Objekten bzw. Eingängen belegt werden, die ebenfalls vom Typ Text (z.B. 14 Byte) sind. Achtung Der Typ des Init.-Wertes muss mit der Angabe im Feld "Datenformat" übereinstimmen! Die Angabe des Datenformats ist nur für den HS/FS-Experte von Bedeutung. Der HS/FS erkennt das Datenformat anhand des Init.-Wertes. Die beiden Angaben müssen also übereinstimmen!

Beispiel anhand eines UND-Gatters:
#5004|Ausgang|Init.-Wert|Binär|Typ|Datenformat
5004|1|0|1|1|0
5004|2|0|1|1|0
5004|3|0|1|2|0
5004|4|0|1|2|0
Beispiel anhand der "Integer zu Text"-Umwandlung:
#5004|Ausgang|Init.-Wert|Binär|Typ|Datenformat
5004|1|""|0|1|1

### 4.6.Satzart 5012 - Definition einer Formelzeile

Innerhalb der Formelzeile wird die eigentliche Funktionalität eines Bausteins definiert.
Die Formelzeilen werden in der Reihenfolge der Definition ausgeführt. Ein Ändern der Zeilenreihenfolge kann also zu anderen Ergebnissen führen. Eine Formelzeile wird pro Berechnung des Bausteins einmal ausgeführt. Weitere Informationen dazu unter Berechnung eines Bausteins.
Eine Formelzeile besteht aus folgenden Feldern:

Feld | Typ | Beschreibung
--- | --- | ---
5012 | Zahl | Satzart
Ende nach Ausführen | Boolean | Beendet die Berechnung des Bausteins nach der Abarbeitung der Formel, falls das Ergebnis der Bedingung ungleich Null ergibt. Weitere Informationen dazu unter Berechnung eines Bausteins. Erlaubte Werte: 1 = ja 0 = nein
Bedingung | Formel | Ist das Ergebnis der Bedingung ungleich Null, wird die Berechnung der "Formel" ausgeführt. Soll das Ergebnis der Bedingung immer True/Wahr sein, so wird das Feld durch zwei Hochkommata gefüllt. Beispiel: `""`
Formel | Formel | Wird ausgeführt, wenn "Bedingung" ungleich Null ergibt. Das Ergebnis der Berechnung kann auf die Pins weitergeleitet werden.
Zeitformel | Formel | Wird ausgeführt, wenn "Bedingung" ungleich Null ergibt und mindestens ein Zeitspeicher im Baustein definiert wurde. Diese Angabe ist optional. Falls sie nicht benötigt wird, sind Hochkommata zu setzen. Beispiel: `""` Das Ergebnis dieser Berechnung dient dem im "Pin Zeitspeicher" zugewiesenen Zeitspeicher als Ausführungszeitpunkt. Der Ausführungszeitpunkt eines Zeitspeichers kann während einer Berechnung verändert werden. Mehr dazu unter Berechnung eines Bausteins.
Pin - Ausgang | Zahl / Index | In diesen Ausgang wird das Ergebnis der Berechnung im Feld "Formel" geschrieben. Die Angabe ist optional. Wenn dieser Wert gleich Null ist, findet keine Weiterleitung an einen Ausgang statt.
Pin – Zeitspeicher | Zahl / Index | In diesen Zeitspeicher wird das Ergebnis der Berechnung im Feld "Zeitformel" geschrieben. Das Ergebnis der Zeitformel löst die erneute Berechnung des Bausteins durch den hier zugewiesenen Zeitspeicher aus. Ist das Ergebnis gleich Null, wird der Zeitspeicher angehalten. Bei Werten ungleich Null wird ein Wert in Sekunden erwartet. Das Ergebnis aus "Formel" wird bei einer durch den Zeitspeicher ausgelösten Berechnung in die Variable ON[Index] geschrieben. Die Variable OC[Index] hat während der ausgelösten Berechnung den Wert 1. Mehr zum Thema "Variable" in diesem Kapitel. Die Angabe ist optional. Wenn dieser Wert gleich Null ist, findet keine Weiterleitung an einen Zeitspeicher statt.
Pin – Speichervariable | Zahl / Index | In diese Speichervariable wird das Ergebnis der Berechnung im Feld "Formel" geschrieben. Die Angabe ist optional. Wenn dieser Wert gleich Null ist, findet keine Weiterleitung an eine Speichervariable statt.
Pin – Negierter Ausgang | Zahl / Index | In diesen Ausgang wird das negierte Ergebnis der Berechnung im Feld "Formel" geschrieben. Achtung Das "negierte Ergebnis der Berechnung" ist nicht immer identisch mit dem "negierten Wert des Pin - Ausgangs"! Die Angabe ist optional. Wenn dieser Wert gleich Null ist, findet keine Weiterleitung an einen Ausgang statt.

Im Kapitel Beispiele sind 6 Bausteine exemplarisch beschrieben, von denen z.B. der Telegramm-Generator Zeitspeicher nutzt.

## 5.Variable

Die in der folgenden Tabelle aufgelisteten Variablen stehen innerhalb der Formeln/Bedingungen zur Verfügung:
Hinweis
Diese Variablen können nur ausgelesen, aber nicht beschrieben werden!

Feld | Typ | Beschreibung
--- | --- | ---
EI | Zahl | Mögliche Werte: 1 = Die Berechnung findet innerhalb der Initialisierung statt. 0 = Die Berechnung findet außerhalb der Initialisierung statt. Achtung Dies bezieht sich nur auf die Initialisierung des Bausteins selbst! Sollte während der Initialisierungsphase des HS/FS der Baustein mehrfach durch in der Logik vorgelagerte andere Bausteine und deren Initialisierung(en) berechnet werden, ist EI nur bei der ersten, d.h. bei der eigenen Initialisierung, gleich '1'!
EA | Array | Der Wert des Eingangs vor der Berechnung.
EN | Array | Der aktuelle Wert des Eingangs.
EC | Array of Boolean | Mögliche Werte: 1 = Am Eingang ist ein Telegramm eingetroffen. Das Eingangstelegramm hat die Berechnung ausgelöst. 0 = Der Eingang ist nicht aktiv.
AA | Array | Der Wert des Ausgangs vor der Berechnung.
AN | Array | Der aktuelle Wert des Ausgangs.
AC | Array of Boolean | Mögliche Werte: 1 = Der Wert des Ausgangs hat sich geändert. 0 = Der Wert des Ausgangs hat sich nicht geändert.
ON | Array | Enthält den in den Zeitspeicher geschriebenen Wert, sobald der Zeitspeicher abgelaufen ist.
OC | Array of Boolean | Mögliche Werte: 1 = Sobald der Zeitspeicher abgelaufen ist. 0 = Solange der Zeitspeicher läuft.
SA | Array | Der Wert einer Speichervariablen vor der Berechnung.
SN | Array | Der aktuelle Wert einer Speichervariablen.
SC | Array of Boolean | Mögliche Werte: 1 = Der Wert der Variable hat sich geändert. 0 = Der Wert der Variable hat sich nicht geändert.

Hinweise:

- Die Größe der jeweiligen Arrays ist davon abhängig, wie viele Eingänge, Ausgänge, Zeitspeicher oder Speichervariablen im Logikbaustein definiert sind (Satzart 5001).
- Alle Arrays beginnen mit dem Index 1.
  Um auf einen Index zuzugreifen, muss man den Index in eckigen Klammern hinter die Variable hängen. Die Syntax EN[2] liefert also den zweiten Wert innerhalb des Arrays EN. Dies entspricht dem aktuellen Wert des zweiten Eingangs.
- Bei Verwendung eines ungültigen Index löst der HS/FS eine Ausnahme-Behandlung (Exception) aus. Diese "Ausnahme" führt zu einer Fehlberechnung des Bausteins. Alle aufgetretenen "Ausnahmen" können auf der Debug-Seite im Abschnitt "Exceptions" eingesehen werden.

Siehe hierzu auch einige dokumentierte Beispiele.

## 6.Berechnung eines Bausteins

### 6.1.Wann wird berechnet?

Die Berechnung eines Bausteins wird immer dann gestartet, wenn...:

- ...das System startet und die Eigenschaft "Berechnung bei Initialisierung" (Satzart 5001) gesetzt ist.
- ...ein Eingangssignal auf einem belegten Eingang eintrifft.
- ...ein Zeitspeicher abgelaufen ist.
  Ein Zeitspeicher kann in einer Zeile der Satzart 5001 definiert werden, und in einer Zeitformel (Satzart 5012) ausgelöst werden. Ist ein Zeitspeicher noch nicht abgelaufen, kann der Ausführungszeitpunkt verändert werden.

Hinweis
Trifft am Eingang ein Telegramm ein und wird an einem der Ausgänge ein Wert gesendet, werden alle anhängenden Bausteine, falls vorhanden, ebenfalls berechnet.

### 6.2.Wie wird berechnet?

Jede definierte Formelzeile (Satzart 5012) wird in der angegebenen Reihenfolge berechnet (d.h. die ".hsl" Datei wird von oben nach unten abgearbeitet)
Beispiel:
`5012|0|"EC[1] and EN[1] and EN[4]"|"SN[1]+1"|""|0|0|1|0
5012|0|"EC[2] and EN[2] and EN[4] and (SN[1]&gt;0)"|"SN[1]-1"|""|0|0|1|0
5012|0|"EC[3] and EN[3]"|"0"|""|0|0|1|0
5012|0|"SC[1] or EI"|"SN[1]"|""|1|0|0|0
`

### 6.3.Berechnung abbrechen

Um eine Berechnung abzubrechen, muss die Eigenschaft "Ende nach Ausführen" gesetzt sein.
Die Berechnung wird dann abgebrochen, wenn die Bedingung als Ergebnis True/Wahr ergibt. Vor dem Beenden der Berechnung wird die aktuelle Zeile zu Ende berechnet. Alle weiteren Formelzeilen werden ignoriert.

## 7.Startverhalten der Logik

Siehe Datei `"logikstart.html"`, die Teil der Online Dokumentation des HS/FS Experte ist.

## 8.Hinweise zur Sprachsyntax

Die Logik verwendet innerhalb der Bedingungen, Formeln und Zeit-Formeln die Syntax der Skript-Sprache '''Python'''. Hinweise und die Dokumentation zu Python finden Sie im Internet unter der Adresse https://www.python.org/ (in englischer Sprache).

### 8.1.Zulässige Ausdrücke und Funktionen

Es sind nur Ausdrücke und Funktionen mit Rückgabewert erlaubt, d.h., Schleifen, If-Else Konstrukte, etc. werden '''nicht''' unterstützt!

### 8.2.Operatoren

Die Variablen können mit den folgenden Operatoren manipuliert und verglichen werden:

Operator | Beschreibung
--- | ---
+ | Addition
- | Subtraktion
* | Multiplikation
/ | Division
& | binäres UND
| | binäres ODER
== | Gleich (als Vergleicher)
< | Kleiner
<= | Kleiner gleich
> | Größer
>= | Größer gleich
!= | Ungleich (identisch "<>")
<> | Ungleich (identisch "!=")

Beispiele:
`EN[1]+SN[1]`
Erklärung: Addiert Eingang 1 und Speichervariable 1
`((EN[1]+SN[1])&gt;EN[2])`
Erklärung: Prüft, ob die Summe aus Eingang 1 und der Speichervariable 1 größer als der Wert an Eingang 2 ist. Ergibt im Erfolgsfall TRUE / WAHR.
Weitere Operatoren findet man in der Python-Dokumentation unter:

- https://docs.python.org/2/reference/lexical_analysis.html#operators
- https://docs.python.org/2.7/library/stdtypes.html

Hinweis: Rechnen mit Gleitkomma-Werten
Um mit Gleitkomma-Werten zu arbeiten, muss jede Variable mit der Funktion float() umschlossen werden.
Zum Beispiel bei der Division von zwei Eingangswerten:
`float(EN[1])/float(EN[2])`. Eine einfache Berechnung liefert nur das Ergebnis als Ganzzahl, also: 2/3 ergibt 0 und 4/3 ergibt 1. Die Berechnung `float(2)/float(3)` ergibt jedoch den korrekten Gleitkomma-Wert.

### 8.3.Boolsche Operatoren

Es werden die folgenden boolschen Operatoren unterstützt:
and: Logisches "UND". Verknüpft mehrere Werte mit einem logischen "UND":

- 1 and 1 ergibt 1
- 1 and 0 ergibt 0
- 0 and 1 ergibt 0
- 0 and 0 ergibt 0

or: "ODER". Verknüpft mehrere Werte mit einem logischen "ODER":

- 1 or 1 ergibt 1
- 1 or 0 ergibt 1
- 0 or 1 ergibt 1
- 0 or 0 ergibt 0

### 8.4.Hinweise zur Verwendung externer Bibliotheken

Innerhalb einer Formel besteht die Möglichkeit, (externe) Python-Bibliotheken einzubinden. Momentan ist der Zugriff auf folgende Bibliotheken beschränkt:

Bibliothek | Beschreibung
--- | ---
math | Das Modul math stellt mathematische Funktionen zur Verfügung. Genaue Beschreibung: math.
whrandom | (bis inkl. Experte 2.8) Das Modul whrandom dient der Generierung von Zufallszahlen. Weitere Info: whrandom.
random | (ab Experte v2.10, ersetzt die in früheren Experte-Versionen verwendete Bibliothek whrandom) Das Modul random dient der Generierung von Zufallszahlen. Genaue Beschreibung: random.
time | Das Modul time dient der Zeitbehandlung. Hinweis Um die aktuelle Uhrzeit/Datum zu ermitteln, sollte die Funktion localtime() verwendet werden. Dies ist vor allem beim Wechseln zwischen Sommer- und Winterzeit von Bedeutung. Genaue Beschreibung: time.
string | Das Modul string liefert Funktionen zur Textbehandlung. Genaue Beschreibung: string.

Externe Funktionen werden nach folgendem Schema aufgerufen:
`__import__`('BIBLIOTHEK').NAME_DER_FUNKTION(EVENTUELLE_PARAMETER)
Hinweis: Vor und nach "import" stehen jeweils 2 Unterstriche.
Beispiele zur Nutzung:

- `__import__('whrandom').randint(1,100)
  oder
  __import__('random').randint(1,100)
  `
  Erklärung: Dieser Ausdruck ruft die Funktion randint() aus der Bibliothek "whrandom" bzw. "random" auf. Als Antwort liefert der Aufruf eine zufällige Ganzzahl im Bereich 1-100 (beide Zahlen inklusive), die bspw. auf einen Ausgang gelegt werden kann.
- `__import__('time').time()`
  Erklärung: Dieser Aufruf liefert die aktuelle Uhrzeit als Ganzzahl. Der Aufruf hat keine Parameter.
- `__import__('time').localtime()[1]`
  Erklärung: Die Funktion localtime() liefert als Antwort ein Array. In diesem Array steht an Position 1 der aktuelle Monat.

## 9.Fehlersuche

### 9.1.Nutzen der Debugliste des Homeservers

Der HS/FS führt eine interne Liste zur Protokollierung der beim Interpretieren der Logikmodule aufgetretenen Fehler. Um diese Liste aufzurufen, muss im Browser die Debug-Seite aufgerufen werden:
`https://HS_IP/hslist?lst=debug&user=USER&pw=PWD`
Dort finden sich unter "Exceptions" die vom Interpreter ausgegebenen Fehlermeldungen.
Je nach Projektierung können Sie auch per `"http:\\..."` anstatt per `"https:\\..."` auf die Debug-Seite zugreifen.

### 9.2.Erkennen von Strukturfehlern

Der HS/FS-Experte erkennt Fehler in der Struktur von Bausteinen beim Überprüfen des Projekts. Sollten in einem Baustein Fehler bezüglich der Struktur vorhanden sein, signalisiert dies der HS/FS-Experte durch eine Fehlermeldung.

### 9.3.Externe Hilfsmittel

#### 9.3.1.Test

Ein sehr nützliches Hilfsmittel stellt die "Python IDLE Shell" dar, die standardmäßig ein Bestandteil der Pythonumgebung unter Windows ist.
Sie ermöglicht es, zeilenweise Statements zu testen. Hierfür ist es am einfachsten, die benötigten Arrays (SN[],EN[],....) zu definieren und darauf die Formelzeilen anzuwenden. Logik- oder Syntaxfehler fallen hierbei schon vor dem Aufspielen des Projektes auf den HS/FS auf. Somit ist eine schnelle Entwicklung von Logikmodulen möglich, ohne bei jeder Änderung des Logikmoduls das Projekt neu auf den HS/FS aufspielen zu müssen.
Weitere Informationen zur "Python IDLE Shell" und die Installationspakete finden sich auf www.python.de.

#### 9.3.2.Hilfe-Datei

Es gibt eine Mustervorlage für die Erstellung einer HTML-Hilfe-Datei für Logikbausteine. Diese finden Sie unter dem Namen "`log55555.html`", zusammen mit einem Style-Sheet, im Unterordner "`/HSL SDK/Help Template/`" der ZIP-Datei, in der auch diese Dokumentation enthalten ist (Schnittstelleninormationen.zip).

#### 9.3.3.Container Datei

Um die Veröffentlichung und/oder Weitergabe zu vereinfachen, gibt es die Möglichkeit, den Baustein zusammen mit Hilfe-Dateien in einen Container zu verpacken, der im HS/FS-Experte importiert werden kann.
Näheres dazu siehe "`hslz_structure.html`" im Unterordner "`/HSL SDK/HSLZ/`" der ZIP-Datei, in der auch diese Dokumentation enthalten ist (Schnittstelleninormationen.zip).

## 10.Beispiele

In diesem Kapitel werden einige bereits vorhandene Bausteine in der korrekten HSL-Dateidefinition erläutert und definiert. Es handelt sich um folgende Bausteine:

- Binärauslöser
- UND-Gatter
  Verwenden nur Ein- und Ausgänge.
- Telegramm-Generator
  Verwendet Eingänge, Ausgänge und Zeitspeicher.
- Zählerbaustein
- Ein-/Ausschaltverzögerung
  Verwendet Eingänge, Ausgänge und Speichervariablen.
- Textauslöser
  Äquivalent zum Binärauslöser, arbeitet mit Werten vom Typ Text.

### 10.1.Binärauslöser als Logikmodul

5000|"Binärauslöser"|0|1|"E1"|2|"A1 (Wert = 1)"|"A2 (Wert <> 1)"
Der Baustein wird im HS/FS-Experte auf oberster Ebene angezeigt. Der Baustein ist als nicht remanent gekennzeichnet und hat einen Eingang und zwei Ausgänge.
`5001|1|2|0|0|0`
Der Binärauslöser hat einen Eingang und zwei Ausgänge. Er besitzt keine Speichervariablen und keine Zeitspeicher. Weiterhin wird der Baustein nur bei eintreffenden Telegrammen berechnet.
Der Baustein wird nicht bei der Initialisierung berechnet.
`5002|1|0|0`
Hier wird Eingang 1 definiert. Als Init.-Wert erhält der Eingang den Wert 0.
`5004|1|0|1|1|0`
Ausgang 1 besitzt den Init.-Wert 0, wird binär gerundet und bei jeder Berechnung gesendet.
`5004|2|0|1|1|0`
Ausgang 2 hat dieselben Eigenschaften wie Ausgang 1.
`5012|0|""|"EN[1]<>0"|""|1|0|0|2`
Bei jedem eintreffenden Telegramm wird das Ergebnis des Ausdrucks Eingang 1<>0 auf Ausgang 1 gesendet. Trifft die Bedingung zu, ist das Ergebnis des Vergleichs 1 (WAHR).
Somit wird auf Ausgang 1 eine Eins gesendet und auf Ausgang 2 eine Null.

### 10.2.UND-Gatter als Logikmodul

5000|"UND-Gatter\2-fach"|0|2|"E1"|"E2"|4|"A1"|"A2 neg"|"A3 (SBC)"|"A4 neg (SBC)"
Der Baustein wird im HS/FS-Experte in der Kategorie UND-Gatter mit der Bezeichnung 2-fach angezeigt.
Der Baustein ist als nicht remanent gekennzeichnet und hat zwei Eingänge und vier Ausgänge.
`5001|2|4|0|0|1`
Das UND-Gatter hat zwei Eingänge und vier Ausgänge. Es besitzt keine Speichervariablen und keine Zeitspeicher. Der Baustein wird bei der Initialisierung berechnet.
`5002|1|1|0
5002|2|1|0
` Die beiden Eingänge haben den Init-Wert Eins.
`5004|1|0|1|1|0
5004|2|0|1|1|0
` Die Ausgänge 1 und 2 haben jeweils den Init-Wert Null. Das Ergebnis wird immer binär gerundet und bei jeder Berechnung gesendet.
`5004|3|0|1|2|0
5004|4|0|1|2|0
` Die Ausgänge 3 und 4 haben jeweils den Init-Wert Null. Auch hier wird das Ergebnis binär gerundet. Gesendet werden die Werte jeweils nur bei einer Wertänderung.
`5012|0|""|"EN[1] and EN[2]"|""|1|0|0|2`
Eingang 1 und Eingang 2 werden mit dem UND-Operator verknüpft. Das Ergebnis wird auf Ausgang 1 gesendet. Die Negierung wird auf Ausgang 2 gesendet.
`5012|0|"(EI==0)"|"EN[1] and EN[2]"|""|3|0|0|4`
Die Formel ist mit der aus der vorhergehenden 5012er-Zeile identisch. Jedoch hat die Formel aus dieser Zeile eine zusätzliche Bedingung. Die Berechnung wird daher nur dann ausgeführt, wenn die Variable EI den Wert 0 hat. Nur wenn dieser Vergleich 1 (WAHR) ist, wird der UND-Vergleich ausgeführt und das Ergebnis auf die Ausgänge gesendet.

### 10.3.Telegramm-Generator als Logikmodul

5000|"Weitere Bausteine\Telegrammgenerator"|0|2|"E1"|"E2"|2|"A1"|"A2"
Der Baustein wird in der Kategorie Weitere Bausteine unter der Bezeichnung Telegrammgenerator angezeigt. Er hat zwei Eingänge und zwei Ausgänge. Weiterhin ist er als nicht remanent gekennzeichnet.
`5001|2|2|1|0|1`
Der Baustein besitzt zwei Eingänge, zwei Ausgänge, einen Zeitspeicher und keine Speichervariable. Er wird bei der Initialisierung berechnet.
`5002|1|0|0
5002|2|0|0
` Beide Eingänge werden mit dem Wert Null initialisiert.
`5004|1|0|1|1|0
5004|2|0|1|1|0
` Beide Ausgänge werden mit dem Wert Null initialisiert, binär gerundet und bei jeder Berechnung gesendet.
`5012|1|"(EI or OC[1] or EC[1] or EC[2]) and EN[2] and (EN[1]&gt;0)"|"1"|"EN[1]"|1|1|0|2`
Der erste Bedingungsblock wird erfüllt, wenn die Berechnung des Bausteins innerhalb der Initialisierung stattfindet (EI==1), ein Zeitspeicher abgelaufen ist (OC[1]), oder sich einer der Eingänge geändert hat (EC[1], EC[2]).
Ist der erste Block WAHR, Eingang 2 gleich Eins (True/Wahr), und Eingang 1 größer als Null, ist die gesamte Bedingung erfüllt.
Ist dies der Fall, wird auf Ausgang 1 und Zeitspeicher 1 eine Eins gesendet und die Negierung auf Ausgang 2.
Im Feld Formel/Zeit wird der Wert von Eingang 1 als neuer Zeitgeber verwendet. Nach Ablauf dieser Zeit wird der Baustein erneut berechnet.
Hinweis
Trifft vor Ablauf dieser Zeit ein Telegramm auf Eingang 1 oder 2 ein, wird der aktuelle Zeitspeicher abgebrochen und neu gestartet, da er mit einem neuem Wert und einer neuen Zeit beschrieben wird.

### 10.4.Zählerbaustein als Logikmodul

5000|"Weitere Bausteine\Zählerbaustein"|1|4|"E1 (+Zähler)"|"E2 (-Zähler)"|"E3
Reset"|"E4 Ein/Aus"|1|"A1 Takte (sbc)"
Der Baustein wird in der Kategorie Weitere Bausteine unter der Bezeichnung Zählerbaustein angezeigt. Er hat vier Eingänge und einen Ausgang und ist als remanent gekennzeichnet.
`5001|4|1|0|1|1`
Der Baustein besitzt vier Eingänge, einen Ausgang und eine Speichervariable.
Der Baustein wird bei der Initialisierung berechnet.
`5002|1|0|0
5002|2|0|0
5002|3|0|0
5002|4|0|0
` Alle vier Eingänge werden mit dem Wert 0 initialisiert.
`5004|1|0|0|2|0`
Der einzige Ausgang wird mit dem Wert 0 initialisiert, und nur bei einer Änderung gesendet.
`5003|1|0|1`
Die einzige Speichervariable ist remanent.
`5012|0|"EC[1] and EN[1] and EN[4]"|"SN[1]+1"|""|0|0|1|0`
Wenn sich Eingang 1 geändert hat, der Wert von Eingang 1 ungleich Null ist, und der Wert von Eingang 4 ebenfalls ungleich Null ist, wird der Wert der Speichervariable 1 um eins erhöht.
`5012|0|"EC[2] and EN[2] and EN[4] and (SN[1]&gt;0)"|"SN[1]-1"|""|0|0|1|0`
Wenn sich Eingang 2 geändert hat, der Wert von Eingang 2 ungleich Null ist, und der Wert von Eingang 4 ebenfalls ungleich Null ist, wird der Wert der Speichervariable 1 um eins gemindert.
`5012|0|"EC[3] and EN[3]"|"0"|""|0|0|1|0`
Hat sich Eingang 3 geändert und der Wert von Eingang 3 ungleich Null ist, wird die Speichervariable 1 auf Null gesetzt.
`5012|0|"SC[1] or EI"|"SN[1]"|""|1|0|0|0`
Bei Initialisierung oder Wertänderung der ersten Speichervariable wird der Wert der Speichervariable 1 auf Ausgang 1 gesendet.

### 10.5.Ein/Ausschaltverzögerung

5000|"Verzögerung\Ein/Ausschaltverzögerung"|0|3|"E1"|"E2"|"E3"|2|"A1"|"A2"
Der Baustein wird in der Kategorie Verzögerung unter der Bezeichnung Ein/Ausschaltverzögerung angezeigt. Er hat drei Eingänge und zwei Ausgänge und ist als nicht remanent gekennzeichnet.
`5001|3|2|2|2|0`
Der Baustein hat drei Eingänge, zwei Ausgänge, verwendet zwei Zeitspeicher und zwei Speichervariablen.
`5002|1|0|0
5002|2|0|0
5002|3|0|0
` Alle Eingänge haben den Init.-Wert 0
`5003|1|0|0`
Die Speichervariable 1 wird mit dem Wert Null initialisiert.
`5003|2|1|0`
Die Speichervariable 2 wird mit dem Wert Eins initialisiert.
`5004|1|0|1|1|0
5004|2|0|1|1|0
` Alle Ausgänge werden bei Berechnung in Binärform gesendet.
`5012|0|"OC[1]"|"ON[1]"|""|1|0|0|2`
Wird bei abgelaufenem Zeitspeicher 1 berechnet. Sendet den Wert des Zeitspeichers auf Ausgang 1 und den negierten Wert auf Ausgang 2.
`5012|1|"OC[1]"|"0"|""|0|0|1|0`
Ist der Zeitspeicher 1 abgelaufen, wird der Wert Null in die Speichervariable 1 geschrieben und die Berechnung wird danach beendet, es werden keine weiteren Zeilen ausgeführt.
`5012|0|"OC[2]"|"ON[2]"|""|1|0|0|2`
Wird bei abgelaufenem Zeitspeicher 2 berechnet. Sendet den Wert des Zeitspeichers auf Ausgang 1 und den negierten Wert auf Ausgang 2.
`5012|1|"OC[2]"|"1"|""|0|0|2|0`
Ist der Zeitspeicher 2 abgelaufen, wird der Wert Null in die Speichervariable 2 geschrieben und die Berechnung wird danach beendet, es werden keine weiteren Zeilen ausgeführt.
`5012|0|"EC[3] and (EN[3]<>0)"|"1"|"0"|0|2|2|0`
Trifft ein Wert ungleich 0 auf Eingang 3 ein, wird eine Eins in die Speichervariable 2 und in den Zeitspeicher 2 geschrieben, der Zeitgeber 2 wird angehalten. Somit wird die Ausschaltverzögerung gestoppt.
`5012|1|"EC[3] and (EN[3]<>0) and (EN[1]==0)"|"1"|""|1|0|0|2`
Trifft ein Wert ungleich 0 auf Eingang 3 ein und Eingang 1 ist mit einer Null belegt, wird eine Eins auf den Ausgang 1 und eine Null auf Ausgang 2 gesendet.
Danach wird die Berechnung beendet.
`5012|1|"EC[3] and (EN[3]<>0) and (SN[1]==0)"|"1"|"EN[1]"|0|1|1|0`
Trifft ein Wert ungleich 0 auf Eingang 3 ein und Speichervariable 1 ist gleich Null, wird eine Eins in die Speichervariable 1 und den Zeitspeicher 1 geschrieben. Zeitspeicher 1 wird mit dem Wert von Eingang 1 gestartet.
Achtung
Der Zeitspeicher 1 hat den Wert Eins, löst aber nach n-Sekunden (je nach Wert von Eingang 1) eine Neuberechnung aus.
`5012|0|"EC[3] and (EN[3]==0)"|"0"|"0"|0|1|1|0`
Trifft ein Wert gleich 0 auf Eingang 3 ein, wird eine Null in die Speichervariable 1 und in den Zeitspeicher 1 geschrieben, der Zeitgeber 1 wird angehalten. Somit wird die Einschaltverzögerung gestoppt.
`5012|1|"EC[3] and (EN[3]==0) and (EN[2]==0)"|"0"|""|1|0|0|2`
Trifft ein Wert gleich 0 auf Eingang 3 ein und Eingang 2 ist mit einer Null belegt, wird eine Null auf den Ausgang 1 und eine Eins auf Ausgang 2 gesendet.
Danach wird die Berechnung beendet.
`5012|1|"EC[3] and (EN[3]==0) and (SN[2]==1)"|"0"|"EN[2]"|0|2|2|0`
Trifft ein Wert gleich 0 auf Eingang 3 ein und Speichervariable 2 ist gleich Eins, wird eine Null in die Speichervariable 2 und den Zeitspeicher 2 geschrieben. Zeitspeicher 2 wird mit dem Wert von Eingang 2 gestartet.
Achtung
Der Zeitspeicher 2 hat den Wert Null, löst aber nach n-Sekunden (je nach Wert von Eingang 2) eine Neuberechnung aus.

### 10.6.Textauslöser

5000|"Textfunktionen\Textauslöser"|0|1|"E1"|2|"A1 (Textlänge > 0)"|"A2 (Textlänge = 0)"
Der Baustein wird in der Kategorie Textfunktionen unter der Bezeichnung Textauslöser angezeigt. Der Baustein ist als nicht remanent gekennzeichnet und hat einen Eingang und zwei Ausgänge.
`5001|1|2|0|0|0`
Der Baustein hat einen Eingang und zwei Ausgänge. Er besitzt keine Speichervariablen und keine Zeitspeicher. Weiterhin wird der Baustein nur bei eintreffenden Telegrammen berechnet. Der Baustein wird nicht bei der Initialisierung berechnet.
`5002|1|""|1`
Hier wird Eingang 1 als Texteingang definiert. Als Init.-Wert erhält der Eingang einen Leertext.
`5004|1|0|1|1|0`
Ausgang 1 besitzt den Init.-Wert Null. Der Ausgang wird binär gerundet und bei jeder Berechnung gesendet.
`5004|2|0|1|1|0`
Ausgang 2 hat dieselben Eigenschaften wie Ausgang 1.
`5012|0|""|"len(str(EN[1]))>0"|""|1|0|0|2`
Bei jedem eintreffenden Telegramm wird das Ergebnis des Ausdrucks 'Textlänge von Eingang 1' > 0 auf Ausgang 1 gesendet. Trifft die Bedingung zu, ist das Ergebnis des Vergleichs Eins (WAHR).
Somit wird auf Ausgang 1 eine Eins gesendet und auf Ausgang 2 eine Null.

## 11.Veröffentlichung

- 18.09.2018 Version 4.8 - Änderungen
  - Satzart 5003 - Texte sind jetzt erlaubt.
  - Hilfe-Datei - Hinweis auf HTML-Hilfe Mustervorlage hinzugefügt.
  - Container-Datei - Hinweis auf HSLZ-Datei hinzugefügt.
  - Hinweis auf HTTP-Zugriffsmöglichkeit bei Aufruf der Debug-Seite hinzugefügt
  - Hinweis auf die Änderung bei der Nummernkreisvergabe und DSGVO hinzugefügt
  - System-Pfade aktualisiert
- 25.04.2017 Version 4.7 - Änderungen
  - Satzart 5000 - Neue optionale Felder
  - Front- und Back-Page entfernt
  - Angaben von HS/FS-Endpunkten sind jetzt in der Form "https://..."
- 23.02.2016 Version 4.5 - Umstrukturierung
  - Format der Dokumentation von PDF auf HTML umgestellt
  - Alle Kapitel überarbeitet und ggf. aktualisiert
- 14.01.2014 Version 4.2 - Änderungen
  - Satzart 5004 - Ausgangs-Typ: Erklärung zu "sbc" präzisiert
  - Satzart 5012 - negierter Ausgang: Hinweis hinzugefügt
  - Variable - Erklärung zu EI präzisiert
  - Startverhalten der Logik - Kapitel Gestrichen. Inhalt ist in der Online-Hilfe verfügbar
- 22.01.2013 Version 4.0 - Änderungen
  - Versions-Nr der Doku an die Versions-Nummer des Experten angepasst
  - System-Pfade - Format für Experte ab v4.0 hinzugefügt
- 12.10.2012 Version 2.2 - Änderungen
  - Deckblatt - HomeServer 4 & FacilityServer 4 hinzugefügt
  - Zuweisen eines Dateinamens - Korrektur der URL zur Nummernkreis-Seite
  - Logikmodule in Projekt einbinden - Überarbeitet
  - Operatoren - Ergänzt
  - Externe Bibliotheken - Überarbeitet / Ergänzt
- 20.08.2012 Version 2.1 - Änderungen
  - Nummernkreise - Durch neue Inhalte ersetzt
  - Weitere Quellen - Überarbeitet
- 16.12.2011 Version 2.0 - Änderungen
  - Satzart 49999 - Spezifizierung der Beschreibung des Sprachkürzels
- 17.11.2011 Version 1.9 - Änderungen
  - Aufbau der Definitionsdatei - Tabellenzeile mit Satzart 4999 neu hinzugefügt
  - Satzart 49999 - Kapitel neu hinzugefügt
- 21.07.2011 Version 1.8 - Änderungen
  - Satzart 5000 - Neue Funktion: Anzeige der Versions-Nr.
- 25.02.2011 Version 1.7 - Änderungen
  - Kapitel 3.1 - Korrektur der Internet-Adresse
  - Kapitel 3.2 - Ergänzung/Aktualisierung der Angaben zum Logik-Ordner-Pfad
  - Kapitel 4.6 - Korrektur der in der letzten Zeile angegebenen Kapitel-Nr.
  - Kapitel 5 - Korrektur der in der letzten Zeile angegebenen Kapitel-Nr.
  - Neues Kapitel 7 - "Startverhalten der Logik"
  - Kapitel von 7 bis 10 neu nummeriert - Sind jetzt Kapitel 8 bis 11
  - Titelzeile - geändert
- 01.10.2010 Version 1.5 - Änderungen
  - Kapitel 4.2 - Anmerkung 2 im Feld "Kodierter Formel-Block" hinzugefügt.
- 29.09.2010 Version 1.4 - Änderungen
  - Kapitel 4.2 - Neues Feld "Kodierter Formel-Block". Beispiele angepasst.
- 22.09.2009 Version 1.3 - Änderungen
  - Kapitel 4.1 - Es darf ab Experte Version 2.4 eine beliebige Kategorietiefe verwendet werden.
- 18.06.2008 Version 1.2 - Korrekturen
  - Kapitel 2.1 - Internet-Adresse(n) korrigiert
  - Kapitel 2.4 - Text-Korrekturen
  - Kapitel 2.5 - (wurde gestrichen)
  - Kapitel 3.1 - Internet-Adresse korrigiert
- 02.02.2007 Version 1.1 - Ergänzungen und Fehlerbereinigung
  - Kapitel 4.6 - Fehlerkorrektur
  - Kapitel 8 - Kapitel "Fehlersuche" eingefügt
- 19.01.2007 Version 1.0 - Ergänzungen und Fehlerbereinigung
  - Kapitel 4.1 - Ergänzungen
  - Kapitel 4.4 - Ergänzungen
  - Kapitel 4.6 - Formulierung präzisiert
  - Kapitel 5 - Hinweise berichtigt
  - Kapitel 6.2 - Ergänzungen und Beispiel hinzugefügt
  - Kapitel 7 - Ergänzungen
  - Kapitel 8.2 - Ergänzungen und Präzisierung
  - Kapitel 8.3 - Ergänzungen
  - Kapitel 8.4 - Vervollständigung der Satzart 5000
  - Kapitel 8.6 - Berichtigung
- 08.12.2006 Version 0.8 - Ergänzungen und Fehlerbereinigung
  - Kapitel 4.3 - Ergänzungen
  - Kapitel 4.6 - Ergänzungen
  - Kapitel 5 - URL der Debugseite ergänzt
  - Kapitel 7.2 - Kapitel umbenannt und präzisiert, Ergänzungen
  - Kapitel 7.3 - Restriktionen bei der Verwendung von Boolschen Operatoren präzisiert
  - Kapitel 7.4 - Links korrigiert
- 28.08.2006 Version 0.7 - Fehlerbereinigung
  - Kapitel 5 - Textänderung bei der Variable EC
  - Kapitel 6.1 - Ergänzung
- 27.06.2006 Version 0.6 - Ergänzungen
  - Kapitel 7.x - Kapitel 7.3 wurde nach 7.4 verschoben. 7.3 wurde ergänzt.
- 26.06.2006 Version 0.5 - Ergänzungen und Fehlerbereinigung
  - Kapitel 4.2 - Textergänzung
  - Kapitel 4.3 - Korrektur der Beispiele
  - Kapitel 4.4 - Anmerkung
  - Kapitel 4.6 - Ergänzung
  - Kapitel 7.2 - Kapitel wurde ergänzt
- 25.04.2005 Version 0.4 - Fehlerbereinigung
- 05.03.2005 Version 0.3 - Erstveröffentlichung