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
*From:* [email protected] [mailto:[email protected]]
*On Behalf Of *Sobhani, Bayan
*Sent:* Monday, January 22, 2018 4:20 PM
*To:* [email protected]
*Subject:* How to work with motor record position counts larger than 2147483648?
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