- improvements and bug fixes

This commit is contained in:
zolliker
2010-04-13 14:32:18 +00:00
parent 410166572b
commit 9e4eabeed1
6 changed files with 144 additions and 71 deletions

View File

@ -243,7 +243,7 @@ static void ArrayObjParDef(void *object)
ArrayObj *arr = ParCast(&arrayObjClass, object); ArrayObj *arr = ParCast(&arrayObjClass, object);
FILE *saveFile; FILE *saveFile;
ArrayItem *item, *next; ArrayItem *item, *next;
char *u; char *u, *v;
WrtObjContext context; WrtObjContext context;
static int doNotNest = 0; static int doNotNest = 0;
int saveObjects; int saveObjects;
@ -261,8 +261,18 @@ static void ArrayObjParDef(void *object)
} else { } else {
u = ""; u = "";
} }
fprintf(saveFile, " %s makeitem %s \"%s\" \"%s\"\n", arr->p.name, if (item->value) {
item->name, item->value, u); v = item->value;
} else {
v = "";
}
if (strchr(v, '\n') != NULL) {
fprintf(saveFile, " %s makeitem %s {%s} \"%s\"\n", arr->p.name,
item->name, v, u);
} else {
fprintf(saveFile, " %s makeitem %s \"%s\" \"%s\"\n", arr->p.name,
item->name, v, u);
}
if (saveObjects) { if (saveObjects) {
WrtObj(&context, item->name); WrtObj(&context, item->name);
} }

56
ease.c
View File

