maxpower with comment
This commit is contained in:
143
tecs/tecs.c
143
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<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;
|
||||
|
Reference in New Issue
Block a user