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
This commit is contained in:
Ferdi Franceschini
2006-06-22 09:20:43 +10:00
committed by Douglas Clowes
parent 5f62768d59
commit 400871d6da

View File

@@ -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 <stdlib.h>
/* ISO C Standard: 7.16 Boolean type and values <stdbool.h> */
@@ -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;
}