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:
committed by
Douglas Clowes
parent
5f62768d59
commit
400871d6da
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user