new versions

This commit is contained in:
cvs
2002-01-24 13:24:43 +00:00
parent c7347e4129
commit e3c9ba56e6
4 changed files with 303 additions and 154 deletions

View File

@ -9,12 +9,13 @@ typedef struct { char *instr; char *host; char *user; int cod; } Instrument;
static Instrument list[]={
{ "DMC", "lnsa05.psi.ch", "DMC" , 1},
{ "TOPSI", "lnsa07.psi.ch", "TOPSI" , 1},
{ "SANS", "lnsa10.psi.ch", "SANS" , 3},
{ "SANS", "lnsa10.psi.ch", "SANS" , 1},
{ "HRPT", "lnsa11.psi.ch", "HRPT" , 1},
{ "TRICS", "lnsa13.psi.ch", "TRICS" , 1},
{ "TASP", "lnsa12.psi.ch", "TASP" , 1},
{ "TRICS", "lnsa18.psi.ch", "TRICS" , 1},
{ "AMOR", "lnsa14.psi.ch", "AMOR" , 1},
{ "FOCUS", "lnsa16.psi.ch", "FOCUS" , 1},
{ "TASP", "lnsa08.psi.ch", NULL , 0},
{ "RITA", "lnsa08.psi.ch", NULL , 0},
{ "PREP", "lnsa01.psi.ch", NULL , 0},
{ "TEST", "lnsa15.psi.ch", "lnslib", 2}
};
@ -54,9 +55,6 @@ int InstrHost(char *input, char *instr, char *host, char *user, char *pcod
time(&t);
tim=*localtime(&t);
sprintf(pcod, "%02dlns%d", tim.tm_year % 100, tim.tm_mon/6+1);
} else if (list[j].cod == 3) {
str_ncpy(pcod, instr, pcod_len);
str_ncat(pcod, "ASQ", pcod_len);
} else {
str_ncpy(pcod, " ", pcod_len);
}

View File

