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  <20202021  2022  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  <20202021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: Record for a running sum
From: Donny Domagoj Cosic via Tech-talk <[email protected]>
To: "Hu, Yong" <[email protected]>
Cc: [email protected]
Date: Tue, 14 Jan 2020 13:13:19 +0100
Hi Yong,

Thank you for the help. I did mean "value" and not "values" so your solution works great. Also thank you for letting me know about the Circular Buffer record. The biggest challenge for me at the moment is just getting my head around all the record types that exist and how to set the various fields properly.

I tried your solution and it is exactly how I wanted it to work. However I am having another problem with the processing of my DosagePV (the actual value, not the simulated). I set the SCAN field to "I/O Intr" but it is being processed only on a value change. So if the value received from the stream is constant, the record does not get processed. Is there a way to change this?, because I need to know the period between values to integrate the dose accurately.

Additionally, also on the topic of record processing. I tired to save the last value of the Dosage:1h by using a similar method to yours with the timestamp as follows:

record(calcout, "Dosage:1h-ResetVal_"){
    field(INPA, "TimeStamp CP")
    field(INPA, "Dosage:1h")
    field(CALC, "0")
    field(OUT,  "PreviousDosage:1h PP")
}

However the record is not processed after the TimeStamp record is processed. Only if i remove the the original reset record:

record(calcout, "Dosage:1h-Reset_"){
    field(INPA, "TimeStamp CP")
    field(CALC, "0")
    field(OUT,  "Dosage:1h PP")
}

will my second reset record be processed. Why is this?

Thank you again for your help.

Regards,
Donny

---
Donny Domagoj Cosic
 Institut Ruđer Bošković, Bijenička cesta 54, 10000 Zagreb, Croatia

Dana 21.12.2019 05:39, Hu, Yong je napisao(la):
Hi Donny,

Firstly welcome to the EPICS community! You did very well in just one
month.

Yes, you are in the right direction. See below highlighted: just one
small change and two more records that save "Dosage:1h" value to
“PreviousDosage:1h” before every reset. Again, the example below
only shows “reset every minute”.

You said “…that saves the "Dosage:1h" values before every
reset”. If you really mean “values” instead of “value”, then
you need another compress record with field(ALG," Circular Buffer ")
and field(INP," PreviousDosage:1h CP"). See
https://wiki-ext.aps.anl.gov/epics/index.php/RRM_3-14 [1] to find out
more details on calcout, compress, etc.

record(calc, "DosagePV") {

 field(INPA, "DosagePV")

 field(SCAN, "1 second")

 field(CALC, "A+1")

 field(FLNK, "TimeStamp")

}

record(stringin, "TimeStamp")

{

 field(DTYP, "Soft Timestamp")

 field(PINI,"YES")

 #field(INP, "@%b %d, %Y %H:%M:%S.%03f")

 field(INP, "@%M")

}

record(calcout, "Dosage:1h-Reset_")

{

 field(INPA, "TimeStamp CP")

 field(CALC, "0")

 field(OUT, "Dosage:1h PP")

}

record(calcout, "Dosage:1h-Calc_")

{

 field(INPA, "Dosage:1h")

 field(INPB, "DosagePV CP")

 field(CALC, "A+B")

 field(OUT, "Dosage:1h PP")

}

record(ai, "Dosage:1h")

{

 field(PREC, "3")

 field(EGU, "blabla")

 field(PINI,"YES")

 info(autosaveFields_pass0, "VAL")

 field(FLNK,"PreviousDosage:1h-Calc_")

}

record(calcout, "PreviousDosage:1h-Calc_")

{

 field(INPA,"Dosage:1h-Calc_")

 field(INPB,"Dosage:1h")

 field(CALC,"B")

 field(OOPT,"Transition To Zero" )

 field(DOPT,"Use OCAL")

 field(OCAL,"A")

 field(OUT, "PreviousDosage:1h PP")

}

record(ai, "PreviousDosage:1h")

{

 field(PREC, "3")

 field(EGU, "blabla")

 field(PINI,"YES")

 info(autosaveFields_pass0, "VAL")

}

On 12/11/19, 3:41 AM, "Donny Domagoj Cosic"
<[email protected]> wrote:

 Hi Yong,

 Thank you very much for the detailed response. I follow your logic
and

 it seems like a good solution. All the solution that I came up with
were

 a lot more complicated so I really enjoy the simplicity of this

 solution. The only thing that I had to add to your solution is a new

 record that saves the "Dosage:1h" values before every reset. However

 with my limited knowledge of EPICS (I just started working with EPICS
a

 month ago) I dont think i did it properly. I created a new calc
record

 that looks for the reset and forwards the old Dosage:1h value. Im
sure

 there is a better way to do this maybe using the OOPT field, however
I

 was not able to get it to work properly. Am I thinking about this in
the

 right way?

 Regards,

 Donny

 ---

 Donny Domagoj Cosic

 Institut Ruđer Bošković, Bijenička cesta 54, 10000 Zagreb,
