Dimmer mit einfachem Schalter mit der KL2751 Klemme von Beckhoff

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.

Darstellung der KL2751

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.

Force für Dimmer Variable

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.