Converted all fields to double from float to avoid rounding errors

This commit is contained in:
Peter Denison
2006-05-18 19:51:07 +00:00
parent 58f430e383
commit d9115f871f
2 changed files with 63 additions and 67 deletions
+26 -30
View File
@@ -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;
+37 -37
View File
@@ -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)