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 */
|
htr, power=DATA_UNDEF, /* heater current percentage, heater power */
|
||||||
tLimit, /* temperature limit */
|
tLimit, /* temperature limit */
|
||||||
tMaxLimit, /* maximal temperature limit */
|
tMaxLimit, /* maximal temperature limit */
|
||||||
maxPower, /* max. Power */
|
maxPowerFlt, /* max. Power */
|
||||||
maxCurrent, /* maxCurrent (not really reached for resist > 25 Ohm */
|
maxCurrent, /* maxCurrent (not really reached for resist > 25 Ohm */
|
||||||
powFact=1, /* power factor (for external power supplies) */
|
powFact=1, /* power factor (for external power supplies) */
|
||||||
resist=10, /* heater resistance */
|
resist=10, /* heater resistance */
|
||||||
@ -194,6 +194,7 @@ static char
|
|||||||
devHelp[10000],
|
devHelp[10000],
|
||||||
update[32], /* update script option */
|
update[32], /* update script option */
|
||||||
lscfg[256], /* lsc commands for configuration */
|
lscfg[256], /* lsc commands for configuration */
|
||||||
|
maxPower[128],
|
||||||
controlChannel[4]="A";
|
controlChannel[4]="A";
|
||||||
|
|
||||||
static char
|
static char
|
||||||
@ -1160,7 +1161,7 @@ int ReadHeater(int full) {
|
|||||||
power=DATA_UNDEF;
|
power=DATA_UNDEF;
|
||||||
} else {
|
} else {
|
||||||
power=Percent2Power(htr);
|
power=Percent2Power(htr);
|
||||||
if (power>maxPower) power=maxPower;
|
if (power>maxPowerFlt) power=maxPowerFlt;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
OnError: return -1;
|
OnError: return -1;
|
||||||
@ -1301,44 +1302,111 @@ int SetTemp(int switchOn) {
|
|||||||
|
|
||||||
void CalcMaxPower(void) {
|
void CalcMaxPower(void) {
|
||||||
int i, j;
|
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;
|
iAmp=1; iRange=0;
|
||||||
maxCurrent=0;
|
maxCurrent=0;
|
||||||
if (maxPower>0) {
|
if (maxPowerFlt>0) {
|
||||||
if (resist<1) resist=10;
|
if (resist<1) resist=10;
|
||||||
maxCurrent=1;
|
maxCurrent = 1; /* must be 1 for Power2Percent */
|
||||||
h=Power2Percent(maxPower)/100;
|
h=Power2Percent(maxPowerFlt)/100;
|
||||||
p=h*h*resist; /* power before amplifier */
|
p=h*h*resist; /* power before amplifier */
|
||||||
plim=2500/resist;
|
plim=2500/resist;
|
||||||
/* power limited by 50 V output. U*U/R=2500/R */
|
/* power limited by 50 V output. U*U/R=2500/R */
|
||||||
if (p>plim) p=plim;
|
if (p>plim) p=plim;
|
||||||
pa=resist*4; /* max. maxPower R*I*I (I=2 A) */
|
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--) {
|
for (i=4; i>0; i--) {
|
||||||
pr=pa;
|
pr=pa;
|
||||||
for (j=5; j>0; j--) {
|
for (j=5; j>0; j--) {
|
||||||
if (p<pr) {
|
if (pr > p) {
|
||||||
if (p/pr>=quo) {
|
if (pr < high.p) {
|
||||||
quo=p/pr; pw=pr; iAmp=i; iRange=j;
|
high.p = pr;
|
||||||
|
high.iAmp = i;
|
||||||
|
high.iRange = j;
|
||||||
}
|
}
|
||||||
} else if (p<=plim || pw==0) {
|
} else {
|
||||||
if (pr/p>=quo) {
|
if (pr > low.p) {
|
||||||
quo=pr/p; pw=pr; iAmp=i; iRange=j;
|
low.p = pr;
|
||||||
|
low.iAmp = i;
|
||||||
|
low.iRange = j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pr=pr/10;
|
pr=pr/10;
|
||||||
}
|
}
|
||||||
pa=pa/4;
|
pa=pa/4;
|
||||||
}
|
}
|
||||||
if (pw<plim) {
|
if (high.iRange == 0) {
|
||||||
plim=pw;
|
best = &low;
|
||||||
|
if (low.iRange == 0) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
maxPower=Percent2Power(100*sqrt(plim/resist));
|
} else if (low.iRange == 0) {
|
||||||
maxCurrent=sqrt(pw/resist);
|
best = &high;
|
||||||
assert(maxCurrent>0);
|
} else if (p > low.p*1.1) {
|
||||||
|
best = &high;
|
||||||
} else {
|
} else {
|
||||||
iRange=0;
|
best = &low;
|
||||||
|
}
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1420,9 +1488,9 @@ int SetMaxPower(void) {
|
|||||||
} else {
|
} else {
|
||||||
limCurrent=maxCurrent;
|
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) {
|
if (manual) {
|
||||||
cod1=3;
|
cod1=3;
|
||||||
} else {
|
} else {
|
||||||
@ -1447,7 +1515,7 @@ int SetMaxPower(void) {
|
|||||||
}
|
}
|
||||||
initMaxPower=0;
|
initMaxPower=0;
|
||||||
lastCurrent=maxCurrent;
|
lastCurrent=maxCurrent;
|
||||||
pold=maxPower;
|
pold=maxPowerFlt;
|
||||||
PidSumHdl(COC_RD, NULL, 0);
|
PidSumHdl(COC_RD, NULL, 0);
|
||||||
logfileOut(LOG_MAIN, "pid: %s\n", pid);
|
logfileOut(LOG_MAIN, "pid: %s\n", pid);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2214,7 +2282,7 @@ int SetPower(float setpower) {
|
|||||||
|
|
||||||
logfileOut(LOG_MAIN,"SetPower\n");
|
logfileOut(LOG_MAIN,"SetPower\n");
|
||||||
if (setpower<0) return 0;
|
if (setpower<0) return 0;
|
||||||
if (setpower>maxPower) setpower=maxPower;
|
if (setpower>maxPowerFlt) setpower=maxPowerFlt;
|
||||||
if (setpower<0) setpower=0;
|
if (setpower<0) setpower=0;
|
||||||
mout=Power2Percent(setpower);
|
mout=Power2Percent(setpower);
|
||||||
if (mout>100) mout=100;
|
if (mout>100) mout=100;
|
||||||
@ -2291,6 +2359,7 @@ int MaxPowerHdl(int mode, void *base, int fd) {
|
|||||||
if (mode==COC_WR) {
|
if (mode==COC_WR) {
|
||||||
if (loop!=1) return COC_DWR;
|
if (loop!=1) return COC_DWR;
|
||||||
setpower=power;
|
setpower=power;
|
||||||
|
sscanf(maxPower, "%f", &maxPowerFlt);
|
||||||
CalcMaxPower();
|
CalcMaxPower();
|
||||||
if (remoteMode!=2) {
|
if (remoteMode!=2) {
|
||||||
ERR_MSG("controller is in local mode, enter 'remote' first");
|
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;
|
static float setpower=0;
|
||||||
float htr1, diff;
|
float htr1, diff;
|
||||||
if (mode==COC_WR) {
|
if (mode==COC_WR) {
|
||||||
if (power>maxPower) power=maxPower;
|
if (power>maxPowerFlt) power=maxPowerFlt;
|
||||||
htr1=Power2Percent(power);
|
htr1=Power2Percent(power);
|
||||||
diff=htr1-htr;
|
diff=htr1-htr;
|
||||||
if (mout+diff>100) {
|
if (mout+diff>100) {
|
||||||
@ -2811,7 +2880,7 @@ int main(int argc, char *argv[]) {
|
|||||||
CocStrFld(SensorT, curve, RD);
|
CocStrFld(SensorT, curve, RD);
|
||||||
CocStrFld(SensorT, type, RD);
|
CocStrFld(SensorT, type, RD);
|
||||||
|
|
||||||
CocDefFlt(maxPower, RW); CocHdl(MaxPowerHdl);
|
CocDefStr(maxPower, RW); CocHdl(MaxPowerHdl);
|
||||||
CocDefFlt(slope, RW); CocHdl(MaxPowerHdl);
|
CocDefFlt(slope, RW); CocHdl(MaxPowerHdl);
|
||||||
CocDefFlt(prop, RW); CocHdl(PidHdl);
|
CocDefFlt(prop, RW); CocHdl(PidHdl);
|
||||||
CocDefFlt(integ, RW); CocHdl(PidHdl);
|
CocDefFlt(integ, RW); CocHdl(PidHdl);
|
||||||
@ -3009,18 +3078,18 @@ int main(int argc, char *argv[]) {
|
|||||||
tim0=mycMsecSince(0)/period*period;
|
tim0=mycMsecSince(0)/period*period;
|
||||||
tim=mycNow();
|
tim=mycNow();
|
||||||
|
|
||||||
ERR_P(DataCreateSet(NULL, "Tm", &tm, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Tm", &tm, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "Ts", &ts, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Ts", &ts, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "Tr", &tr, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Tr", &tr, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "Te", &te, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Te", &te, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "Tk", &tk, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Tk", &tk, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "He", &he, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "He", &he, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "T1", &sensA1.t, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "T1", &sensA1.t, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "T2", &sensA2.t, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "T2", &sensA2.t, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "T3", &sensA3.t, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "T3", &sensA3.t, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "Aux", &aux, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "Aux", &aux, logPeriod, LOGLIFETIME, tim));
|
||||||
ERR_P(DataCreateSet(NULL, "P", &power, 5, LOGLIFETIME, tim));
|
ERR_P(DataCreateSet(NULL, "P", &power, logPeriod, LOGLIFETIME, tim));
|
||||||
|
|
||||||
remoteMode=2;
|
remoteMode=2;
|
||||||
prop=50;
|
prop=50;
|
||||||
|
Reference in New Issue
Block a user