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

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)