Re: solarreglung mit heizungsunterstützung Kategorie: Programmierung (von André H. - 20.08.2004 13:41) | ||
Als Antwort auf Re: solarreglung mit heizungsunterstützung von Matthias - 19.08.2004 14:53 | ||
| ||
Hallo Matthias, > - Wie kann ich mein init thread starten damit er nur beim Start die Standartwerte übernimmt? Mache aus dem Thread eine Funktion und rufe diese als erstes im Main-Thread auf ! Für soetwas ist es nicht sinnvoll einen Thread laufen zu lassen, da der Sinn eines Inits ist, alle benötigten Parameter, Schnittstellen etc. in einen definierten Zusand zu bringen, bevor das eigentliche Programm läuft. Au�erdem solltest Du den main-Thread anhalten, wenn dieser nichtsmehr tun mu�. Ich bevorzuge allerdings diesen nach einem Init mit allgemeinen Aufgaben durchführen zu lassen. Daher sollte hier immer folgende Struktur im Main-Thread bevorzugt werden: thread main { //Initialisierungen loop { //Hauptroutinen } } �brigens, bevor Du ein Kettenposting startest, wenn Dein Quellcode nicht korrekt angezeigt wird, solltest Du beim Erstellen eines Posting oberhalb des Kommentareingabefeldes schauen. Dort steht u.a. nicht umsonst folgendes: ... C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) ... Also benutze dann bitte auch das Code-Tag, wenn Du Quellcode-postest. Ansonsten wird dieser immer falsch angezeigt, sobald dieser Grö�er-und Kleinerzeichen enthält. Das sind nämlich Html-Steuerzeichen. Jeder Browser interpretiert onst ganze Passagen als Html-Tag ! Aber das habe ich eigentlich schon oft genug geschrieben. Ich war so frei und habe Deinen Quellcode unten mit dem Code-Tag versehen. Deine Kettenpostings werde ich heute noch löschen. Noch ein angenehmer Nebeneffekt des Code-Tags, wenn dieser jeder benutzt: Man kann sehr einfach nach Postings mit Quellcode mit der Suchfunktion finden, wenn man nach "<code>" für C2-Quellcode und nach "<asm>" für ASM-Routinen sucht. ;-) > So wie es jetzt ist funktioniert das ja nicht. �ndern will ich die Temperatur im Thread tempset. > Hier ist zu erwähnen das ich im Moment am notwendigen Umstieg auf OSOPT V3.0 > arbeite aber da klappt irgendwas nicht. Daher fliegen station_lcd und _io > als nächstes raus. An OSOPT V3.0 liegt das nicht. Es liegt an den original Station-Treiber. Die können einen schon zum verzweifeln bringen. ;-) Installieren einfach das aktuelle Service-Pack. Dann kannst Du Dein Programm sehr einfach anpassen, da in jeder Zeile, in der eine �nderung nötig ist, ein Fehler angezeigt wird. Ach, ja. Warum verwendest Du so viele Floats ? In Heizungs und Solarregelungen ist es unnötig mit diesem Datentyp zu arbeiten. Verwende lieber Integer und Long und bilde Dir ein Festkommainteger mit einer oder zwei Nachkommastellen. So arbeitet es sich einfacher. Zur Ausgabe von Festkommainteger gibt es z.B. in lcdext.c2 fertige Funktionen. So mu�t Du nicht extra die Zahlen erst zu einem String konvertieren. Und nebenbei läuft das Programm schneller. ;-) Und noch ein letzter Tip zur optischen Formatierung von C2: Ich wei�, da� es in C üblich ist, möglichst viel in eine Zeile zu packen. Jedoch sollte hier lieber eine Art der Formatierung gewählt werden, welche sich an die guten alten Basiczeiten anlehnt. Dann kann man den Quellcode einfach besser lesen, und besonders im Forum besser nachvollziehen, was jemand programmiert hat. ;-) Ich meine damit aber hauptsächlich sinnvoll einzurücken. Als Bsp.: thread xy { blabla=99; if z>=irgendwas machdies(); loop { diesunddas(); sleep ein_wenig; // ;-) if ports.get(p); { machdas(); unddies(); } } } MfG André H. float tsi;float tss;float ts; float tki;float tks;float tk; int i;int tast1;int tast2; float diff; float tmax; thread init//------Standartwerte setzen----------- {tmax=250;diff=10;halt;} thread mess //------Messung und Mittelung von Speicher und Kollektortemp.------- {tss=0;tks=0; for i=1...10 {tsi=ports.adc(1);tki=ports.adc(2);tss=tss+tsi;tks=tks+tki;} ts=tss/10;tk=tks/10;} thread print//------Ausgabe von Speicher und Kollektortemp am LCD------ {run 1;station_lcd.init();station_io.init();station_io.LIGHTon(); loop {string temp;temp="S=";str.putfloatf(temp,ts,1);str.putstring(temp," K="); str.putfloatf(temp,tk,1); string tempset;tempset="M=";str.putfloatf(tempset,tmax,0); str.putstring(tempset," D="); str.putfloatf(tempset,diff,0); station_lcd.clear(); station_lcd.print(temp); station_lcd.cursorpos(2, 0); station_lcd.print(tempset); sleep 500;}} thread relman//--------Ein und Ausschalten von Pumpe über F1 und F2------- {tast1=station_io.getkey(); if tast1==10 station_io.RELon(1); if tast1==11 station_io.RELoff(1);} thread stop//----------Programm Stop über F3--------- {tast2=station_io.getkey(); if tast2==12 quit 63; } thread ksvgl//---------Koll. und Speicher Vergleichen und Pumpe anschalten------ {if tk>ts+diff and ts<tmax station_io.RELon(1);else station_io.RELoff(1);} thread tempset//------------------------------------------------------- {int m;m=station_io.getkey();sleep 100; if m==6 tmax=tmax+1; if m==7 tmax=tmax-1; if m==8 diff=diff-1; if m==9 diff=diff+1; } thread main//--------------------------------------------------------- {run mess; run print; run relman; run stop; run ksvgl; run tempset; } Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |