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) |