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  <20172018  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  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: CA client within Asyn
From: Benoit RAT <[email protected]>
To: EPICS mailing list <[email protected]>
Date: Tue, 11 Apr 2017 13:00:11 +0200
Hi everybody,

Within my Asyn IOC I need sometime to modify some PV from other IOC. 
I did try to do this using the .db but the task was too complex and I am now trying to setup my own CA client inside Asyn.
As I am using Asyn I have also linked all the callback from CA to the one from Asyn... 
This seems to work more or less but I have some problems with the ca_put.


quick resume of what I am doing
===========================

--------------- # Part 1 (OK)

At the setup of the IOC I call:

ca_context_create (ca_enable_preemptive_callback);
...
ca_search_and_connect(pvext_write1->name,&(pvext_write1->chan_id),callback_coHaAr,NULL);
ca_search_and_connect(pvext_write2->name,&(pvext_write2->chan_id),callback_coHaAr,NULL);
...
ca_search_and_connect(pvext_writeN->name,&(pvext_writeN->chan_id),callback_coHaAr,NULL);

and at the end of the setup I call

ca_flush_io()

This work fine and after some seconds I enter callback_coHaAr() for each of the CA created.

--------------- # Part 2

Then at some point in my code, changes of value my internal PV, I modify external PV.

status=ca_put_callback (DBR_DOUBLE, pvext_write1->chan_id, &(pvext_write1->val.float64),callback_put,pvext_write1);
status=ca_put_callback (DBR_DOUBLE, pvext_write2->chan_id, &(pvext_write2->val.float64),callback_put,pvext_write2);
....
status=ca_put_callback (DBR_DOUBLE, pvext_writeN->chan_id, &(pvext_writeN->val.float64),callback_put,pvext_writeN);

And after all my writes has been put, I call

ca_flush_io()


And this is when sometime my hook callback_put() is correctly called back (Almost 90% the first time)

 callback_put() > chid:0x949a3a0 usr:0x94c86a8 (status:x1)

But then if I make succesive call, the hook callback_put() might be called back some more time.. and then never


However If I shutdown the remote IOC, all my callback appears


If only one was missing, I get on my epicConsole:

callback_put() > chid:0x95074c8 usr:0x9535860 (status:xc0) 
callback_coHaAr() > chid:0x95074c8 op:7 (down) 


If 4 were missing:

callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_coHaAr() > chid:0x98623f8 op:7 (down)
 


Conclusion
===========================

I think I am missing something while mixing the epicsThread of asyn and ca, but I really don't know what to try more and I don't find any good examples of ChannelAccess client with thread.


Best,





--
 

Benoit RAT LAMY

fix. (+34) 958 285 024

e-mail: [email protected]

www.sevensols.com 



Replies:
Re: CA client within Asyn Eric Norum

Navigate by Date:
Prev: Asyn timeout Hinko Kocevar
Next: Archiver Appliance established multiple CA connections for one channel Wang, Lin
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: asyn timeout Paduan Donadio, Marcio
Next: Re: CA client within Asyn Eric Norum
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024