new features for evcontroller Nov.2002 M.Z.

This commit is contained in:
cvs
2002-11-13 07:21:26 +00:00
parent 55eedb640b
commit 3ace74d9d7
12 changed files with 200 additions and 201 deletions

View File

@ -39,6 +39,7 @@
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <tcl.h>
#include "fortify.h"
#include "splitter.h"
@ -83,6 +84,9 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
self->fTarget = fVal;
self->eMode = EVDrive;
self->iStop = 0;
self->start = time(NULL);
self->lastt = 0;
self->iWarned = 0;
/* try at least three times to do it */
for(i = 0; i < 3; i++)
@ -178,9 +182,9 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
float fPos, fDelta;
int iRet, iCode, iFix;
char pBueffel[256], pError[132];
static int iCount;
static int callCount;
static int callCount, iCount=0;
time_t now, tmo;
self = (pEVControl)pData;
assert(self);
assert(pCon);
@ -193,8 +197,8 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
/* get the current position */
iRet = self->pDriv->GetValue(self->pDriv,&fPos);
iRet = self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
if(iRet == 0)
{
self->pDriv->GetError(self->pDriv,&iCode, pError,131);
@ -229,8 +233,6 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
return HWFault;
}
/* calculate difference to target */
fDelta = self->fTarget - fPos;
if(fDelta < 0.)
{
fDelta = - fDelta;
@ -240,32 +242,62 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
callCount++;
if(callCount >= 10)
{
sprintf(pBueffel,"%s = %f", self->pName, fPos);
sprintf(pBueffel,"%s = %g", self->pName, fPos);
InvokeCallBack(self->pCall, VALUECHANGE,pBueffel);
callCount = 0;
}
now = time(NULL);
tmo = (int)(ObVal(self->pParam, MAXWAIT) * 60);
/* based on this: logic ! */
if (tmo>0 && now > self->start+tmo ) /* time out */
{
sprintf(pBueffel,"ERROR: wait time limit reached on %s",
self->pName);
SCWrite(pCon,pBueffel,eError);
self->eMode = EVMonitor;
return HWIdle;
}
if(fDelta <= ObVal(self->pParam, TOLERANCE)) /* done */
{
iCount++;
if(iCount > 3)
if (iCount < 3)
{
iCount++;
return HWBusy;
}
tmo = (int)(ObVal(self->pParam, SETTLE) * 60);
if (self->lastt <= 0) /* lastt negative: -seconds already waited */
{
self->lastt += now;
if (tmo>0)
{
sprintf(pBueffel,"%s inside tolerance, wait %.2f min. to settle",
self->pName, (self->lastt + tmo - now)/60.0);
SCWrite(pCon,pBueffel,eStatus);
}
return HWBusy;
}
if (now > self->lastt + tmo)
{
self->eMode = EVMonitor;
return HWIdle;
}
else
{
return HWBusy;
}
return HWBusy;
}
else
{
iCount = 0;
if (iCount > 0) {
iCount--;
return HWBusy;
}
if (self->lastt > 0) { /* save time already waited */
sprintf(pBueffel,"%s outside tolerance, settling time suspended",
self->pName);
SCWrite(pCon,pBueffel,eStatus);
self->lastt -= now;
}
return HWBusy;
}
self->eMode = EVIdle;
return HWFault;
}
/*--------------------------------------------------------------------------*/
static int EVILimits(void *pData, float fVal, char *pError, int iErrLen)
@ -279,7 +311,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
/* lower limit */
if( fVal < ObVal(self->pParam, LOWLIMIT))
{
sprintf(pBueffel,"ERROR: %f violates lower limit of device",fVal);
sprintf(pBueffel,"ERROR: %g violates lower limit of device",fVal);
strncpy(pError,pBueffel,iErrLen);
return 0;
}
@ -287,7 +319,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
/* upper limit */
if( fVal > ObVal(self->pParam, UPLIMIT))
{
sprintf(pBueffel,"ERROR: %f violates upper limit of device",fVal);
sprintf(pBueffel,"ERROR: %g violates upper limit of device",fVal);
strncpy(pError,pBueffel,iErrLen);
return 0;
}
@ -317,16 +349,15 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
pEVControl self = NULL;
pExeList pExe;
SConnection *pCon = NULL;
float fPos;
float fPos, fDelta;
char pBueffel[256];
self = (pEVControl)pData;
assert(self);
self->pDriv->GetValue(self->pDriv,&fPos);
sprintf(pBueffel,"WARNING: %s is out of range by %f",self->pName,
self->fTarget - fPos);
self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
sprintf(pBueffel,"WARNING: %s is out of range by %g",self->pName,fDelta);
pExe = GetExecutor();
pCon = GetExeOwner(pExe);
if(!self->iWarned)
@ -349,16 +380,15 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
pEVControl self = NULL;
pExeList pExe;
SConnection *pCon = NULL;
float fPos;
float fPos, fDelta;
char pBueffel[256];
int iRet;
self = (pEVControl)pData;
assert(self);
self->pDriv->GetValue(self->pDriv,&fPos);
sprintf(pBueffel,"WARNING: %s is out of range by %f",self->pName,
self->fTarget - fPos);
self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
sprintf(pBueffel,"WARNING: %s is out of range by %g",self->pName,fDelta);
pExe = GetExecutor();
pCon = GetExeOwner(pExe);
@ -402,7 +432,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
pEVControl self = NULL;
pExeList pExe;
SConnection *pCon = NULL;
float fPos;
float fPos,fDelta;
char pBueffel[256];
int iRet;
@ -410,9 +440,8 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
assert(self);
/* report problem */
self->pDriv->GetValue(self->pDriv,&fPos);
sprintf(pBueffel,"WARNING: %s is out of range by %f",self->pName,
self->fTarget - fPos);
self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
sprintf(pBueffel,"WARNING: %s is out of range by %g",self->pName,fDelta);
pExe = GetExecutor();
pCon = GetExeOwner(pExe);
if(!self->iWarned)
@ -438,7 +467,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
pEVControl self = NULL;
pExeList pExe;
SConnection *pCon = NULL;
float fPos;
float fPos, fDelta;
char pBueffel[256];
int iRet;
@ -446,9 +475,8 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
assert(self);
/* report problem */
self->pDriv->GetValue(self->pDriv,&fPos);
sprintf(pBueffel,"WARNING: %s is out of range by %f",self->pName,
self->fTarget - fPos);
self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
sprintf(pBueffel,"WARNING: %s is out of range by %g",self->pName,fDelta);
pExe = GetExecutor();
pCon = GetExeOwner(pExe);
if(pCon)
@ -527,14 +555,13 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
assert(self);
iRet = self->pDriv->GetValue(self->pDriv, &fPos);
iRet = self->pDriv->GetValues(self->pDriv,&self->fTarget,&fPos,&fDelta);
if( iRet == 1 )
{
if(self->iLog)
{
VarlogAdd(self->pLog, fPos);
}
fDelta = self->fTarget - fPos;
if(fDelta < 0.)
{
fDelta = -fDelta;
@ -568,7 +595,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
self->callCount++;
if(self->callCount >= 20)
{
sprintf(pBueffel,"%s = %F", self->pName, fPos);
sprintf(pBueffel,"%s = %g", self->pName, fPos);
InvokeCallBack(self->pCall,VALUECHANGE, pBueffel);
self->callCount = 0;
}
@ -614,6 +641,22 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
}
return NULL;
}
/*--------------------------------------------------------------------------*/
/* this routine is the standard method of pEVDriver for GetValues.
* it may be replaced by a device specific routine, for the case that
* the target value differs systematically from the target value
* (i.e.control not on sample sensor)
* Oct. 2002 M.Zolliker
*/
static int StdGetValues(pEVDriver self, float *fTarget, float *fPos, float *fDelta)
{
int iRet;
assert(self);
iRet=self->GetValue(self, fPos);
if (iRet>0) *fDelta = *fTarget - *fPos;
return iRet;
}
/*-------- All this done, we can actually implement the controller ---------*/
pEVControl CreateEVController(pEVDriver pDriv, char *pName, int *iErr)
{
@ -679,7 +722,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
}
/* new parameter space */
pRes->pParam = ObParCreate(7);
pRes->pParam = ObParCreate(9);
if(!pRes->pParam)
{
free(pRes->pDrivInt);
@ -695,9 +738,15 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
ObParInit(pRes->pParam, UPLIMIT, "upperlimit", 300.0, usUser);
ObParInit(pRes->pParam, LOWLIMIT, "lowerlimit", 2., usUser);
ObParInit(pRes->pParam, SAFEVALUE, "safevalue", 0., usUser);
ObParInit(pRes->pParam, MAXWAIT, "maxwait", 0., usUser);
ObParInit(pRes->pParam, SETTLE, "settle", 0., usUser);
/* local initialisations */
pRes->pDriv = pDriv;
if (pDriv->GetValues==NULL) /* if GetValues is undefined, set to default */
{
pDriv->GetValues=StdGetValues;
}
iRet = pDriv->Init(pDriv);
if(iRet >= 0)
{
@ -901,32 +950,38 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
sprintf(pBueffel,"Parameter listing for %s",self->pName);
SCWrite(pCon,pBueffel,eValue);
sprintf(pBueffel,"%s.%s = %f ",self->pName, "tolerance",
sprintf(pBueffel,"%s.%s = %g ",self->pName, "tolerance",
ObVal(self->pParam,TOLERANCE));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "access",
sprintf(pBueffel,"%s.%s = %g",self->pName, "access",
ObVal(self->pParam,ACCESS));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "ErrorHandler",
sprintf(pBueffel,"%s.%s = %g",self->pName, "ErrorHandler",
ObVal(self->pParam,ERRORHANDLER));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "interrupt",
sprintf(pBueffel,"%s.%s = %g",self->pName, "interrupt",
ObVal(self->pParam,INTERRUPT));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "UpperLimit",
sprintf(pBueffel,"%s.%s = %g",self->pName, "UpperLimit",
ObVal(self->pParam,UPLIMIT));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "LowerLimit",
sprintf(pBueffel,"%s.%s = %g",self->pName, "LowerLimit",
ObVal(self->pParam,LOWLIMIT));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "SafeValue",
sprintf(pBueffel,"%s.%s = %g",self->pName, "SafeValue",
ObVal(self->pParam,SAFEVALUE));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %g",self->pName, "MaxWait",
ObVal(self->pParam,MAXWAIT));
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %g",self->pName, "Settle",
ObVal(self->pParam,SETTLE));
SCWrite(pCon,pBueffel, eValue);
EVCGetPos(self,pCon,&fPos);
sprintf(pBueffel,"%s.%s = %f",self->pName, "CurrentValue",
sprintf(pBueffel,"%s.%s = %g",self->pName, "CurrentValue",
fPos);
SCWrite(pCon,pBueffel, eValue);
sprintf(pBueffel,"%s.%s = %f",self->pName, "TargetValue",
sprintf(pBueffel,"%s.%s = %g",self->pName, "TargetValue",
self->fTarget);
SCWrite(pCon,pBueffel, eValue);
@ -977,7 +1032,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
iRet = EVCGetPos(self,pCon,&fPos);
if(iRet)
{
sprintf(pBueffel,"%s.%s = %f",self->pName,"CurrentValue", fPos);
sprintf(pBueffel,"%s.%s = %g",self->pName,"CurrentValue", fPos);
SCWrite(pCon,pBueffel,eValue);
return 1;
}
@ -1076,7 +1131,7 @@ extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
}
else
{
sprintf(pBueffel,"%s.%s = %f",self->pName,argv[1],fPos);
sprintf(pBueffel,"%s.%s = %g",self->pName,argv[1],fPos);
SCWrite(pCon,pBueffel,eValue);
return 1;
}