g+
g+ Communities
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  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014 
<== Date ==> <== Thread ==>

Subject: RE: SNL with C
From: Mark Rivers <rivers@cars.uchicago.edu>
To: Pierrick Hanlet <hanlet@fnal.gov>, "Zelazny, Michael Stanley" <zelazny@slac.stanford.edu>
Cc: "tech-talk@aps.anl.gov" <tech-talk@aps.anl.gov>
Date: Thu, 20 Dec 2012 03:23:23 +0000
It needs to be outside the block.  All C functions need to be escaped with a single block of %{ }%, as in the example below from one of my SNL programs.

Note that it is usually a good idea to build the program with the +r option so that multiple instances of the SNL program can be run:

/* This program must be compiled with the recursive option */
option +r;

In that case if your C code uses variables from the SNL code it needs to reference them with the pVar structure pointer, also shown below.


/*  C functions  */
%{

/* getMotorPositions returns the positions of each motor.
 * It reads the positions from the controller, and then converts to
 * EPICS motor user coordinates */
static int getMotorPositions(SS_ID ssId, struct UserVar *pVar, double *pos)
{
    int status;
    int j;
    int dir;

    /* Read the current positions of all the axes */

    status = GroupPositionCurrentGet(pVar->positionSocket,
                                     pVar->groupName,pVar->numAxes,pos);
    if (status != 0)
        printMessage("Error performing GroupPositionCurrentGet%i\n", status);
    /* Convert from XPS units (which are EPICS motor dial units) to user units */
    for (j=0; j<pVar->numAxes; j++) {
        if (pVar->epicsMotorDir[j] == 0) dir=1; else dir=-1;
        pos[j] = pos[j]*dir + pVar->epicsMotorOff[j];
    }

    return(status);
}


...

static void printMessage(const char *pformat, ...)
{
    va_list pvar;
    FILE     *fp = stdout;
    epicsTimeStamp now;
    char nowText[40];

    epicsTimeGetCurrent(&now);
    nowText[0] = 0;
    epicsTimeToStrftime(nowText,sizeof(nowText),
         "%Y/%m/%d %H:%M:%S.%03f",&now);
    fprintf(fp,"%s ",nowText);
    va_start(pvar, pformat);
    vfprintf(fp,pformat,pvar);
    va_end(pvar);
    fflush(fp);
}

}%


Cheers,
Mark


________________________________
From: tech-talk-bounces@aps.anl.gov [tech-talk-bounces@aps.anl.gov] on behalf of Pierrick Hanlet [hanlet@fnal.gov]
Sent: Wednesday, December 19, 2012 6:37 PM
To: Zelazny, Michael Stanley
Cc: tech-talk@aps.anl.gov
Subject: Re: SNL with C

Great!  Thank you and Mark.

Another question: if I want to write a C function, I understand that it needs to be
after the last SNL statement.  Does it belong outside of the ss SS1 {} block, or
is it after the last statement within the block.  Is it true that this code would
also need to be escaped %{ short myFunc() {} }%?
Best regards,
Pierrick


On 12/19/2012 06:11 PM, Zelazny, Michael Stanley wrote:

try putting your statement in an "entry" block.  And, as Mark says, the "%%" probably isn't necessary.

ss SS1 {

  state Offline {
    /* Get PV relevent PV information */
    when (SS1mon == 1) {
      SS1state = 1;
      pvPut(SS1state);
    } state Pumping
  }

  state Pumping {
    /* Get PV relevent PV information */
    entry {
    %%if (StateReadCDB()) printf("SS1-Pumping: success\");
    }
    when (SS1vac <= 1.0e-4) {
      SS1state = 2;
      pvPut(SS1state);
    } state Pumped_Warm
  }
... continued
}
________________________________________
From: tech-talk-bounces@aps.anl.gov<mailto:tech-talk-bounces@aps.anl.gov> [tech-talk-bounces@aps.anl.gov<mailto:tech-talk-bounces@aps.anl.gov>] On Behalf Of Pierrick M Hanlet [hanlet@fnal.gov<mailto:hanlet@fnal.gov>]
Sent: Wednesday, December 19, 2012 3:59 PM
To: tech-talk@aps.anl.gov<mailto:tech-talk@aps.anl.gov>
Subject: SNL with C

Hi,
I a newcomer to SNL.

I have a library to which I link my snl.  In a global entrance block, I can successfully call
one of the functions.  Later I added the use of another function in a state set and now
I can no longer compile.

ss SS1 {

  state Offline {
    /* Get PV relevent PV information */
    when (SS1mon == 1) {
      SS1state = 1;
      pvPut(SS1state);
    } state Pumping
  }

  state Pumping {
    /* Get PV relevent PV information */
    %%if (StateReadCDB()) printf("SS1-Pumping: success\");
    when (SS1vac <= 1.0e-4) {
      SS1state = 2;
      pvPut(SS1state);
    } state Pumped_Warm
  }
... continued
}


The error at compilation/linking is:
converting ../sncMICEStates.stt
/home/epics/epics/Support/seq/bin/linux-x86/snc +r   ../sncMICEStates.stt -o sncMICEStates.c.tmp
syntax error: line no. 96 (../sncMICEStates.stt)
     state option list
make[3]: *** [sncMICEStates.c] Error 1
make[3]: Leaving directory `/home/epics/epics/iocTops/MICEStates/MICEStatesApp/src/O.linux-x86'
make[2]: *** [install.linux-x86] Error 2
make[2]: Leaving directory `/home/epics/epics/iocTops/MICEStates/MICEStatesApp/src'
make[1]: *** [src.install] Error 2
make[1]: Leaving directory `/home/epics/epics/iocTops/MICEStates/MICEStatesApp'
make: *** [MICEStatesApp.install] Error 2

where line no. 96 is the escaped call to the library function in my Pumping state.  The error "state option list"
doesn't tell me anything.

Help please,
Pierrick



"Whether you think you can or think you can't, either way, you are correct"
-- Henry Ford

_________________________________________________________________________
Pierrick Hanlet
IIT/Fermilab
+1-630-697-8758 (FNAL)
+1-312-567-5745 (IIT)
+1-630-697-8758/+44-7-948-860-1978 (US/UK mobile)


--
"Whether you think you can or think you can't, either way, you are correct" -- Henry Ford
_______________________________________________________________
Pierrick Hanlet
IIT/Fermilab
+1-630-840-5555 (FNAL)
+1-312-567-5745 (IIT)
+1-630-697-8758/+44-79-48-860-197 (US/UK mobile)


Replies:
Re: SNL with C Benjamin Franksen
References:
SNL with C Pierrick M Hanlet
RE: SNL with C Zelazny, Michael Stanley
Re: SNL with C Pierrick Hanlet

Navigate by Date:
Prev: RE: SNL with C Zelazny, Michael Stanley
Next: Re: [makefile] adding a library to an EPICS application Martin Konrad
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014 
Navigate by Thread:
Prev: RE: structs and SNL Mark Rivers
Next: Re: SNL with C Benjamin Franksen
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014 
ANJ, 18 Nov 2013 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· EPICSv4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·