- various improvements in SE drivers
This commit is contained in:
139
ighdriv.c
139
ighdriv.c
@ -34,11 +34,12 @@ Markus Zolliker, May 2005
|
||||
#define OLDIGH -8
|
||||
#define SORBS_FLAG 1
|
||||
#define MIXP_FLAG 2
|
||||
#define STILL_FLAG 3
|
||||
#define SORBP_FLAG 4
|
||||
#define MOT_FLAGS 5
|
||||
#define VALVE_FLAGS 8
|
||||
#define MAX_FLAG 31
|
||||
#define MAXP_FLAG 3
|
||||
#define STILL_FLAG 4
|
||||
#define SORBP_FLAG 5
|
||||
#define MOT_FLAGS 6
|
||||
#define VALVE_FLAGS 9
|
||||
#define MAX_FLAG 32
|
||||
|
||||
static char *valves[]={"V9", "V8", "V7", "V11A", "V13A", "V13B", "V11B", "V12B",
|
||||
" He4", "V1", "V5", "V4", "V3", "V14", "V10", "V2",
|
||||
@ -60,6 +61,7 @@ static char *closedOrOpen[]={"closed", "open", NULL};
|
||||
|
||||
typedef struct {
|
||||
EaseDriv d;
|
||||
float setT;
|
||||
float sorbS;
|
||||
float mixT;
|
||||
float onekT;
|
||||
@ -69,6 +71,8 @@ typedef struct {
|
||||
float sorbP;
|
||||
float press[n_PRESS];
|
||||
float mv[n_MOTOR];
|
||||
float v6pos;
|
||||
time_t v6time;
|
||||
int pdig;
|
||||
int v[n_VALVES];
|
||||
int e; /* heater range */
|
||||
@ -82,12 +86,40 @@ static ParClass ighClass = { "IGH", sizeof(Igh) };
|
||||
|
||||
static long IghSet(long pc, void *object);
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int IghPower2Range(float p) {
|
||||
int e;
|
||||
if (p <= 0) return 0;
|
||||
for (e = 1; e < 5; e++) {
|
||||
if (p < 1.9994) break;
|
||||
p /= 10;
|
||||
}
|
||||
return e;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static float IghRange2Max(int e) {
|
||||
static float elist[]={0,2,20,200,2000,20000};
|
||||
if (e < 0) {
|
||||
e = 0;
|
||||
} else if (e > 5) {
|
||||
e = 5;
|
||||
}
|
||||
return elist[e];
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void IghParDef(void *object) {
|
||||
Igh *drv = ParCast(&ighClass, object);
|
||||
EaseBase *eab = object;
|
||||
int i, flag, l, changed;
|
||||
char *vPos;
|
||||
char *vPos, *val;
|
||||
char fmt[8], vList[80];
|
||||
float maxP;
|
||||
|
||||
ParName(""); ParTail("K"); ParFmt("%.4f");
|
||||
ParFloat(&drv->mixT, PAR_NAN);
|
||||
|
||||
ParName("Tset"); ParTail("K"); ParFmt("%.4f");
|
||||
if (eab->syntax == OLDIGH) ParList("all");
|
||||
ParFloat(&drv->setT, PAR_NAN);
|
||||
|
||||
ParName("TsorbSet");
|
||||
EaseUpdate(SORBS_FLAG); ParTail("K"); ParFmt("%.1f");
|
||||
@ -106,8 +138,7 @@ static void IghParDef(void *object) {
|
||||
ParFloat(&drv->sorbT, PAR_NAN);
|
||||
|
||||
ParName("Pmix");
|
||||
if (drv->e < 1 || drv->e > 5) drv->e=1;
|
||||
if (drv->e == 5) {
|
||||
if (drv->e >= 5 || drv->e < 1) {
|
||||
strcpy(fmt, "%.0f");
|
||||
} else {
|
||||
snprintf(fmt, sizeof fmt, "%%.%df", 4 - drv->e);
|
||||
@ -115,6 +146,14 @@ static void IghParDef(void *object) {
|
||||
EaseUpdate(MIXP_FLAG); ParTail("uW"); ParFmt(fmt);
|
||||
ParFloat(&drv->mixP, PAR_NAN);
|
||||
|
||||
ParName("Pmax");
|
||||
EaseUpdate(MAXP_FLAG); ParTail("uW"); ParFmt("%g");
|
||||
if ((val = ParGetValueArg())) {
|
||||
drv->e = IghPower2Range(atof(val) * 0.9);
|
||||
}
|
||||
maxP = IghRange2Max(drv->e);
|
||||
ParFloat(&maxP, PAR_NAN);
|
||||
|
||||
ParName("Pstill");
|
||||
EaseUpdate(STILL_FLAG); ParTail("mW"); ParFmt("%.3f");
|
||||
ParFloat(&drv->stillP, PAR_NAN);
|
||||
@ -144,11 +183,16 @@ static void IghParDef(void *object) {
|
||||
flag = MOT_FLAGS;
|
||||
for (i=0; i<n_MOTOR; i++) {
|
||||
ParName(motorValves[i]);
|
||||
ParFmt("%.1f");
|
||||
ParTail("%");
|
||||
if (i == V1K) ParList("all");
|
||||
EaseUpdate(flag); flag++;
|
||||
ParFloat(&drv->mv[i], PAR_NAN);
|
||||
}
|
||||
|
||||
ParName("v6pos"); ParFmt("%.1f"); ParTail("%");
|
||||
ParFloat(&drv->v6pos, PAR_NAN);
|
||||
|
||||
assert(flag == VALVE_FLAGS);
|
||||
l = 0;
|
||||
for (i=0; i<n_VALVES; i++) {
|
||||
@ -229,7 +273,13 @@ void IghStatus(Igh *drv) {
|
||||
drv->a = ans[3] - '0';
|
||||
drv->s = ans[16] - '0';
|
||||
drv->o = ans[18] - '0';
|
||||
drv->e = ans[20] - '0';
|
||||
if (EaseGetUpdate(drv, MAXP_FLAG) == 0) {
|
||||
if (drv->a == 0) {
|
||||
drv->e = 0;
|
||||
} else {
|
||||
drv->e = ans[20] - '0';
|
||||
}
|
||||
}
|
||||
if (ans[5] != '3' && drv->remote == 2) {
|
||||
ParPrintf(drv, eError, "IGH switched to local");
|
||||
*code = EASE_FAULT;
|
||||
@ -243,7 +293,8 @@ static long IghRead(long pc, void *object) {
|
||||
EaseBase *eab = object;
|
||||
char *p;
|
||||
int l;
|
||||
time_t thisPeriod;
|
||||
time_t now;
|
||||
float delta;
|
||||
|
||||
switch (pc) { default: /* FSM BEGIN *******************************/
|
||||
EaseWrite(eab, "X");
|
||||
@ -285,6 +336,12 @@ static long IghRead(long pc, void *object) {
|
||||
}
|
||||
if (EaseCheckDoit(eab)) goto quit;
|
||||
|
||||
if (eab->syntax == OLDIGH) goto noSetTemp;
|
||||
EaseWrite(eab, "R33");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
drv->setT = OxiGet(eab, 4, NULL, drv->setT);
|
||||
|
||||
noSetTemp:
|
||||
EaseWrite(eab, "R1");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
drv->sorbT = OxiGet(eab, 1, NULL, drv->sorbT);
|
||||
@ -297,6 +354,10 @@ static long IghRead(long pc, void *object) {
|
||||
|
||||
if (EaseCheckDoit(eab)) goto quit;
|
||||
|
||||
if (drv->e == 0) {
|
||||
drv->mixP = 0;
|
||||
goto skip4;
|
||||
}
|
||||
if (EaseGetUpdate(drv, MIXP_FLAG)) goto skip4;
|
||||
EaseWrite(eab, "R4");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
@ -325,6 +386,16 @@ static long IghRead(long pc, void *object) {
|
||||
EaseWrite(eab, "R7");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
drv->mv[V6] = OxiGet(eab, 1, NULL, drv->mv[V6]);
|
||||
time(&now);
|
||||
delta = (now - drv->v6time) / 2.64; /* speed: 1/2.64 %/sec */
|
||||
drv->v6time = now;
|
||||
if (drv->v6pos > drv->mv[V6] + delta) {
|
||||
drv->v6pos -= delta;
|
||||
} else if (drv->v6pos < drv->mv[V6] - delta) {
|
||||
drv->v6pos += delta;
|
||||
} else {
|
||||
drv->v6pos = drv->mv[V6];
|
||||
}
|
||||
skip7:
|
||||
|
||||
if (EaseCheckDoit(eab)) goto quit;
|
||||
@ -424,6 +495,7 @@ static long IghSet(long pc, void *object) {
|
||||
if (upd == EASE_RUN) goto set_temp;
|
||||
if (upd == SORBS_FLAG) goto set_sorb_temp;
|
||||
if (upd == MIXP_FLAG) goto set_mix_pow;
|
||||
if (upd == MAXP_FLAG) goto set_max_pow;
|
||||
if (upd == STILL_FLAG) goto set_still_pow;
|
||||
if (upd == SORBP_FLAG) goto set_sorb_pow;
|
||||
goto finish;
|
||||
@ -482,33 +554,44 @@ static long IghSet(long pc, void *object) {
|
||||
goto loop;
|
||||
|
||||
set_mix_pow:
|
||||
EaseWrite(eab, "A0");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
if (drv->e <= 1) goto skipe;
|
||||
EaseWrite(eab, "E1");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
|
||||
skipe:
|
||||
if (drv->mixP > 0) {
|
||||
mp = drv->mixP * 0.1;
|
||||
for (i=2; i<6; i++) {
|
||||
if (mp > 199) {
|
||||
break;
|
||||
}
|
||||
mp = mp * 10;
|
||||
}
|
||||
if (mp > 1999) mp = 1999;
|
||||
drv->e = 7-i;
|
||||
drv->e = IghPower2Range(drv->mixP);
|
||||
mp = drv->mixP / IghRange2Max(drv->e) * 2000;
|
||||
} else {
|
||||
mp = 0;
|
||||
mp = 0; /* range unchanged for external heater signal */
|
||||
}
|
||||
OxiSet(eab, "M", mp, 0);
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
if (drv->e == 0) goto loop;
|
||||
|
||||
EaseWrite(eab, "A1");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
|
||||
set_max_pow:
|
||||
if (drv->e == 0) goto seta0;
|
||||
snprintf(buf, sizeof buf, "E%d", drv->e);
|
||||
EaseWrite(eab, buf);
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
EaseWrite(eab, "A1");
|
||||
goto loop;
|
||||
|
||||
seta0:
|
||||
EaseWrite(eab, "A0");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
goto loop;
|
||||
|
||||
|
||||
set_temp:
|
||||
/* unknown yet */
|
||||
goto loop;
|
||||
EaseWrite(eab, "A2");
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
if (drv->d.targetValue < 0) drv->d.targetValue = 0;
|
||||
if (drv->d.targetValue > 1.999) drv->d.targetValue = 1.999;
|
||||
OxiSet(eab, "T", drv->d.targetValue, 4);
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
goto loop;
|
||||
|
||||
@ -521,6 +604,11 @@ static long IghSet(long pc, void *object) {
|
||||
|
||||
set_mot:
|
||||
i = upd - MOT_FLAGS;
|
||||
if (drv->mv[i] > 99.9) {
|
||||
drv->mv[i]=99.9;
|
||||
} else if (drv->mv[i] < 0) {
|
||||
drv->mv[i]=0;
|
||||
}
|
||||
OxiSet(eab, motorCommands[i], drv->mv[i], 1);
|
||||
return __LINE__; case __LINE__: /**********************************/
|
||||
goto loop;
|
||||
@ -544,11 +632,10 @@ static int IghInit(SConnection *con, int argc, char *argv[], int dynamic) {
|
||||
IghParDef, OxiHandler, IghStart, NULL, IghRead,
|
||||
IghSet);
|
||||
if (drv == NULL) return 0;
|
||||
ParPrintf(drv, eValue, "OI Gas Handling System");
|
||||
return 1;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void IghStartup(void) {
|
||||
ParMakeClass(&ighClass, EaseDrivClass());
|
||||
MakeDriver("IGH", IghInit, 0);
|
||||
MakeDriver("IGH", IghInit, 0, "OI Gas Handling System");
|
||||
}
|
||||
|
Reference in New Issue
Block a user