EPICS Home

Experimental Physics and Industrial Control System


 
1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  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  <20122013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: put to disabled records and monitors
From: Dirk Zimoch <[email protected]>
To: EPICS <[email protected]>
Date: Thu, 30 Aug 2012 11:36:23 +0200
Hi folks,

A colleague of mine has seen the following strange effect:

If a disabled (DISA=1) record is written then monitors do not show the change. To be exact: If the VAL field of a passive record is modified multiple times, then a monitor shows only the first change. But if the record is scanned periodically, or any other field with pp(TRUE) has been written before, then even the first change is not shown. However, a caget can confirm that the value has changed.

Even when the record is re-enabled (DISA=0), the monitors do not update before the record processes the next time.

Other fields than the VAL field are not affected, all of their modifications are immediately shown by monitors.

So it seems if any attempt has been made to process a disabled record, then any later modification of the VAL field and only the VAL field does not trigger a monitor.

Is this the correct behavior? IMHO no. It leads to inconsistent displays for the same value. As for any other field, people also want to see any change that someone else makes on the VAL field.

The problem appeared when a epid record had to be configured (KP, KI, and KD set, as well as the setpoint VAL), before is is activated. Other displays did not show the modified setpoint. I could confirm that the problem is not limited to the epid record but affects standard base record like ao as well.

The code in question seems to be dbPut in dbAccess.c:

    /* Propagate monitor events for this field, */
    /* unless the field field is VAL and PP is true. */
    pfldDes = paddr->pfldDes;
    isValueField = dbIsValueField(pfldDes);
    if (isValueField) precord->udf = FALSE;
    if (precord->mlis.count &&
        !(isValueField && pfldDes->process_passive))
        db_post_events(precord, paddr->pfield, DBE_VALUE | DBE_LOG);

What about changing this to

    if (precord->mlis.count &&
        !(isValueField && pfldDes->process_passive &&
          precord->disa != precrod->disv))
        db_post_events(precord, paddr->pfield, DBE_VALUE | DBE_LOG);

or skip the whole test for VAL and do

    if (precord->mlis.count)
        db_post_events(precord, paddr->pfield, DBE_VALUE | DBE_LOG);

?

Any opinions?

Dirk


Replies:
Re: put to disabled records and monitors Tim Mooney

Navigate by Date:
Prev: Re: Cross-compilation, static build, etc Angus Gratton
Next: Re: Keithley 6517B support? Joe Sullivan
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Location of caTools sources Shankar, Murali
Next: Re: put to disabled records and monitors Tim Mooney
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024