From 400871d6dabcb65bae0bdcf79899f56ba1551be6 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Thu, 22 Jun 2006 09:20:43 +1000 Subject: [PATCH] Save power by switching motors off after a move, controlled by the nopowersave parameter. Don't resend move command if motor is busy. r1023 | ffr | 2006-06-22 09:20:43 +1000 (Thu, 22 Jun 2006) | 3 lines --- site_ansto/motor_dmc2280.c | 56 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/site_ansto/motor_dmc2280.c b/site_ansto/motor_dmc2280.c index f618839b..8e7c1a67 100644 --- a/site_ansto/motor_dmc2280.c +++ b/site_ansto/motor_dmc2280.c @@ -8,9 +8,9 @@ * Ferdi Franceschini November 2005 * * TODO - * - Add nopowersave optional parameter. - * - nopowersave = 0 (default) switch motor off after move. - * - nopowersave = 1 leave motor on after move. + * - check for ESTOP flag on controller. + * - ESTOP=1 means emergency stop, motion on all axes must stop. + * - ESTOP=0 means all OK. */ #include /* ISO C Standard: 7.16 Boolean type and values */ @@ -35,8 +35,10 @@ /*@-incondefs@*/ /* XXX Should this also free pData */ +#if 0 int readRS232(prs232 self, /*@out@*/void *data, /*@out@*/int *dataLen); int readRS232TillTerm(prs232 self, /*@out@*/void *data, int *datalen); +#endif void KillRS232(/*@only@*/ void *pData); /* Storage returned by Tcl_GetVar2 is owned by the Tcl interpreter and should not be modified */ /*@observer@*//*@dependent@*/ char *Tcl_GetVar2(Tcl_Interp *interp, char *name1, char *name2, int flags); @@ -84,27 +86,27 @@ typedef struct __MoDriv { char lastCmd[1024]; float home; /**< home position for axis, default=0 */ int motorHome; /**< motor home position in steps */ + int noPowerSave; /**< Flag = 1 to leave motors on after a move */ int stepsPerX; /**< steps per physical unit */ int abs_endcoder; /**< Flag = 1 if there is an abs enc */ int absEncHome; /**< Home position in counts for abs enc */ int cntsPerX; /**< absolute encoder counts per physical unit */ } DMC2280Driv, *pDMC2280Driv; /*------------------- error codes ----------------------------------*/ -#define BADADR -1 // Unknown host/port? +#define BADADR -1 // NOT SET: Unknown host/port? #define BADBSY -2 #define BADCMD -3 -#define BADPAR -4 // Does SICS already check parameter types? +#define BADPAR -4 // NOT SET: Does SICS already check parameter types? #define BADUNKNOWN -5 -#define BADSTP -6 -#define BADEMERG -7 +#define BADSTP -6 // NOT SET +#define BADEMERG -7 // NOT SET: ESTOP #define RVRSLIM -8 #define FWDLIM -9 -#define RUNFAULT -10 -#define POSFAULT -11 -#define BADCUSHION -12 +#define POSFAULT -11 // NOT SET +#define BADCUSHION -12 // NOT SET #define ERRORLIM -13 #define IMPOSSIBLE_LIM_SW -14 -#define BGFAIL -15 +#define BGFAIL -15 // NOT SET /*--------------------------------------------------------------------*/ #define STATUSMOVING 128 /* Motor is moving */ #define STATUSERRORLIMIT 64 /* Number of errorss exceed limit */ @@ -121,6 +123,7 @@ typedef struct __MoDriv { #define SUCCESS 1 #define _REQUIRED 1 #define _OPTIONAL 0 +#define _SAVEPOWER 0 #define HOME "home" #define HARDLOWERLIM "hardlowerlim" @@ -343,7 +346,7 @@ static int DMC2280GetPos(void *pData, float *fPos){ static int DMC2280Run(void *pData,float fValue){ pDMC2280Driv self = NULL; char axis; - char cmd[CMDLEN], SH[CMDLEN], BG[CMDLEN], absPosCmd[CMDLEN]; + char cmd[CMDLEN], SHx[CMDLEN], BGx[CMDLEN], absPosCmd[CMDLEN]; int absEncHome, stepsPerX, motorHome, cntsPerX, newAbsPosn; float target; @@ -352,8 +355,8 @@ static int DMC2280Run(void *pData,float fValue){ axis=self->axisLabel; motorHome = self->motorHome; stepsPerX=self->stepsPerX; - snprintf(SH, CMDLEN, "SH%c", axis); - snprintf(BG, CMDLEN, "BG%c", axis); + snprintf(SHx, CMDLEN, "SH%c", axis); + snprintf(BGx, CMDLEN, "BG%c", axis); target = fValue - self->home; newAbsPosn = (int)(target * stepsPerX + motorHome + 0.5); snprintf(absPosCmd, CMDLEN, "PA%c=%d",axis, newAbsPosn); @@ -372,9 +375,9 @@ static int DMC2280Run(void *pData,float fValue){ if (FAILURE == DMC2280Send(self, absPosCmd)) return HWFault; - if (FAILURE == DMC2280Send(self, SH)) + if (FAILURE == DMC2280Send(self, SHx)) return HWFault; - if (FAILURE == DMC2280Send(self, BG)) + if (FAILURE == DMC2280Send(self, BGx)) return HWFault; return OKOK; } @@ -461,6 +464,10 @@ static int DMC2280Status(void *pData){ return HWBusy; } } + if (self->noPowerSave == _SAVEPOWER) { + snprintf(cmd, CMDLEN, "MO%c", self->axisLabel); + DMC2280Send(self, cmd); + } return HWIdle; } } @@ -509,9 +516,6 @@ static void DMC2280Error(void *pData, int *iCode, char *error, int errLen){ case FWDLIM: strncpy(error,"Crashed into forward limit switch",(size_t)errLen); break; - case RUNFAULT: - strncpy(error,"Run fault detected",(size_t)errLen); - break; case POSFAULT: strncpy(error,"Positioning fault detected",(size_t)errLen); break; @@ -548,12 +552,11 @@ static int DMC2280Fix(void *pData, int iCode,/*@unused@*/ float fValue){ switch(iCode){ case BADADR: + return MOTFAIL; case BADCMD: //case TIMEOUT: case BADPAR: - case BADBSY: - return MOTREDO; - case RUNFAULT: + return MOTFAIL; case POSFAULT: return MOTREDO; case NOTCONNECTED: @@ -974,6 +977,10 @@ static void KillDMC2280(/*@only@*/void *pData){ pNew->motorHome=0; else sscanf(pPtr,"%d",&(pNew->motorHome)); + if ((pPtr=getParam(pCon, interp, params,"noPowerSave",_OPTIONAL)) == NULL) + pNew->noPowerSave=_SAVEPOWER; + else + sscanf(pPtr,"%d",&(pNew->noPowerSave)); if ((pPtr=getParam(pCon, interp, params,"absEnc",_OPTIONAL)) == NULL) pNew->abs_endcoder=0; else { @@ -1003,8 +1010,3 @@ static void KillDMC2280(/*@only@*/void *pData){ /* TODO Initialise current position and target to get a sensible initial list output */ return (MotorDriver *)pNew; } - - - - -