M.Z. 20.08.2003

This commit is contained in:
cvs
2003-08-20 14:40:52 +00:00
parent 3f17e76df1
commit b9c35befdd
8 changed files with 159 additions and 25 deletions

View File

@@ -115,6 +115,7 @@ static float
fbuf, /* float buffer */
r1, r2, /* temporary values */
still=0,
mout,
tInt=0; /* integral time (sec.) for setpoint shift */
static int
@@ -865,7 +866,8 @@ int ReadTemp(void) {
s->t2 = s->t1;
s->stat2 = s->stat1;
}
if (s->t1 == 63.0 || s->t2 == 63.0 || s->t0 == 63.0) {
if (set != 63.0 &&
(s->t1 == 63.0 || s->t2 == 63.0 || s->t0 == 63.0)) {
/* probably noisy values */
logfileOut(LOG_MAIN, "magic %s: %g %g %g\n", s->ch, s->t1, s->t2, s->t0);
}
@@ -1098,7 +1100,7 @@ void CalcMaxPower(void) {
float pa, pr, pw, quo, p, pl, plim;
iAmp=1; iRange=0;
if (scalPower==0) scalPower=maxPower;
/* if (scalPower==0) */ scalPower=maxPower;
if (maxPower>0) {
p=scalPower/powFact;
plim=2500/resist;
@@ -1110,9 +1112,13 @@ void CalcMaxPower(void) {
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 (p/pr>quo) {
quo=p/pr; pw=pr; iAmp=i; iRange=j;
}
} else if (p<plim || pw==0) {
if (pr/p>quo) { quo=pr/p; pw=pr; iAmp=i; iRange=j; }
if (pr/p>quo) {
quo=pr/p; pw=pr; iAmp=i; iRange=j;
}
}
pr=pr/10;
}
@@ -1188,6 +1194,7 @@ int SetMaxPower(void) {
}
logfileOut(LOG_MAIN, "maxPower changed from %g to %g\n", pold, maxPower);
ERR_P(LscCmd(ser, "CDISP 1:[loop],[resist],1;MOUT [loop]:0;CMODE [loop]:1"));
mout=0;
if (slope<0) slope=-slope;
if (slope!=0 && slope<0.1) slope=0.1;
fbuf=tLimit/CtlScale();
@@ -1831,8 +1838,69 @@ int AlarmHdl(int mode, void *base, int fd) {
OnError: return -1;
}
int SetPower(float setpower) {
float htr1, htr0, diff, dist;
int cnt;
if (setpower<0) return 0;
if (setpower>maxPower) setpower=maxPower;
if (setpower<0) setpower=0;
htr1=sqrt(setpower/scalPower*1e4);
ERR_P(LscCmd(ser, "HTR?>htr"));
diff=htr1-htr;
if (abs(diff) <0.11) return 0;
if (htr==0) {
if (diff<10) diff=10;
if (diff>50) diff=50;
diff+=diff*0.5+10;
while (htr==0) {
mout+=diff;
ERR_P(LscCmd(ser, "MOUT 1,[mout]"));
ERR_P(LscCmd(ser, "HTR?>htr"));
}
}
if (htr==100) {
if (diff>-10) diff=-10;
if (diff<-50) diff=-50;
while (htr==100) {
mout+=diff;
ERR_P(LscCmd(ser, "MOUT 1,[mout]"));
ERR_P(LscCmd(ser, "HTR?>htr"));
}
}
diff=htr1-htr;
if (abs(diff) >0.11) {
cnt=20;
if (mout+diff >= 100) {
if (mout>99.89) cnt=0;
mout=100;
} else if (mout+diff <= -100) {
if (mout<-99.89) cnt=0;
mout=-100; cnt=0;
} else {
mout+=diff;
}
ERR_P(LscCmd(ser, "MOUT 1,[mout]"));
htr0=htr;
while (htr0 == htr && cnt>0) {
ERR_P(LscCmd(ser, "HTR?>htr"));
cnt--;
}
}
if (abs(htr1-htr) > 0.11) {
power=htr*htr*scalPower*1e-4;
logfileOut(LOG_MAIN, "power: %f (tried %f)\n", power, setpower);
} else {
logfileOut(LOG_MAIN, "power: %f\n", setpower);
}
return 0;
OnError: return -1;
}
int MaxPowerHdl(int mode, void *base, int fd) {
static float setpower;
if (mode==COC_WR) {
setpower=power;
scalPower=maxPower;
CalcMaxPower();
if (remoteMode!=2) {
@@ -1847,7 +1915,31 @@ int MaxPowerHdl(int mode, void *base, int fd) {
return COC_DWR;
} else if (mode==COC_DWR && remoteMode==2) {
ERR_I(SetMaxPower());
ERR_I(SetTemp(1));
ERR_I(SetPower(setpower));
}
return 0;
OnError: return -1;
}
int PowerHdl(int mode, void *base, int fd) {
static float setpower=0;
float htr1, diff;
if (mode==COC_WR) {
if (power>maxPower) power=maxPower;
htr1=sqrt(power/scalPower*1e4);
diff=htr1-htr;
if (mout+diff>100) {
diff=100-mout;
power=(htr+diff)*(htr+diff)*scalPower/1e4;
} else if (mout+diff<-100) {
diff=-100-mout;
power=(htr+diff)*(htr+diff)*scalPower/1e4;
}
if (power<0) power=0;
setpower=power;
return COC_DWR;
} else if (mode==COC_DWR && scalPower>0) {
ERR_I(SetPower(setpower));
}
return 0;
OnError: return -1;
@@ -2293,12 +2385,13 @@ int main(int argc, char *argv[]) {
CocDefFlt(set, RW); CocHdl(SetHdl);
CocDefFlt(ramp, RW); CocHdl(SetHdl);
CocDefFlt(still, RW); CocHdl(StillHdl);
CocDefFlt(power, RW); CocHdl(PowerHdl);
CocDefFlt(mout, RD);
CocDefFlt(scalPower, RD);
CocDefFlt(smooth, RW);
CocDefFlt(powFact, RW);
CocDefFlt(resist, RD);
CocDefFlt(htr, RD);
CocDefFlt(power, RD);
CocDefFlt(setH, RD);
CocDefFlt(full, RW);
CocDefFlt(tLimit, RD);