- Fixes to el734hp.c for handling of emergency stop

- Added waiting 5 sec after driving A6 to tas code
This commit is contained in:
koennecke
2005-03-16 07:59:56 +00:00
parent ed3c13e47c
commit 7bf31b710b
4 changed files with 135 additions and 17 deletions

View File

@ -8,7 +8,7 @@
Copyright: Copyright:
Labor fuer Neutronenstreuung Labor fuer Neutrnenstreuung
Paul Scherrer Institut Paul Scherrer Institut
CH-5423 Villigen-PSI CH-5423 Villigen-PSI

122
el734hp.c
View File

@ -77,6 +77,66 @@
#define POSFAULT -13 #define POSFAULT -13
#define BADCUSHION -14 #define BADCUSHION -14
#define BADCOUNT -15 #define BADCOUNT -15
/*-------------------------------------------------------------------
This reruns the command when an emergency stop has been detected.
This ougth to fix the problem that there is still another *ES in the
line even after releasing the emergency stop button
--------------------------------------------------------------------*/
static int transactEL734(prs232 self, void *send, int sendLen,
void *reply, int replylen){
int status, len, oldTimeout;
char *pReply = NULL;
/*
try to read away rubbish on the line first
*/
oldTimeout = getRS232Timeout(self);
setRS232Timeout(self,0);
if(availableRS232(self)){
len = replylen;
readRS232(self,reply,&len);
}
setRS232Timeout(self,oldTimeout);
/*
Actually do something. Some controllers send one erroneus *ES when the
emergency stop had been released. Therefore we believe an emergency stop
message only at the second try. This is the logic below.
*/
status = transactRS232(self,send,sendLen,reply,replylen);
if(status == 1){
pReply = (char *)reply;
if(strstr(pReply,"*ES") != NULL){
if(availableRS232(self)){
len = replylen;
readRS232TillTerm(self,reply,&len);
}
return transactRS232(self,send,sendLen,reply,replylen);
} else {
return status;
}
} else {
return status;
}
}
/*-------------------------------------------------------------------
If we get an empty reply when we expect some response data, then, maybe,
the controller has sent us "\r*ES\r". Therefore this checks on
empty messages if there is some more, i.e: the *ES
--------------------------------------------------------------------*/
static void checkEmpty(pEL734Driv self, char *pReply, int *replylen){
int oldTimeout;
if(strlen(pReply) < 1) {
oldTimeout = getRS232Timeout(self->controller);
setRS232Timeout(self->controller,0);
if(availableRS232(self->controller)){
readRS232(self->controller,pReply,replylen);
}
setRS232Timeout(self->controller,oldTimeout);
}
}
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
static int checkResponse(pEL734Driv self, char *pReply){ static int checkResponse(pEL734Driv self, char *pReply){
/* /*
@ -111,7 +171,7 @@ static int checkResponse(pEL734Driv self, char *pReply){
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
static int EL734GetPos(void *pData, float *fPos){ static int EL734GetPos(void *pData, float *fPos){
pEL734Driv self = NULL; pEL734Driv self = NULL;
int status; int status, replyLen;
char pCommand[50],pReply[80]; char pCommand[50],pReply[80];
self = (pEL734Driv)pData; self = (pEL734Driv)pData;
@ -123,12 +183,16 @@ static int EL734GetPos(void *pData, float *fPos){
} }
snprintf(pCommand,79,"u %d\r",self->iMotor); snprintf(pCommand,79,"u %d\r",self->iMotor);
status = transactRS232(self->controller,pCommand,strlen(pCommand), status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
self->errorCode = status; self->errorCode = status;
return HWFault; return HWFault;
} }
replyLen = 79;
checkEmpty(self,pReply,&replyLen);
if(!checkResponse(self,pReply)){ if(!checkResponse(self,pReply)){
return HWFault; return HWFault;
} }
@ -148,7 +212,7 @@ static int EL734Run(void *pData,float fValue){
self->oredMsr = 0; self->oredMsr = 0;
snprintf(pCommand,79,"p %d %.3f\r",self->iMotor,fValue); snprintf(pCommand,79,"p %d %.3f\r",self->iMotor,fValue);
status = transactRS232(self->controller,pCommand,strlen(pCommand), status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
self->errorCode = status; self->errorCode = status;
@ -189,9 +253,6 @@ static int decodeMSR(pEL734Driv self, int msr){
} else if(self->oredMsr & 0x1000){ } else if(self->oredMsr & 0x1000){
self->errorCode = BADCUSHION; self->errorCode = BADCUSHION;
return HWFault; return HWFault;
} else if(self->oredMsr & 0x8){
self->errorCode = BADSTP;
return HWFault;
} else if(self->oredMsr & 0x40) { } else if(self->oredMsr & 0x40) {
self->errorCode = BADSTP; self->errorCode = BADSTP;
return HWFault; return HWFault;
@ -225,19 +286,22 @@ static int decodeMSR(pEL734Driv self, int msr){
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
static int EL734Status(void *pData){ static int EL734Status(void *pData){
pEL734Driv self = NULL; pEL734Driv self = NULL;
int status, msr; int status, msr, replyLen = 79;
char pCommand[50],pReply[80]; char pCommand[50],pReply[80];
self = (pEL734Driv)pData; self = (pEL734Driv)pData;
assert(self); assert(self);
snprintf(pCommand,79,"msr %d\r",self->iMotor); snprintf(pCommand,79,"msr %d\r",self->iMotor);
status = transactRS232(self->controller,pCommand,strlen(pCommand), status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status < 0){ if(status < 0){
self->errorCode = status; self->errorCode = status;
return HWFault; return HWFault;
} }
checkEmpty(self,pReply,&replyLen);
if(!checkResponse(self,pReply)){ if(!checkResponse(self,pReply)){
return HWFault; return HWFault;
} }
@ -345,9 +409,17 @@ static int EL734Fix(void *pData, int iCode, float fValue){
return MOTREDO; return MOTREDO;
} }
break; break;
case BADUNKNOWN:
if(availableRS232(self->controller)){
len = 79;
readRS232TillTerm(self->controller,pReply,&len);
return MOTREDO;
}
return MOTFAIL;
break;
case BADLOC: case BADLOC:
snprintf(pCommand,49,"RMT 1\r"); snprintf(pCommand,49,"RMT 1\r");
transactRS232(self->controller,pCommand,strlen(pCommand),pReply,79); transactEL734(self->controller,pCommand,strlen(pCommand),pReply,79);
return MOTREDO; return MOTREDO;
case NOTCONNECTED: case NOTCONNECTED:
initRS232(self->controller); initRS232(self->controller);
@ -384,7 +456,7 @@ static int EL734Halt(void *pData){
assert(self); assert(self);
snprintf(pCommand,79,"s %d\r",self->iMotor); snprintf(pCommand,79,"s %d\r",self->iMotor);
status = transactRS232(self->controller,pCommand,strlen(pCommand), status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
self->errorCode = status; self->errorCode = status;
@ -399,19 +471,22 @@ static int EL734Halt(void *pData){
static int EL734GetPar(void *pData, char *name, static int EL734GetPar(void *pData, char *name,
float *fValue){ float *fValue){
pEL734Driv self = NULL; pEL734Driv self = NULL;
int status; int status, replyLen = 79;
char pCommand[50],pReply[80]; char pCommand[50],pReply[80];
self = (pEL734Driv)pData; self = (pEL734Driv)pData;
assert(self); assert(self);
if(strcmp(name,"speed") == 0){ if(strcmp(name,"speed") == 0){
snprintf(pCommand,79,"J %d\r",self->iMotor); snprintf(pCommand,79,"J %d\r",self->iMotor);
status = transactRS232(self->controller,pCommand,strlen(pCommand), status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
self->errorCode = status; self->errorCode = status;
return 0; return 0;
} }
checkEmpty(self,pReply,&replyLen);
if(!checkResponse(self,pReply)){ if(!checkResponse(self,pReply)){
return 0; return 0;
} }
@ -429,15 +504,32 @@ static int EL734SetPar(void *pData, SConnection *pCon,
self = (pEL734Driv)pData; self = (pEL734Driv)pData;
assert(self); assert(self);
pCommand[0] ='\0';
if(strcmp(name,"speed") == 0){ if(strcmp(name,"speed") == 0){
snprintf(pCommand,79,"J %d %d\r",self->iMotor,(int)newValue); snprintf(pCommand,79,"J %d %d\r",self->iMotor,(int)newValue);
status = transactRS232(self->controller,pCommand,strlen(pCommand), } else if(strcmp(name,"forceupper") == 0){
if(!SCMatchRights(pCon,usMugger)){
return 0;
}
self->fUpper = newValue;
snprintf(pCommand,79,"H %d %8.3f %8.3f\r",self->iMotor,self->fLower, self->fUpper);
} else if(strcmp(name,"forcelower") == 0){
if(!SCMatchRights(pCon,usMugger)){
return 0;
}
self->fLower = newValue;
snprintf(pCommand,79,"H %d %8.3f %8.3f\r",self->iMotor,self->fLower, self->fUpper);
}
if(strlen(pCommand) > 1){
status = transactEL734(self->controller,pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
self->errorCode = status; self->errorCode = status;
return 0; return 0;
} }
if(!checkResponse(self,pReply)){ if(!checkResponse(self,pReply)){
snprintf(pCommand,79,"ERROR %s while setting parameter",pReply);
SCWrite(pCon,pCommand,eError);
return 0; return 0;
} }
return 1; return 1;
@ -512,14 +604,14 @@ MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]){
pNew->KillPrivate = KillEL734; pNew->KillPrivate = KillEL734;
pNew->controller = controller; pNew->controller = controller;
pNew->iMotor = motor; pNew->iMotor = motor;
/* /*
connection will already have been set up, read limits connection will already have been set up, read limits
*/ */
snprintf(pCommand,49,"h %d\r",pNew->iMotor); snprintf(pCommand,49,"h %d\r",pNew->iMotor);
success = 0; success = 0;
for(i = 0; i < 3; i++){ for(i = 0; i < 3; i++){
status = transactRS232(pNew->controller, pCommand,strlen(pCommand), status = transactEL734(pNew->controller, pCommand,strlen(pCommand),
pReply,79); pReply,79);
if(status != 1){ if(status != 1){
getRS232Error(status,pReply,79); getRS232Error(status,pReply,79);

View File

@ -301,6 +301,10 @@ int TASDrive(SConnection *pCon, SicsInterp *pSics, void *pData,
*/ */
status = Wait4Success(GetExecutor()); status = Wait4Success(GetExecutor());
TASUpdate(self,pCon); TASUpdate(self,pCon);
/*
handle interrupts
*/
if(status == DEVINT) if(status == DEVINT)
{ {
if(SCGetInterrupt(pCon) == eAbortOperation) if(SCGetInterrupt(pCon) == eAbortOperation)

View File

@ -298,7 +298,18 @@ static int RecalcAction(SConnection *pCon, SicsInterp *pSics, void *pData,
return TASUpdate(self,pCon); return TASUpdate(self,pCon);
} }
/*--------------------------------------------------------------------------
when A6 has been drive Bertrand wants to wait for some seconds in order
to allow for the analyzer shielding to settle down. This is done
through this callback function
---------------------------------------------------------------------------*/
static int A6WaitCallback(int iEvent, void *pEventData, void *pUserData)
{
if(iEvent == MOTEND)
{
SicsWait(5);
}
}
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
A function for killing the TAS data structure is needed A function for killing the TAS data structure is needed
-------------------------------------------------------------------------*/ -------------------------------------------------------------------------*/
@ -321,6 +332,7 @@ int TASFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
char pBueffel[132]; char pBueffel[132];
pSicsVariable pVar = NULL; pSicsVariable pVar = NULL;
CommandList *pCom = NULL; CommandList *pCom = NULL;
pMotor pMot = NULL;
/* check arguments*/ /* check arguments*/
if(argc < 2) if(argc < 2)
@ -395,6 +407,16 @@ int TASFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
RegisterCallback(pVar->pCall,VALUECHANGE,TimerCallback,pNew,NULL); RegisterCallback(pVar->pCall,VALUECHANGE,TimerCallback,pNew,NULL);
} }
/*
Install the wait callback for A6
*/
pMot = FindMotor(pSics,"a6");
if(pMot != NULL)
{
RegisterCallback(pMot->pCall,MOTEND,A6WaitCallback,NULL,NULL);
}
/* /*
initialize SRO value initialize SRO value
*/ */