====== Mehr zu Makro und Accessory ====== In diesem Kapitel werden tiefergehende Erläuterungen zu Makro und Accessory beschrieben. ===== Allgemein ===== Ein Makro dient zur Steuerung von Abläufen auf einer BiDiB-Baugruppe, wie z.B. der LightControl. Dazu werden mehrere Makroschritte in der konfigurierten Reihenfolge ausgeführt. \\ Die nachfolgende Abbildung zeigt den Makros-Reiter im BiDiB-Wizard. {{:wizard:macro-tab.png|}} ** Startbedingung ** Jedes Makro kann zu einer konfigurierten Zeit durch die Modellbahn-Uhr gestartet werden. Dazu muss die Checkbox aktiviert werden und die Uhrzet ausgewählt werden. Zudem muss das Steuerungsprogramm regelmässig die aktuelle Modellbahn-Zeit senden. **Verzögerungsfaktor** Mit Anpassung des ''Verzögerungsfaktor'' kann die Ausführgeschwindigkeit des Makro angepasst werden. Dieser Verzögerungsfaktor gilt für alle "Verzögerungen" (Eintrag in Spalte Wartezeit sowie in Schritten mit Port Typ "Verzögerung") im aktuellen Makro. Ein Wert von 2 führt zu einer Verdoppelung der Wartezeit während der Ausführung. \\ Hinweis: Die Wartezeit wird in Ticks angegeben. Normalerweise (bei Verzögerungsfaktor 1) dauert ein Tick 20ms. **Durchläufe** Der Wert im Schieber ''Durchläufe'' bestimmt, wie oft ein Makro durchläuft, nachdem es gestartet wurde. Der Standardwert ist 1, wodurch ein gestartetes Makro 1-mal ausgeführt wird. Wird die Anzahl Durchläufe auf unendlich (∞) gesetzt, dann läuft das Makro bis es wieder gestoppt wird. ===== Makroschritte ===== In den folgenden Abschnitten werden die Optionen der Spalte ''Porttyp'' beschrieben. Bei einigen ''Porttypen'' ist die Spalte ''Verzögerung'' aktiviert. Ein Verzögerungswert wird verwendet, um zu warten, //bevor// der Schritt ausgeführt wird. Wenn Sie vor dem Schritt eine Verzögerung hinzufügen möchten, müssen Sie den Port Typ ''Verzögerung'' verwenden. \\ Bei den ''Ticks'' handelt es sich um eine Zeitangabe für die Wartezeit bis zur Ausführung der Aktion. Die Grundeinheit ist ein Makro-Tick und beträgt 20 ms. ===== Makro ===== Der Porttyp ''Makro'' ermöglicht das ''Starten'' oder ''Stoppen'' eines anderen Makros aus dem ausgewählten Makro. Dies ist erforderlich, wenn mehrere Makros ausgeführt werden, die dieselben Ports steuern. ===== Eingang ===== Der Porttyp ''Eingang'' ermöglicht es, die aktuelle Makroausführung in diesem Schritt zu blockieren, bis die ausgewählte Option in der Spalte ''Action'' erfüllt ist. Wenn Sie ''Warten bis Wert=0'' wählen, wird das Makro in diesem Schritt blockiert, bis der ausgewählte Eingabeport einen Wert von 0 (aus) hat. Wenn Sie ''Warten bis Wert=1'' wählen, wird das Makro in diesem Schritt blockiert, bis der ausgewählte Eingabeport den Wert 1 (ein) hat. Die nachfolgende Abbildung zeigt die Konfguration um das Makro im Schritt 2 so lange anzuhalten bis der Input_0 den Wert 0 hat. {{:wizard:queryinput.png|}} ===== Andere Port-Typen ===== Die anderen //einfachen// Porttypen wie * ''Lichtausgang'' * ''Servoausgang'' * ''Schaltausgang'' * ''Schaltausgang-Paar'' ermöglichen die Ausführung einer Aktion am ausgewählten Port. Für ''Servoausgang'' muss der ''Zielwert'' in der Spalte ''Extra'' eingegeben werden. Dieser Wert wird in diesem Schritt als Zielwert für das Servo verwendet. ===== Servo-Bewegung abwarten ===== Der Typ ''Servo-Bewegung abwarten'' blockiert das aktuelle Makro in diesem Schritt, bis das ausgewählte Servo den Zielwert erreicht hat. ===== Verzögerungen ===== Der Typ ''Verzögerung'' ermöglicht es, in diesem Schritt auf die konfigurierte Verzögerung zu warten. Die ''Zufällige Verzögerung'' ermöglicht das Warten auf eine zufällige Verzögerung mit maximal der in diesem Schritt konfigurierten Verzögerung. Bei den ''Ticks'' handelt es sich um eine Zeitangabe für die Wartezeit bis zur Ausführung der Aktion. Die Grundeinheit ist ein Makro-Tick und beträgt 20 ms. In das Eingabefeld ''Wartezeit'' kann man nur einen Wert von 0-255 eintragen. Benötigt man eine größere Wartezeit, kann man die Ticks mit einem Verzögerungsfaktor verändern. Dafür gibt es den Verzögerungsfaktor-Schieber am oberen Bildrand des Aktionsfensters (siehe oben). Dieser Faktor wirkt jedoch auf alle Wartezeiten in diesem Makro. \\ Alternativ kann man auch mehrere Schritte vom Typ ''Verzögerung'' im Makro benutzen. ===== Flag ===== Der Typ ''Flag'' wird zum ''Löschen'', ''Abfragen'' oder ''Setzen'' eines Flags verwendet. Ein Flag ist ein **baugruppenweiter** //Merker// und wird von allen Makros gemeinsam genutzt. Wenn Sie das Flag in einem Makro ''setzen'' oder ''löschen'', sehen alle anderen Makros denselben Flag-Wert. \\ Dies kann verwendet werden, um ein Makro warten zu lassen (in diesem Schritt blockieren), bis ein Flag-Wert ''0'' (''abfragen 0'') oder ''1'' (''abfragen 1'') vor dem Makro erhält geht weiter. Flags sind nur intern im Knoten verfügbar und der aktuelle Wert kann nicht von außerhalb einer Makroausführung abgefragt oder festgelegt werden. ===== Kritischer Bereich ===== Der Typ ''Kritischer Bereich'' wird verwendet, um die Schritte zwischen dem Schritt ''Kritischer Bereich'', Aktion ''Start'' und dem Schritt ''Kritischer Bereich'', Aktion ''Ende'' vor Unterbrechung oder Abbruch zu schützen . {{ :wizard:macro-critical-section.png |}} :!: Der Schritt ''Kritischer Bereich'' ist eine Hülle um einige Schritte und daher müssen Sie einen Schritt ''Start'' und einen Schritt ''Ende'' haben, um korrekt zu funktionieren. ===== Accessory notify ===== Der Typ ''Accessory notify'' darf nur verwendet werden, wenn das Accessory das Ergebnis senden soll, bevor das Accessory fertig (wirklich fertig) ist. Normalerweise wird die "Accessory fertig durchgelaufen"-Meldung immer nach dem Ende der Ausführung des Accessory gesendet (Normalfall: wenn das zugewiesene Makro beendet ist). Dies dient dazu den kritischen Vorgang der Accessory-Ausführung überwachen zu können. Falls nämlich ein Fehler auftritt wird der Fehler zurückgemeldet und nicht ok. Diese „Ende“-Mitteilung wird pro Ausführung eines Accessory genau 1x gesendet. Falls man erreichen will, dass diese Benachrichtigung schon vor dem eigentlichen Ende der Ausführung des Accessory an das Steuerungs-Programm gesendet wird (weil z.B. alle kritischen Schaltvorgänge schon durchgeführt sind), dann kann man den Befehl "Accessory notify" verwenden. Wenn man das "Accessory notify" mehr als 1x im Makro drin hat, dann hat es keine Auswirkung mehr nachdem das 1. "Accessory notify" gesendet wurde, denn der "Befehl" wird nicht mehr gesendet. Denken Sie z.B. an den Fall, dass das Makro die Tore eines Bahnübergangs schließt. Die Signalleuchten beginnen zu blinken, die Schranken werden mit dem Servo nach unten bewegt, erreichen ihre Endposition und die Signalleuchten sollten einige Zeit blinken. Das folgende Bild zeigt die erforderlichen Makros. {{ :macro:macro_00-03.png |}} Wenn Sie den Aspekt des Zubehörteils zuweisen und die Testtaste drücken, befindet sich das Accessory im Status ''Ausstehend'' (das Uhrensymbol im Assistenten), bis der Eingang mit dem Namen ''Servoende rechts erreicht'' (oder links erreicht) den Wert ''1'' (ich habe es mit einer Verknüpfung auf GPIO 0 getestet, das ist Port 25) und erreicht dann den Status ''Fertig'' (das grüne Markierungssymbol im Assistenten). Wenn dieser Eingangsport nicht den Wert ''1'' erhält, wird das Zubehör nicht als fertig gemeldet und bleibt im Status ''Ausstehend''. Bei dieser Beschreibung handelte es sich um die //normale Ausführung// eines Accessory. Wenn Sie signalisieren möchten, dass das Accessory früher fertig ist, weil Sie beispielsweise einen Ton hinzugefügt haben, der von Anfang an und während des Absenkens der Schranken abgespielt wird, und 20 Sekunden nachdem die Schranken (das Servo) die Endposition erreicht haben, sollte der Ton ausgeschaltet werden, dann könnten Sie die ''Accessory notify''-Aktionen verwenden. {{ :macro:macro_00_enhanced.png |}} Sie können hier ''Accessory notify'' verwenden, da es dem Zug egal ist, ob der Ton aufgehört hat zu spielen, sondern nur, dass die Schranken unten sind und der Eingang 'Servo rechts/links umschalten erreicht' 'glücklich' ist. \\ In diesem Fall können Sie einen Schritt ''Accessory notify'' verwenden, nachdem die Endposition erreicht wurde (bestätigt durch die Eingabe), bevor der Ton beendet ist (und damit das Makro beendet ist). {{ :macro:macro_00_acc_notify.png |}} ===== Accessory notify - ' Okay melden, wenn Wert = 0 / 1' ===== Im folgenden Makro wird das Zubehör immer mit einem Fehler beendet, da in Schritt 4 der Eingang 24: ''Servo-Ende links erreicht'' wartet, bis er ''1'' wird, und einige ms später die Prüfung in Schritt 6 auf denselben Eingang mit einem Wert = ' erfolgt. 0' wird durchgeführt. \\ Daher sollte die Aktion als 'Ergebnis zurückgeben, okay, wenn Wert = '0' und andernfalls ein Fehler' interpretiert werden. {{ :macro:macro_00_acc_notify_ok_if_0.png |}}