# Wochenzeitschaltuhr ??



## Der Nils (10 Dezember 2008)

Hallo
Wer kann mir auf die Sprünge helfen??

Ich möchte div. Steuerungsaufgaben die momentan mit Logos realisiert sind mit ner Beckhoff BC 9050 und zB. KL 4004 etwas eleganter lösen.
Das funktionier ansich auch ganz gut nur mit der Echtzeit Schaltuhr (Wochenprogramm) hab ich keine Idee .
Eine Lampe soll morgens langsam starten
von 0 zu 100% innerhalb einer halben Stunde
nach 10 bis 11 Stunden dann wieder langsam auf 0
hab schon hier und da gelesen und  gefr(oo)gelt komme aber nich so richtig dahinter wie das geht.
mit Ton und dann hoch addieren aber dann müsste ich genau zum richtigen Zeitpunkt starten ......
hat die/der  BC 9050 eine Echtzeituhr???


----------



## drfunfrock (10 Dezember 2008)

Nimm die Bibliothek OSCAT, dort sind Datumsfunk. zu finden, glaube ich jedenfalls.


----------



## Der Nils (10 Dezember 2008)

Hallo
Danke für die schnelle Antwort....
Oscat sieht sehr vielversprechend aus doch
leider sagt er das der Speicher für die globalen Variablen aufgebraucht ist wenn ich die oscat302.lib in PLC Control lade.

Gruß vom Nils


----------



## Brro87 (11 Dezember 2008)

Du kannst unter Projekt ->  Optionen -> TwinCat -> Data den reservierten Speicherplatz erhöhen.


----------



## Der Nils (11 Dezember 2008)

Hi

Unter ,,Projekt / Optionen ...hab ich den Punkt TwinCat nicht ???
BC 9050 is ja auch ein Controler ....da gibt es den Punkt nich..
OSCAT wird da dann wohl auch nich das richtige sein.?!


Gruß vom Nils


----------



## hugo (12 Dezember 2008)

versuchs mal mit projekt / optionen / übersetzungsoptionen
dort konstanten ersetzen anklicken


----------



## master (12 Dezember 2008)

Hallo Nils,

habe vor kurzem eine Heizungssteuerung mit einem BC 9000 gemacht.
Als Echtzeituhr habe ich den RTC Baustein genommen. Getriggert wird dieser baustein vom DCF77 Baustein aus der Oscat lib. Als DCF Empfänger habe ich den vom Conrad genommen (ca.10€) und eine kleine Verstärkerstufe dahinter geschaltet.
Eine Wochenzeitschaltuhr mit 10 Nocken und der dazugehörigen TC Target Visu habe ich mir selber Programmiert.

Gruß
Markus


----------



## drfunfrock (15 Dezember 2008)

Der Nils schrieb:


> Hi
> 
> Unter ,,Projekt / Optionen ...hab ich den Punkt TwinCat nicht ???
> BC 9050 is ja auch ein Controler ....da gibt es den Punkt nich..
> ...



Der Speicher ist Workspace->Twincat einzustellen


----------



## Der Nils (15 Dezember 2008)

Hallo
Dank diesem Forum hab ich jetz RTC und Zeitschaltuhr am Laufen (auch ohne oscat)
Aber für die KL 4004 hab ich keine richtige Idee...
Zeitgesteuert 1-10V hoch und wieder runter dimmen ???
Hab noch nie mit analogen Ausgängen gearbeitet...
Freue mich über jeden Tipp


----------



## master (17 Dezember 2008)

Hallo Nils,

also ich würde durch die positive Flanke der Zeitschaltuhr einen wert (int) in eine Variable schreiben.
Den Wert der Variable dann mit einem Sollwert vergleichen, solange die nicht gleich sind wird ein Unterprogramm aufgerufen und z.B. jede sekunde der Variablenwert um eine gewisse Schrittweite verringert oder vergrößert.
Den Variablenwert skalierst du dann und gibst ihn über die Analogausgabe aus.
Soll der Dimmvorgang für das Auge linear verlaufen, mußt du den Variablenwert noch über eine e-funktion führen.

Gruß
Markus


----------



## Der Nils (18 Dezember 2008)

Hallo

Wie könnte ich die Zeit in der ich von 1 auf 10 V regle beeinflussen???
Und wie wichtig ist wohl die e-Funktion ???
Sollte man das überhaupt so machen ???

