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  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  <20212022  2023  2024  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  <20212022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Recommendations for StreamDevice "architecture" flow
From: "Wang, Andrew via Tech-talk" <tech-talk at aps.anl.gov>
To: EPICS tech-talk <tech-talk at aps.anl.gov>
Date: Wed, 5 May 2021 16:37:49 +0000

All,

 

I would like to get an opinion from you all about whether these “architectures” are appropriate for StreamDevice. I’ve been looking at some posts on Tech-Talk about the general use for StreamDevice, specifically when there are multiple commands. Suppose I need to implement EPICS drivers for an instrument that has two commands: cmd1, cmd2, and cmd3. Here are some “architectures” I’ve tried and used:

 

  1. “Processing chain” method

 

record(ao, “cmd_1_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd1 $(PORT)”)

              field(FLNK, “cmd_1_get”)

}

 

record(ao, “cmd_2_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd2 $(PORT)”)

              field(FLNK, “cmd_2_get”)

}

 

record(ao, “cmd_3_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd3 $(PORT)”)

              field(FLNK, “cmd_3_get”)

}

 

record(ai, “cmd_1_get”)

{

              field(SCAN, “1 second”)

              field(INP, “@instrument.proto getCmd1 $(PORT)”)

              field(FLNK, “cmd_2_get”)

}

 

record(ai, “cmd_2_get”)

{

              field(SCAN, “Passive”)

              field(INP, “@instrument.proto getCmd2 $(PORT)”)

              field(FLNK, “cmd_3_get”)

}

 

record(ai, “cmd_3_get”)

{

              field(SCAN, “Passive”)

              field(INP, “@instrument.proto getCmd3 $(PORT)”)

}

 

 

 

  1. Fanout method

 

record(fanout, “slow_scan”)

{

              field(SCAN, “1 second”)

              field(LNK0, “cmd_1_get”)

              field(LNK1, “cmd_2_get”)

              field(LNK2, “cmd_3_get”)

}

 

record(ao, “cmd_1_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd1 $(PORT)”)

              field(FLNK, “cmd_1_get”)

}

 

record(ao, “cmd_2_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd2 $(PORT)”)

              field(FLNK, “cmd_2_get”)

}

 

record(ao, “cmd_3_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd3 $(PORT)”)

              field(FLNK, “cmd_3_get”)

}

 

record(ai, “cmd_1_get”)

{

              field(SCAN, “Passive”)

              field(INP, “@instrument.proto getCmd1 $(PORT)”)

}

 

record(ai, “cmd_2_get”)

{

              field(SCAN, “Passive”)

              field(INP, “@instrument.proto getCmd2 $(PORT)”)

}

 

record(ai, “cmd_3_get”)

{

              field(SCAN, “Passive”)

              field(INP, “@instrument.proto getCmd3 $(PORT)”)

}

 

 

 

  1. Record scan method

 

record(ao, “cmd_1_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd1 $(PORT)”)

}

 

record(ao, “cmd_2_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd2 $(PORT)”)

}

 

record(ao, “cmd_3_set”)

{

              field(SCAN, “Passive”)

              field(DTYP, “stream”)

              field(OUT, “@instrument.proto setCmd3 $(PORT)”)

}

 

record(ai, “cmd_1_get”)

{

              field(SCAN, “1 second”)

              field(INP, “@instrument.proto getCmd1 $(PORT)”)

}

 

record(ai, “cmd_2_get”)

{

              field(SCAN, “1 second”)

              field(INP, “@instrument.proto getCmd2 $(PORT)”)

}

 

record(ai, “cmd_3_get”)

{

              field(SCAN, “1 second”)

              field(INP, “@instrument.proto getCmd3 $(PORT)”)

}

 

 

Are all valid or is there one that is better than the other. Or is there an even better one that I haven’t thought of…

 

Thanks,

Andy


Replies:
Re: Recommendations for StreamDevice "architecture" flow Ralph Lange via Tech-talk
RE: Recommendations for StreamDevice "architecture" flow Pearson, Matthew R. via Tech-talk

Navigate by Date:
Prev: Re: Where is the image data in PV ArrayData of areaDetector Plugin NDPluginStdArrays? Mark Rivers via Tech-talk
Next: Re: Recommendations for StreamDevice "architecture" flow Ralph Lange via Tech-talk
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  <20212022  2023  2024 
Navigate by Thread:
Prev: Re: Support for Stanford PTC10 Kevin Peterson via Tech-talk
Next: Re: Recommendations for StreamDevice "architecture" flow Ralph Lange via Tech-talk
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  <20212022  2023  2024 
ANJ, 18 May 2021 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·