new features for evcontroller Nov.2002 M.Z.
This commit is contained in:
155
evcontroller.c
155
evcontroller.c
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user