EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  <20182019  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  <20182019  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
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


Replies:
Re: How to work with motor record position counts larger than 2147483648? Torsten Bögershausen
References:
How to work with motor record position counts larger than 2147483648? Sobhani, Bayan

Navigate by Date:
Prev: How to work with motor record position counts larger than 2147483648? Sobhani, Bayan
Next: Re: How to work with motor record position counts larger than 2147483648? Torsten Bögershausen
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  <20182019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: How to work with motor record position counts larger than 2147483648? Sobhani, Bayan
Next: Re: How to work with motor record position counts larger than 2147483648? Torsten Bögershausen
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  <20182019  2020  2021  2022  2023  2024 
ANJ, 22 Jan 2018 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·