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  <20102011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  <20102011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: RE: asyn Driver questions
From: "Szalata, Zenon M." <[email protected]>
To: Eric Norum <[email protected]>
Cc: TECHTALK Tech-Talk <[email protected]>
Date: Wed, 21 Apr 2010 13:06:59 -0700
Thanks Eric,
I did try this and it made no difference.

I have a fix.

In echoDriver.c, in the echoDriverInit, there is a code fragment:

    if(multiDevice) {
        status = pasynOctetBase->initialize(portName,&pechoPvt->octet,0,0,0);
    } else {
        status = pasynOctetBase->initialize(portName,&pechoPvt->octet,1,1,0);
    }

I changed this to 

    if(multiDevice) {
        status = pasynOctetBase->initialize(portName,&pechoPvt->octet,0,0,0);
    } else {
        status = pasynOctetBase->initialize(portName,&pechoPvt->octet,0,0,0);
    }

and now my code works.  Is this the correct fix?  I really don't know.  The problem is that I took echoDriver.c, made number of modifications, most of them seemed to be working and this one little detail was proper for echoDriver.c but not for what I am attempting.
Anyway, perhaps that is it.  Now I can look at the example you sent me at my leasure.

Zen

-----Original Message-----
From: Eric Norum [mailto:[email protected]] 
Sent: Wednesday, April 21, 2010 12:51 PM
To: Szalata, Zenon M.
Cc: Mark Rivers; TECHTALK Tech-Talk
Subject: Re: asyn Driver questions

When you configure the port just ask that the EOS processing be omitted:
	drvAsynIPPortConfigure("HMx01","134.79.64.51:9999 UDP",0,0,1)



On Apr 21, 2010, at 12:40 PM, Szalata, Zenon M. wrote:

> Hi Mark,
> I looked at asynPortDriver and decided that I should look at it in some near future.  For the time being, I have gone ahead trying to understand how various asyn components work.  To this end I am staying with my attempt at a low level asyn driver, which I call drvMarx.c and which is based on Marty Kramer's echoDriver.c.
> I now understand what is happening but as yet don't know what is the right solution.
> I am now using asyn4.13.
> When I process the epics records, the following action is triggered:
> 1. drvMarx:mxWrite() is called and it sends the string to my python "echo" program.
> 2. The python program, converts the string to upper case and sends it back.
> 3. drvMarx:mxRead() routine is called and it calls asynOctetSyncIO:readOnce().
> 4. asynOctetSyncIO:readOnce() calls asynOctetSyncIO:readIt(),
> 5. asynOctetSyncIO:readIt() calls pioPvt->pasynOctet->read().  This turns out to be:
> 6. asynInterposeEos:readIt().  As I see it, this is where trouble is.  In this routine,
>   peosPvt->processEosIn is 1, therefore the execution goes into the for(;;) loop.
>   In this loop, peosPvt->poctet->read() is called twice.  The first time it succeeds
>   but the second time it times out (not surprising since there is no more data to be
>   read from the port).  In the for(;;) loop, there is some fancy handling of EOM stuff.
>   I don't understand that.
> 
> I tried the following in my st.cmd file:
> asynInterposeEosConfig( "HM01",0,0,0)
> This did not affect the value of peosPvt->processEosIn, it is still 1.
> 
> What is the correct solution to this?
> It is clear to me that the read should be done only once.  It seems to me that in my case processEosIn should be 0 and that would solve the problem that the read (recv) from the port is done a second time, which fails with time out.  Or should the EOM parameters be configured somehow, such that the execution goes only once through the for(;;) loop?
> 
> I really need some straightening out on this.
> 
> Thanks in advance,
> Zen
> 
> -----Original Message-----
> From: Mark Rivers [mailto:[email protected]] 
> Sent: Saturday, April 17, 2010 11:18 AM
> To: Szalata, Zenon M.; TECHTALK Tech-Talk
> Subject: RE: asyn Driver questions
> 
> Hi Zen,
> 
> It looks like you must be using a pretty old version of asyn, R4-9 (October 2007) or earlier, because the asynOctetSyncIO->readRawOnce function was removed in R4-10.  The release notes for R4-10 do say:
> 
> ***
> 
> 
> drvAsynIPPort
> 
> 
> Cleaned up timeout handling.
> 
> ***
> 
> I am not sure if going to a more recent release will fix your problems or not, but if possible I would try that first.
> 
> What type of device-specific asyn driver are you trying to write?  The only documents are the ones in asyn.  I have recently added a new C++ base class, asynPortDriver, that makes writing a device-specific driver very easy, particularly for complex devices with lots of parameters.  I think it is well documented, and there is a well-commented example in asyn/testAsynPortDriver.
> 
> Mark
> 
> 
> ________________________________
> 
> From: [email protected] on behalf of Szalata, Zenon M.
> Sent: Sat 4/17/2010 12:38 PM
> To: TECHTALK Tech-Talk
> Subject: asyn Driver questions
> 
> 
> 
> I am trying to learn how to write a driver module which is based on echoDriver.c written by Marty Kramer, which I renamed to drvMarx.c.  I have a soft IOC, which includes the drvMarx.c module and which is intended to communicate with some Ethernet device.  The network protocol is UDP.  Presently the Ethernet device is simulated with a simple Python script which receives text message, converts the text to all upper case and sends this back.  The script is working fine.
> 
> In drvMarx.c I am calling asynOctetSyncIO->readRawOnce, which fails with a timeout.  Here is the code fragment from the read routine in drvMarx.c:
> 
> printf( "\n");
> printf( "mxRead:before:readRawOnce: data=%s,nbts=%d,oemReason=0x%x\n",
> data,*nbytesTransfered,*eomReason);
> printf( "\n");
> 
>  status=pasynOctetSyncIO->readRawOnce( pmxPvt->udpPort,0,data,maxchars,
>        5,nbytesTransfered,eomReason,"");
> printf( "\n");
> printf( "mxRead:after:readRawOnce: data=%s,nbts=%d,oemReason=0x%x\n",
> data,*nbytesTransfered,*eomReason);
> printf( "\n");
> 
> This is what I have in my db file:
> 
> record( stringout, "$(P):SO:SEND:IT"){
>  field( DESC, "Send msg")
>  field( FLNK, "$(P):SI:READ:IT")
> }
> record( stringin, "$(P):SI:READ:IT"){
>  field( DESC, "Read msg")
>  field( DTYP, "asynOctetWriteRead")
>  field( INP,  "@asyn($(P),0,1) $(P):SO:SEND:IT")
> }
> 
> When I put the string Hello in the stringout record, this is what gets output:
> 
> epics> 2010/04/17 10:02:25.337 HM01 queueRequest synchronous
> 2010/04/17 10:02:25.337 HM01 mxDriver:write addr 0
> 2010/04/17 10:02:25.337 HM01 lockPort autoConnectOK 1
> 2010/04/17 10:02:25.337 HM01 flush
> drvMarx:mxFlush
> 2010/04/17 10:02:25.337 HM01 mxDriver:flush addr 0
> 2010/04/17 10:02:25.337 HM01 mxFlush
> 2010/04/17 10:02:25.337 asynOctetSyncIO flush
> 2010/04/17 10:02:25.337 HM01 unlockPort
> 2010/04/17 10:02:25.337 HM01 write
> Hello
> 2010/04/17 10:02:25.337 HM01:SI:READ:IT devAsynOctet: writeIt
> Hello
> 2010/04/17 10:02:25.337 HM01 mxDriver:read addr 0
> 
> mxRead:before:readRawOnce: data=,nbts=0,oemReason=0x0
> 
> 2010/04/17 10:02:30.338 asynOctetSyncIO readRaw failed 134.79.64.51:9999 UDP timeout: Resource temporarily unavailable
> 
> mxRead:after:readRawOnce: data=HELLO,nbts=5,oemReason=0x0
> 
> 2010/04/17 10:02:30.338 mxRead nbytesTransfered 5
> 2010/04/17 10:02:30.338 HM01:SI:READ:IT devAsynOctet: readIt failed
> 
> Note that some of the output is generated by printf statements I put in the code.
> Also note that readRawOnce returns the correct value, which means that it received the data from the python script and yet it failed.
> Here is the st.cmd file:
> 
> #!../../bin/linux-x86/marx
> 
> < envPaths
> 
> cd ${TOP}
> 
> dbLoadDatabase("dbd/marx.dbd")
> marx_registerRecordDeviceDriver(pdbbase)
> 
> drvAsynIPPortConfigure("HMx01","134.79.64.51:9999 UDP",0,0,0)
> 
> mxDriverInit("HM01",0,0,0,"HMx01")
> 
> dbLoadRecords("db/marx.db","P=HM01")
> 
> cd ${TOP}/iocBoot/${IOC}
> 
> asynSetTraceMask("HM01",0,0xff)
> asynSetTraceIOMask("HM01",0,0x2)
> 
> iocInit()
> 
> ## Start any sequence programs
> #seq sncExample,"user=whitegrHost"
> 
> The big question is why is readRawOnce timing out?
> 
> Is there a document describing how to write a device specific asyn device driver?  I see examples in the asyn distribution, like the echoDriver.c, but I find it very difficult to decipher those examples.  Therefore I am stumbling around, much of the time not knowing what is the correct approach.
> 
> Thanks in advance,
> Zen
> 
> 
> 
> 
> 

-- 
Eric Norum
[email protected]






References:
asyn Driver questions Szalata, Zenon M.
RE: asyn Driver questions Mark Rivers
RE: asyn Driver questions Szalata, Zenon M.
Re: asyn Driver questions Eric Norum

Navigate by Date:
Prev: Re: asyn Driver questions Eric Norum
Next: synApps 5.5 Tim Mooney
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  <20102011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: asyn Driver questions Eric Norum
Next: synApps 5.5 Tim Mooney
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  <20102011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
ANJ, 02 Sep 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·