FUNCTION_BLOCK Dimmer
VAR_INPUT

    Soll_min:           INT; (*    3276 = 1   V *)
    Soll_max:          INT; (* 32767 = 10 V *)
    Istwert:             INT;

    An_von_Uhr:    BOOL;

END_VAR
VAR_OUTPUT

    Steuerspannung:     INT;

END_VAR
VAR
END_VAR

IF An_von_Uhr AND Istwert < 3276 THEN
Istwert:= 3276;
END_IF
IF An_von_Uhr AND Istwert < Soll_max THEN
Istwert:= Istwert +1;
END_IF
IF An_von_Uhr = FALSE AND Istwert > Soll_min THEN
Istwert:= Istwert - 1;
END_IF

Steuerspannung:= Istwert;


----------



## master (18 Dezember 2008)

Hallo Nils,

eine zeitliche Verzögerung beim hoch und runterzählen (ca.1s) nicht vergessen, sonst geht es ein wenig schnell.

gruß

Markus


----------



## Der Nils (19 Dezember 2008)

Hi

Wenn 32767 -> 10 Volt   und 3276 -> 1 Volt
hab ich nen Regelbereich von 29491.
Im Sekundentakt dauert das schon zulange....?
Wie könnte man den die Zeit einbinden (ST-Befehl)???


----------



## Brro87 (19 Dezember 2008)

Hallo Nils



> _Im Sekundentakt dauert das schon zulange....?_


Klar! Bei einem Delta (_Unterschied, des Regelbereich vor und nach einem Durchlauf deines FB_) von nur 1, du kannst, das Delta locker höher setzen.

Angenommen der Impuls ist 1Sekunde
Bei deinem Regelbereich von 29491 enspricht dies ungefähr 8 Stunden, bis dein Dimmer den SollWert_Max erreicht hat.

Jetzt ist rechen angesagt...
Willst du z.B. in einer Stunde hochdimmen, dann sie dein Delta etwa so aus:
 1 Stunde = 60 Min = 3600 Sekunden
Delta = 29491 / 3600 => also ca. 8



> _Wie könnte man den die Zeit einbinden (ST-Befehl)??? _


In Oscat gibts glaubs eine Timer....

Gruss
Roman


----------



## Brro87 (19 Dezember 2008)

Hallo Nils

Bei mir würde dein FB, etwa so aussehen....


*Deklaration*

```
FUNCTION_BLOCK Dimmer
VAR_INPUT
  Soll_min     : INT := 3276;  (* 3276 = 1 V *)
  Soll_max     : INT;:= 32767; (* 32767 = 10 V *)
    Istwert      : INT;
  Dimmzeit     : INT; (*Zeit die der Dimmer braucht / in Minuten*)

  An_von_Uhr   : BOOL;
END_VAR
VAR_OUTPUT
  Steuerspannung  : INT;
END_VAR
VAR
  Delta        : INT := 0; (*Um so viel wird jede Sekunde die Regelgrösse erhöht*)

  Impuls       : BOOL;
  Flanke       : R_TRIG; (*Detektor für eine ansteigende Flanke, in standard.lib von TwinCat*)
  Impulsglied  : TP;     (*Impulsgeber, in standard.lib von TwinCat*)
  BoolImpuls   : BOOL;   (*Für den Impuls*)
END_VAR
```


```
(*Berechnung des Delta*)

Delta := ((Soll_max - Soll_min) / (Dimmzeit * 60));
(* " * 60 * weil wird das Delta pro Sekunde wissen wollen*)


(*Impuls erzeugen*)
IF NOT Impulsglied.Q THEN
  BoolImpuls := NOT BoolImpuls;
  Impulsglied( IN := FALSE );
END_IF
Impulsglied( IN := TRUE, PT := T#500ms );     (*PT ist die Hälfte des eigentlichen Impuls*)
Flanke( CLK := BoolImpuls, Q => Impuls);      (*Erst jetzt haben wir, mit Impuls, einen richtigen Impuls*)

IF Impuls THEN                                (*Der Impuls kommt*)
  IF An_von_Uhr THEN                          (*An_von_Uhr ist True*)
    IF Istwert < Soll_min THEN                (*Der Istwert ist kleiner als er solte, dann*)
      Steuerspannung := Soll_min;             (*Steuerspannung gleich dem SollWert_Min*)
    ELSIF (Istwert + Delta) < Soll_max THEN   (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*)
      Steuerspannung := Istwert + Delta;      (*Steuerspannung gleich dem (Istwert + Delta)*)
    ELSE                                      (*sonst*)
      Steuerspannung := Soll_max;             (*Steuerspannung gleich dem SolWert_Max*)
   END_IF
  ELSE                                        (*An_von_Uhr ist FALSE*)
    IF (Istwert - Delta) > Soll_min THEN      (*Der (Istwert - Delta => Unterlaufschutz) ist grösser als der Maxwert, dann*)
      Steuerspannung:= Istwert - Delta;       (*Steuerspannung gleich dem (Istwert - Delta)*)
    ELSE                                      (*sonst*)
      Steuerspannung:= Soll_min;              (*Steuerspannung gleich dem SollWert_Min*)
    END_IF
  END_IF
END_IF
```