@ -934,11 +934,63 @@ void EaseMsgPar(void *object)
int EaseRestartWrapper(void *object, void *userarg, int argc, char *argv[]) int EaseRestartWrapper(void *object, void *userarg, int argc, char *argv[])
{ {
EaseBase *eab = EaseBaseCast(object); EaseBase *eab = EaseBaseCast(object);
char *colon;
char *hostpos;
int port, i;
char host[64], hostport[80];
char *cCmd;
/* short string with length 0 or 1: connect to previous host/port */
if (argc > 0 && strlen(argv[0]) > 1) {
colon = strchr(argv[0], ':');
if (!colon || argc > 1) {
ParPrintf(object, eError, "ERROR: illegal syntax for: %s restart",
eab->p.name);
return 0;
}
port = atoi(colon + 1);
i = colon - argv[0];
if (i >= sizeof host) {
ParPrintf(object, eError, "ERROR: host name too long");
return 0;
}
strncpy(host, argv[0], i);
host[i] = '\0';
if (eab->p.creationCmd != NULL) {
hostpos = strstr(eab->p.creationCmd, eab->ser->pHost);
if (hostpos != NULL) {
/* replace the second part of creationCmd with new host/port */
snprintf(hostport, sizeof hostport, "%s:%d", host, port);
hostpos[0]='\0';
cCmd = calloc(1, strlen(eab->p.creationCmd) + strlen(hostport) + 1);
strcpy(cCmd, eab->p.creationCmd);
strcat(cCmd, hostport);
free(eab->p.creationCmd);
eab->p.creationCmd = cCmd;
}
}
if (eab->ser->pHost != NULL) {
free(eab->ser->pHost);
}
eab->ser->pHost = strdup(host);
eab->ser->iPort = port;
}
EaseStop(eab);
EaseRestart(eab); EaseRestart(eab);
return 0; return 0;
} }
/*----------------------------------------------------------------------------*/
int EaseDisconnectWrapper(void *object, void *userarg, int argc, char *argv[])
{
EaseBase *eab = EaseBaseCast(object);
ParPrintf(object, eWarning, "%s disabled (enable with: %s restart)",
eab->p.name, eab->p.name);
EaseStop(eab);
return 0;
}
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
void EaseBasePar(void *object) void EaseBasePar(void *object)
{ {
@ -950,6 +1002,10 @@ void EaseBasePar(void *object)
ParAccess(usUser); ParAccess(usUser);
ParCmd(EaseRestartWrapper, NULL); ParCmd(EaseRestartWrapper, NULL);
ParName("disconnect");
ParAccess(usUser);
ParCmd(EaseDisconnectWrapper, NULL);
if (ParActionIs(PAR_KILL)) { if (ParActionIs(PAR_KILL)) {
if (eab->ser) { if (eab->ser) {
KillRS232(eab->ser); KillRS232(eab->ser);

View File

@ -63,6 +63,7 @@ typedef struct {
Statistics *stat; Statistics *stat;
double lastRd; double lastRd;
char *model; char *model;
int rdonly;
} Euro2k; } Euro2k;
static ParClass euro2kClass = { "EURO2K", sizeof(Euro2k) }; static ParClass euro2kClass = { "EURO2K", sizeof(Euro2k) };
@ -231,6 +232,11 @@ void Euro2kParDef(void *object)
EaseUpdate(EURO2K_SET); EaseUpdate(EURO2K_SET);
ParFloat(&drv->setpoint, PAR_NAN); ParFloat(&drv->setpoint, PAR_NAN);
ParName("rdonly");
ParLogAs(NULL);
ParAccess(usUser);
ParInt(&drv->rdonly, 0);
ParName("task"); ParName("task");
ParAccess(usUser); ParAccess(usUser);
ParList(NULL); ParList(NULL);
@ -367,6 +373,11 @@ static long Euro2kRead(long pc, void *object)
switch (pc) { switch (pc) {
default: /* FSM BEGIN ****************************** */ default: /* FSM BEGIN ****************************** */
EasePchk(drv); EasePchk(drv);
if (drv->rdonly) {
if (getTime() < drv->lastRd + 10) {
goto fsm_quit;
}
}
if (drv->script && drv->script[0] != '\0' if (drv->script && drv->script[0] != '\0'
&& 0 != strcmp(drv->script, "0")) { && 0 != strcmp(drv->script, "0")) {
pTcl = InterpGetTcl(pServ->pSics); pTcl = InterpGetTcl(pServ->pSics);
@ -482,6 +493,8 @@ static long Euro2kSet(long pc, void *object)
default: /* FSM BEGIN ****************************** */ default: /* FSM BEGIN ****************************** */
EasePchk(drv); EasePchk(drv);
loop: loop:
if (drv->rdonly)
goto fsm_quit;
upd = EaseNextUpdate(drv); upd = EaseNextUpdate(drv);
if (upd == EASE_RUN) { if (upd == EASE_RUN) {
drv->setpoint = drv->d.targetValue; drv->setpoint = drv->d.targetValue;
@ -594,6 +607,8 @@ static long Euro2kStart(long pc, void *object)
drv->unit = strdup("K"); drv->unit = strdup("K");
} }
unitGiven: unitGiven:
if (drv->rdonly)
goto quit;
ModBusPutValue(eab, 111, modBusFloat, drv->d.upperLimit); ModBusPutValue(eab, 111, modBusFloat, drv->d.upperLimit);
return __LINE__; return __LINE__;
case __LINE__: /**********************************/ case __LINE__: /**********************************/

View File

@ -472,11 +472,13 @@ static int ParExecute(SConnection * con, SicsInterp * sics, void *object,
if (argc >= 2 && 0 == strcasecmp(argv[1], "loggeditems")) { if (argc >= 2 && 0 == strcasecmp(argv[1], "loggeditems")) {
pDynString dyn = CreateDynString(124,128); pDynString dyn = CreateDynString(124,128);
for (info = o->infoList; info != NULL; info = info->next) { for (info = o->infoList; info != NULL; info = info->next) {
if (info->log) { if (info->log && (argc==2 || strcasecmp(argv[2], info->name) == 0)) {
DynStringConcat(dyn, " "); DynStringConcat(dyn, " ");
DynStringConcat(dyn, argv[0]); DynStringConcat(dyn, argv[0]);
DynStringConcat(dyn, "."); if (info->name[0] != '\0') {
DynStringConcat(dyn, info->name); DynStringConcat(dyn, ".");
DynStringConcat(dyn, info->name);
}
} }
} }
SCWrite(con, GetCharArray(dyn) + 1, eValue); SCWrite(con, GetCharArray(dyn) + 1, eValue);
@ -1058,8 +1060,8 @@ void ParOut(char *buf)
} else { } else {
p = ""; p = "";
} }
ParPrintf(NULL, eValue, "%s%s%s = %s", ctx->callName, p, ctx->parName, ParPrintf(NULL, eValue, "%s%s%s = %s", ctx->callName,
buf); p, ctx->parName, buf);
break; break;
case PAR_SET: case PAR_SET:
if (ctx->parName[0]) { if (ctx->parName[0]) {
@ -1100,8 +1102,13 @@ void ParOut(char *buf)
} }
break; break;
case PAR_SAVE: case PAR_SAVE:
fprintf(ctx->saveFile, " %s %s %s\n", ctx->obj->name, ctx->parName, if (strchr(buf, '\n') != NULL) {
buf); fprintf(ctx->saveFile, " %s %s {%s}\n", ctx->obj->name,
ctx->parName, buf);
} else {
fprintf(ctx->saveFile, " %s %s %s\n", ctx->obj->name,
ctx->parName, buf);
}
break; break;
default: default:
break; break;

View File

@ -374,6 +374,12 @@ $(CFGDIR)x55606.crv: ccrv inp/x55606.inp
$(CFGDIR)x55918.crv: ccrv inp/x55918.inp $(CFGDIR)x55918.crv: ccrv inp/x55918.inp
$Q -p$(CFGDIR) $Q -p$(CFGDIR)
$(CFGDIR)x58599.crv: ccrv inp/x58599.inp
$Q -p$(CFGDIR)
$(CFGDIR)x58600.crv: ccrv inp/x58600.inp
$Q -p$(CFGDIR)
$(CFGDIR)z030114.crv: ccrv inp/z030114.inp $(CFGDIR)z030114.crv: ccrv inp/z030114.inp
$Q -p$(CFGDIR) $Q -p$(CFGDIR)
@ -503,6 +509,8 @@ all_crv: dev.list \
$(CFGDIR)x51079.crv \ $(CFGDIR)x51079.crv \
$(CFGDIR)x55606.crv \ $(CFGDIR)x55606.crv \
$(CFGDIR)x55918.crv \ $(CFGDIR)x55918.crv \
$(CFGDIR)x58599.crv \
$(CFGDIR)x58600.crv \
$(CFGDIR)z030114.crv \ $(CFGDIR)z030114.crv \
ALLINP= \ ALLINP= \
@ -631,5 +639,7 @@ inp/x50991.inp \
inp/x51079.inp \ inp/x51079.inp \
inp/x55606.inp \ inp/x55606.inp \
inp/x55918.inp \ inp/x55918.inp \
inp/x58599.inp \
inp/x58600.inp \
inp/z030114.inp \ inp/z030114.inp \

View File

@ -111,8 +111,9 @@ static Plug
static float static float
set, /* set T */ set, /* set T */
setH, /* set T on heat exchanger */ setH, /* set T on heat exchanger */
set2, /* set T of seconds loop in two loop mode */ set2, /* set T of second loop in two loop mode */
htr, power=DATA_UNDEF, /* heater current percentage, heater power */ htr, power=DATA_UNDEF, /* heater current percentage, heater power */
power2=DATA_UNDEF, /* heater2 power */
tLimit, /* temperature limit */ tLimit, /* temperature limit */
tMaxLimit, /* maximal temperature limit */ tMaxLimit, /* maximal temperature limit */
maxPowerFlt, /* max. Power */ maxPowerFlt, /* max. Power */
@ -220,7 +221,6 @@ static char
static char static char
*alarmList[N_SENSORS], /* enabled alarms */ *alarmList[N_SENSORS], /* enabled alarms */
*table=NULL, /* environment devices table */
*cache=NULL, /* curve list cache */ *cache=NULL, /* curve list cache */
*logfile="<none>"; *logfile="<none>";
@ -560,16 +560,6 @@ int InstalCurve(SensorT *sensor, char *devArg) {
return -1; return -1;
} }
int ReadTable(void) { /* obsolete */
char nbuf[256];
if (table!=NULL) { FREE(table); table=NULL; };
str_copy(nbuf, binDir);
str_append(nbuf, TABLE_FILE);
ERR_P(table=str_read_file(nbuf));
return 1;
OnError: return -1;
}
void InitSensor(SensorT *s) { void InitSensor(SensorT *s) {
s->t=DATA_UNDEF; s->t=DATA_UNDEF;
s->scale=1; s->scale=1;
@ -584,10 +574,10 @@ void InitSensor(SensorT *s) {
} }
int PrepInput(char *label) { int PrepInput(char *label) {
char *t, *e; char *t;
char nam[16], chans[8], typ; char nam[16], typ;
char buf[256]; char buf[256];
int i, j, l; int i, j;
SensorT *s; SensorT *s;
char *cfg; char *cfg;
@ -602,14 +592,9 @@ again:
str_append(buf, nam); str_append(buf, nam);
str_append(buf, ".cfg"); str_append(buf, ".cfg");
cfg=str_read_file(buf); cfg=str_read_file(buf);
if (cfg==NULL) { /* will be obsolete */ if (cfg==NULL) {
logfileOut(LOG_MAIN, "%s not found, try tecs.cfg\n", buf); logfileOut(LOG_MAIN, "%s not found\n", buf);
ERR_I(ReadTable()); ERR_MSG("device not found");
t=strstr(table, label);
if (t==NULL) ERR_MSG("device not found");
e=strchr(t, '\'');
if (e==NULL || e>strchr(t,'\n')) ERR_MSG("missing ' or device name in table file");
t=e+1;
} }
if (cfg && *cfg=='@') { /* alias */ if (cfg && *cfg=='@') { /* alias */
t=strchr(cfg,'\n'); t=strchr(cfg,'\n');
@ -641,35 +626,30 @@ again:
resist=10; resist=10;
nScan=0; nScan=0;
unit=1; unit=1;
empty=0;
full = -1;
} else { } else {
InitSensor(&sensC); InitSensor(&sensC);
InitSensor(&sensD); if (strcasecmp(nam, "none") == 0) {
/* exception: he sensor is not cleared when stick is none */
if (full < 0 || sensB.type[0]=='\0' || sensD.type[0] != 'h') {
InitSensor(&sensD);
}
} else {
empty = 0;
full = -1;
InitSensor(&sensD);
}
} }
for (i=5;i<9;i++) { for (i=5;i<9;i++) {
InitSensor(sensors[i]); InitSensor(sensors[i]);
} }
empty=0;
dev[0]='\0'; dev[0]='\0';
str_copy(heUnits, "%"); str_copy(heUnits, "%");
if (cfg==NULL) { /* will be obsolete */ ERR_P(CocReadVars(cfg, '\0'));
i=sscanf(t, "%12s%n", nam, &l);
if (i<1) ERR_MSG("missing device name");
nam[strlen(nam)-1]='\0'; /* strip off quote */
t+=l;
str_copy(chans, "____");
i=sscanf(t, "%8s%n", chans, &l);
if (i<1) ERR_MSG("missing chans");
t+=l;
/* interprete settings until '+' appeares (after whitespace) */
ERR_P(CocReadVars(t, '+'));
if (strlen(chans)>4) ERR_MSG("no more than 4 channels allowed");
} else {
ERR_P(CocReadVars(cfg, '\0'));
}
if (loop!=2) loop=1; if (loop!=2) loop=1;
if (plug==&plug0) { if (plug==&plug0) {
@ -678,16 +658,6 @@ again:
j=2; j=2;
} }
str_copy(plug->descr, dev); str_copy(plug->descr, dev);
if (cfg==NULL) { /* will be obsolete */
sensA.type[0]=chans[0];
sensA.type[1]='\0';
sensB.type[0]=chans[1];
sensB.type[1]='\0';
sensC.type[0]=chans[2];
sensC.type[1]='\0';
sensD.type[0]=chans[3];
sensD.type[1]='\0';
}
if (sensA.type[0]>'0' && sensA.type[0]<='4') { if (sensA.type[0]>'0' && sensA.type[0]<='4') {
nScan=sensA.type[0]-'0'; nScan=sensA.type[0]-'0';
for (i=5;i<5+nScan;i++) { for (i=5;i<5+nScan;i++) {
@ -713,6 +683,7 @@ again:
} }
maxPowerFlt=25; maxPowerFlt=25;
sscanf(maxPower, "%f", &maxPowerFlt); sscanf(maxPower, "%f", &maxPowerFlt);
for (i=j; i<j+2; i++) { for (i=j; i<j+2; i++) {
s=sensors[i]; s=sensors[i];
typ=s->type[0]; typ=s->type[0];
@ -1257,13 +1228,19 @@ int ReadHeater(int full) {
static int cntOff=3; static int cntOff=3;
time_t now; time_t now;
power2 = DATA_UNDEF;
if (loop==1) { if (loop==1) {
if (full) { if (full) {
if (relay) { if (relay) {
ERR_P(LscCmd(ser, "HTRST?>htrst")); ERR_P(LscCmd(ser, "HTRST?>htrst"));
htr=0; htr=0;
} else { } else {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay;RANGE?>ibuf")); if (twoloops) {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay;RANGE?>ibuf;AOUT?2>fbuf"));
power2 = fbuf*fbuf*1e-5;
} else {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay;RANGE?>ibuf"));
}
if (jRange!=0 && ibuf==0) { if (jRange!=0 && ibuf==0) {
if (swRangeOn) { if (swRangeOn) {
time(&now); time(&now);
@ -1404,7 +1381,7 @@ int SetTemp(int switchOn) {
} }
} }
ERR_P(LscCmd(ser, "SETP?[loop]>fbuf")); ERR_P(LscCmd(ser, "SETP?[loop]>fbuf"));
if (fabsf(setH-fbuf) >= (fbuf+setH)*1.0e-5) { if (fabsf(setH-fbuf) >= (fbuf+setH)*1.0e-5 || twoloops) {
ERR_P(LscCmd(ser, "SETP [loop]:[setH]")); ERR_P(LscCmd(ser, "SETP [loop]:[setH]"));
if (twoloops) { if (twoloops) {
ERR_P(LscCmd(ser, "SETP 2:[set2]")); ERR_P(LscCmd(ser, "SETP 2:[set2]"));
@ -1989,12 +1966,8 @@ int ConfigByName(int plugNr) {
logfileOut(LOG_MAIN+LOG_STAT ,"configure plug%d for %s\n", plugNr, plug->device); logfileOut(LOG_MAIN+LOG_STAT ,"configure plug%d for %s\n", plugNr, plug->device);
plug->sensor1->present=0; plug->sensor1->present=0;
plug->sensor2->present=0; plug->sensor2->present=0;
if (0!=strcmp(plug->device, "none")) { sprintf(buf, "'%s'", plug->device);
sprintf(buf, "'%s'", plug->device); ERR_I(PrepInput(buf));
ERR_I(PrepInput(buf));
} else {
plug->descr[0]='\0';
}
settingsFlag=1; settingsFlag=1;
return 0; return 0;
OnError: OnError:
@ -3439,6 +3412,7 @@ int main(int argc, char *argv[]) {
CocDefFlt(ramp, RW); CocHdl(SetHdl); CocDefFlt(ramp, RW); CocHdl(SetHdl);
CocDefFlt(still, RW); CocHdl(StillHdl); CocDefFlt(still, RW); CocHdl(StillHdl);
CocDefFlt(power, RW); CocHdl(PowerHdl); CocDefFlt(power, RW); CocHdl(PowerHdl);
CocDefFlt(power2, RD);
CocDefFlt(mout, RW); CocHdl(MoutHdl); CocDefFlt(mout, RW); CocHdl(MoutHdl);
CocDefFlt(tLimit, RW); CocHdl(TLimitHdl); CocDefFlt(tLimit, RW); CocHdl(TLimitHdl);
CocDefFlt(tMaxLimit, RD); CocDefFlt(tMaxLimit, RD);
@ -3682,6 +3656,7 @@ int main(int argc, char *argv[]) {
ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, logPeriod, LOGLIFETIME, tim)); ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "Aux", &aux, logPeriod, LOGLIFETIME, tim)); ERR_P(DataCreateSet(NULL, "Aux", &aux, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "P", &power, logPeriod, LOGLIFETIME, tim)); ERR_P(DataCreateSet(NULL, "P", &power, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "power2", &power2, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "ScanChan", &scanChan, logPeriod, LOGLIFETIME, tim)); ERR_P(DataCreateSet(NULL, "ScanChan", &scanChan, logPeriod, LOGLIFETIME, tim));
DataUndef(0); DataUndef(0);
ERR_P(DataCreateSet(NULL, "Set", &set, logPeriod, LOGLIFETIME, tim)); ERR_P(DataCreateSet(NULL, "Set", &set, logPeriod, LOGLIFETIME, tim));