Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Zeituhr für Heizung Kategorie: Programmierung (von André H. - 8.07.2003 22:02)
Als Antwort auf Zeituhr für Heizung von Guido - 8.07.2003 20:28

Hallo Guido,

> ach ja welche Module benotige ich nochmal für das Relaisboard I²C???

Das ist das Modul pcf.c2 .

> function kennl(int Tout, int steigung, int parallel) returns int// ermittlung der Zeit
> // ermittlung der Vorlauftemp in Abhängigkeit der Zeit
> {
> long TSoll;
> TSoll=getSoll(Tout,steigung,parallel);
> std=system.hour();
> min=system.minute();
> if ((std == 22)and(min == 30))or((std == 8)and(min==00));
> {
>  a=constant.ON;
> }
> if ((std == 6)and(min==00))or((std==15)and(min==30));
> {
>  a=constant.OFF;
> }
> if a==constant.ON ;
> {
>  TSoll=TSoll-300;
> }
> if a==constant.OFF;
> {
>  TSoll=TSoll;
> }
> return TSoll;
> }

Also, fangen wir mal an:
Als erstes sehe ich, daÃ? Du einen Grundlegenden Fehler im Syntax machst.
Und zwar bei den if-Abfragen ! Diese dürfen nicht mit einen Semikolon enden !
Es wird sonst das nachstehende in den geschweiften Klammern immer ausgeführt,
da dies dann nicht mehr als if-bedingte Anweisung behandelt wird.
Bsp.:

if Bedingung ; Anweisung;
ist gleichbedeutend mit
if Bedingung { }
Anweisung;
Hier sieht man, daÃ? die Anweisung nichts mehr mit der If-Abfrage zu tun hat.
Kurz, entferne die Semikolons hinter den If-Abfragen !
Der Korrekte Syntax lautet:
if Bedingung Anweisung;
oder
if Bedingung { Anweisung_1; Anweisung_2; ... ; Anweisung_n}
Das zum Syntax.

Nun zur Routine selbst:
Im Prinzip funktioniert es so (, wenn die Semikolons bei den Ifs entfernt werden).
Jedoch kann der direkte Zeitvergleich zu Problemen führen.
Um einen Vergleich zu Analogen Schaltuhren zu machen:
Du hast die Routine so aufgebaut, wie eine Schaltuhr mit steckbaren Reitern.
Es wird zu einer bestimmten Zeit das flag gesetzt und irgendwann anders wieder
zurückgesetzt.
Im Normalbetrieb funzt dies auch, jedoch kann es passieren, daÃ? Schaltzeiten
einfach übersprungen werden, wenn z.B. selbige geändert werden oder sich die
Zeit selbst durch ein Einstellen (So/Wi, DCF-Sync etc.) ändert.
Hier ist es besser, mit einer Abfrage zu prüfen, ob die aktuelle
Uhrzeit sich im vorgegebenen Zeitraum befindet.
Dazu ist es sinnvoll, sich ein Time-Serial-Format zu bilden.
Das einfachste wäre hhmm:
Bsp.:
time=hour*100 + minute
Aus 15:08 wird dann 1508 .
Eleganter wäre es natürlich, statt mit hunndert, mit 60 zu multiplizieren:
time=hour*60 + minute
Aus 15:08 wird dann 908 .

Die komplette Abfrage kann dann so aussehen:

if (time>=SU1ein and time<SU1aus) or (time>=SU2ein and time<SU2aus)
    flag=1;
  else
    flag=0;

Allerdings gibt es hier ein anderes Problem: Der Tageswechsel !
Dieses Zeitformat fängt um 0:00  mit 0 an und geht bis 1439 um 23:59 .
Um dies zu lösen gibt es ettliche Ansätze.
Das einfachste wäre natürlich dafür zu sorgen, da� es nie dazu kommt,
da� über den Tageswechsel etwas geschalten wird.
In Deinem Fall wäre dies sogar recht einfach. Du setzt Dein Flag, wenn
es zu einer Nachtabsenkung kommen soll. Drehst Du das Ganze um,
dann funzt die obige Abfrage. Das löst aber das Problem nicht wirklich.

Eine weitere Möglichkeit wäre folgende:

if (SU1aus - SU1ein) >=0
   term1=not (time<SU1ein and time>=SU1aus);
  else
   term1=time>=SU1ein and time<SU1aus;

if (SU2aus - SU2ein) >=0
   term2=not (time<SU2ein and time>=SU2aus);
  else
   term2=time>=SU2ein and time<SU2aus;

if term1 or term2
    flag=1;
  else
    flag=0;

Es gibt aber noch X weitere Lösungsansätze.
Aber jetzt alle aufzulisten, würde zu lange dauern.

MfG André H.


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Zeituhr für Heizung (von Guido - 8.07.2003 22:12)
    Re: Zeituhr für Heizung korrekt ? (von Milf. - 12.07.2003 23:06)
        Re: Zeituhr für Heizung korrekt ? (von André H. - 13.07.2003 9:17)