Hi Alex,
The problem is that the RRBV field in the motor record is a 32-bit integer:
This is from motorRecord.dbd:
field(RRBV,DBF_LONG) {
prompt("Raw Readback Value")
special(SPC_NOMOD)
}
The motor driver reads back the theoretical and encoder positions as doubles, but then they is converted to 32-bit integers in devMotorAsyn.c to be compatible with the fields
in the record.
if ( pPvt->needUpdate )
{
epicsInt32 rawvalue;
rawvalue = (epicsInt32)floor(pPvt->status.position + 0.5);
if (pmr->rmp != rawvalue)
{
pmr->rmp = rawvalue;
db_post_events(pmr, &pmr->rmp, DBE_VAL_LOG);
}
rawvalue = (epicsInt32)floor(pPvt->status.encoderPosition + 0.5);
if (pmr->rep != rawvalue)
{
pmr->rep = rawvalue;
db_post_events(pmr, &pmr->rep, DBE_VAL_LOG);
}
Mark
I am working on adapting the SmarAct MCS motor record driver for the MCS2, which seems to record its position in picometers unlike the MCS’s nanometers.
I have the following code in my polling function:
Int64_t val = getp(0); //Gets position of channel 0 positioner
printf(“%f\n”,(double) val); //prints -6000093133.000000
setDoubleParam(c_p_->motorEncoderPosition_,(double)val);
setDoubleParam(c_p_->motorPosition_,(double)val);
…
callParamCallbacks();
return asynSuccess;
But when I look at the motor record, the RRBV is shown as -2147483648. I looked at asynMotorController.cpp and saw the line:
createParam(motorEncoderPositionString, asynParamFloat64, &motorEncoderPosition_);
Shouldn’t this mean I can write 64-bit floating point values to motorEncoderPosition_ (i.e. larger than 2147483648)? How should I go about working with position counts larger than 2147483648?
Alex