@ -33,6 +33,7 @@ typedef struct {
float t, t0, t1, t2, min, max, band; /* temperatures */
float scale; /* scale for extreme ranges */
float lim; /* range limit (used when two sensors present) */
float alarm;
int stat1, stat2; /* reading status summary */
int present; /* 0: sensor inactive, 1: sensor configured, -1: sensor parameters read */
int readStat; /* reading status */
@ -82,7 +83,9 @@ static float
set, /* set T */
setH, /* set T on heat exchanger */
htr, power=DATA_UNDEF, /* heater current percentage, heater power */
tLimit, maxPower, /* heater parameters */
tLimit, /* temperature limit */
maxPower, /* max. Power */
powFact=1, /* power factor (for external power supplies) */
tShift=0, /* setpoint shift */
full, /* full value for helium level */
prop, integ, deriv, /* pid */
@ -95,6 +98,7 @@ static float
aux=DATA_UNDEF, /* auxiliary value */
ramp=0,
slope=0,
smooth=0,
fbuf, /* float buffer */
r1, r2, /* temporary values */
tInt=0; /* integral time (sec.) for setpoint shift */
@ -127,6 +131,7 @@ static int
tim0, /* msec Time */
per, /* effective period */
mmInt, mmTime, /* interval and time for next min-max logging */
lockAlarm,
cntError,
tableTime; /* last time when table was read */
@ -142,9 +147,10 @@ static char
head[64], /* curve header */
intype[64], /* input configuration */
chan[2], /* actual channel */
alarms[20], /* alarm status */
alarmChannels[4]=" ",
alarmList[4], /* alarm list */
alarmStatus[20], /* alarm status */
alarmChannels[8]="",
alarmList[8], /* enabled alarms */
alarmHistory[8]="",
config[256], /* special configuration commands */
helium[80], /* helium level status */
heUnits[4], /* helium level units */
@ -253,13 +259,17 @@ int InstalCurve(SensorT *sensor, char *dev) {
sens=sensor;
str_copy(chan, sens->ch);
sens->present=0;
if (sens->type=='x' || sens->type=='h') {
if (sens->type=='x' || sens->type=='h' || sens->type=='f') {
if (chan[0]>='C') {
ERR_P(LscCmd(ser, "INTYPE [chan]:0,1,2,1,13;MNMX [chan]:1,3")); /* 7.5 V Range */
ERR_P(LscCmd(ser, "INTYPE [chan]:0,1,2,1,13")); /* 7.5 V Range */
} else {
ERR_P(LscCmd(ser, "INTYPE [chan]:0,1,2,1,12;MNMX [chan]:1,3")); /* 5 V Range */
ERR_P(LscCmd(ser, "INTYPE [chan]:0,1,2,1,12")); /* 5 V Range */
}
if (sens->type=='f') {
ERR_P(LscCmd(ser, "MNMX [chan]:1,4;INCRV [chan]:0"));
} else {
ERR_P(LscCmd(ser, "MNMX [chan]:1,3;INCRV [chan]:0"));
}
ERR_P(LscCmd(ser, "INCRV [chan]:0"));
if (settingsFlag==0) sens->present=1;
return 0;
}
@ -356,6 +366,7 @@ int InstalCurve(SensorT *sensor, char *dev) {
} else { /* header does not match -> download */
logfileOut(LOG_MAIN, "%s\n%s\n", head, chead);
if (num<=20) ERR_MSG("standard curve does not match");
if (busy) ERR_MSG("busy");
logfileOut(LOG_MAIN+LOG_STAT, "download curve %d\n", num);
@ -479,8 +490,14 @@ int PrepInput(char *label) {
sensB.scale=1;
sensA.lim=0;
sensB.lim=0;
sensA.alarm=0;
sensB.alarm=0;
slope=0;
ramp=0;
controlMode=0;
powFact=1;
config[0]='\0';
tLimit=310;
} else {
sensC.present=0;
sensD.present=0;
@ -488,6 +505,8 @@ int PrepInput(char *label) {
sensD.scale=1;
sensC.lim=0;
sensD.lim=0;
sensC.alarm=0;
sensD.alarm=0;
}
loop=1;
resist=10;
@ -524,13 +543,14 @@ int PrepInput(char *label) {
s=sensors[i];
typ=chans[i];
if (typ=='_') typ='\0';
if (NULL==strchr("mnslhxt", typ)) ERR_MSG("unknown channel type code");
if (NULL==strchr("mnslhxft", typ)) ERR_MSG("unknown channel type code");
if (typ!='\0') {
s->present=-1;
}
s->type=typ;
s->band=10;
if (s->scale==0.0) s->scale=1.0;
if (s->alarm==0.0 && typ=='m' || typ=='s') s->alarm=tLimit;
}
if (!plug->manual) { /* set device name */
@ -728,28 +748,33 @@ int ReadTemp(void) {
s->stat1=0;
s->stat2=0;
if (s->present) {
if (s->type=='h' || s->type=='x') {
typ='S';
} else {
typ='K';
}
if (doit) ERR_P(LscCmd(ser, buf));
str_substitute(buf
, "KRDG?#>sens#.t0;MDAT?#>sens#.t1,sens#.t2;MDATST?#>sens#.stat1,sens#.stat2"
, "#", s->ch);
buf[0]=typ; /* change KRDG to SRDG */
if (s->type=='h' || s->type=='x') {
buf[0]='S'; /* change KRDG to SRDG */
typ='S';
} else if (s->type=='f') {
buf[0]='L'; /* change KRDG to LDAT */
buf[1]='D';
buf[2]='A';
buf[3]='T';
}
doit=1;
}
}
if (doit) {
if (ramp!=0) {
str_append(buf, ";SETP?[loop]>tr");
tr=tr*CtlScale();
} else {
tr=set;
str_append(buf, ";SETP?[loop]>fbuf");
}
str_append(buf, ";MNMXRST");
ERR_P(LscCmd(ser, buf));
if (ramp!=0) {
tr=fbuf*CtlScale();
} else {
tr=setH;
}
if (tr==0) tr=DATA_UNDEF;
}
@ -763,7 +788,7 @@ int ReadTemp(void) {
logfileOut(LOG_MAIN, "magic %s: %g %g %g\n", s->ch, s->t1, s->t2, s->t0);
}
stat=(s->stat1 | s->stat2) & (255-2); /* ignore "old reading" */
stat=(s->stat1 | s->stat2) & (255-3); /* ignore "old reading" and "invalid reading" */
if (stat != s->readStat) {
s->readStat=stat;
err=LscReadStat(stat);
@ -849,7 +874,12 @@ int ReadTemp(void) {
int ReadHeater(void) {
if (loop==1) {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay"));
if (relay) {
ERR_P(LscCmd(ser, "HTRST?>htrst"));
htr=0;
} else {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay"));
}
} else {
ERR_P(LscCmd(ser, "AOUT?2>htr"));
htrst=0;
@ -923,9 +953,9 @@ int SetTemp(int switchOn) {
}
if (ramp > 0 && set != 0) {
/* take ramp from actual temperature if more than 1 % deviation */
ERR_P(LscCmd(ser, "CSET?[loop]>,,cod1;SETP?[loop]>tr"));
tr=tr*scale;
if (cod1 == 0 || fabsf(ctlSens->t - tr) >= 0.01 * ctlSens->t) {
ERR_P(LscCmd(ser, "CSET?[loop]>,,cod1;SETP?[loop]>fbuf"));
tr=fbuf*scale;
if (cod1 == 0 || fabsf(ctlSens->t - tr) >= 0.1 * ctlSens->t) {
fbuf = ctlSens->t;
tr = fbuf * scale;
ERR_P(LscCmd(ser, "SETP [loop],[fbuf];RAMP [loop],0,0;SETP [loop],[fbuf]"));
@ -940,7 +970,7 @@ int SetTemp(int switchOn) {
ERR_P(LscCmd(ser, "ANALOG 2:0,0"));
}
setH=0;
} else if (switchOn) { /* switch on also when bad heater message and no alarms: || (htrst>=5 && relay==0)) */
} else if (switchOn) { /* switch on also when bad heater message and no alarms: || (htrst>=5 && !relay)) */
ERR_P(LscCmd(ser, "CSET [loop]:[chan],1,1,0"));
if (loop==1) {
ERR_P(LscCmd(ser, "RANGE:[iRange]"));
@ -948,16 +978,23 @@ int SetTemp(int switchOn) {
ERR_P(LscCmd(ser, "ANALOG 2:0,3"));
}
} else {
ERR_P(LscCmd(ser, "CSET [loop]:[chan],1"));
ERR_P(LscCmd(ser, "CSET?[loop]>,buf1,"));
if (buf1[0] != '1') {
ERR_P(LscCmd(ser, "CSET [loop]:[chan],1"));
}
}
showSet=(0!=strcmp(ctlSens->ch, controlChannel) || switchOn);
str_copy(controlChannel, ctlSens->ch);
if (ramp==0 || set==0) {
ERR_P(LscCmd(ser, "RAMP [loop],0,[ramp];SETP?[loop]>fbuf"));
ERR_P(LscCmd(ser, "RAMP?[loop]>buf1,"));
if (buf1[0] != '0') {
ERR_P(LscCmd(ser, "RAMP [loop]:0,[ramp]"));
}
ERR_P(LscCmd(ser, "SETP?[loop]>fbuf"));
if (fabsf(setH-fbuf) >= (fbuf+setH)*1.0e-5) {
ERR_P(LscCmd(ser, "SETP [loop]:[setH]"));
if (controlMode!=2 && !showSet) {
logfileOut(LOG_MAIN, "set %g (on %s) (was changed)\n", set, ctlSens->ch);
logfileOut(LOG_MAIN, "set %g (on %s) (was changed %g -> %g)\n", set, ctlSens->ch, fbuf, setH);
}
} else {
setH=fbuf;
@ -969,15 +1006,27 @@ int SetTemp(int switchOn) {
} else {
if (ramp < 0) ramp=-ramp;
if (ramp < 0.1) ramp=0.1;
ERR_P(LscCmd(ser, "RAMP [loop]:1,[ramp];SETP [loop],[setH];SETP?[loop]>tr"));
tr=tr*scale;
if (showSet) {
ERR_P(LscCmd(ser, "RAMP [loop]:1,[ramp];SETP [loop],[setH];SETP?[loop]>fbuf"));
} else {
ERR_P(LscCmd(ser, "SETP?[loop]>fbuf"));
if (fabs(fbuf-setH) >= ramp*smooth) {
fbuf=ramp;
} else {
fbuf=sqrt(fabs(fbuf-setH)*ramp/smooth);
if (fbuf<0.1) fbuf=0.1;
}
ERR_P(LscCmd(ser, "RAMP [loop]:1,[fbuf];SETP [loop],[setH]"));
ERR_P(LscCmd(ser, "SETP?[loop]>fbuf"));
}
tr=fbuf*scale;
if (showSet) {
logfileOut(LOG_MAIN, "set %g (on %s) %g K/min, starting from %g\n", set, ctlSens->ch, ramp, tr);
}
}
if (tr==0) tr=DATA_UNDEF;
if (showSet) {
relay=0;
/* relay=0; */
ERR_I(ReadHeater());
}
return 0;
@ -986,27 +1035,28 @@ int SetTemp(int switchOn) {
int SetMaxPower(void) {
int i, j;
float pa, pr, pw, dif;
float pa, pr, pw, dif, p;
if (loop == 1) {
iAmp=1; iRange=0;
if (maxPower>0) {
p=maxPower/powFact;
pa=resist*4; /* max. maxPower */
pw=0; dif=1.0e6;
for (i=4; i>0; i--) {
pr=pa;
for (j=5; j>0; j--) {
if (pr>maxPower) {
if (pr/maxPower<dif) { dif=pr/maxPower; pw=pr; iAmp=i; iRange=j; }
if (pr>p) {
if (pr/p<dif) { dif=pr/p; pw=pr; iAmp=i; iRange=j; }
} else {
if (maxPower/pr<dif) { dif=maxPower/pr; pw=pr; iAmp=i; iRange=j; }
if (p/pr<dif) { dif=p/pr; pw=pr; iAmp=i; iRange=j; }
}
pr=pr/10;
}
pa=pa/4;
}
}
maxPower=pw;
maxPower=pw*powFact;
}
logfileOut(LOG_MAIN, "maxPower %g\n", maxPower, iAmp, iRange);
ERR_P(LscCmd(ser, "CDISP 1:[loop],[resist],1;MOUT [loop]:0;CMODE [loop]:1"));
@ -1026,6 +1076,8 @@ char DisplayFmt(SensorT *s) {
if (s==NULL || s->present<=0 || s->type=='h') return '\0';
if (s->type=='x') {
return '3';
} else if (s->type=='f') {
return '4';
} else {
if (s->scale==1.0) {
return '1';
@ -1035,6 +1087,30 @@ char DisplayFmt(SensorT *s) {
}
}
int ConfigAlarms(void) {
int i, k;
SensorT *s;
ERR_P(LscCmd(ser, "RELAY 1:1;BEEP:0"));
relay=0;
k=0;
for (i=0;i<4;i++) {
s=sensors[i];
str_copy(buf1, s->ch);
if (s->present==1 && s->alarm>0) {
r1=s->alarm/s->scale;
ERR_P(LscCmd(ser, "ALARM [buf1]:1,1,[r1],0,1,1"));
alarmList[k]=s->ch[0];
k++;
} else {
ERR_P(LscCmd(ser, "ALARM [buf1]:0")); /* switch off unused alarms */
}
}
alarmList[k]='\0';
return 0;
OnError: return -1;
}
int Settings(void) {
char buf[256], typ;
char flds[6], fmt[6];
@ -1042,10 +1118,14 @@ int Settings(void) {
int i,k,l;
SensorT *s;
remoteMode=2; /* set to remote mode */
ERR_P(LscCmd(ser, "MODE:[remoteMode]"));
ERR_P(LscCmd(ser, "PID?[loop]>prop,integ,deriv"));
ERR_P(LscCmd(ser, "RAMP?[loop]>,ramp"));
if (remoteMode!=2) {
remoteMode=2; /* set to remote mode */
ERR_P(LscCmd(ser, "PID?[loop]>prop,integ,deriv"));
ERR_P(LscCmd(ser, "RAMP?[loop]>,ramp"));
ERR_P(LscCmd(ser, "MODE:[remoteMode]"));
} else {
ERR_P(LscCmd(ser, "PID [loop],[prop],[integ],[deriv]"));
}
for (i=0; i<4; i++) {
s=sensors[i];
plug=plugs[i/2];
@ -1080,7 +1160,7 @@ int Settings(void) {
samp.sensor2=s;
} else if ('h'==typ) {
heliumSens=s;
} else if ('x'==typ) {
} else if ('x'==typ || 'f'==typ) {
auxSens=s;
} else if ('t'==typ) {
testSens=s;
@ -1097,38 +1177,19 @@ int Settings(void) {
}
if (settingsFlag) return 0;
str_copy(statusBuf, "alarms");
/* alarms */
alarmList[0]='\0';
alarmList[1]='\0';
alarmList[2]='\0';
s=cryo.sensor1;
if (s!=NULL) {
ERR_I(SetMaxPower());
r1=tLimit/s->scale;
str_copy(buf1, s->ch);
str_copy(buf, "ALARM [buf1]:1,1,[r1],0,1,1;RELAY 1:1;BEEP:0");
alarmList[0]=s->ch[0];
if (samp.sensor1!=cryo.sensor1) {
s=samp.sensor1;
r2=tLimit/s->scale;
str_copy(buf2, s->ch);
str_append(buf, ";ALARM [buf2]:1,1,[r2],0,1,1");
alarmList[1]=s->ch[0];
}
ERR_P(LscCmd(ser, buf));
}
/* switch off alarm of unused channels */
buf[0]='\0';
if (NULL==strchr(alarmList, 'A')) str_append(buf, ";ALARM A:0");
if (NULL==strchr(alarmList, 'B')) str_append(buf, ";ALARM B:0");
if (NULL==strchr(alarmList, 'C')) str_append(buf, ";ALARM C:0");
if (NULL==strchr(alarmList, 'D')) str_append(buf, ";ALARM D:0");
if (buf[0]!='\0') ERR_P(LscCmd(ser, buf+1)); /* send without leading semicolon */
if (settingsFlag) return 0;
str_copy(statusBuf, "alarms");
ERR_I(ConfigAlarms());
if (settingsFlag) return 0;
str_copy(statusBuf, "display");
/* display */
@ -1194,7 +1255,7 @@ int Settings(void) {
logfileOut(LOG_MAIN, "load %s\n", config);
p=cfg;
while (p!=NULL) {
str_split(buf, p, '\n');
p=str_split(buf, p, '\n');
ERR_P(LscCmd(ser, buf));
}
FREE(cfg);
@ -1331,45 +1392,62 @@ int PeriodicTask(void) {
if (relay || loop !=1) {
if (alarmList[0]!='\0') {
str_copy(buf, "ALARMST?*");
buf[8]=alarmList[0];
if (alarmList[1]!='\0') {
str_append(buf,";ALARMST?*");
buf[18]=alarmList[1];
buf[0]='\0';
for (k=0;(k<4) && alarmList[k]!='\0';k++) {
str_copy(buf1,";ALARMST?*");
buf1[9]=alarmList[k];
str_append(buf, buf1);
}
str_append(buf, ";ALMRST");
ERR_P(alms=LscCmd(ser, buf));
if (0!=strcmp(alarms, alms)) {
str_copy(alarmChannels, " ");
if (alms[ 0]!='0' || alms[ 2]!='0') alarmChannels[0]=alarmList[0];
if (alms[ 4]!='0' || alms[ 6]!='0') alarmChannels[1]=alarmList[1];
if (0==strcmp(alarmChannels," ")) {
if (loop == 1) {
logfileOut(LOG_MAIN, "No more alarms, but relay is on!\n");
ERR_P(alms=LscCmd(ser, buf+1)); /* send without leading semicolon */
if (0!=strcmp(alarmStatus, alms)) {
str_copy(alarmStatus, alms);
alarmChannels[0]='\0';
i=0;
for (k=0;(k<4) && alarmList[k]!='\0';k++) {
if (alms[k*4] != '0' || alms[k*4+2] != '0') {
alarmChannels[i]=alarmList[k];
i++;
alarmChannels[i]='\0';
if (NULL==strchr(alarmHistory, alarmList[k])) { /* if not yet in history */
str_append(alarmHistory, alarmChannels+i-1); /* add to history */
}
}
}
if (i==0) {
if (lockAlarm) {
logfileOut(LOG_MAIN, "No more active alarms, latching alarms: %s!\n", alarmHistory);
} else {
logfileOut(LOG_MAIN, "No more alarms\n");
alarmHistory[0]='\0';
alarmChannels[0]='\0';
logfileOut(LOG_MAIN, "No more active alarms\n");
ERR_P(LscCmd(ser, "ALMRST"));
relay=0;
}
} else {
logfileOut(LOG_MAIN, "Alarm on channel %s\n", alarmChannels);
if (loop != 1) {
ERR_P(LscCmd(ser, "CSET 2:[chan],1,0,0"));
if (!relay) {
logfileOut(LOG_MAIN, "Switch off heater\n");
if (!relay0 && set!=0) {
lockAlarm=1;
logfileOut(LOG_MAIN, "Switch off heater\n");
if (loop==1) { /* turn on high relay manually, switch off heater and reset alarms */
ERR_P(LscCmd(ser, "RELAY 1:2,1;RANGE:0;ALMRST"));
} else {
ERR_P(LscCmd(ser, "RELAY 1:2,1;ANALOG 2:0,0;ALMRST"));
relay=1;
}
} else {
ERR_P(LscCmd(ser, "ALMRST"));
}
}
str_copy(alarms, alms);
} else {
ERR_P(LscCmd(ser, "ALMRST"));
}
} else if (loop == 1) {
if (!relay0) logfileOut(LOG_MAIN, "Relay is on!\n");
alarms[0]='\0';
alarmStatus[0]='\0';
}
} else if (loop == 1) {
str_copy(alarmChannels, " ");
if (relay0) logfileOut(LOG_MAIN, "No more alarms, relay is off\n");
alarms[0]='\0';
alarmChannels[0]='\0';
alarmStatus[0]='\0';
}
relay0=relay;
@ -1393,11 +1471,11 @@ int PeriodicTask(void) {
if (set!=0 && remoteMode==2) {
if (cryo.sensor1!=samp.sensor1 && controlMode==2) {
t=ctlSens->t;
d=(setH-t)/t-1.0; /* relative difference */
d=(setH-t)/t; /* relative difference */
w=exp(-d*d*230); /* gaussian */
if (w<0.1) tInt=0; /* reset when far from setpoint (more than 10 %) */
/* if (w<0.1) tInt=0; reset when far from setpoint (more than 10 %) */
if (int2<1) int2=1;
if (tInt<int2*1000/per) tInt+=w; /* increase integral time until int2 sec. */
if (tInt<int2) tInt+=w*per/1000; /* increase integral time until int2 sec. */
if (tInt>w) {
p=w/tInt;
} else {
@ -1533,7 +1611,13 @@ int DeviceHdl(int mode, void *base) {
int SetHdl(int mode, void *base) {
if (mode==COC_WR) {
if (remoteMode!=2) {
ERR_MSG("controller is in local mode, set to remote first");
ERR_MSG("controller is in local mode, enter 'remote' first");
} else if (relay && set!=0) {
if (alarmChannels[0]!='\0') {
ERR_MSG("alarm is active, set prohibited");
} else {
ERR_MSG("alarm was active, enter 'reset' first");
}
} else if (set<0) {
set=0;
} else if (set>tLimit) {
@ -1561,14 +1645,29 @@ int PidHdl(int mode, void *base) {
OnError: return -1;
}
int AlarmHdl(int mode, void *base) {
if (mode==COC_WR) {
return COC_DWR;
} else if (mode==COC_DWR) {
ERR_I(ConfigAlarms());
}
return 0;
OnError: return -1;
}
int MaxPowerHdl(int mode, void *base) {
if (mode==COC_WR) {
if (remoteMode==2) {
return COC_DWR;
if (remoteMode!=2) {
ERR_MSG("controller is in local mode, enter 'remote' first");
} else if (relay) {
if (alarmChannels[0]!='\0') {
ERR_MSG("alarm is active, maxPower prohibited");
} else {
ERR_MSG("alarm was active, enter 'reset' first");
}
}
ERR_MSG("controller is in local mode, set to remote first");
return 0;
} else if (mode==COC_DWR && remoteMode!=2) {
return COC_DWR;
} else if (mode==COC_DWR && remoteMode==2) {
ERR_I(SetMaxPower());
ERR_I(SetTemp(1));
}
@ -1655,9 +1754,13 @@ int ShowSensor(StrBuf *buf, SensorT *s, char *name, char *units, char lim) {
} else {
ERR_I(StrPut(buf, LscReadStat(s->readStat), StrNONE));
}
if (s==ctlSens && tr!=DATA_UNDEF) {
if (s==ctlSens) {
ERR_I(StrPut(buf, ", setpoint", '='));
ERR_I(PutFloat(buf, 5, tr));
if (tr==DATA_UNDEF) {
ERR_I(PutFloat(buf, 5, 0.0));
} else {
ERR_I(PutFloat(buf, 5, tr));
}
ERR_I(StrPut(buf, " ", StrNONE));
ERR_I(StrPut(buf, units, StrNONE));
}
@ -1704,45 +1807,51 @@ int StatusHdl(int mode, void *base) {
goto EndStatus;
}
if (remoteMode==1) {
ERR_I(StrPut(&buf, "LOCAL mode, use command 'remote' to enable remote control", '\n'));
ERR_I(StrPut(&buf, "LOCAL mode, enter 'remote' to enable remote control", '\n'));
}
ERR_I(StrPut(&buf, "device:", ' '));
ERR_I(StrPut(&buf, device, StrNONE));
if (set==0) {
ERR_I(StrPut(&buf, "\nheater off (set=0)", StrNONE));
ERR_I(StrPut(&buf, "\nheater off,",' '));
} else {
ERR_I(StrPut(&buf, "\ntarget", '='));
ERR_I(PutFloat(&buf, 5, set));
if (ramp==0 || tr==setH) {
ERR_I(StrPut(&buf, " K", StrNONE));
ERR_I(StrPut(&buf, " K,", ' '));
} else {
ERR_I(StrPut(&buf, " K ramping at", ' '));
ERR_I(PutFloat(&buf, 4, ramp));
ERR_I(StrPut(&buf, " K/min", StrNONE));
}
if (relay) {
ERR_I(StrPut(&buf, ", heater off (alarm)", StrNONE));
} else if (htrst!=0) {
ERR_I(StrPut(&buf, ",", ' '));
ERR_I(StrPut(&buf, LscHtrStat(htrst), StrNONE));
} else {
if (power!=DATA_UNDEF) {
ERR_I(StrPut(&buf, ", htr power", '='));
if (power>=0.5) {
ERR_I(PutFloat(&buf, 3, power));
ERR_I(StrPut(&buf, " W, htr current", '='));
} else {
ERR_I(PutFloat(&buf, 3, power*1000));
ERR_I(StrPut(&buf, " mW, htr current", '='));
}
ERR_I(PutFloat(&buf, 4, htr));
ERR_I(StrPut(&buf, " ", '%'));
}
ERR_I(StrPut(&buf, " K/min,", ' '));
}
}
if (0!=strcmp(alarmChannels," ")) {
ERR_I(StrPut(&buf, "\nalarm on channel",' '));
ERR_I(StrPut(&buf, alarmChannels, StrNONE));
if (relay) {
if (alarmChannels[0]!='\0') {
ERR_I(StrPut(&buf, "alarm on channel",' '));
ERR_I(StrPut(&buf, alarmChannels, StrNONE));
} else if (alarmHistory[0]!='\0') {
ERR_I(StrPut(&buf, "alarm was on channel", ' '));
ERR_I(StrPut(&buf, alarmHistory, ','));
ERR_I(StrPut(&buf, " (enter 'reset' to confirm)", StrNONE));
} else {
ERR_I(StrPut(&buf, "alarm",' '));
}
} else if (htrst!=0) {
ERR_I(StrPut(&buf, LscHtrStat(htrst), StrNONE));
} else {
if (power!=DATA_UNDEF) {
ERR_I(StrPut(&buf, "htr power", '='));
if (power>=0.5) {
ERR_I(PutFloat(&buf, 3, power));
ERR_I(StrPut(&buf, " W, htr current", '='));
} else {
ERR_I(PutFloat(&buf, 3, power*1000));
ERR_I(StrPut(&buf, " mW, htr current", '='));
}
ERR_I(PutFloat(&buf, 4, htr));
ERR_I(StrPut(&buf, " ", '%'));
} else {
ERR_I(StrPut(&buf, "set=0", StrNONE));
}
}
tM=0; tS=0;
if (cryo.sensor1!=NULL) {
@ -1786,16 +1895,39 @@ EndStatus:
int RemoteHdl(int mode, void *base) {
if (mode==COC_WR) {
return COC_DRD;
} else if (mode==COC_DRD) {
return COC_DWR;
} else if (mode==COC_DWR) {
ERR_P(LscCmd(ser, "MODE:[remoteMode]"));
}
return 0;
OnError: return -1;
}
int ExecuteRequest(void) {
int RelayHdl(int mode, void *base) {
if (mode==COC_WR) {
if (alarmChannels[0]!='\0') ERR_MSG("alarm is still active");
return COC_DWR;
} else if (mode==COC_DWR) {
if (relay) {
ERR_P(LscCmd(ser, "RELAY 1:2,1"));
if (alarmHistory[0]=='\0') {
str_copy(alarmHistory, "X");
}
} else {
alarmHistory[0]='\0';
alarmStatus[0]='\0';
ERR_P(LscCmd(ser, "ALMRST;RELAY 1:1"));
logfileOut(LOG_MAIN, "reset alarms\n");
relay0=0;
lockAlarm=0;
set=0;
}
}
return 0;
OnError: return -1;
}
int ExecuteRequest(void) {
if (readTemp) ERR_I(ReadTemp());
ERR_I(CocCallHandlers());
while (settingsFlag==1) {
@ -1844,7 +1976,7 @@ int MainBody(void) {
per=1000; /* 1 sec */
cryo.temp=0;
samp.temp=0;
remoteMode=1;
/* remoteMode=1; */
noResp=3;
} else if (noResp < 2) {
logfileOut(LOG_ALL ,"no response\n");
@ -1953,6 +2085,7 @@ int main(int argc, char *argv[]) {
CocFltFld(SensorT, t2, RD);
CocFltFld(SensorT, lim, RD);
CocFltFld(SensorT, scale, RD);
CocFltFld(SensorT, alarm, RW); CocHdl(AlarmHdl);
CocIntFld(SensorT, readStat, RD);
CocIntFld(SensorT, stat1, RD);
CocIntFld(SensorT, stat2, RD);
@ -1965,6 +2098,8 @@ int main(int argc, char *argv[]) {
CocDefFlt(deriv, RW); CocHdl(PidHdl);
CocDefFlt(set, RW); CocHdl(SetHdl);
CocDefFlt(ramp, RW); CocHdl(SetHdl);
CocDefFlt(smooth, RW);
CocDefFlt(powFact, RW);
CocDefFlt(htr, RD);
CocDefFlt(power, RD);
CocDefFlt(setH, RD);
@ -1980,6 +2115,8 @@ int main(int argc, char *argv[]) {
CocDefFlt(fbuf, RD);
CocDefFlt(r1, RD);
CocDefFlt(r2, RD);
CocDefFlt(tShift, RW);
CocDefFlt(tInt, RW);
CocDefPtr(clData, ClientData);
CocStrFld(ClientData, cmd, RW); CocHdl(SendHdl);
@ -2017,6 +2154,7 @@ int main(int argc, char *argv[]) {
CocDefInt(iAmp, RD);
CocDefInt(iRange, RD);
CocDefInt(remoteMode, RW); CocHdl(RemoteHdl);
CocDefInt(relay, RW); CocHdl(RelayHdl);
CocDefInt(htrst, RD);
CocDefInt(loop, RD);
CocDefInt(rdTim, RD);
@ -2027,7 +2165,6 @@ int main(int argc, char *argv[]) {
CocDefInt(controlMode, RW);
CocDefInt(int2, RW);
CocDefInt(busy, RD);
CocDefInt(relay, RD);
CocDefInt(serialNo, RD);
CocDefInt(quit, RW);

View File

@ -58,16 +58,18 @@
print *,'Tecs Client'
print *,'-----------'
print *
print *,'<empty line> show temperature and device'
print *,'set <temp> set temperature'
print *,'send <command> direct command to LSC340'
print *,'device <device> set cryo device'
print *,'<parameter> show parameter'
print *,'<parameter> <value> set parameter'
print *
print *,'<empty line> show summary'
print *,'plot <var> chart for temperature and <var>'
1 ,' var = P (default), He, Aux'
print *,'log <n> show last n lines of logfile'
print *,'remote set to remote mode'
print *,'reset reset alarms'
print *,'kill shut down TecsServer'
print *,'restart restart TecsServer'
print *,'exit,quit exit tecs client'
@ -83,6 +85,7 @@
cmd=' '
k=0
do j=1,l
if (k .gt. 0 .and. line(j:j) .eq. '=') line(j:j)=' '
if (line(j:j) .gt. ' ') then
k=k+1
cmd(k:k)=line(j:j)
@ -136,6 +139,9 @@
else if (cmd .eq. 'remote') then
iret=tecs_set_par('remoteMode', '2', 2)
if (iret .lt. 0) goto 19
else if (cmd .eq. 'reset') then
iret=tecs_set_par('relay', '0', 2)
if (iret .lt. 0) goto 19
elseif (cmd .eq. 'rwacs') then
iret=tecs_rights(1)
if (iret .lt. 0) goto 19
@ -158,12 +164,13 @@
print *,'controlMode control on: 0: heat exchanger, '
1 ,'1: sample, 2: second loop'
print *,'maxPower heater max. power'
print *,'ramp ramp in K/min. (0: no ramp)'
print *,'prop PID gain'
print *,'int PID integration time: 1000/int sec'
print *,'deriv PID derivation term'
print *,'maxShift maximum (set-tempH) for controlMode=2'
print *,'int2 integration time (sec) for controlMode=2'
print *,'remoteMode 1: local, 2: remote'
! print *,'remoteMode 1: local, 2: remote'
print *
print *,'Read only parameters:'
print *

View File

@ -171,7 +171,7 @@ subroutine tecs_plot(auxpar)
sel2=sel
endif
do rl=1,2
if (mode==zoom) then
if (mode==zoom .and. rl==1) then
ymin(1)=y1
ymax(1)=y2
else
@ -361,7 +361,8 @@ subroutine tecs_plot(auxpar)
numl=0
numb=' '
7 if (mode==live) then
7 ex=undef
if (mode==live) then
! if (device(1:1)=='X') then
! call pgmtxt('T', 0.5, 0.0, 0.0, 'LIVE MODE (click on text window before pressing any further key)')
! endif
@ -369,7 +370,7 @@ subroutine tecs_plot(auxpar)
i=chartperiod-mod(myc_now(), chartperiod)
call get_cursor(ex, ey, key, -i)
do while (key == char(0)) ! no key pressed
do while (key == char(0) .or. key == ' ') ! no key or space key pressed
iret=tecs_get_mult(pars, t, nset, yy1)
if (iret<0) goto 99
tim1=t-tbase
@ -428,7 +429,7 @@ subroutine tecs_plot(auxpar)
if (mode==zoom) then
if (ex==undef) then
ex=(x1+x2)/2
ey=(min(y1,ymax(1))+max(y1,ymin(1)))/2
ey=(min(y2,ymax(1))+max(y1,ymin(1)))/2
end if
fx=max(winmin,x2-x1)
fy=max(y2-y1,1e-3,y2*1e-5)
@ -532,6 +533,7 @@ subroutine tecs_plot(auxpar)
elseif (key == 'S') then
sel=sel+1
if (sel > tmax) sel=0
if (mode==zoom) mode=0
elseif (key == 'C') then
auxsel=auxsel+1
if (auxsel > amax) auxsel=1
@ -553,18 +555,16 @@ subroutine tecs_plot(auxpar)
read(*,'(a)') filnam
open(lund, file=filnam, status='unknown', carriagecontrol='list')
gap=.false.
do j=1,nset
if (j == 1) then
write(lund, *) ' time [h]',char(9),' Tm [K]'
elseif (j == 2) then
write(lund,*)
write(lund, *) ' time [h]',char(9),' Ts [K]'
l=0
i2=0
do i1=1,nset
if (i1 > nset-naux) then
j=i1
else
write(lund,*)
write(lund, *) ' time [h]',char(9), ' ',trim(parnam(j))
j=nset-i1+(1-naux)
endif
gap=.false.
do i=1,retLen(j)
if (yd(i,j)==undef) then
if (gap) then
@ -572,13 +572,20 @@ subroutine tecs_plot(auxpar)
gap=.false.
endif
else
if (i2/=i1) then
if (l > 0) write(lund, *)
write(lund, *) ' time [h]',char(9), ' ',trim(parnam(j))
l=l+1
i2=i1
endif
write(lund, '(f9.4,a,f9.4)') xd(i,j)/3600., char(9), max(-999.,min(9999.,yd(i,j)))
l=l+1
gap=.true.
endif
enddo
enddo
close(lund)
print *, retLen(1)+1, ' lines written to ',filnam(1:48)
print *, l, ' lines written to ',filnam(1:48)
endif
end subroutine