diff --git a/GNUmakefile b/GNUmakefile index a3c40212..3ce2f73d 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,8 +1,11 @@ include /ioc/tools/driver.makefile MODULE = motorBase -EXCLUDE_VERSIONS=3.13 -BUILDCLASSES+=vxWorks Linux WIN32 +EXCLUDE_VERSIONS=3.13 3.14 7.0.6 +BUILDCLASSES = Linux +#ARCH_FILTER = %-ppc4xxFP +ARCH_FILTER = eldk42-ppc4xxFP +#ARCH_FILTER = eldk53-ppc4xxFP SOURCES += motorApp/MotorSrc/motorRecord.cc DBDS += motorApp/MotorSrc/motorRecord.dbd diff --git a/motorApp/MotorSrc/devMotorAsyn.c b/motorApp/MotorSrc/devMotorAsyn.c index aa02f9e2..46af83b9 100644 --- a/motorApp/MotorSrc/devMotorAsyn.c +++ b/motorApp/MotorSrc/devMotorAsyn.c @@ -432,29 +432,30 @@ CALLBACK_VALUE update_values(struct motorRecord * pmr) pmr->name, pPvt->needUpdate); if ( pPvt->needUpdate ) { - epicsInt32 rawvalue; + epicsFloat64 rawF64; + epicsInt32 rawI32; - rawvalue = (epicsInt32)floor(pPvt->status.position + 0.5); - if (pmr->rmp != rawvalue) + rawF64 = pPvt->status.position; + if (pmr->rmp != rawF64) { - pmr->rmp = rawvalue; + pmr->rmp = rawF64; db_post_events(pmr, &pmr->rmp, DBE_VAL_LOG); } - rawvalue = (epicsInt32)floor(pPvt->status.encoderPosition + 0.5); - if (pmr->rep != rawvalue) + rawF64 = pPvt->status.encoderPosition; + if (pmr->rep != rawF64) { - pmr->rep = rawvalue; + pmr->rep = rawF64; db_post_events(pmr, &pmr->rep, DBE_VAL_LOG); } /* Don't post MSTA changes here; motor record's process() function does efficent MSTA posting. */ pmr->msta = pPvt->status.status; - rawvalue = (epicsInt32)floor(pPvt->status.velocity); - if (pmr->rvel != rawvalue) + rawI32 = (epicsInt32)floor(pPvt->status.velocity); + if (pmr->rvel != rawI32) { - pmr->rvel = rawvalue; + pmr->rvel = rawI32; db_post_events(pmr, &pmr->rvel, DBE_VAL_LOG); } diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 03d83c6d..1ab4fa6b 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -637,7 +637,8 @@ static long init_record(dbCommon* arg, int pass) MARK(M_VAL); pmr->dval = pmr->drbv; MARK(M_DVAL); - pmr->rval = NINT(pmr->dval / pmr->mres); + pmr->rval = pmr->dval / pmr->mres; + //printf("RVAL_1: %g=%g/%g\n",pmr->rval,pmr->dval,pmr->mres); MARK(M_RVAL); } @@ -654,7 +655,8 @@ static long init_record(dbCommon* arg, int pass) MARK(M_SPMG); pmr->diff = pmr->dval - pmr->drbv; MARK(M_DIFF); - pmr->rdif = NINT(pmr->diff / pmr->mres); + pmr->rdif = pmr->diff / pmr->mres; + //printf("RDIF_1: %g=%g/%g\n",pmr->rdif,pmr->diff,pmr->mres); MARK(M_RDIF); pmr->lval = pmr->val; pmr->ldvl = pmr->dval; @@ -768,7 +770,8 @@ static long postProcess(motorRecord * pmr) #endif MARK(M_VAL); MARK(M_DVAL); - pmr->rval = NINT(pmr->dval / pmr->mres); + pmr->rval = pmr->dval / pmr->mres; + //printf("RVAL_2: %g=%g/%g\n",pmr->rval,pmr->dval,pmr->mres); MARK(M_RVAL); pmr->diff = 0.; MARK(M_DIFF); @@ -892,7 +895,8 @@ static long postProcess(motorRecord * pmr) { double currpos = pmr->dval / pmr->mres; double newpos = bpos + pmr->frac * (currpos - bpos); - pmr->rval = NINT(newpos); + pmr->rval = newpos; + //printf("RVAL_3: %g=%g\n",pmr->dval,newpos); WRITE_MSG(MOVE_ABS, &newpos); } pmr->mip = MIP_MOVE_BL; @@ -941,7 +945,8 @@ static long postProcess(motorRecord * pmr) { double currpos = pmr->dval / pmr->mres; double newpos = bpos + pmr->frac * (currpos - bpos); - pmr->rval = NINT(newpos); + pmr->rval = newpos; + //printf("RVAL_4: %g=%g\n",pmr->dval,newpos); WRITE_MSG(MOVE_ABS, &newpos); } WRITE_MSG(GO, NULL); @@ -1260,7 +1265,7 @@ static long process(dbCommon *arg) { /* We're going in the wrong direction. Readback problem? */ - printf("%s:tdir = %d\n", pmr->name, pmr->tdir); + //printf("%s:tdir = %d\n", pmr->name, pmr->tdir); INIT_MSG(); WRITE_MSG(STOP_AXIS, NULL); SEND_MSG(); @@ -2173,7 +2178,8 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) MARK(M_DIFF); } - pmr->rdif = NINT(pmr->diff / pmr->mres); + pmr->rdif = pmr->diff / pmr->mres; + //printf("RDIF_2: %g=%g/%g\n",pmr->rdif,pmr->diff,pmr->mres); MARK(M_RDIF); if (set && !pmr->igset) { @@ -2202,7 +2208,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) double relbpos = ((pmr->dval - pmr->bdst) - pmr->drbv) / pmr->mres; double rbdst1 = 1.0 + (fabs(pmr->bdst) / fabs(pmr->mres)); long rdbdpos = NINT(pmr->rdbd / fabs(pmr->mres)); /* retry deadband steps */ - long rpos, npos, rtnstat; + long rtnstat; msta_field msta; msta.All = pmr->msta; @@ -2221,18 +2227,17 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) pmr->val = pmr->dval * dir + pmr->off; if (pmr->val != pmr->lval) MARK(M_VAL); - pmr->rval = NINT(pmr->dval / pmr->mres); + pmr->rval = pmr->dval / pmr->mres; + //printf("RVAL_5: %g=%g/%g\n",pmr->rval,pmr->dval,pmr->mres); if (pmr->rval != pmr->lrvl) MARK(M_RVAL); /* Don't move if we're within retry deadband. */ - rpos = NINT(rbvpos); - npos = NINT(newpos); too_small = false; if ((pmr->mip & MIP_RETRY) == 0) { - if (abs(npos - rpos) < 1) + if (newpos==rbvpos) too_small = true; if (!too_small) { @@ -2247,9 +2252,10 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) } } } - else if (abs(npos - rpos) < rdbdpos) + else if (abs(newpos - rbvpos) < rdbdpos) too_small = true; + //printf("too_small: %u\n",(unsigned int)too_small); if (too_small == true) { if (pmr->dmov == FALSE && (pmr->mip == MIP_DONE || pmr->mip == MIP_RETRY)) @@ -3723,7 +3729,8 @@ static void process_motor_info(motorRecord * pmr, bool initcall) pmr->diff = pmr->dval - pmr->drbv; MARK(M_DIFF); - pmr->rdif = NINT(pmr->diff / pmr->mres); + pmr->rdif = pmr->diff / pmr->mres; + //printf("RDIF_3: %g=%g/%g\n",pmr->rdif,pmr->diff,pmr->mres); MARK(M_RDIF); } @@ -3735,9 +3742,10 @@ static void load_pos(motorRecord * pmr) pmr->ldvl = pmr->dval; pmr->lval = pmr->val; - if (pmr->rval != (epicsInt32) NINT(newpos)) + if (pmr->rval != newpos) MARK(M_RVAL); - pmr->lrvl = pmr->rval = (epicsInt32) NINT(newpos); + pmr->lrvl = pmr->rval = newpos; + //printf("RVAL_6: %g=%g\n",pmr->rval,newpos); if (pmr->foff) { @@ -4158,7 +4166,8 @@ static void syncTargetPosition(motorRecord *pmr) MARK(M_VAL); pmr->dval = pmr->ldvl = pmr->drbv; MARK(M_DVAL); - pmr->rval = pmr->lrvl = NINT(pmr->dval / pmr->mres); + pmr->rval = pmr->lrvl = pmr->dval / pmr->mres; + //printf("RVAL_7: %g=%g/%g\n",pmr->rval,pmr->dval,pmr->mres); MARK(M_RVAL); } diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index 05fd99b6..a2f22eea 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -533,13 +533,13 @@ recordtype(motor) { special(SPC_NOMOD) interest(1) } - field(RVAL,DBF_LONG) { + field(RVAL,DBF_DOUBLE) { asl(ASL0) prompt("Raw Desired Value (step") special(SPC_MOD) pp(TRUE) } - field(LRVL,DBF_LONG) { + field(LRVL,DBF_DOUBLE) { prompt("Last Raw Des Val (steps") special(SPC_NOMOD) interest(1) @@ -567,7 +567,7 @@ recordtype(motor) { prompt("Difference dval-drbv") special(SPC_NOMOD) } - field(RDIF,DBF_LONG) { + field(RDIF,DBF_DOUBLE) { prompt("Difference rval-rrbv") special(SPC_NOMOD) } @@ -575,15 +575,15 @@ recordtype(motor) { prompt("Raw cmnd direction") special(SPC_NOMOD) } - field(RRBV,DBF_LONG) { + field(RRBV,DBF_DOUBLE) { prompt("Raw Readback Value") special(SPC_NOMOD) } - field(RMP,DBF_LONG) { + field(RMP,DBF_DOUBLE) { prompt("Raw Motor Position") special(SPC_NOMOD) } - field(REP,DBF_LONG) { + field(REP,DBF_DOUBLE) { prompt("Raw Encoder Position") special(SPC_NOMOD) }