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  <20122013  2014  2015  2016  2017  2018  2019  2020  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 
<== Date ==> <== Thread ==>

Subject: RE: What is void* puser in ca_create_channel
From: "Hill, Jeffrey O" <johill@lanl.gov>
To: Florian Feldbauer <florian@ep1.ruhr-uni-bochum.de>
Cc: EPICS tech talk <tech-talk@aps.anl.gov>
Date: Tue, 3 Apr 2012 15:44:01 +0000
Hi,

Correct, a single-threaded CA client code must periodically spend some time in ca_pend_event() in order that the channels will connect. The channels will not transition from a disconnected to a connected state if your main thread doesn't periodically call ca_pend_event. The ca_pend_event(), among other tasks, arranges for the incoming TCP messages to be processed, and calls the user callbacks.

The ca_flush_io() call is forcing all of the en-queued put/get/subscribe requests to be delivered to the TCP circuits in aggregate, but does not necessarily process the incoming messages on the TCP circuits, or call the connection callbacks.

Jeff

> -----Original Message-----
> From: Florian Feldbauer [mailto:florian@ep1.ruhr-uni-bochum.de]
> Sent: Monday, April 02, 2012 8:05 AM
> To: Hill, Jeffrey O
> Cc: EPICS tech talk
> Subject: Re: What is void* puser in ca_create_channel
> 
> Hey,
> 
> after creating all channels and subscriptions I used ca_flush_io() in my
> program as
> mentioned in the talk "Channel Access Client Programming" from Dirk
> Zimoch at the last
> EPICS meeting at PSI.
> When I use ca_pend_event() instead, the CA is working.
> 
> Best regards,
> Florian
> 
> 
> On 03/30/2012 04:10 PM, Hill, Jeffrey O wrote:
> >> Just one other question: Can I use the CA methods ca_create_channel and
> >> ca_create_subscription within a c++ class?
> > Yes, the necessary 'extern"C"' bracketing is in the ca header files so
> that its C interface can be called from C++.
> >
> >> Any idea based on this few information, or should I post my code?
> > If the CA client and its IOC are not on the same subnet then you may
> need to add the IOC's address to the EPICS_CA_ADDR_LIST environment
> variable for the client. Otherwise, if they are intended to be on the same
> subnet them make certain that both hosts are configured with the same
> subnet mask.
> >
> > There are also some additional suggestions in the troubleshooting
> section of the CA reference manual.
> >
> > Jeff
> >
> >> -----Original Message-----
> >> From: Florian Feldbauer [mailto:florian@ep1.ruhr-uni-bochum.de]
> >> Sent: Friday, March 30, 2012 6:29 AM
> >> To: Hill, Jeffrey O
> >> Cc: EPICS tech talk
> >> Subject: Re: What is void* puser in ca_create_channel
> >>
> >> Thanks for your answers.
> >>
> >> Just one other question: Can I use the CA methods ca_create_channel and
> >> ca_create_subscription within a c++ class?
> >> The project we are working on should use OO techniques.
> >> We need not only an interface to EPICS, but also to a simulation.
> >> So we wanted to have an abstract base class, which is used by the rest
> >> of our project, and  derived classes for the implementation of
> >> the individual "control systems". One derived class would contain the
> CA
> >> for EPICS and another the interface to our simulation.
> >>
> >> I can compile my test program for this object-structure, but I don't
> get
> >> a conncetion to my EPICS ioc.
> >> The two examples from makeBaseApp.pl are working correctly.
> >>
> >> Any idea based on this few information, or should I post my code?
> >>
> >> Best regards,
> >> Florian
> >>
> >> On 03/29/2012 05:19 PM, Hill, Jeffrey O wrote:
> >>> Hi,
> >>>
> >>> The puser pointer you pass to ca_create_channel is saved by the
> library
> >> with the channel and is later supplied as a puser argument to your
> channel
> >> connectione state update callback function. There is also a ca function
> >> "void * ca_puser ( CHID )" that will return the puser pointer that was
> >> supplied when the channel was created.
> >>> Likewise, the puser pointer you pass to ca_create_subscription is
> saved
> >> by the library with the subscription and is later supplied as a puser
> >> argument to your subscription update callback function.
> >>>> How does this parameter have to look like?
> >>>> Can I use a C-Struct with any member I want to have (even members
> which
> >>>> are not for the CA, but for another part of my program)? Are there
> any
> >>>> members which are mandatory? (like value or chid)
> >>> A pointer to any data structure can be used. The CA library does not
> in
> >> any way access, or place any restrictions on the content of, this user
> >> application private data structure. The user application is of course
> >> responsible for allocation, initialization, maintenance, and de-
> allocation
> >> (proper cleanup) of this data structure.
> >>> Use of void pointers passed to callbacks is an old technique which is
> >> roughly equivalent to a virtual function in modern software interfaces,
> >> BTW.
> >>> HTH, and feel free to send any other questions that you might have,
> and
> >> I will do my best to answer them.
> >>> Jeff
> >>>
> >>>> -----Original Message-----
> >>>> From: tech-talk-bounces@aps.anl.gov [mailto:tech-talk-
> >> bounces@aps.anl.gov]
> >>>> On Behalf Of Florian Feldbauer
> >>>> Sent: Thursday, March 29, 2012 4:01 AM
> >>>> To: EPICS tech talk
> >>>> Subject: What is void* puser in ca_create_channel
> >>>>
> >>>> Dear all,
> >>>>
> >>>> I currently write a CA Client that should monitor all measured
> >>>> temperatures in my experiment
> >>>> to regulate the chillers.
> >>>> This is my first try to program a CA Client, and I have a question
> >>>> concerning this:
> >>>>
> >>>> The ca_create_channel and the ca_create_subscription methods both
> have
> >>>> a parameter void* puser. How does this parameter have to look like?
> >>>> Can I use a C-Struct with any member I want to have (even members
> which
> >>>> are not
> >>>> for the CA, but for another part of my program)? Are there any
> members
> >>>> which are mandatory? (like value or chid)
> >>>>
> >>>> In the camonitor.c example generated with makeBaseApp.pl this puser
> is
> >>>> just a pointer to a C-Struct containing
> >>>> a c-string value, the chid and evid of the channel.
> >>>>
> >>>> Best regards,
> >>>> Florian
> >>>>
> >>>> --
> >>>> -------------------------------------
> >>>> | Florian Feldbauer                 |
> >>>> | Ph.D. student                     |
> >>>> |                                   |
> >>>> | Institut für Experimentalphysik I |
> >>>> | Ruhr-Universität Bochum           |
> >>>> | Universitätsstr. 150              |
> >>>> | D-44780 Bochum                    |
> >>>> |                                   |
> >>>> | Office: NB 2/173                  |
> >>>> | Phone:  (+49)234 / 32-23538       |
> >>>> | Fax:    (+49)234 / 32-14170       |
> >>>> | Web:    http://www.ep1.rub.de     |
> >>>> -------------------------------------
> >>
> >> --
> >> -------------------------------------
> >> | Florian Feldbauer                 |
> >> | Ph.D. student                     |
> >> |                                   |
> >> | Institut für Experimentalphysik I |
> >> | Ruhr-Universität Bochum           |
> >> | Universitätsstr. 150              |
> >> | D-44780 Bochum                    |
> >> |                                   |
> >> | Office: NB 2/173                  |
> >> | Phone:  (+49)234 / 32-23538       |
> >> | Fax:    (+49)234 / 32-14170       |
> >> | Web:    http://www.ep1.rub.de     |
> >> -------------------------------------
> 
> 
> --
> -------------------------------------
> | Florian Feldbauer                 |
> | Ph.D. student                     |
> |                                   |
> | Institut für Experimentalphysik I |
> | Ruhr-Universität Bochum           |
> | Universitätsstr. 150              |
> | D-44780 Bochum                    |
> |                                   |
> | Office: NB 2/173                  |
> | Phone:  (+49)234 / 32-23538       |
> | Fax:    (+49)234 / 32-14170       |
> | Web:    http://www.ep1.rub.de     |
> -------------------------------------



Replies:
Re: What is void* puser in ca_create_channel Dirk Zimoch
References:
What is void* puser in ca_create_channel Florian Feldbauer
RE: What is void* puser in ca_create_channel Hill, Jeffrey O
Re: What is void* puser in ca_create_channel Florian Feldbauer
RE: What is void* puser in ca_create_channel Hill, Jeffrey O
Re: What is void* puser in ca_create_channel Florian Feldbauer

Navigate by Date:
Prev: ITER distribution 3.0 Di Maio Franck
Next: RE: casStrmClient.cc error: invalid channel identifier Hill, Jeffrey O
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 
Navigate by Thread:
Prev: Re: What is void* puser in ca_create_channel Florian Feldbauer
Next: Re: What is void* puser in ca_create_channel Dirk Zimoch
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 
ANJ, 18 Nov 2013 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·