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  2012  2013  2014  2015  2016  2017  2018  <20192020  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  <20192020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: Questions about channel access C API programming
From: "Johnson, Andrew N. via Tech-talk" <[email protected]>
To: Abdalla Ahmad <[email protected]>, "[email protected]" <[email protected]>
Date: Tue, 5 Mar 2019 16:45:01 +0000
On 3/5/19 8:08 AM, Abdalla Ahmad via Tech-talk wrote:
The attached C file is a snippet from a Qt project. In the project there was a function that writes values to many PVs in a loop. What was happening is that some PVs do not get their new value updated immediately but after 3 or 4 seconds. The code shows a similar behavior, two consecutive "ca_put" calls, and the same behavior occurs. I double-checked the database (included in the comments) but there is nothing wrong. I tried to use ca_context_ or ca_task_ but the project crashes maybe because the QE framework is already handling low-level CA. What am I missing here?

If you want to minimize the time between the two puts, you should reorganize the code so all the name searches happen first and get resolved, then do both puts together, more like this:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cadef.h>

int main()
{
    srand(time(0));
    double v1 = ((rand() % 100) / 10.0) * 1E-7;
    double v2 = ((rand() % 100) / 10.0);
    
    chid pvID1;
    chid pvID2;

    ca_task_initialize();
	
    ca_search("Analog_1", &pvID1);
    ca_search("Analog_2", &pvID2);
    ca_pend_io(1.0);

    ca_put(DBR_DOUBLE, pvID1, &v2);
    ca_put(DBR_DOUBLE, pvID2, &v2);
    ca_flush();

    ca_task_exit();
}
Of course this code won't behave quite the same as your version if the Analog_2 record isn't available, and it really should be checking the status values returned by all CA routines to detect those kinds of problems. If you don't do that your control system is likely to be very brittle, meaning that when something minor goes wrong (such as a name search taking longer to complete than the 1 second you are allowing because the load on your network has increased since you tested the code) the knock-on effects could bring down your whole control system.

For code that needs to be event driven like I suspect most Qt applications are, you probably shouldn't be using the basic API routines ca_search() and ca_pend_io() either, but should switch to the event-driven API routines that take callback routines that are called when the operation completes.

- Andrew
-- 
Arguing for surveillance because you have nothing to hide is no
different than making the claim, "I don't care about freedom of
speech because I have nothing to say." -- Edward Snowdon

Replies:
RE: Questions about channel access C API programming Abdalla Ahmad via Tech-talk
References:
Questions about channel access C API programming Abdalla Ahmad via Tech-talk

Navigate by Date:
Prev: Re: Questions about channel access C API programming Wang Xiaoqiang via Tech-talk
Next: CA and CS-studio configuration Kacper Kłys via Tech-talk
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  <20192020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: Questions about channel access C API programming Wang Xiaoqiang via Tech-talk
Next: RE: Questions about channel access C API programming Abdalla Ahmad via Tech-talk
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  <20192020  2021  2022  2023  2024