Bei mir dreht das so....
Habe beim Test die Dimmerzeit auf 2 (Minuten) gesetzt.

Gruess
Roman


----------



## Der Nils (21 Dezember 2008)

HI
@BRRO87

hab das Prg.mal getestet is SUPER
aber ich hatte das selbe Problem wi mit meinen diversen Prog's ....wenn ich in größeren Sritten erhöhe bleib er beim Max oder Min nicht stehen sonndern fängt wieder von forne an.
die Berechnung des delta's ---echt super da bin ich noch Meilen weit weg.


----------



## Brro87 (22 Dezember 2008)

Hallo Nils

Freut mich, das bei dir läuft...

Zu deinem Problem:
Hast du den FB komplett übernommen.. so wie ich in oben gepostet habe?(Muss ich wissen um dein Problem nachzuvollziehen!)
Eigentlich solte dies abgefangen werden....unteranderm hier...

```
IF Istwert < Soll_min THEN                (*Der Istwert ist kleiner als er solte, dann*)
      Steuerspannung := Soll_min;             (*Steuerspannung gleich dem SollWert_Min*)
    ELSIF (Istwert + Delta) < Soll_max THEN   (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*)
      Steuerspannung := Istwert + Delta;      (*Steuerspannung gleich dem (Istwert + Delta)*)
    ELSE                                      (*sonst*)
      Steuerspannung := Soll_max;             (*Steuerspannung gleich dem SolWert_Max*)
```
Das Problem das du hier bringst, ist meist das gleich, und zwar man vergisst das der Datentyp eine Obergrenze hat. Und bei Überschreitung dieswer Grenze fängt er wieder von vorne an.

Der Int definiert sich ja folgend... (ist aus der TwinCathilfe)
*Typ* *Untergrenze* *Obergrenze* *Speicherplatz
**INT**     -32768* *32767* *16                         Bit
*Angenommen unser Wert ist im Mom "32760" und wir erhöhen diesen Wert um "10", dann überschreiten wird ja die Obergrenze um "3", und unser Ergebnis ist nun "-32766"

Daher musst du dies abfangen, ich mache diese oben so...
In der IF abfrage addierre ich dem zu erhöhenden Wert schon mit dem Delta un frage dan ab, ob dies schon höher als die Obergrenze ist (bei deinem FB, sind ja Obergrenze und Max, des Outputs, dasselbe!) Wenn ja dan wird die IF- anweisung nicht mehr ausgeführt, weill dies ja zum Überlaufen führen würde!


```
ELSIF (Istwert + Delta) < Soll_max THEN
      Steuerspannung := Istwert + Delta;
    ELSE
```
Denke mal, das wird dein Fehler in allen Fb's beheben.
Zur Sicherheit kannst du ja mal noch einen anderen FB posten....oder auch Exportieren und mir Mailen....... (würde wahrscheinlich am einfachsten gehen!)

Hoffe konnte dir weiter helfen
Gruess
Roman


----------



## Der Nils (30 Dezember 2008)

Hi
hab endlich Zeit gehabt den Fehler zu suchen
der Wert ist immer über die 32767 hinaus gelaufen... dann -32XXX also auch kleiner hab das dann so gemacht
     ELSIF (Steuerspannung + Delta) < Soll_max AND   
              (Steuerspannung + Delta) > Soll_min  THEN
       Steuerspannung := Steuerspannung + Delta;     
     ELSE                                     
       Steuerspannung := Soll_max;   

Jetz läuft das vom Feinsten !!

