imporved simulation driver M.Z.
This commit is contained in:
44
simdriv.c
44
simdriv.c
@ -61,9 +61,23 @@
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int RunComplete(SIMDriv *self)
|
static int RunComplete(SIMDriv *self)
|
||||||
{
|
{
|
||||||
time_t tD;
|
int sign;
|
||||||
if(time(&tD) > self->iTime)
|
time_t now;
|
||||||
{
|
|
||||||
|
if (self->iTime == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
now=time(NULL);
|
||||||
|
/* move */
|
||||||
|
if (self->fTarget > self->fPos) {
|
||||||
|
sign=1;
|
||||||
|
} else {
|
||||||
|
sign=-1;
|
||||||
|
}
|
||||||
|
self->fPos += sign * self->fSpeed * (now - self->iTime);
|
||||||
|
self->iTime = now;
|
||||||
|
if (sign*(self->fPos - self->fTarget) > 0) {
|
||||||
|
self->fPos = self->fTarget;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -91,23 +105,13 @@
|
|||||||
return HWFault;
|
return HWFault;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RunComplete(pDriv))
|
*fPos = pDriv->fPos;
|
||||||
{
|
|
||||||
*fPos = pDriv->fPos;
|
|
||||||
}
|
|
||||||
else /* simulate a mispositioned motor */
|
|
||||||
{
|
|
||||||
*fPos = pDriv->fPos - 1.;
|
|
||||||
return OKOK;
|
|
||||||
}
|
|
||||||
return OKOK;
|
return OKOK;
|
||||||
}
|
}
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
static int SimRun(void *self, float fVal)
|
static int SimRun(void *self, float fVal)
|
||||||
{
|
{
|
||||||
SIMDriv *pDriv;
|
SIMDriv *pDriv;
|
||||||
float fDiff;
|
|
||||||
time_t tD;
|
|
||||||
|
|
||||||
assert(self);
|
assert(self);
|
||||||
pDriv = (SIMDriv *)self;
|
pDriv = (SIMDriv *)self;
|
||||||
@ -122,10 +126,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* calculate time for completion */
|
/* set start time */
|
||||||
fDiff = fVal - pDriv->fPos;
|
pDriv->fTarget = fVal;
|
||||||
if(fDiff < .0) fDiff = -fDiff;
|
pDriv->iTime = time(NULL);
|
||||||
pDriv->iTime = time(&tD) + (long)(fDiff/pDriv->fSpeed);
|
|
||||||
|
|
||||||
/* in a fifth the failures, simply die, else simply do not find pos */
|
/* in a fifth the failures, simply die, else simply do not find pos */
|
||||||
if(SimRandom() < (pDriv->fFailure/5))
|
if(SimRandom() < (pDriv->fFailure/5))
|
||||||
@ -139,7 +142,7 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pDriv->fPos = fVal;
|
/* pDriv->fPos = fVal; */
|
||||||
return OKOK;
|
return OKOK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -350,7 +353,8 @@ static int SimSetPar(void *self, SConnection *pCon, char *name, float newValue)
|
|||||||
|
|
||||||
|
|
||||||
/* calculate current position, initialise func pters */
|
/* calculate current position, initialise func pters */
|
||||||
pDriv->fPos = (pDriv->fUpper - pDriv->fLower)/2.;
|
pDriv->fPos = (pDriv->fUpper + pDriv->fLower)/2.;
|
||||||
|
pDriv->fTarget = pDriv->fPos;
|
||||||
pDriv->name = strdup("Simulant");
|
pDriv->name = strdup("Simulant");
|
||||||
pDriv->GetPosition = GetSimPos;
|
pDriv->GetPosition = GetSimPos;
|
||||||
pDriv->RunTo = SimRun;
|
pDriv->RunTo = SimRun;
|
||||||
|
2
simev.c
2
simev.c
@ -108,7 +108,7 @@
|
|||||||
if(pMe->fFailure < .0){
|
if(pMe->fFailure < .0){
|
||||||
*fPos = pMe->fTarget;
|
*fPos = pMe->fTarget;
|
||||||
} else {
|
} else {
|
||||||
*fPos = pMe->fTarget + SimRandom();
|
*fPos = pMe->fTarget + SimRandom()/50-1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* simulate a mispositioned motor */
|
else /* simulate a mispositioned motor */
|
||||||
|
Reference in New Issue
Block a user