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  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: Abdalla Ahmad via Tech-talk <[email protected]>
To: "Johnson, Andrew N." <[email protected]>, "[email protected]" <[email protected]>
Date: Wed, 6 Mar 2019 08:11:29 +0000

Hi Andrew

 

In my code I added a ca_pend_io after the main loop just to wait for the ca_put calls to finish their IO but kept the same ca_pend_io per each search. For now it is working fine but I still need to test it by applying a real and large sample of PVs.

 

For an event-driven API, do you mean something like ca_put_callback in the CA API?

 

Best Regards,

Abdalla.

 

From: Johnson, Andrew N. [mailto:[email protected]]
Sent: Tuesday, March 05, 2019 6:45 PM
To: Abdalla Ahmad <[email protected]>; [email protected]
Subject: Re: Questions about channel access C API programming

 

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 Johnson, Andrew N. via Tech-talk
References:
Questions about channel access C API programming Abdalla Ahmad via Tech-talk
Re: Questions about channel access C API programming Johnson, Andrew N. via Tech-talk

Navigate by Date:
Prev: CA and CS-studio configuration Kacper Kłys 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 
Navigate by Thread:
Prev: Re: Questions about channel access C API programming Johnson, Andrew N. via Tech-talk
Next: Re: Questions about channel access C API programming Johnson, Andrew N. 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 
ANJ, 06 Mar 2019 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·