Ach noch was ....Wie baut man son ,,CODE,, Fenster ein ???


----------



## MarkusP (30 Dezember 2008)

Ganz einfach, mit 

dem vorvorletzten ICON #
bzw. dem Schlüsselwort "[kode]" und "[/kode]". Statt k nimmst Du c, kann ich aber nicht machen, da sonst das Code-Fenster kommt.

LG


----------



## Der Nils (30 Dezember 2008)

Hallo
Ich hab noch ne Frage zum Ablauf...

Wenn der Wert auf 3276 runter ist soll die Lampe ganz abschalten.
Ich hab festgestellt das die ,,Dimmzeit,, nicht als nachlauf reicht.
bzw Er etwas länger braucht um runter zu tackten als die eingestellte Zeit.
Ich hab dann nicht mal 60 sondern mal 70 gerechnet.
Is aber nich so elegant...


```
FUNCTION_BLOCK Dimmer2
VAR_INPUT
  Soll_min     : INT;  (* 3276 = 1 V *)
  Soll_max     : INT; (* 32767 = 10 V *)

  Dimmzeit     : INT; (*Zeit die der Dimmer braucht / in Minuten*)

  An_von_Uhr   : BOOL;
END_VAR
VAR_OUTPUT
  Steuerspannung   : INT;
    Lampe              :BOOL;
END_VAR
VAR
  Delta        : INT ; (*Um so viel wird jede Sekunde die Regelgrösse erhöht*)

  Impuls       : BOOL;
  Flanke       : R_TRIG; (*Detektor für eine ansteigende Flanke, in standard.lib von TwinCat*)
  Impulsglied  : TP;     (*Impulsgeber, in standard.lib von TwinCat*)
  BoolImpuls   : BOOL;   (*Für den Impuls*)
    Nachlauf       :TOF;    (*Nachlauf zum abschalten der Lampe*)
    N_Zeit: TIME;       (*errechnete Nachlaufzeit*)
END_VAR
```


```
(*Berechnung des Delta*)

Delta := ((Soll_max - Soll_min) / (Dimmzeit * 60));
(* " * 60 * weil wird das Delta pro Sekunde wissen wollen*)


(*Impuls erzeugen*)
IF NOT Impulsglied.Q THEN
  BoolImpuls := NOT BoolImpuls;
  Impulsglied( IN := FALSE );
END_IF
Impulsglied( IN := TRUE, PT := T#500ms );     (*PT ist die Hälfte des eigentlichen Impuls*)
Flanke( CLK := BoolImpuls, Q => Impuls);      (*Erst jetzt haben wir, mit Impuls, einen richtigen Impuls*)

N_Zeit := INT_TO_TIME( Dimmzeit * 1000 );
Nachlauf ( IN := An_von_Uhr , PT :=N_Zeit*70);
Lampe:= Nachlauf.Q;


IF Impuls THEN                                (*Der Impuls kommt*)
  IF An_von_Uhr THEN                          (*An_von_Uhr ist True*)
    IF Steuerspannung < Soll_min THEN                (*Der Istwert ist kleiner als er solte, dann*)
      Steuerspannung := Soll_min;             (*Steuerspannung gleich dem SollWert_Min*)
     ELSIF (Steuerspannung + Delta) < Soll_max AND   (*Ist der (Istwert + Delta => Überlaufschutz) kleiner als der Maxwert, dann*)
                    (Steuerspannung + Delta) > Soll_min  THEN
       Steuerspannung := Steuerspannung + Delta;      (*Steuerspannung gleich dem (Istwert + Delta)*)
     ELSE                                      (*sonst*)
       Steuerspannung := Soll_max;             (*Steuerspannung gleich dem SolWert_Max*)
    END_IF
    ELSE                                        (*An_von_Uhr ist FALSE*)
    IF (Steuerspannung - Delta) > Soll_min THEN      (*Der (Istwert - Delta => Unterlaufschutz) ist grösser als der Maxwert, dann*)
      Steuerspannung:=Steuerspannung - Delta;       (*Steuerspannung gleich dem (Istwert - Delta)*)
    ELSE                                      (*sonst*)
      Steuerspannung:= Soll_min;              (*Steuerspannung gleich dem SollWert_Min*)
    END_IF
  END_IF
END_IF
```
Danke an alle die bis jetzt mitgeholfen .....;-)


----------

