Experimental Physics and
| |||||||||||||||||
|
You cannot just set up the channel and then loop on a Yes you can, and in some cases that's exactly what you should be doing. If you started your IOC *after* your program, your posted code would have called ca_context_create() multiple times without a matching call to ca_context_destroy(), which might explain what you saw (there were probably multiple active contexts which were all reporting disconnects). I suggest you make it impossible for simple programs ever to call ca_context_create() after it has once returned ECA_NORMAL, and don't use ca_context_destroy() in them at all. I've attached my modified version of your code which loops calling just ca_get() and ca_pend_io(). I can stop and start the IOC it connects to using either 'exit' or Control-C and the channel reconnects properly in both cases when I restart it. The ca_pend_io(0) after calling ca_create_channel() waits forever for the channel to connect before it starts the loop, but you could do this other ways too. calling ca_context_create calling ca_create_channel calling ca_pend_io(0) ca_pend_io returned 0x1: value=0x6 ca_pend_io returned 0x1: value=0x8 ca_pend_io returned 0x1: value=0x0 CA.Client.Exception............................................... Warning: "Virtual circuit disconnect" Context: "tux.aps.anl.gov:5064" Source File: ../cac.cpp line 1127 Current Time: Fri Jan 18 2008 09:15:33.826129157 .................................................................. CA.Client.Exception............................................... Warning: "Virtual circuit disconnect" Context: "op=0, channel=anjHost:aiExample, type=DBR_SHORT, count=1, ctx="tux.aps.anl.gov:5064"" Source File: ../getCopy.cpp line 86 Current Time: Fri Jan 18 2008 09:15:33.826488069 .................................................................. ca_pend_io failed: User specified timeout on IO operation expired ca_get failed: Virtual circuit disconnect ca_pend_io failed: User specified timeout on IO operation expired ca_get failed: Virtual circuit disconnect ca_pend_io failed: User specified timeout on IO operation expired ca_get failed: Virtual circuit disconnect ca_pend_io failed: User specified timeout on IO operation expired ca_pend_io returned 0x1: value=0x2 ca_pend_io returned 0x1: value=0x4 ca_pend_io returned 0x1: value=0x6 One other suggestion: In a CA client program like this, using ca_pend_event() instead of sleep() or epicsThreadSleep() can result in exception messages being printed sooner and the program seeming quicker to respond, since the CA library won't output anything while your code is not executing a CA library call. - Andrew -- When a distinguished but elderly scientist states that something is possible, he is almost certainly right. When he states that something is impossible, he is very probably wrong. -- Arthur C. Clarke #include <stdlib.h> #include <stdio.h> #include <epicsThread.h> #include <cadef.h> #define EPICS_TIMEOUT 5.0 int main(int argc, char *argv[]) { char *PVN = "anjHost:aiExample"; int rc; chid CID; double timeout = EPICS_TIMEOUT; unsigned short value; printf("calling ca_context_create\n"); rc = ca_context_create(ca_disable_preemptive_callback); if (rc != ECA_NORMAL) { printf("ca_context_create failed %s\n", ca_message(rc)); exit(1); } printf("calling ca_create_channel\n"); rc = ca_create_channel(PVN, NULL, NULL, 10, &CID); if (rc != ECA_NORMAL) { printf("ca_create_channel failed: %s\n", ca_message(rc)); exit(1); } printf("calling ca_pend_io(0)\n"); rc = ca_pend_io(0); if (rc != ECA_NORMAL) { printf("ca_pend_io failed: %s\n", ca_message(rc)); exit(1); } for(;;) { rc = ca_get(DBR_SHORT, CID, &value); if (rc != ECA_NORMAL) { printf("ca_get failed: %s\n", ca_message(rc)); } rc = ca_pend_io(timeout); if (rc != ECA_NORMAL) { printf("ca_pend_io failed: %s\n", ca_message(rc)); } else { printf("ca_pend_io returned 0x%x: value=0x%x\n", rc, value); } epicsThreadSleep(2); } exit(0); }
| ||||||||||||||||
ANJ, 02 Sep 2010 |
·
Home
·
News
·
About
·
Base
·
Modules
·
Extensions
·
Distributions
·
Download
·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing · |