Erstellen eines Applikationsbausteins

Im Folgenden soll gezeigt werden, wie auf Basis der Tc3_DALI-Bibliothek ein eigener Applikationsbaustein erstellt werden kann. Das Beispiel beschreibt einen einfachen Funktionsblock, der Vorschaltgeräte per Kurzadresse, Gruppenadresse oder per Sammelruf steuert.

Hier finden Sie das TwinCAT-Projekt mit dem Beispiel.

Erstellen eines Applikationsbausteins 1:

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.

Erstellen eines Applikationsbausteins 2:

Über eine positive Flanke an einem der drei Eingänge wird jeweils der DALI-Befehl RECALL MAX LEVEL, RECALL MIN LEVEL oder OFF versendet.

Parametrierung der DALI-Vorschaltgeräte

Der Baustein kann die Variablen maxLevel, minLevel und fadeTime von den DALI-Vorschaltgeräten initialisieren. Dazu stehen die entsprechenden Eigenschaften zur Verfügung, deren Werte in die DALI-Vorschaltgeräte geschrieben werden, sobald an bInitialize eine positive Flanke erkannt wurde. Während dieser Zeit steht der Ausgang bInitializing auf TRUE.

Erstellen eines Applikationsbausteins 3:

DALI-Kurzadresse für Referenzgerät (nReferenceDeviceAddress)

Der Parameter nReferenceDeviceAddress wird verwendet, sobald im Hintergrund der Ausgangswert eines Referenz-DALI-Vorschaltgerätes zyklisch ausgelesen werden soll (tCycleActualLevel > 0 s). Der Ausgangswert seht am Ausgang nActualLevel zur Verfügung.

Soll mit dem Baustein ein einzelnes DALI-Vorschaltgerät angesteuert werden (eAddressType = E_DALIAddressType.Short), so wird kein Referenz-DALI-Vorschaltgerät benötigt. Der Ausgangswert des einzelnen Vorschaltgerätes wird in diesem Fall über die Einzeladdresse nAddress ermittelt.

Wird mit dem Baustein eine DALI-Gruppe angesprochen (eAddressType = E_DALIAddressType.Group), so muss nReferenceDeviceAddress immer die Kurzadresse eines DALI-Vorschaltgerätes enthalten, welches sich in der angesprochenen DALI-Gruppe befinden muss.

Auch bei einem Sammelruf (eAddressType = E_DALIAddressType.Broadcast) muss sich an der DALI-Linie ein DALI-Vorschaltgerät mit entsprechender Kurzadresse finden.

Ü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

Ähnlich wie bei SetCommunication, wird auch CheckParameters im ersten SPS-Zyklus aufgerufen. Der Aufruf erfolgt aber auch, wenn an den Eingängen bInitialize, bRecallMaxLevel, bRecallMinLevel oder bOff eine positive Flanke erkannt wurde.

Alternativ kann auch jedes Mal die Methode aufgerufen werden, wenn sich der Wert eines Parameters geändert hat.

Aufbau des Bausteins

Im oberen Teil des Bausteins werden die positiven Flanken der Eingänge bInitialize, bRecallMaxLevel, bRecallMinLevel oder bOff abgefragt.

Im mittleren Teil befindet sich eine Schrittkette, in der die einzelnen Aktionen ausgeführt werden. Wird eine positive Flanke an einem der Eingänge erkannt, so wird der entsprechende Schritt der Schrittkette angesprungen. Nach Ausführung der DALI-Befehle RECALL MAX LEVEL (Schritt 200) oder RECALL MIN LEVEL (Schritt 300) wird anschließend der DALI-Befehl QUERY ACTUAL LEVEL versendet Dadurch wird der neue Ausgangswert aus dem DALI-Referenzgerät ausgelesen und an dem Ausgang nActualLevel ausgegeben. Das Schreiben der Variablen maxLevel, minLevel und fadeTime erfolgt ab dem Schritt 10000.

Im unteren Teil wird der Ausgangswert zyklisch aus dem DALI-Referenzgerät ausgelesen und an dem Ausgang nActualLevel ausgegeben.

Anmerkungen

Die Schrittkette kann immer nur dann auf eine neue Aktion gesetzt werden, wenn aktuell keine Aktion ausgeführt werden (nStep = 0).

Auch sollte die Anzahl der DALI-Befehle minimiert werden. So wird z.B. nach den DALI-Befehlen RECALL MAX LEVEL oder RECALL MIN LEVEL der aktuelle Ausgangswert nur dann ausgelesen, wenn in den nächsten 1000 ms nicht der Ausgangswert durch zyklische Abfrage im unter Teil des Bausteins schon erfolgen wird:

IF (((tonCycleActualLevel.PT - tonCycleActualLevel.ET) > T#1S) OR (tCycleActualLevel = T#0S)) THEN
  nStep := 9000;
ELSE
  bBusy := FALSE;
  nStep := 0;
END_IF