Croatia

 Dana 05.12.2019 22:14, Hu, Yong je napisao(la):

 > Hi Donny,

 >

 > I did similar applications at NSLS-II: calculate hourly, daily,

 > monthly, yearly cumulative beam current in the Storage Ring.

 >

 > Here is one example to test the cumulative dosage in one minute:

 > "DosagePV" is a simulated PV; "Dosage:1h" is the cumulative dosage;


 > Whenever one minute passes, the value of “TimeStamp” (@%M) will


 > change and "Dosage:1h-Reset_" will set "Dosage:1h" to 0.

 >

 > To calculate hourly, daily, monthly, yearly dosage, simply change
%M

 > in field(INP, "@%M") to %H, %d, %b, %Y.

 >

 > To preserve the cumulative dosage, you should use EPICS AutoSave

 > (info(autosaveFields_pass0, "VAL")). Otherwise, the value will be 0


 > after your IOC is rebooted.

 >

 > record(calc, "DosagePV") {

 >

 > field(INPA, "DosagePV")

 >

 > field(SCAN, "1 second")

 >

 > field(CALC, "A+1")

 >

 > field(FLNK, "TimeStamp")

 >

 > }

 >

 > record(stringin, "TimeStamp")

 >

 > {

 >

 > field(DTYP, "Soft Timestamp")

 >

 > field(PINI,"YES")

 >

 > #field(INP, "@%b %d, %Y %H:%M:%S.%03f")

 >

 > field(INP, "@%M")

 >

 > }

 >

 > record(calcout, "Dosage:1h-Reset_")

 >

 > {

 >

 > field(INPA, "TimeStamp CP")

 >

 > field(CALC, "0")

 >

 > field(OUT, "Dosage:1h PP")

 >

 > }

 >

 > record(calcout, "Dosage:1h-Calc_")

 >

 > {

 >

 > field(INPA, "Dosage:1h")

 >

 > field(INPB, "DosagePV CP")

 >

 > field(CALC, "A+B")

 >

 > field(OUT, "Dosage:1h PP")

 >

 > }

 >

 > record(ai, "Dosage:1h")

 >

 > {

 >

 > field(PREC, "3")

 >

 > field(EGU, "blabla")

 >

 > field(PINI,"YES")

 >

 > info(autosaveFields_pass0, "VAL")

 >

 > }

 >

 > There are other ways to calculate the cumulative dosage: use
compress

 > record.

 >

 > I prefer the first approach above. The approach below works only if


 > “DosagePV” updates at a regular rate (i.e. 1Hz).

 >

 > record(compress,"Dosage:1h-Com_")

 >

 > {

 >

 > field(INP,"DosagePV CP")

 >

 > field(ALG,"N to 1 Average")

 >

 > field(NSAM,"1")

 >

 > field(N,"3600")

 >

 > field(PREC,"3")

 >

 > field(FLNK,"Dosage:1h_")

 >

 > }

 >

 > record(calc, "Dosage:1h_")

 >

 > {

 >

 > field(INPA, "Dosage:1h-Com_")

 >

 > field(CALC, "3600*A")

 >

 > field(PREC, "3")

 >

 > }

 >

 > HTH,

 >

 > Yong Hu

 >

 > NSLS-II Controls Group

 >

 > FROM: Tech-talk <[email protected]> on behalf of

 > "[email protected]" <[email protected]>

 > ORGANIZATION: Institut Ruđer Bošković

 > REPLY-TO: Donny Domagoj Cosic <[email protected]>

 > DATE: Thursday, December 5, 2019 at 9:20 AM

 > TO: "[email protected]" <[email protected]>

 > SUBJECT: Record for a running sum

 >

 > Hello,

 >

 > I developed an IOC for the radiation monitors found throughout our

 >

 > laboratory. Through this IOC I am able to read in the values of
each

 >

 > probe and display them nicely using CS-Studio. However I would like
to

 >

 >

 > add the ability to the IOC to keep a running sum so I can calculate


 > the

 >

 > cumulative monthly and yearly doses throughout the laboratory but I
am

 >

 >

 > not sure how to implement this. I tried searching for similar
projects

 >

 >

 > of examples, but without any luck. Would you be able to provide me

 > with

 >

 > some pointers onto how to implement such a feature?

 >

 > Regards,

 >

 > Donny

 >

 > --

 >

 > Donny Domagoj Cosic

 >

 > Institut Ruđer Bošković, Bijenička cesta 54, 10000 Zagreb,

 > Croatia



Links:
------
[1] https://wiki-ext.aps.anl.gov/epics/index.php/RRM_3-14

Navigate by Date:
Prev: RE: Killing caRepeater on Windows 10 Freddie Akeroyd - UKRI STFC via Tech-talk
Next: Re: Killing caRepeater on Windows 10 Mark Rivers 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  <20202021  2022  2023  2024 
Navigate by Thread:
Prev: Re: [EXTERNAL] Re: CA_DISABLE_REPEATER Re: Killing caRepeater on Windows 10 Kasemir, Kay via Tech-talk
Next: ci-scripts 2.1.0 available 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  <20202021  2022  2023  2024 
ANJ, 14 Jan 2020 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·