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"
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"){
field(DESC,
"Power
supply status")
field(ZNAM,
"Stopped")
field(ONAM,
"Started")
}
And now caget into StatusSeparator returns 1,
StatusSeparator.A returns 0, BitmaskGetter returns 0 and
EnableStatus returns "Started", as expected.
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.