Erstellen eines Gerätebausteins
Im Folgenden soll gezeigt werden, wie auf Basis der Tc3_DALI-Bibliothek ein eigener Gerätebaustein erstellt werden kann. Das Beispiel beschreibt einen einfachen Funktionsblock, der ein DALI-Sensor (Input device) mit Präsenzmelder (Instanz 0) und Helligkeitssensor (Instanz 1) abbildet.
Hier finden Sie das TwinCAT-Projekt mit dem Beispiel .
![]() | Das TwinCAT-Projekt steht als *.zip Datei zum Download zur Verfügung. Diese muss zuerst lokal entpackt werden, damit das Archiv (*.tnzip Datei) zum Import in das TwinCAT-Projekt zur Verfügung steht. |

Über die Eingänge bQueryOccupancy und bQueryBrightness wird unmittelbar von der jeweiligen Instanz der aktuelle Messwert ausgelesen und am Ausgang bOccupied bzw. nBrightnessLevel ausgegeben. Während des Lesevorgangs ist der Ausgang bReadingOccupancy bzw. bReadingBrightness = TRUE.
Durch eine positive Flanke am Eingang bCancelHoldTimerOccupancy wird an die Instanz 0 (Präsenzmelder) der DALI-Befehl CANCEL HOLD TIMER gesendet. Dadurch wird der Hold Timer vorzeitig beendet und falls keine Bewegung vorhanden ist, der Ausgang bOccupied auf FALSE gesetzt.
Parametrierung der DALI-Vorschaltgeräte
Der Baustein kann alle relevanten Variablen vom Präsenzmelder (Instanz 0) und vom Helligkeitssensor (Instanz 1) initialisieren. Dazu stehen die entsprechenden Eigenschaften zur Verfügung, deren Werte in das DALI-Steuergerät geschrieben werden, sobald an bInitialize eine positive Flanke erkannt wurde. Während dieser Zeit steht der Ausgang bInitializing auf TRUE.

Übergabe der Referenz auf den Kommunikationsbaustein
Bei der Deklaration des Bausteins wird in runden Klammern der vollständige Pfad des Kommunikationsbausteins (FB_KL6811Communication, FB_KL6821Communication oder FB_EL6821Communication,…) angegeben.
fbDALIApplicationExample : FB_DALIApplicationExample(Communication.fbKL6821Communication);
Hierüber wird festgelegt, über welche DALI-Klemme der Baustein kommunizieren soll.
In FB_DALIApplicationExample wird der Parameter durch die Methode FB_init übergeben. Der Aufruf der Methode FB_init erfolgt automatisch durch die Laufzeitumgebung von TwinCAT 3, einmalig vor dem Starten des SPS-Programms.
Der Parameter ist vom Typ I_DALICommunication und in der Tc3_DALI-Bibliothek enthalten. Alle Kommunikationsbausteine (FB_KL6811Communication, FB_KL6821Communication oder FB_EL6821Communication, …) haben dieses Interface implementiert. Über den Interface-Pointer kommunizieren alle DALI-Befehlsbausteine (z. B. FB_DALI102Off) mit dem DALI-Kommunikationsbaustein.
In der Methode FB_init wird der Parameter der Variablen _ipDALICommunication des Funktionsblocks zugewiesen.
Damit zur Laufzeit die Referenz geändert werden kann, wird außerdem der Interface-Pointer über die Eigenschaft ipDALICommunication an den Gerätebaustein übergeben. Intern wird die Eigenschaft auch hier in der Variablen _ipDALICommunication abgelegt.
Im Gerätebaustein muss sichergestellt sein, dass dieser Interface-Pointer an alle DALI-Befehlsbausteine weitergegeben wird. Hierzu steht die interne Methode SetCommunication zur Verfügung. In dieser Methode wird der Interface-Pointer an alle DALI-Befehlsbausteine übergeben, die sich im Funktionsbaustein befinden. Hierzu wird in den Befehlsbausteinen die Eigenschaft ipDALICommunication verwendet. Mit dieser Eigenschaft wird die Referenz auf den DALI-Kommunikationsbaustein zur Laufzeit neu zugewiesen.
Überprüfen der Parameter
Die Überprüfung aller Parameter erfolgt durch die internen Methode CheckParameters. Die Methode liefert die Error-Id zurück, oder 0, falls kein Fehler vorliegt. Hierbei können die Ids der Laufzeitmeldungen verwendet werden:
IF (THIS^.ipDALICommunication = 0) THEN
CheckParameters := TC_EVENTS.TcDALIEventClass.TheInterfaceToTheCommunicationBufferIsNotInitialized.nEventId;
END_IF
Bei Bedarf können aber auch eigene Error-Ids, die bei 1000 beginnen, zum Einsatz kommen:
IF (<check your parameter>) THEN
CheckParameters := 1000;
END_IF
CheckParameters wird im ersten SPS-Zyklus und bei einer positiven Flanke am Eingang bInitialize aufgerufen.
Außerdem wird die Methode CheckParameters aufgerufen, sobald sich ein Parameter geändert hat. Die Überprüfung auf Änderung der Parameter erfolgt in der Methode ParameterChanged. Liefert diese TRUE zurück, so wurde ein Parameter geändert. Anschließend wird mit der Methode CheckParameters geprüft ob alle Parameter korrekte Werte enthalten. Ist dieses nicht der Fall, wird der Baustein beendet.
IF (THIS^.ParameterChanged()) THEN
nErrorId := THIS^.CheckParameters();
bError := (nErrorId > 0);
IF (bError) THEN
bParameterInvalid := TRUE;
RETURN;
ELSE
bParameterInvalid := FALSE;
END_IF
END_IF
IF (bParameterInvalid) THEN
RETURN;
END_IF
Aufbau des Bausteins
Im oberen Teil des Bausteins werden beim erstmaligen Starten die Parameter (CheckParameters) überprüft und der Interface Pointer vom Kommunikationsbaustein (_ipDALICommunication) an die internen DALI-Bausteine übergeben (SetCommunication).
Im mittleren Teil befindet sich eine Schrittkette, mit der das DALI-Steuergerät initialisiert wird. Hierfür werden die Bausteine FB_DALI103ControlDevice, FB_DALI303OccupancySensor und FB_DALI304LightSensor verwendet. Zum Schluss der Initialisierung wird aus beiden Instanzen der aktuelle Messwert ausgelesen. Die Initialisierung darf nur dann gestartet werden, wenn aktuell kein Messwert ausgelesen wird (bReadingOccupancy und bReadingBrightness sind FALSE).
Im unteren Teil werden die Notifications ausgewertet und das Lesen der Messwerte durch die Eingänge bQueryOccupancy und bQueryBrightness ausgeführt. Hierfür werden ebenfalls die Bausteine FB_DALI103ControlDevice, FB_DALI303OccupancySensor und FB_DALI304LightSensor verwendet. Dieser Bereich wird nur abgearbeitet, wenn die Initialisierung nicht aktiv ist.