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 2021 <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 2020 2021 <2022> 2023 2024 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Re: Implementing transform field |
From: | "Mooney, Tim M. via Tech-talk" <tech-talk at aps.anl.gov> |
To: | "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov>, "Marco A. Barra Montevechi Filho" <marco.filho at lnls.br> |
Date: | Thu, 4 Aug 2022 14:29:17 +0000 |
Hi Marco,
I think you need to look at the transform record's COPT field. To serve the original purpose of the record, CLCA is not performed if A has changed since the last time the record was processed. The non-default behavior you want requires that you set COPT to
"Always"
Tim Mooney (mooney at anl.gov) (630)252-5417
Beamline Controls Group (www.aps.anl.gov) Advanced Photon Source, Argonne National Lab From: Tech-talk <tech-talk-bounces at aps.anl.gov> on behalf of Marco A. Barra Montevechi Filho via Tech-talk <tech-talk at aps.anl.gov>
Sent: Thursday, August 4, 2022 9:19 AM To: tech-talk at aps.anl.gov <tech-talk at aps.anl.gov> Subject: Implementing transform field
Good morning, all!
Im trying to implement the transform field in an IOC but im not getting the expected result:
i have an analog in record reading a bitmask value from a modbus register. Since the bitmask has 16 bits, i want to perform 16 bitwise operations to transform each bit in a
binary in record thus transforming each 0 or 1 into a different string.
Since i dont want to need to create 16 calcout records, i thought i could use the
transform record to perform all bitwise operations and push each one of them into a different
binary in record. So after reading the documentation i tried to perform a calculation with
transform just for testing:
record(ai,
"${BL}:${H}:${EQ}:BitmaskGetter")
{
field(DESC,
"Bitmask used by other pvs.")
field(DTYP,"asynInt32")
field(INP,"@asyn(SIP_EMODBUS_1_1_Rd_Status,0,1000)MODBUS_DATA")
field(SCAN, "I/O Intr")
field(FLNK,
"${BL}:${H}:${EQ}:StatusSeparator")
}
record(transform,
"${BL}:${H}:${EQ}:StatusSeparator"){
field(DESC,
"PV to process status bitmask")
field(INPA,
"${BL}:${H}:${EQ}:StatusBitmask")
field(CLCA,
"A+1")
field(OUTA,
"${BL}:${H}:${EQ}:EnableStatus")
field(SCAN,
"Passive")
}
record(bi,
"${BL}:${H}:${EQ}:EnableStatus"){
field(DESC,
"Power supply status")
field(ZNAM,
"Stopped")
field(ONAM,
"Started")
}
So i expected that while caget in BitmaskGetter returns 0, caget into StatusSeparator.A would return 1 and EnableStatus would return "Started". It is not what happens: StatusSeparator returns 0 and EnableStatus returns "Stopped".
To test if the calculation is right, i tried substituting the transform record to a
calc one:
record(ai,
"${BL}:${H}:${EQ}:BitmaskGetter")
{
field(DESC,
"Bitmask used by other pvs.")
field(DTYP,"asynInt32")
field(INP,"@asyn(SIP_EMODBUS_1_1_Rd_Status,0,1000)MODBUS_DATA")
field(SCAN, "I/O Intr")
field(FLNK,
"test_calc")
}
record(calcout,
"${BL}:${H}:${EQ}:StatusSeparator""){
field(DESC,
"PV to process status bitmask")
field(INPA,
"${BL}:${H}:${EQ}:StatusBitmask")
field(CALC,
"A+1")
field(OUT,
"${BL}:${H}:${EQ}:EnableStatus")
}
record(bi,
"${BL}:${H}:${EQ}:EnableStatus"){
And now caget into StatusSeparator returns 1, StatusSeparator.A returns 0, BitmaskGetter returns 0 and EnableStatus returns "Started", as expected. field(DESC,
"Power supply status")
field(ZNAM,
"Stopped")
field(ONAM,
"Started")
}
So i figure field OUTA from the transform record pushes the value in field A (which is zero) to the EnableStatus link. If this is the case, is there any way at all to push the result from CLCA to the EnableStatus link? Also,in which field is the
result from CLCA field stored, if any?
Thanks in advance, Marco Aviso Legal: Esta mensagem e seus anexos podem conter informações confidenciais e/ou de uso restrito. Observe atentamente seu conteúdo e considere eventual consulta ao remetente antes de copiá-la, divulgá-la ou distribuí-la. Se você recebeu esta mensagem por engano, por favor avise o remetente e apague-a imediatamente. Disclaimer: This email and its attachments may contain confidential and/or privileged information. Observe its content carefully and consider possible querying to the sender before copying, disclosing or distributing it. If you have received this email by mistake, please notify the sender and delete it immediately. |