Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Themen - wolfii

Seiten: [1]
1
Hallo miteinander,

in der Lib 3.31 ist in GEN_PULSE ein kleiner Fehler reingekommen. Der Wert von tn wird um den jeweils falschen Wert hochgezählt (PTH statt PTL und umgekehrt).

Die korrigierte Fassung schaut bei mir so aus:


IF enq THEN
   tx := DWORD_TO_TIME(T_PLC_MS());
   IF NOT init THEN init := TRUE; tn := tx; END_IF;
   (* This only happens on a timer overflow ... *)
   IF tn > tx THEN
      tn := tx;
   END_IF
   IF tx - tn >= SEL(Q, PTL, PTH) THEN
      tn := tn + SEL(Q, PTL, PTH);
      Q := NOT Q;
   END_IF;
ELSE
   Q := FALSE;
   init := FALSE;
END_IF;

Viele Grüße

Wolfii

2
Hallo miteinander,

vielleicht kann das jemand brauchen:

In der oscat-lib gibts einen Timer-Baustein, den man mit Starttermin und Laufzeit füttert. Für manche Anwendungsfälle war mir ein Timer lieber, den ich mit Start- und Endezeit adressieren kann (beispielsweise brennt unsere Aussenbeleuchtung mit diesem Baustein ab Sonnenuntergang+10min bis zu einer festen Zeit nachts). Liegt die Endezeit vor der Startzeit, geht der Timer davon aus, dass er über Mitternacht laufen soll. Hier also der Quellcode für day_timer

FUNCTION_BLOCK day_timer
VAR_INPUT
   DT_IN: DT;
   starttime: TOD;
   endtime: TOD;
END_VAR
VAR_OUTPUT
   outval: BOOL;
END_VAR
VAR
   currenttime: TOD;
   last_check: TIME := T#0s;
   tx: TIME;
END_VAR


(*
Output is set to TRUE if DT_IN is in between START and END. IF START > END it is
assumed that the timer is meant to run over midnight.
*)
tx := DWORD_TO_TIME(T_PLC_MS());

IF tx - last_check <= T#100ms THEN
   RETURN;
END_IF;

currenttime := DT_TO_TOD(DT_IN);

IF starttime < endtime THEN
   IF currenttime > starttime AND currenttime < endtime THEN
   outval := TRUE;
   ELSE
   outval := FALSE;
   END_IF
ELSE
   IF currenttime > starttime OR currenttime < endtime THEN
   outval := TRUE;
   ELSE
   outval := FALSE;
   END_IF
END_IF
last_check := tx;

3
Bestehende Module / Existing Modules / Vereinfachtes blind_night
« am: 26. Juni 2009, 14:41:03 »
Hallo miteinander,

ich verwende die Jalousienmodule recht ausgiebig in unserem Haus http://www.sonnenhaus-landsham.de/, war aber mit der Funktion von blind_night nicht so ganz glücklich. Insbesondere hat mich gestört, dass blind_night für die laufende Nacht abbricht, wenn einmal eine Handbetätgung passiert ist.

Hier der Quellcode meines Moduls. Es fällt in den Automatikmodus zurück, sobald die Frist für die Handbedienung abgelaufen ist (in meinem Fall sind das zwei Stunden ...). Vielleicht hilfts ja jemandem.

Gruß

Wolfii

FUNCTION_BLOCK blind_night
VAR_INPUT
   UP, DN : BOOL;
   S_IN : BYTE;
   pi, ai : BYTE;
   E_night : BOOL := TRUE;
   E_day   : BOOL := TRUE;
   dtin : DT;
   sunrise, sunset : TOD;
END_VAR
VAR_INPUT CONSTANT
   sunrise_offset : TIME;
   sunset_offset : TIME;
   night_position : BYTE := 0;
   night_angle : BYTE := 0;
END_VAR
VAR_OUTPUT
   QU, QD : BOOL;
   status : BYTE;
   po, ao : BYTE;
END_VAR
VAR
   night : BOOL;
   last_night, last_day : DATE;
END_VAR

IF up AND dn THEN
   IF  (DT_TO_TOD(dtin) > sunset + sunset_offset)  AND e_night THEN
      (* enable night *)
      night := TRUE;
   ELSIF (DT_TO_TOD(dtin) > sunrise + sunrise_offset) AND night AND e_day  THEN
      (* disable night *)
      night := FALSE;
   END_IF;
ELSE
   IF (DT_TO_TOD(dtin) > sunrise + sunrise_offset AND DT_TO_TOD(dtin) < sunset + sunset_offset) THEN
      night := FALSE;
   END_IF
END_IF

(* shade at night only in auto mode and enable = true *)
IF UP AND DN AND night THEN
   status := 141;
   po := night_position;
   ao := night_angle;
   QU := UP;
   QD := DN;
ELSE
   QU := UP;
   QD := DN;
   po := pi;
   ao := ai;
   status := s_in;
END_IF;

Seiten: [1]