1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 <2018> 2019 2020 2021 2022 2023 2024 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 <2018> 2019 2020 2021 2022 2023 2024 |
<== Date ==> | <== Thread ==> |
---|
Subject: | RE: How to work with motor record position counts larger than 2147483648? |
From: | Mark Rivers <[email protected]> |
To: | "'Sobhani, Bayan'" <[email protected]>, "[email protected]" <[email protected]> |
Date: | Mon, 22 Jan 2018 23:02:45 +0000 |
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 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 |