- various enhancements in drivers
This commit is contained in:
152
euro2kdriv.c
152
euro2kdriv.c
@ -59,12 +59,10 @@ typedef struct {
|
||||
float range;
|
||||
float asymmetry;
|
||||
float setpoint;
|
||||
float pbPow;
|
||||
float pbMin;
|
||||
float pbScl;
|
||||
Euro2kPar *pars, *readPar;
|
||||
Euro2kPar *pars, *readPar, *setPar;
|
||||
Statistics *stat;
|
||||
double lastRd;
|
||||
char *model;
|
||||
} Euro2k;
|
||||
|
||||
static ParClass euro2kClass = { "EURO2K", sizeof(Euro2k) };
|
||||
@ -169,6 +167,7 @@ void Euro2kParDef(void *object)
|
||||
Euro2kPar *par, *next;
|
||||
FILE *saveFile;
|
||||
char *w, *t, *u, *f;
|
||||
float old;
|
||||
|
||||
static char *modeList[] = { "auto", "manual", NULL };
|
||||
|
||||
@ -177,9 +176,11 @@ void Euro2kParDef(void *object)
|
||||
ParFloat(&drv->value, PAR_NAN);
|
||||
|
||||
ParName("unit");
|
||||
ParAccess(usUser);
|
||||
if (drv->unit == NULL) {
|
||||
ParAccess(usUser);
|
||||
}
|
||||
ParLogAs(NULL);
|
||||
ParStr(&drv->unit, "C");
|
||||
ParStr(&drv->unit, NULL);
|
||||
|
||||
ParName("mode");
|
||||
ParEnum(modeList);
|
||||
@ -187,15 +188,26 @@ void Euro2kParDef(void *object)
|
||||
EaseUpdate(EURO2K_MODE);
|
||||
ParInt(&drv->mode, 1);
|
||||
|
||||
ParName("model");
|
||||
ParLogAs(NULL);
|
||||
ParStr(&drv->model, NULL);
|
||||
|
||||
/*
|
||||
ParName("pbPow"); ParAccess(usUser); ParFloat(&drv->pbPow, 0.0);
|
||||
ParName("pbMin"); ParAccess(usUser); ParFloat(&drv->pbMin, 8.0);
|
||||
ParName("pbScl"); ParAccess(usUser); ParFloat(&drv->pbScl, 3.0);
|
||||
*/
|
||||
|
||||
old = 0.0;
|
||||
ParName("pbPow");
|
||||
ParAccess(usUser);
|
||||
ParFloat(&drv->pbPow, 0.0);
|
||||
ParSave(0);
|
||||
ParFloat(&old, 0.0);
|
||||
ParName("pbMin");
|
||||
ParAccess(usUser);
|
||||
ParFloat(&drv->pbMin, 8.0);
|
||||
ParSave(0);
|
||||
ParFloat(&old, 0.0);
|
||||
ParName("pbScl");
|
||||
ParAccess(usUser);
|
||||
ParFloat(&drv->pbScl, 3.0);
|
||||
ParSave(0);
|
||||
ParFloat(&old, 0.0);
|
||||
|
||||
ParName("output");
|
||||
ParTail("%");
|
||||
@ -256,7 +268,11 @@ void Euro2kParDef(void *object)
|
||||
}
|
||||
ParName(par->name);
|
||||
if (par->unit) {
|
||||
ParTail(par->unit);
|
||||
if (strcmp(par->unit, "@") == 0) {
|
||||
ParTail(drv->unit);
|
||||
} else {
|
||||
ParTail(par->unit);
|
||||
}
|
||||
} else {
|
||||
ParList(NULL);
|
||||
}
|
||||
@ -265,10 +281,17 @@ void Euro2kParDef(void *object)
|
||||
}
|
||||
if (par->set >= settable) {
|
||||
if (EaseUpdate(EURO2K_PAR)) {
|
||||
par->set = to_set;
|
||||
old = par->par;
|
||||
ParFloat(&par->par, PAR_NAN);
|
||||
if (fabsf(par->par - old) > 1e-5 * (par->par + old)) {
|
||||
par->set = to_set;
|
||||
}
|
||||
} else {
|
||||
ParFloat(&par->par, PAR_NAN);
|
||||
}
|
||||
} else {
|
||||
ParFloat(&par->par, PAR_NAN);
|
||||
}
|
||||
ParFloat(&par->par, PAR_NAN);
|
||||
}
|
||||
}
|
||||
|
||||
@ -313,6 +336,20 @@ double getTime(void)
|
||||
return tv.tv_sec + 1.0e-6 * tv.tv_usec;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
float Euro2kGet(EaseBase * eab, Euro2kPar * par)
|
||||
{
|
||||
/* a hack for converting different time formats on 2216 and 3216 models) */
|
||||
float value;
|
||||
|
||||
value = ModBusGet(eab, par->adr, par->type);
|
||||
if (par->type == modBusTime && value > 100000.0) {
|
||||
par->type = modBusFloat;
|
||||
value = ModBusGet(eab, par->adr, par->type);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static long Euro2kRead(long pc, void *object)
|
||||
{
|
||||
@ -368,7 +405,7 @@ static long Euro2kRead(long pc, void *object)
|
||||
drv->output = ModBusGet(eab, 3, modBusFloat);
|
||||
for (par = drv->pars; par != NULL; par = par->next) {
|
||||
if (par->adr > 3 && par->adr <= 9 && par->set != to_set) {
|
||||
par->par = ModBusGet(eab, par->adr, par->type);
|
||||
par->par = Euro2kGet(eab, par);
|
||||
}
|
||||
}
|
||||
now = getTime();
|
||||
@ -387,16 +424,15 @@ static long Euro2kRead(long pc, void *object)
|
||||
if (drv->position > 100)
|
||||
drv->position = 100;
|
||||
|
||||
if (drv->pbPow <= 0.0)
|
||||
goto getPars;
|
||||
/*
|
||||
if (drv->pbPow <= 0.0) goto getPars;
|
||||
pb = drv->pbMin + pow(drv->value * drv->pbScl, drv->pbPow);
|
||||
if (pb > 999.)
|
||||
pb = 999.;
|
||||
if (pb > 999.) pb=999.;
|
||||
ModBusPutValue(eab, 6, modBusFloat, pb);
|
||||
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
|
||||
return __LINE__; case __LINE__:
|
||||
getPars:
|
||||
*/
|
||||
par = drv->readPar;
|
||||
par0 = par;
|
||||
do {
|
||||
@ -414,7 +450,7 @@ static long Euro2kRead(long pc, void *object)
|
||||
case __LINE__: /**********************************/
|
||||
par = drv->readPar;
|
||||
if (par->set != to_set) {
|
||||
par->par = ModBusGetValue(eab, par->type);
|
||||
par->par = Euro2kGet(eab, par);
|
||||
}
|
||||
skipPar:
|
||||
if (eab->p.verbose >= 3) {
|
||||
@ -439,6 +475,7 @@ static long Euro2kSet(long pc, void *object)
|
||||
int l;
|
||||
int upd;
|
||||
char buf[4];
|
||||
float value;
|
||||
|
||||
switch (pc) {
|
||||
default: /* FSM BEGIN ****************************** */
|
||||
@ -454,16 +491,22 @@ static long Euro2kSet(long pc, void *object)
|
||||
goto run;
|
||||
for (par = drv->pars; par != NULL; par = par->next) {
|
||||
if (par->set == to_set) {
|
||||
ModBusPutValue(eab, par->adr, par->type, par->par);
|
||||
par->set = settable;
|
||||
goto setIt;
|
||||
ModBusRequestValue(eab, par->adr, par->type);
|
||||
goto readIt;
|
||||
}
|
||||
}
|
||||
goto fsm_quit;
|
||||
run:
|
||||
ModBusRequestValue(eab, 2, modBusFloat);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
value = ModBusGetValue(eab, modBusFloat);
|
||||
if (fabsf(value - drv->setpoint) <= 1e-5 * (value + drv->setpoint))
|
||||
goto skipset;
|
||||
ModBusPutFloats(eab, 2, 1, &drv->setpoint);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
skipset:
|
||||
if (drv->mode == 0)
|
||||
goto loop;
|
||||
drv->mode = 0;
|
||||
@ -474,6 +517,18 @@ static long Euro2kSet(long pc, void *object)
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
ModBusPutValue(eab, 273, modBusInt, drv->mode); /* set manual to 0 */
|
||||
goto setIt;
|
||||
readIt:
|
||||
drv->setPar = par;
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
par = drv->setPar;
|
||||
value = Euro2kGet(eab, par);
|
||||
par->set = settable;
|
||||
if (fabsf(par->par - value) <= 0.00001 * fabsf(par->par + value)) {
|
||||
goto loop;
|
||||
}
|
||||
ModBusPutValue(eab, par->adr, par->type, par->par);
|
||||
setIt:
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
@ -488,17 +543,54 @@ static long Euro2kStart(long pc, void *object)
|
||||
{
|
||||
Euro2k *drv = ParCast(&euro2kClass, object);
|
||||
EaseBase *eab = object;
|
||||
int number;
|
||||
char hex[8];
|
||||
|
||||
switch (pc) {
|
||||
default: /* FSM BEGIN ****************************** */
|
||||
ModBusRequestValue(eab, 1, modBusFloat);
|
||||
ModBusRequestValue(eab, 122, modBusInt);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
if (0 == ModBusGetValue(eab, modBusFloat)) {
|
||||
if (eab->state != EASE_read) {
|
||||
ParPrintf(drv, eError, "bad or no response on ModBus");
|
||||
goto quit;
|
||||
}
|
||||
ParPrintf(drv, eLog, "connected to euro2k");
|
||||
number = ModBusGetValue(eab, modBusInt);
|
||||
if (drv->model != NULL) {
|
||||
free(drv->model);
|
||||
}
|
||||
snprintf(hex, sizeof hex, "%4.4X", number);
|
||||
if (hex[0] == 'E')
|
||||
hex[0] = '3';
|
||||
if (hex[2] == '3') {
|
||||
hex[3] = '2';
|
||||
} else if (hex[2] == '6') {
|
||||
hex[2] = '1';
|
||||
hex[3] = '6';
|
||||
} else {
|
||||
hex[2] = '0';
|
||||
hex[3] = hex[2];
|
||||
}
|
||||
drv->model = strdup(hex);
|
||||
ModBusRequestValue(eab, 107, modBusInt);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
number = ModBusGetValue(eab, modBusInt);
|
||||
snprintf(eab->version, sizeof(eab->version), "%s V%4.4X", drv->model,
|
||||
number);
|
||||
ParPrintf(drv, eLog, "connected to Eurotherm %s", eab->version);
|
||||
if (drv->unit != NULL)
|
||||
goto unitGiven;
|
||||
ModBusRequestValue(eab, 516, modBusInt);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
number = ModBusGetValue(eab, modBusInt);
|
||||
if (number == 0) {
|
||||
drv->unit = strdup("C");
|
||||
} else if (number == 2) {
|
||||
drv->unit = strdup("K");
|
||||
}
|
||||
unitGiven:
|
||||
ModBusPutValue(eab, 111, modBusFloat, drv->d.upperLimit);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
|
Reference in New Issue
Block a user