forked from epics_driver_modules/motorBase
Converted all fields to double from float to avoid rounding errors
This commit is contained in:
@@ -2,9 +2,9 @@
|
||||
FILENAME... motorRecord.cc
|
||||
USAGE... Motor Record Support.
|
||||
|
||||
Version: $Revision: 1.30 $
|
||||
Modified By: $Author: rivers $
|
||||
Last Modified: $Date: 2006-03-21 22:45:05 $
|
||||
Version: $Revision: 1.31 $
|
||||
Modified By: $Author: peterd $
|
||||
Last Modified: $Date: 2006-05-18 19:51:06 $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -139,7 +139,7 @@ static void check_speed_and_resolution(motorRecord *);
|
||||
static void set_dial_highlimit(motorRecord *, struct motor_dset *);
|
||||
static void set_dial_lowlimit(motorRecord *, struct motor_dset *);
|
||||
static void set_userlimits(motorRecord *);
|
||||
static void range_check(motorRecord *, float *, double, double);
|
||||
static void range_check(motorRecord *, double *, double, double);
|
||||
static void clear_buttons(motorRecord *);
|
||||
|
||||
/*** Record Support Entry Table (RSET) functions. ***/
|
||||
@@ -387,7 +387,7 @@ Make RDBD >= MRES.
|
||||
******************************************************************************/
|
||||
static void enforceMinRetryDeadband(motorRecord * pmr)
|
||||
{
|
||||
float min_rdbd;
|
||||
double min_rdbd;
|
||||
|
||||
min_rdbd = fabs(pmr->mres);
|
||||
|
||||
@@ -562,7 +562,7 @@ static long init_record(dbCommon* arg, int pass)
|
||||
pmr->lrvl = pmr->rval;
|
||||
pmr->lvio = 0; /* init limit-violation field */
|
||||
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == (float) 0.0))
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0))
|
||||
;
|
||||
else if ((pmr->drbv > pmr->dhlm + pmr->mres) || (pmr->drbv < pmr->dllm - pmr->mres))
|
||||
{
|
||||
@@ -1197,7 +1197,7 @@ static long process(dbCommon *arg)
|
||||
pmr->mip |= MIP_DELAY_REQ;
|
||||
MARK(M_MIP);
|
||||
|
||||
callbackRequestDelayed(&pcallback->dly_callback, (double) pmr->dly);
|
||||
callbackRequestDelayed(&pcallback->dly_callback, pmr->dly);
|
||||
|
||||
pmr->dmov = FALSE;
|
||||
pmr->pact = 0;
|
||||
@@ -1210,7 +1210,7 @@ static long process(dbCommon *arg)
|
||||
enter_do_work:
|
||||
|
||||
/* check for soft-limit violation */
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == (float) 0.0))
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0))
|
||||
pmr->lvio = false;
|
||||
else
|
||||
{
|
||||
@@ -1716,7 +1716,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind)
|
||||
return(OK);
|
||||
}
|
||||
/* check for limit violation */
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == (float) 0.0))
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0))
|
||||
;
|
||||
else if ((pmr->homf && (pmr->dval > pmr->dhlm - pmr->velo)) ||
|
||||
(pmr->homr && (pmr->dval < pmr->dllm + pmr->velo)))
|
||||
@@ -1778,7 +1778,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind)
|
||||
(pmr->mip & MIP_JOG_REQ))
|
||||
{
|
||||
/* check for limit violation */
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == (float) 0.0))
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0))
|
||||
;
|
||||
else if ((pmr->jogf && (pmr->dval > pmr->dhlm - pmr->velo)) ||
|
||||
(pmr->jogr && (pmr->dval < pmr->dllm + pmr->velo)))
|
||||
@@ -1911,7 +1911,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind)
|
||||
}
|
||||
|
||||
/* Record limit violation */
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == (float) 0.0))
|
||||
if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0))
|
||||
pmr->lvio = false;
|
||||
else
|
||||
pmr->lvio = (pmr->dval > pmr->dhlm) ||
|
||||
@@ -2166,7 +2166,7 @@ static long special(DBADDR *paddr, int after)
|
||||
RTN_STATUS rtnval;
|
||||
motor_cmnd command;
|
||||
double temp_dbl;
|
||||
float *temp_flt;
|
||||
double *pcoeff;
|
||||
msta_field msta;
|
||||
|
||||
msta.All = pmr->msta;
|
||||
@@ -2577,34 +2577,32 @@ velcheckB:
|
||||
break;
|
||||
|
||||
case motorRecordPCOF:
|
||||
temp_flt = &pmr->pcof;
|
||||
pcoeff = &pmr->pcof;
|
||||
command = SET_PGAIN;
|
||||
goto pidcof;
|
||||
case motorRecordICOF:
|
||||
temp_flt = &pmr->icof;
|
||||
pcoeff = &pmr->icof;
|
||||
command = SET_IGAIN;
|
||||
goto pidcof;
|
||||
case motorRecordDCOF:
|
||||
temp_flt = &pmr->dcof;
|
||||
pcoeff = &pmr->dcof;
|
||||
command = SET_DGAIN;
|
||||
pidcof:
|
||||
if (msta.Bits.GAIN_SUPPORT != 0)
|
||||
{
|
||||
if (*temp_flt < 0.0) /* Validity check; 0.0 <= gain <= 1.0 */
|
||||
if (*pcoeff < 0.0) /* Validity check; 0.0 <= gain <= 1.0 */
|
||||
{
|
||||
*temp_flt = 0.0;
|
||||
*pcoeff = 0.0;
|
||||
changed = true;
|
||||
}
|
||||
else if (*temp_flt > 1.0)
|
||||
else if (*pcoeff > 1.0)
|
||||
{
|
||||
*temp_flt = 1.0;
|
||||
*pcoeff = 1.0;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
temp_dbl = *temp_flt;
|
||||
|
||||
INIT_MSG();
|
||||
rtnval = (*pdset->build_trans)(command, &temp_dbl, pmr);
|
||||
rtnval = (*pdset->build_trans)(command, pcoeff, pmr);
|
||||
/* If an error occured, build_trans() has reset the gain
|
||||
* parameter to a valid value for this controller. */
|
||||
if (rtnval != OK)
|
||||
@@ -2612,21 +2610,19 @@ pidcof:
|
||||
|
||||
SEND_MSG();
|
||||
if (changed == 1)
|
||||
db_post_events(pmr, temp_flt, DBE_VAL_LOG);
|
||||
db_post_events(pmr, pcoeff, DBE_VAL_LOG);
|
||||
}
|
||||
break;
|
||||
|
||||
case motorRecordCNEN:
|
||||
if (msta.Bits.GAIN_SUPPORT != 0)
|
||||
{
|
||||
double tempdbl;
|
||||
|
||||
INIT_MSG();
|
||||
tempdbl = pmr->cnen;
|
||||
temp_dbl = pmr->cnen;
|
||||
if (pmr->cnen != 0)
|
||||
WRITE_MSG(ENABLE_TORQUE, &tempdbl);
|
||||
WRITE_MSG(ENABLE_TORQUE, &temp_dbl);
|
||||
else
|
||||
WRITE_MSG(DISABL_TORQUE, &tempdbl);
|
||||
WRITE_MSG(DISABL_TORQUE, &temp_dbl);
|
||||
SEND_MSG();
|
||||
}
|
||||
|
||||
@@ -3596,14 +3592,14 @@ static void set_userlimits(motorRecord *pmr)
|
||||
}
|
||||
|
||||
/*
|
||||
FUNCTION... void range_check(motorRecord *, float *, double, double)
|
||||
FUNCTION... void range_check(motorRecord *, double *, double, double)
|
||||
USAGE... Limit parameter to valid range; i.e., min. <= parameter <= max.
|
||||
|
||||
INPUT... parm - pointer to parameter to be range check.
|
||||
min - minimum value.
|
||||
max - 0 = max. range check disabled; !0 = maximum value.
|
||||
*/
|
||||
static void range_check(motorRecord *pmr, float *parm_ptr, double min, double max)
|
||||
static void range_check(motorRecord *pmr, double *parm_ptr, double min, double max)
|
||||
{
|
||||
bool changed = false;
|
||||
double parm_val = *parm_ptr;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# FILENAME... motorRecord.dbd
|
||||
|
||||
# Version: $Revision: 1.14 $
|
||||
# Modified By: $Author: sluiter $
|
||||
# Last Modified: $Date: 2005-05-10 16:19:23 $
|
||||
# Version: $Revision: 1.15 $
|
||||
# Modified By: $Author: peterd $
|
||||
# Last Modified: $Date: 2006-05-18 19:51:07 $
|
||||
|
||||
# Experimental Physics and Industrial Control System (EPICS)
|
||||
|
||||
@@ -124,72 +124,72 @@ recordtype(motor) {
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(VELO,DBF_FLOAT) {
|
||||
field(VELO,DBF_DOUBLE) {
|
||||
prompt("Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(VBAS,DBF_FLOAT) {
|
||||
field(VBAS,DBF_DOUBLE) {
|
||||
prompt("Base Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(VMAX,DBF_FLOAT) {
|
||||
field(VMAX,DBF_DOUBLE) {
|
||||
prompt("Max. Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(S,DBF_FLOAT) {
|
||||
field(S,DBF_DOUBLE) {
|
||||
prompt("Speed (revolutions/sec)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(SBAS,DBF_FLOAT) {
|
||||
field(SBAS,DBF_DOUBLE) {
|
||||
prompt("Base Speed (RPS)")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(SMAX,DBF_FLOAT) {
|
||||
field(SMAX,DBF_DOUBLE) {
|
||||
prompt("Max. Speed (RPS)")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(ACCL,DBF_FLOAT) {
|
||||
field(ACCL,DBF_DOUBLE) {
|
||||
prompt("Seconds to Velocity")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
initial("0.2")
|
||||
}
|
||||
field(BDST,DBF_FLOAT) {
|
||||
field(BDST,DBF_DOUBLE) {
|
||||
prompt("BL Distance (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(BVEL,DBF_FLOAT) {
|
||||
field(BVEL,DBF_DOUBLE) {
|
||||
prompt("BL Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(SBAK,DBF_FLOAT) {
|
||||
field(SBAK,DBF_DOUBLE) {
|
||||
prompt("BL Speed (RPS)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(BACC,DBF_FLOAT) {
|
||||
field(BACC,DBF_DOUBLE) {
|
||||
prompt("BL Seconds to Velocity")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
@@ -246,7 +246,7 @@ recordtype(motor) {
|
||||
interest(1)
|
||||
initial("200")
|
||||
}
|
||||
field(UREV,DBF_FLOAT) {
|
||||
field(UREV,DBF_DOUBLE) {
|
||||
prompt("EGU's per Revolution")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
@@ -254,7 +254,7 @@ recordtype(motor) {
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
}
|
||||
field(MRES,DBF_FLOAT) {
|
||||
field(MRES,DBF_DOUBLE) {
|
||||
prompt("Motor Step Size (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
asl(ASL0)
|
||||
@@ -262,14 +262,14 @@ recordtype(motor) {
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
}
|
||||
field(ERES,DBF_FLOAT) {
|
||||
field(ERES,DBF_DOUBLE) {
|
||||
prompt("Encoder Step Size (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
}
|
||||
field(RRES,DBF_FLOAT) {
|
||||
field(RRES,DBF_DOUBLE) {
|
||||
prompt("Readback Step Size (EGU")
|
||||
promptgroup(GUI_COMMON)
|
||||
interest(1)
|
||||
@@ -305,34 +305,34 @@ recordtype(motor) {
|
||||
interest(1)
|
||||
size(16)
|
||||
}
|
||||
field(HLM,DBF_FLOAT) {
|
||||
field(HLM,DBF_DOUBLE) {
|
||||
prompt("User High Limit")
|
||||
special(SPC_MOD)
|
||||
pp(TRUE)
|
||||
}
|
||||
field(LLM,DBF_FLOAT) {
|
||||
field(LLM,DBF_DOUBLE) {
|
||||
prompt("User Low Limit")
|
||||
special(SPC_MOD)
|
||||
pp(TRUE)
|
||||
}
|
||||
field(DHLM,DBF_FLOAT) {
|
||||
field(DHLM,DBF_DOUBLE) {
|
||||
prompt("Dial High Limit")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
pp(TRUE)
|
||||
}
|
||||
field(DLLM,DBF_FLOAT) {
|
||||
field(DLLM,DBF_DOUBLE) {
|
||||
prompt("Dial Low Limit")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
pp(TRUE)
|
||||
}
|
||||
field(HOPR,DBF_FLOAT) {
|
||||
field(HOPR,DBF_DOUBLE) {
|
||||
prompt("High Operating Range")
|
||||
promptgroup(GUI_COMMON)
|
||||
interest(1)
|
||||
}
|
||||
field(LOPR,DBF_FLOAT) {
|
||||
field(LOPR,DBF_DOUBLE) {
|
||||
prompt("Low Operating Range")
|
||||
promptgroup(GUI_COMMON)
|
||||
interest(1)
|
||||
@@ -353,25 +353,25 @@ recordtype(motor) {
|
||||
prompt("Raw Low Limit Switch")
|
||||
special(SPC_NOMOD)
|
||||
}
|
||||
field(HIHI,DBF_FLOAT) {
|
||||
field(HIHI,DBF_DOUBLE) {
|
||||
prompt("Hihi Alarm Limit (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
field(LOLO,DBF_FLOAT) {
|
||||
field(LOLO,DBF_DOUBLE) {
|
||||
prompt("Lolo Alarm Limit (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
field(HIGH,DBF_FLOAT) {
|
||||
field(HIGH,DBF_DOUBLE) {
|
||||
prompt("High Alarm Limit (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
pp(TRUE)
|
||||
interest(2)
|
||||
}
|
||||
field(LOW,DBF_FLOAT) {
|
||||
field(LOW,DBF_DOUBLE) {
|
||||
prompt("Low Alarm Limit (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
pp(TRUE)
|
||||
@@ -412,7 +412,7 @@ recordtype(motor) {
|
||||
interest(2)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(RDBD,DBF_FLOAT) {
|
||||
field(RDBD,DBF_DOUBLE) {
|
||||
prompt("Retry Deadband (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
@@ -487,7 +487,7 @@ recordtype(motor) {
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
}
|
||||
field(TWV,DBF_FLOAT) {
|
||||
field(TWV,DBF_DOUBLE) {
|
||||
prompt("Tweak Step Size (EGU)")
|
||||
promptgroup(GUI_COMMON)
|
||||
interest(1)
|
||||
@@ -619,7 +619,7 @@ recordtype(motor) {
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
}
|
||||
field(DLY,DBF_FLOAT) {
|
||||
field(DLY,DBF_DOUBLE) {
|
||||
prompt("Readback settle time (s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
@@ -632,21 +632,21 @@ recordtype(motor) {
|
||||
size(4)
|
||||
extra("void *cbak")
|
||||
}
|
||||
field(PCOF,DBF_FLOAT) {
|
||||
field(PCOF,DBF_DOUBLE) {
|
||||
promptgroup(GUI_COMMON)
|
||||
prompt("Proportional Gain")
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
initial("0")
|
||||
}
|
||||
field(ICOF,DBF_FLOAT) {
|
||||
field(ICOF,DBF_DOUBLE) {
|
||||
promptgroup(GUI_COMMON)
|
||||
prompt("Integral Gain")
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
initial("0")
|
||||
}
|
||||
field(DCOF,DBF_FLOAT) {
|
||||
field(DCOF,DBF_DOUBLE) {
|
||||
promptgroup(GUI_COMMON)
|
||||
prompt("Derivative Gain")
|
||||
special(SPC_MOD)
|
||||
@@ -695,13 +695,13 @@ recordtype(motor) {
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(JVEL,DBF_FLOAT) {
|
||||
field(JVEL,DBF_DOUBLE) {
|
||||
prompt("Jog Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
interest(1)
|
||||
}
|
||||
field(JAR,DBF_FLOAT) {
|
||||
field(JAR,DBF_DOUBLE) {
|
||||
prompt("Jog Accel. (EGU/s^2)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
@@ -721,7 +721,7 @@ recordtype(motor) {
|
||||
menu(menuYesNo)
|
||||
initial("YES")
|
||||
}
|
||||
field(HVEL,DBF_FLOAT) {
|
||||
field(HVEL,DBF_DOUBLE) {
|
||||
prompt("Home Velocity (EGU/s)")
|
||||
promptgroup(GUI_COMMON)
|
||||
special(SPC_MOD)
|
||||
|
||||
Reference in New Issue
Block a user