Re: Programmcode funzt nicht Kategorie: Programmierung (von Guido, http://ferienwohnung-wiekert.de - 4.07.2003 18:50) | |
Als Antwort auf Re: Programmcode funzt nicht von André H. - 4.07.2003 7:45
| |
Danke für deine Hilfe ich habe deine Skrips erstmal kopiert und versuche Sie zu verstehen nochmal danke MFG Guido > 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; > > } > > Meine Seite: http://ferienwohnung-wiekert.de | |
Antwort schreiben Antworten: |