Experimental Physics and Industrial Control System
Hey guys,
I've got EPICS and ASYN running and have successfully followed one of Eric Norum's examples to talk to an Agilent 34970A MUX (over IP) and store the *IDN in a stringin record. I'm having problems however with reading a voltage measurement back reliably. I create device support with the devGpib template and the commands:
/* Param 0 -- Read identification string */
{&DSET_SI, GPIBREAD, IB_Q_HIGH, "*IDN?\n++read eoi",NULL, 0, 200, NULL, 0, 0, NULL, NULL, NULL},
/*Param 1 -- Read Measurement @ Channel */
{&DSET_AI, GPIBREAD, IB_Q_HIGH, "MEAS:VOLT:DC? (@203)\n++read eoi", NULL, 0, 200, readMEAS, 0, 0, NULL, NULL, NULL}
I'm interfacing with the GPIB device via the PROLOGIX GPIB-Ethernet controller, (Google them, they're pretty neat) so you can ignore the ++read eoi part of the command string. The conversion method is:
static int readMEAS( struct gpibDpvt *pdpvt, int P1, int P2, char **P3){
struct aiRecord *pai= (struct aiRecord *)pdpvt->precord;
double meas;
sscanf(pdpvt->msg,"%lg",&meas);
printf("meas %f\n",meas);
printf("Messge Length %d. Msg %s\n",pdpvt->msgInputLen,pdpvt->msg);
meas = (double)atof(pdpvt->msg);
printf("meas %f\n",meas);
pai->val = meas;
return 0;
}
I set:
asynSetTraceMask("L0",-1,0x9)
asynSetTraceIOMask("L0",-1,0x2)
in my st.cmd to do some debugging. When I force one of my voltage measurement records to process the first time I get:
epics> dbtr AG34970:VOLT:Coil
epics> 2010/08/06 15:39:30.848 172.25.100.85:1234 write 32
MEAS:VOLT:DC? (@203)\n++read eoi\n
2010/08/06 15:39:31.011 172.25.100.85:1234 read 17
+2.99865210E+00\n\003
meas 2.998652
Messge Length 15. Msg +2.99865210E+00
meas 2.998652
This is exactly what I expect since I'm supplying the MUX with 3 V at Channel 203. So far so good. When I print the record I get:
epics> dbpr AG34970:VOLT:Coil
ASG: DESC: Coil Voltage DISA: 0 DISP: 0
DISV: 1 NAME: AG34970:VOLT:Coil RVAL: 0
SEVR: INVALID STAT: UDF SVAL: 0 TPRO: 0
VAL: 2.9986521
My first newbie question is why is SEVR: INVALID? The VAL is certainly what I want it to be. The problem occurs if I try to process the record more than once:
epics> dbtr AG34970:VOLT:Coil
epics> 2010/08/06 15:39:49.785 172.25.100.85:1234 write 32
MEAS:VOLT:DC? (@203)\n++read eoi\n
2010/08/06 15:39:49.948 172.25.100.85:1234 read 17
+2.99867890E+00\n\003
meas 0.000000
Messge Length 16. Msg +2.99867890E+00
meas 0.000000
Hmmm........an ASCII string indicating an appropriate value is read but converted into a double of 0.0000 . Note the message length has increased by 1. Its as if a hidden character is appended somewhere that screws up the sscanf and atof functions. Perhaps there is a more error proof way to convert ASCII to doubles? Has anyone seen this before? I have no such problem with my stringin record. I can send *IDN? and read the device name reliably.
Thanks very much for your help. I will happily make any device support I get working public.
Cheers,
Andrew Wagner
- Replies:
- RE: aiRecord/devGpib problem Mark Rivers
- RE: aiRecord/devGpib problem Allison, Stephanie
- Navigate by Date:
- Prev:
Re: BOY - XY Graph and macro substitution John William Sinclair
- Next:
Re: BOY - XY Graph and macro substitution PaweÅ PrÄdki
- 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
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
NI USB-6221 BNC Szalata, Zenon M.
- Next:
RE: aiRecord/devGpib problem Mark Rivers
- 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
2019
2020
2021
2022
2023
2024