From a4d9b5e5cf24a7ff969caab76332f80ab6e3eda6 Mon Sep 17 00:00:00 2001 From: zolliker Date: Wed, 29 Jun 2005 14:13:37 +0000 Subject: [PATCH] maxpower with comment --- tecs/tecs.c | 143 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 106 insertions(+), 37 deletions(-) diff --git a/tecs/tecs.c b/tecs/tecs.c index 8694199..5e38e2b 100644 --- a/tecs/tecs.c +++ b/tecs/tecs.c @@ -106,7 +106,7 @@ static float htr, power=DATA_UNDEF, /* heater current percentage, heater power */ tLimit, /* temperature limit */ tMaxLimit, /* maximal temperature limit */ - maxPower, /* max. Power */ + maxPowerFlt, /* max. Power */ maxCurrent, /* maxCurrent (not really reached for resist > 25 Ohm */ powFact=1, /* power factor (for external power supplies) */ resist=10, /* heater resistance */ @@ -194,6 +194,7 @@ static char devHelp[10000], update[32], /* update script option */ lscfg[256], /* lsc commands for configuration */ + maxPower[128], controlChannel[4]="A"; static char @@ -1160,7 +1161,7 @@ int ReadHeater(int full) { power=DATA_UNDEF; } else { power=Percent2Power(htr); - if (power>maxPower) power=maxPower; + if (power>maxPowerFlt) power=maxPowerFlt; } return 0; OnError: return -1; @@ -1301,44 +1302,111 @@ int SetTemp(int switchOn) { void CalcMaxPower(void) { int i, j; - float pa, pr, pw, quo, p, plim, h; + struct { + float p; + int iAmp, iRange; + } low, high, *best; + float pa, pr, p, plim; + float h, maxAt; + char warning[128]; iAmp=1; iRange=0; maxCurrent=0; - if (maxPower>0) { + if (maxPowerFlt>0) { if (resist<1) resist=10; - maxCurrent=1; - h=Power2Percent(maxPower)/100; + maxCurrent = 1; /* must be 1 for Power2Percent */ + h=Power2Percent(maxPowerFlt)/100; p=h*h*resist; /* power before amplifier */ plim=2500/resist; /* power limited by 50 V output. U*U/R=2500/R */ if (p>plim) p=plim; pa=resist*4; /* max. maxPower R*I*I (I=2 A) */ - pw=0; quo=0.; + low.p = 0; + low.iRange = 0; + high.p = resist*6; + high.iRange = 0; for (i=4; i>0; i--) { pr=pa; for (j=5; j>0; j--) { - if (p=quo) { - quo=p/pr; pw=pr; iAmp=i; iRange=j; + if (pr > p) { + if (pr < high.p) { + high.p = pr; + high.iAmp = i; + high.iRange = j; } - } else if (p<=plim || pw==0) { - if (pr/p>=quo) { - quo=pr/p; pw=pr; iAmp=i; iRange=j; + } else { + if (pr > low.p) { + low.p = pr; + low.iAmp = i; + low.iRange = j; } } pr=pr/10; } pa=pa/4; } - if (pw low.p*1.1) { + best = &high; + } else { + best = &low; } - maxPower=Percent2Power(100*sqrt(plim/resist)); - maxCurrent=sqrt(pw/resist); + warning[0]='\0'; + maxAt = 100; + if (best->p > plim) { + maxAt = sqrt(plim/best->p)*100; + maxPowerFlt=Percent2Power(100*sqrt(plim/resist)); + } else { + maxPowerFlt=Percent2Power(100*sqrt(best->p/resist)); + } + snprintf(maxPower, sizeof maxPower, "%.5g", maxPowerFlt); + if (best->p > p * 1.01) { + if (low.iRange != 0) { + snprintf(warning, sizeof warning, + "next lower value: %.4g", + Percent2Power(100*sqrt(low.p/resist))); + } else { + snprintf(warning, sizeof warning, + "rounded up to minimal value"); + } + } else if (best->p < p * 0.99) { + if (high.p > plim) high.p = plim; + if (high.p < resist * 5) { + snprintf(warning, sizeof warning, + "next higher value: %.4g", + Percent2Power(100*sqrt(high.p/resist))); + } else { + snprintf(warning, sizeof warning, + "rounded down to maximal value"); + } + } else if (p < h*h*resist * 0.99) { + snprintf(warning, sizeof warning, + "rounded down to maximal value"); + } + if (maxAt < 99.0) { + str_append(maxPower, " ("); + if (warning[0] != '\0') { + str_append(maxPower, warning); + str_append(maxPower, ", "); + } + snprintf(warning, sizeof warning, + "maximum power already at %.1f %%", + maxAt); + str_append(maxPower, warning); + str_append(maxPower, ")"); + } else if (warning[0]!='\0') { + str_append(maxPower, " ("); + str_append(maxPower, warning); + str_append(maxPower, ")"); + } + maxCurrent=sqrt(best->p/resist); assert(maxCurrent>0); - } else { - iRange=0; } } @@ -1420,9 +1488,9 @@ int SetMaxPower(void) { } else { limCurrent=maxCurrent; } - maxPower=limCurrent*limCurrent*resist; + maxPowerFlt=limCurrent*limCurrent*resist; } - logfileOut(LOG_MAIN, "maxPower changed from %g to %g\n", pold, maxPower); + logfileOut(LOG_MAIN, "maxPower changed from %g to %g\n", pold, maxPowerFlt); if (manual) { cod1=3; } else { @@ -1447,7 +1515,7 @@ int SetMaxPower(void) { } initMaxPower=0; lastCurrent=maxCurrent; - pold=maxPower; + pold=maxPowerFlt; PidSumHdl(COC_RD, NULL, 0); logfileOut(LOG_MAIN, "pid: %s\n", pid); return 0; @@ -2214,7 +2282,7 @@ int SetPower(float setpower) { logfileOut(LOG_MAIN,"SetPower\n"); if (setpower<0) return 0; - if (setpower>maxPower) setpower=maxPower; + if (setpower>maxPowerFlt) setpower=maxPowerFlt; if (setpower<0) setpower=0; mout=Power2Percent(setpower); if (mout>100) mout=100; @@ -2291,6 +2359,7 @@ int MaxPowerHdl(int mode, void *base, int fd) { if (mode==COC_WR) { if (loop!=1) return COC_DWR; setpower=power; + sscanf(maxPower, "%f", &maxPowerFlt); CalcMaxPower(); if (remoteMode!=2) { ERR_MSG("controller is in local mode, enter 'remote' first"); @@ -2316,7 +2385,7 @@ int PowerHdl(int mode, void *base, int fd) { static float setpower=0; float htr1, diff; if (mode==COC_WR) { - if (power>maxPower) power=maxPower; + if (power>maxPowerFlt) power=maxPowerFlt; htr1=Power2Percent(power); diff=htr1-htr; if (mout+diff>100) { @@ -2811,7 +2880,7 @@ int main(int argc, char *argv[]) { CocStrFld(SensorT, curve, RD); CocStrFld(SensorT, type, RD); - CocDefFlt(maxPower, RW); CocHdl(MaxPowerHdl); + CocDefStr(maxPower, RW); CocHdl(MaxPowerHdl); CocDefFlt(slope, RW); CocHdl(MaxPowerHdl); CocDefFlt(prop, RW); CocHdl(PidHdl); CocDefFlt(integ, RW); CocHdl(PidHdl); @@ -3009,18 +3078,18 @@ int main(int argc, char *argv[]) { tim0=mycMsecSince(0)/period*period; tim=mycNow(); - ERR_P(DataCreateSet(NULL, "Tm", &tm, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "Ts", &ts, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "Tr", &tr, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "Te", &te, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "Tk", &tk, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "He", &he, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "T1", &sensA1.t, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "T2", &sensA2.t, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "T3", &sensA3.t, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "Aux", &aux, 5, LOGLIFETIME, tim)); - ERR_P(DataCreateSet(NULL, "P", &power, 5, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Tm", &tm, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Ts", &ts, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Tr", &tr, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Te", &te, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Tk", &tk, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "He", &he, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "T1", &sensA1.t, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "T2", &sensA2.t, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "T3", &sensA3.t, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "Aux", &aux, logPeriod, LOGLIFETIME, tim)); + ERR_P(DataCreateSet(NULL, "P", &power, logPeriod, LOGLIFETIME, tim)); remoteMode=2; prop=50;