Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  <20062007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  <20062007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
<== Date ==> <== Thread ==>

Subject: Re: Sequencer embedded C code question
From: "Jiro Fujita" <jiro.fujita@gmail.com>
To: tech-talk@aps.anl.gov, jemian@anl.gov
Date: Thu, 29 Jun 2006 18:07:45 -0400
You are correct.
However, this is so, because I had to copy/paste in segments, and I
missed one line, that contains "}%".
So, the escaped C block is something like this:

%{
when()
{
  rob=&roba; /*i dont know how to do this & wont work w/ roba as just rob*/
  v=rob[0];                /*Get first char from string*/
  wa1=strpbrk(rob, "+-");  /*Break string at +-,rest is wa1*/
  z=(float)wa1;            /*convert string to float z*/
}%


On 6/29/06, Pete Jemian <jemian@aps.anl.gov> wrote:

Something is not right with the fragment you sent. You start an escaped C block with "%{" but that block is never closed. So, the SNL compiler passes the rest of the code to the C compiler which does not have a definition for roba.

Try something like this:

ss string_handler {
  state stateN {
    when () {
      /* rob_pj is the string received from the device:  "1+32.23" or
"2-50.01" */
      sscanf(rob_pj, "%d%f", &chanNum, &value);
      if ( (1 <= chanNum) && (chanNum <= 5) ) {
        channel[chanNum-1] = value;
        pvPut(channel[chanNum-1]);
      }
    } state stateN
  }
}


Pete


Jiro Fujita wrote:
> Eric,
> Here is what the code looks like right now:
>
> program snchygrometer
>
> %%#include <ctype.h>
> %%#include <stdlib.h>
> %%#include <stdio.h>
>
>  %%char rob[10] ;
>  char *roba;
>  assign roba to "rawdata" ;
>  monitor roba ;
>  float ch1 ;
>  float ch2 ;
>  float ch3 ;
>  float ch4 ;
>  float ch5 ;
>  assign ch1 to "PV1";
>  assign ch2 to "PV2";
>  assign ch3 to "PV3";
>  assign ch4 to "PV4";
>  assign ch5 to "PV5";
>
>   %%int v ;
>   %%int z ;
>   %%extern char *wa1 ;
>   %%char *sign="+-" ;
>
> %{
> when()
> {
>   rob=&roba; /*i dont know how to do this & wont work w/ roba as just
> rob*/
>   v=rob[0];                /*Get first char from string*/
>   wa1=strpbrk(rob, "+-");  /*Break string at +-,rest is wa1*/
>   z=(float)wa1;            /*convert string to float z*/
>
> ss ss1 {
>   state state1 {
>      when (    v==1) {
>          ch1 = z; pvPut(ch1);
>      } state state2
>   }
>   state state2 {
>      when (    v==2) {
>          ch2 = z; pvPut(ch2);
>      } state state3
>   }
>   state state3 {
>      when (    v==3) {
>          ch3 = z; pvPut(ch3);
>      } state state4
>   }
>   state state4 {
>      when (    v==4) {
>          ch4 = z; pvPut(ch4);
>      } state state5
>   }
>   state state5 {
>      when (    v==5) {
>          ch5 = z; pvPut(ch5);
>      } state state1
>   }
> }
>
>
> (This is the entire code).
> and here is the error we are getting:
>
> make[3]: Entering directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src/O.linux-x86'
> /usr/bin/gcc -c   -D_POSIX_C_SOURCE=199506L -D_POSIX_THREADS
> -D_XOPEN_SOURCE=500        -D_X86_  -DUNIX  -D_BSD_SOURCE -Dlinux
> -D_REENTRANT -ansi  -O3  -Wall          -g  -I. -I..
> -I../../../include/os/Linux -I../../../include
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/../modules/soft/seq-2.0.11/include/os/Linux
>
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/../modules/soft/seq-2.0.11/include
>
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/include/os/Linux
> -I/home/sysuser/epics3.14.8.2/base-3.14.8.2/include
> -I/home/sysuser/epics3.14.8.2/modules/soft/asyn/4-6/include/os/Linux
> -I/home/sysuser/epics3.14.8.2/modules/soft/asyn/4-6/include
> sncProgram.c
> ../sncExample.stt:35: warning: return type defaults to `int'
> ../sncExample.stt: In function `when':
> ../sncExample.stt:36: `roba' undeclared (first use in this function)
> ../sncExample.stt:36: (Each undeclared identifier is reported only once
> ../sncExample.stt:36: for each function it appears in.)
> ../sncExample.stt:39: pointer value used where a floating point value
> was expected
> make[3]: *** [sncProgram.o] Error 1
> make[3]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src/O.linux-x86'
> make[2]: *** [install.linux-x86] Error 2
> make[2]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp/src'
> make[1]: *** [src.install] Error 2
> make[1]: Leaving directory
> `/home/sysuser/epics3.14.8.2/hygrometerApp/hygrometerApp'
> make: *** [hygrometerApp.install] Error 2
>
> What we are wondering is, why does it think rob is defaulting to int,
> when we are setting it as char??  Obviously, there is something wrong
> with array vs pointer (this is what I have been telling to my
> students), but this seems to compile without any issues outside of
> EPICS (well, the original ones we started out did, anyway).
>
> On 6/29/06, Eric Norum <norume@aps.anl.gov> wrote:
>>
>> I'm not sure what you have changed, but the code you posted
>> originally seems
>> to be mixing up the notion of "array of characters" and "pointer to
>> character".  See my comment below:
>>
>> program snchygrometer
>>
>> %%#include <ctype.h>
>> %%#include <stdlib.h>
>> %%#include <stdio.h>
>>
>>   %%char rob[10] ;
>>   char *roba;
>>   assign roba to "rawdata" ;
>>   monitor roba ;
>>   float ch1 ;
>>   float ch2 ;
>>   float ch3 ;
>>   float ch4 ;
>>   float ch5 ;
>>   assign ch1 to "PV1";
>>   assign ch2 to "PV2";
>>   assign ch3 to "PV3";
>>   assign ch4 to "PV4";
>>   assign ch5 to "PV5";
>>
>>   int v ;
>>   float z ;
>>   %%extern char *wa1 ;
>>   %%char *sign="+-" ;
>>
>> %{
>>   rob=&roba                 <<<<<<<<<<<<< EVEN WITH A SEMICOLON AT
>> THE  END
>> THIS LINE MAKES NO SENSE.
>>   v=rob[0];                 /*Get first char from string*/
>>   wa1=strpbrk(rob, "+-");   /*Break string at +-,rest is wa1*/
>>   z=(float)wa1;             /*convert string to float z*/
>>  }%
>>
>>
>>
>> Perhaps you could mail me your latest code??
>>
>>
>> --
>> Eric Norum <norume@aps.anl.gov>
>> Advanced Photon Source
>> Argonne National Laboratory
>> (630) 252-4793
>>
>>

--

----------------------------------------------------------
  Pete R. Jemian, Ph.D.                <jemian@anl.gov>
  Beam line Controls and Data Acquisition, Group Leader
  Advanced Photon Source,   Argonne National Laboratory
  Argonne, IL  60439                   630 - 252 - 3189
-----------------------------------------------------------
      Education is the one thing for which people
         are willing to pay yet not receive.
-----------------------------------------------------------




References:
Re: Sequencer embedded C code question Jiro Fujita
RE: Sequencer embedded C code question Laznovsky, Michael
Re: Sequencer embedded C code question Jiro Fujita
Re: Sequencer embedded C code question Eric Norum
Re: Sequencer embedded C code question Jiro Fujita
Re: Sequencer embedded C code question Pete Jemian

Navigate by Date:
Prev: Re: Sequencer embedded C code question Eric Norum
Next: Re: Sequencer embedded C code question Pete Jemian
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  <20062007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
Navigate by Thread:
Prev: Re: Sequencer embedded C code question Pete Jemian
Next: Re: Sequencer embedded C code question Pete Jemian
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  <20062007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
ANJ, 02 Sep 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·