Um das Licht zu dimmen, setzen wir die Beckhoff Klemme KL2751 ein. Mit dieser ist es einfach möglich, eine Lampe zu dimmen. Dies wollen wir in verschiedenen Räumen verwenden, um ein angenehmeres Licht zu erzeugen.
Neben der eigentlich Dimmerklemme, die direkt 230V als Ergebnis ausgibt brauchen wir auch einen binäre Eingangsklemme, um das Signal des Lichtschalters auswerten zu können. Hierzu verwenden wir, wie für alle Schalter die KL1808. An dieser ist ein Gira 4-fach Taster angeschlossen. Von diesem 4-fach-Taster wollen wir eine Wippe für das Dimmen des Lichtes verwenden. Damit sollen folgende Funktionen umgesetzt werden:
- Per kurzen Druck soll das Licht entweder auf 100% (obere Wippe) oder auf 0% ausgeschaltet (untere Wippe) gesetzt werden.
- Bei langen Druck soll das Licht gedimmt werden, solange auf den Schalter gedrückt wird. Dabei soll man von jeder beliebigen Position starten können.
Klemme anschließen
Die Klemme muss hinter einer Stromeinspeiseklemme KL9160 Klemme gesteckt sein, da sie über die KL9160 Klemme mit 230V versorgt wird. Hier muss aufgepasst werden, dass nicht zu viele Klemmen hinter eine Stromeinspeiseklemme gepackt werden.
An die Klemme haben wir zum Testen entweder eine klassische Glühlampe oder eine dimmbare LED in einer Baufassung angeschlossen. Bei den dimmbaren LEDs muss man auf eine gute Qualität achten, damit die Dimmfunktion auch möglichst linear funktioniert. Die Baufassung ist dabei an die Ausgänge 1 und 3 angeschlossen, könnten aber auch an die Ausgänge 5 und 7 angeschlossen werden. Mit einer Klemme lassen sich so zwei Lampen dimmen, allerdings mit den identischen Werten. Dies macht also nur dann Sinn, wenn beide Lampen z.B. im gleichen Raum sind.
Mit der KL2751 Klemme als Aktor dimmen
Jetzt muss diese KL2751 Klemme angesprochen werden. Für den ersten Test kann man die Variablen direkt ansprechen. Dazu setzt man die Data Out Variable auf einen Wer zwischen 0 und 32767 (bzw. 0x0000 und 0x7FFF). Dies entspricht bei Integer den positiven Zahlen, 0x8000 bis 0xFFFF sind negative Zahlen. Per Force wird dieser Wert gesetzt.
Hier kann man mit einigen Werten rumspielen, um zu sehen, dass das Dimmen der angeschlossenen Lampe grundsätzlich funktioniert.
Jetzt kann eine mit dem Ausgang verknüpfte Variable den Wert gesetzt bekommen.
VAR data AT %Q*: INT; END_VAR data := 16383;
Normalen Lichtschalter als Dimmer-Sensor konfigurieren
Da Schalter leicht prellen können, haben wir uns für eine sehr einfache Anti-Prell-Funktion entschieden. Dazu schauen wir uns die letzten 5 Werte an und entscheide anhand der Mehrheit der Werte, welcher Wert gerade gilt.
_pufferUp[0] := _pufferUp[1]; _pufferUp[1] := _pufferUp[2]; _pufferUp[2] := _pufferUp[3]; _pufferUp[3] := _pufferUp[4]; IF _portUp.DataBool THEN _pufferUp[4] := 1; ELSE _pufferUp[4] := 0; END_IF _actValueUp := _pufferUp[0] + _pufferUp[1] + _pufferUp[2] + _pufferUp[3] + _pufferUp[4] > 2;
Analog wird das gleiche für den zweiten Schalter gemacht.
_pufferDown[0] := _pufferDown[1]; _pufferDown[1] := _pufferDown[2]; _pufferDown[2] := _pufferDown[3]; _pufferDown[3] := _pufferDown[4]; IF _portDown.DataBool THEN _pufferDown[4] := 1; ELSE _pufferDown[4] := 0; END_IF _actValueDown := _pufferDown[0] + _pufferDown[1] + _pufferDown[2] + _pufferDown[3] + _pufferDown[4] > 2;
Als erstes haben wir eine Funktion implementiert, die das kurze Drücken als Ein- bzw. Ausschalten erkennt und bei langem Drücken das Dimmen. Dazu benötigen wir die folgenden Konstanten:
VAR CONSTANT click_min : INT := 2; click_max : INT := 10; dimm_max : INT := 100; END_VAR
Mit diesen wird die Anzahl der Durchläufe festgelegt, die gelten, damit das Ganze als ein Klick angesehen wird und ab wann als Dimmen. Das Ganze wurde durch einige Versuche mit dem Schalter festgelegt.
Mit diesen Werten können wir jetzt einfach mitzählen und dann entscheiden, ob es sich gerade um ein Dimmen oder ein Klicken handelt.
IF _actValueUp THEN _duration_on := _duration_on + 1; IF _duration_on > click_max THEN // Dimmen statt klicken SetValue(MIN(INT_TO_REAL(_duration_on) / dimm_max, 1.0)); END_IF _lastActiveUp := TRUE; END_IF IF _actValueDown THEN _duration_on := _duration_on + 1; IF _duration_on > click_max THEN SetValue(MAX(INT_TO_REAL(_duration_on) / dimm_max, 0.0)); END_IF _lastActiveUp := FALSE; END_IF IF NOT _actValueUp AND NOT _actValueDown THEN IF _duration_on > 0 THEN IF _duration_on >= click_min AND _duration_on <= click_max THEN IF _lastActiveUp THEN SetValue(1.0); ELSE SetValue(0.0); END_IF END_IF _duration_on := 0; END_IF END_IF
Die oben angegeben Funktion hat jetzt nur noch das Problem, dass das Dimmen jetzt immer bei 0% oder 100% beginnt, je nachdem in welche Richtung man dimmt. Um das zu umgehen, nutzen wir die Variable _baseVal, in der der aktuelle Dimm-Zustand gespeichert wird. Das sieht dann für die eine Richtung wie folgt aus:
IF _actValueUp THEN IF _duration_on <= 0 THEN _baseVal := _lastValue; END_IF _duration_on := _duration_on + 1; IF _duration_on > click_max THEN SetValue(MIN(_baseVal + INT_TO_REAL(_duration_on) / dimm_max, 1.0)); END_IF _lastActiveUp := TRUE; END_IF
Wie man sieht, berechnet die Funktionen einen Wert zwischen 0 und 1. Diese muss jetzt noch in einen Wert zwischen 0 und 32767 umgerechnet werden. Dies geht sehr einfach per folgender Zeile:
data := REAL_TO_INT(DataReal * 32767);
Alles zusammengefasst kann nun mit dem Schalter der Dimmer gesteuert werden, der sowohl den Klick, als auch das Dimmen beherrscht.