maxpower with comment

This commit is contained in:
zolliker
2005-06-29 14:13:37 +00:00
parent 5e373ebafd
commit a4d9b5e5cf

View File

@ -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<pr) {
if (p/pr>=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<plim) {
plim=pw;
if (high.iRange == 0) {
best = &low;
if (low.iRange == 0) {
return;
}
} else if (low.iRange == 0) {
best = &high;
} else if (p > 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;