EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: Problems with dbLinkIsConstant
From: "Johnson, Andrew N. via Core-talk" <core-talk at aps.anl.gov>
To: Torsten Bögershausen <torsten.bogershausen at ess.eu>
Cc: EPICS core-talk <core-talk at aps.anl.gov>
Date: Tue, 30 Jun 2020 15:55:02 +0000
Hi Torsten,

On Jun 30, 2020, at 3:09 AM, Torsten Bögershausen via Core-talk <core-talk at aps.anl.gov> wrote:

I have a problem with dbLinkIsConstant(), it seems.

If I run the motor module with this code:

#if LT_EPICSBASE(7,0,0,0)
#define dbLinkIsConstant(lnk) ((lnk)->type == CONSTANT)
#else
#include "dbLink.h"
#endif


And later

   if (dbLinkIsConstant(&pmr->dol))
   {
       pmr->udf = FALSE;
       Debug(pmr,3, "init_record %s\n", "dbLinkIsConstant=true set UDF=FALSE");

       recGblInitConstantLink(&pmr->dol, DBF_DOUBLE, &pmr->val);
   }


I get this log message:
[motorRecord.cc:906  IOC:m1] init_record dbLinkIsConstant=true set UDF=FALSE

However, the .DOL field is empty.
Is this the expected behavior ?

Yes, an empty or unpopulated link field has always been represented with type==CONSTANT which is a macro with value 0 so this is also the default if the link field is not set at all. In 3.16.1 I introduced extensible links and the dbLinkIsConstant() routine to Base because extensible links can also provide constant values, and they don’t have type==CONSTANT.

Note that recGblInitConstantLink() has always returned TRUE if the link is a constant and provided a value (else FALSE), so there is no actual need for the conditional around it – that was merely an optimization for earlier versions of Base but is no longer helpful. My suggested replacement for the code above is to not call dbLinkIsConstant() at all, just do this instead:

   if (recGblInitConstantLink(&pmr->dol, DBF_DOUBLE, &pmr->val))
   {
       pmr->udf = FALSE;
       Debug(pmr,3, "init_record %s\n", "
recGblInitConstantLink set UDF=FALSE");
   }

That should be backwards compatible with older Base versions, and I believe all of the record types  have now had that modification done already. This was documented in the Release Notes for version 3.16.1, look for the section titled “Support Routine Modifications for Extensible Link Types”. 

HTH,

- Andrew

-- 
Complexity comes for free, simplicity you have to work for.


Replies:
Re: Problems with dbLinkIsConstant Torsten Bögershausen via Core-talk
References:
Problems with dbLinkIsConstant Torsten Bögershausen via Core-talk

Navigate by Date:
Prev: Re: version headers Michael Davidsaver via Core-talk
Next: Re: version headers Michael Davidsaver via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
Navigate by Thread:
Prev: Problems with dbLinkIsConstant Torsten Bögershausen via Core-talk
Next: Re: Problems with dbLinkIsConstant Torsten Bögershausen via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
ANJ, 30 Jun 2020 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·