Re: Programmcode funzt nicht Kategorie: Programmierung (von André H. - 4.07.2003 7:45) | |
Als Antwort auf Programmcode funzt nicht von Guido - 3.07.2003 22:53
| |
Hallo Guido, Warum so umständlich ? Und warum willst Du eine Widerstandsberechnung durchführen ? Dafür gibt es Me�adapter, mit denen Du ein (fast) lineare Spannung zur Temperatur bekommst. Au�erdem, versuche den Variabeltyp float zu vermeiden. Dieser ist sehr Rechenintensiv undmeistens nicht nötig. Meistens reciht es Festkommazahlen zu verwenden. Wenn Du z.B. eine Nachkommastelle benötigst, und die Zahl nicht grö�er als 3276,7 und nicht kleiner als -3276,8 werden kann/soll, reicht Integer völlig. Hier ein Beispiel für die Auswertung von PT1000 und AD592. Der Programmcode stammt aus meiner eigenen Regelung. Ich verwende, durch einen kleine Patch, zwei versch. Sensortypen (AD592 und PT1000). Die Me�bereiche sind bei mir: AD592: -40 bis +130°C PT1000: -30 bis +275°C Beim PT1000 führe ich zusätzlich eine Anpassung zwecks der Linearität durch, Da die Widerstandskurve des PT sich bei ca. 0°C und ca. 100°C ändert und ab hier sich nicht mehr ganz linear zur Temperatur verhält. int value[16]; //------------------------------- // Temperatur berechnen //------------------------------- function getAD592(int x) returns int {long y; y=x; y=(170*y)/1023 - 395; if x==10230 y=-32000; // Fühler Kurzschlu� if x==0 y=-31000; // Fühler unterbrochen return y; } function getPT(int x) returns int {long y; y=x; if x>=7800 y=((y-7800)*75)/243 +2000; else if x>=5810 y=((y-5810)*60)/199 +1400; else if x>=4130 y=((y-4130)*50)/150 + 900; else if x>=1030 y=((y-1030)*90)/310; else y=(y*30)/103 - 300; if x==0 y=-32000; // Fühler Kurzschlu� if x==10230 y=-31000; // Fühler unterbrochen return y; } //------------------------------- // AD-Werte holen und als temp // in var speichern //------------------------------- thread gettemp {byte i; run 25; loop { for i=0...15 { if i%4==3 value[i]=getAD592(rbports.ad(i)); else value[i]=getPT(rbports.ad(i)); } sleep 250; } } Hier hab' ich noch eine Berechnung der Temperatur bei Verwendung von KTY81-210(KTY10-6) Sensoren. Diese ist für eine Regelung mit dem "Vorgänger" des CC2-ReglerBoards: Der Me�bereich hier ist -39°C bis +135°C function getTemp(int ad)returns int {long temp; temp=ad; // LP = -39,0°C = 0 // HP = 135,0°C =1023 // tkges = 0,17008797653958944281524926686217 K/digit // -39°C = 0 Tk = 0,20000 // -30°C = 45 Tk = 0,18182 // -20°C = 100 Tk = 0,17241 // 0°C = 216 Tk = 0,16556 // 25°C = 367 Tk = 0,16098 mitte // 110°C = 895 Tk = 0,17544 // 120°C = 952 Tk = 0,20000 // 130°C = 1002 Tk = 0,238095 // 135°C = 1023 if ad >=1002 temp=((temp-1002)*2381)/1000 +1300; else if ad >=952 temp=((temp-952)*2) +1200; else if ad >=895 temp=((temp-895)*2193)/1250 +1100; else if ad >=367 temp=((temp-367)*8049)/5000 +250; else if ad >=216 temp=((temp-216)*4139)/2500; else if ad >=100 temp=((temp-100)*17241)/10000 -200; else if ad >=45 temp=((temp-45)*9091)/5000 -300; else temp=(temp*2)-390; if ad==0 temp=-31000; // Fühler Kurzschlu� if ad==1023 temp=-30000; // Fühler unterbrochen yield; return temp; } Und noch ein Tip zur Verwenung von Variablen: Anstatt für jeden Sensor eine eigene Varable zu benutzen, solltest Du lieber ein Array nehmen. So sind z.B. �nderungen der Fühlerreihenfolge leichter möglich. z.B.: temp.value[var.kollektor] in var.kolektor (Konstante oder Variable) steht nur die Fühlernummer(0-15). MfG André H. > Hallo > > könnt ihr mir helfen?? > Ich habe folgenden Code geschrieben um die Sensorwerte der Regelboards in Temeraturen umzurechnen. > Leider arbeitet der Code nicht im Simulator der Wert der Variablen schwankt zwischen 56 0 und kann nicht ausgewertet werden > des weiteren verursacht das Skript einen Feheler im Modul rbports.c2 (Stacküberlauf) owohl es zZ noch gar nicht aufgerufen wird. > Ich bin noch absoluter Anfänger und für jede Hilfe dankbar. > float u[15] ,r[15], t[15]; > byte i; > > > > > //********* > thread temp > //********* > > { > for i=0...15 > { > u[i]=10000*0.0004; // für 10000 soll rbports.AD[i] eingesetzt werden > r[i]=5/u[i]-1;// Wiederstandsberechnung > t[i]=1000/(math.ln(r[i])/4.3+1000/298)-273;// Umrechnung in Temp (nach Buch) > } > } > thread main > { > int olkessel, vorlaufoel, ruecklaufoel, holzkessel, vorlaufholz, vorlaufheizung, > ruecklaufheizung, speicheroben, speichermitte, speicherunten, aussentemp; > string s; // Ausgabe Display > run temp; > olkessel = t[0]; > vorlaufoel = t[1]; > ruecklaufoel = t[2]; > holzkessel = t[3]; > vorlaufholz = t[4]; > vorlaufheizung = t[5]; > ruecklaufheizung = t[6]; > speicheroben = t[7]; > speichermitte = t[8]; > speicherunten = t[9]; > aussentemp = t[10]; > sleep 2000; > } > Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | |
Antwort schreiben Antworten: Re: Programmcode funzt nicht (von Guido - 4.07.2003 18:50) |