HSL2.0 - Initialisierungs-Phase
Inhalt
1.
Einleitung
2.
Beispiel
2.1.
Fall 1: Baustein B1 ist ein HSL1.0-Baustein
2.2.
Fall 2: Baustein B1 ist ein HSL2.0-Baustein

## 1.Einleitung

Informationen zur Verhaltensweise von HSL2.0-Bausteinen während der Initialisierung und die richtige Vorgehensweise.
Während der Initialisierung werden die Bausteine abgearbeitet. Die genaue Vorgehensweise dabei ist in der HTML-Online-Hilfe des HS/FS Experte unter "Startverhalten der Logik" (logikstart.html) beschrieben.
Bei einem HSL 2.0-Baustein sind dabei folgende Punkte/Ereignisse zu beachten, die in dieser Reihenfolge stattfinden:

- Das Instanzieren der HSL 2.0-Klasse findet im Kontext der Logik statt.
- Die Methode on_init() wird im Kontext des Bausteins ausgeführt. Die Berechnung blockiert den Logik-Thread nicht. HSL2.0-Bausteine werden bei Neustart immer berechnet.
- Bei allen Eingangstelegrammen, die nach der Initialisierung eines Bausteins eintreffen, wird die Methode on_input_value() im Kontext des Bausteins ausgeführt. Die Berechnung blockiert den Logik-Thread nicht.

Daraus folgt, dass es Situationen gibt, in denen sich HSL2.0 und HSL1.0 Bausteine unterschiedlich verhalten.

## 2.Beispiel

Das Schaubild zeigt vereinfacht dargestellt zwei Bausteine, die miteinander und mit mehreren KO verbunden sind:

- E1, E2: K-Objekte, die mit den Eingängen von Baustein B1 verbunden sind
- E3: K-Objekt, das mit einem der Eingänge von Baustein B2 verbunden ist
- A1: K-Objekt, das mit dem Ausgang von Baustein B2 verbunden ist
- B1: Ein "UND-Gatter" als HSL1.0- (Baustein-ID 9002) oder HSL2.0-Baustein (Code-Beispiel siehe hier)
- B2: Ein "ODER-Gatter" als HSL1.0-Baustein (Baustein-ID 9005)

### 2.1.Fall 1: Baustein B1 ist ein HSL1.0-Baustein

In diesem Fall bilden die Bausteine B1 und B2 eine "Berechnungs-Kette", die bei der Initialisierung von rechts nach links abgearbeitet wird. (siehe bereits eingangs erwähnte Doku "Startverhalten der Logik")
Dabei werden die Werte der KO, die mit den Eingängen von Baustein B1 verbunden sind, berücksichtigt und der Eingang von B2 erhält während der Initialisierung den Wert, der durch Berechnung von Baustein B1 an dessen Ausgang anliegt.
Fazit: Baustein B2 feuert nach Ende der gesamten Logik-Initialisierung genau ein einziges Mal, und zwar den Wert, der durch Berechnung der gesamten "Kette" entstanden ist.

### 2.2.Fall 2: Baustein B1 ist ein HSL2.0-Baustein

Baustein B1 wird während der Initialisierung der Logik instanziert. An dieser Stelle ist es nicht möglich, einen Ausgang zu beschreiben, womit die "Berechnungs-Kette" unterbrochen ist.
In diesem Fall erhält der Eingang von B2 bei dessen Initialisierung den Init-Wert des Ausgangs von B1 und nach Abschluss der Logik-Initialisierung feuert der Baustein. Dies alles findet im Logik-Kontext statt.
Baustein B1 wird parallel dazu im Baustein-Kontext berechnet, die Methode on_init() wird angestoßen und er feuert. Dieser Wert wird in die Queue des Logik-Kontexts eingereiht.
Fazit: Baustein B2 feuert nach Ende der Logik-Initialisierung einmal, und zwar den Wert, der unter Verwendung des Init-Werts vom Ausgang von Baustein B1 entstanden ist. Bei Abarbeitung der Logik-Queue kommt es dann zum zweiten Feuern von Baustein B2, diesmal mit dem Wert, der durch die Berechnung von Baustein B1 entstanden ist.
Hinweis
Wird ein Eingang mit einem Init-Wert belegt, der während der Laufzeit nie an diesem Eingang empfangen werden kann (der Init-Wert liegt außerhalb des Wertebereichs des mit dem Eingang verbundenen KO), kann während der Initialisierung (in der Methode on_init()) der am Eingang anliegende Wert mittels self.get_input_value() mit dem Init-Wert verglichen und somit festgestellt werden, ob der Eingang bereits vor der Berechnung des Bausteins von dem KO beschrieben wurde.