|
|
|
|
@@ -14,41 +14,29 @@ record(bo, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
|
|
|
|
|
field(OMSL, "supervisory")
|
|
|
|
|
field(ZNAM, "Closed")
|
|
|
|
|
field(ONAM, "Open")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "NICOS can't write to PROC field")
|
|
|
|
|
field(DOL0, 1)
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):RESETTER.PROC")
|
|
|
|
|
field(SELM, "All")
|
|
|
|
|
field(PINI, "NO")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(bo, "$(INSTR)$(SPS_REGISTER_NAME):RESETTER")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "PV For Resetting internal state")
|
|
|
|
|
field(DOL, 0)
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(bo, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
|
|
|
|
|
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Trigger Internal Busy Status")
|
|
|
|
|
field(VAL, 1)
|
|
|
|
|
# This determines the number of max retry ticks
|
|
|
|
|
field(VAL, 5)
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):CLEAR-CONTROL PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
|
|
|
|
|
# Reset status
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Trigger Returned to Ready Status")
|
|
|
|
|
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
|
|
|
|
|
field(DO1, 0)
|
|
|
|
|
field(SELM, "Specified")
|
|
|
|
|
field(SELL, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS.VAL")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):INTERNAL-STATUS PP")
|
|
|
|
|
field(DESC, "Try to reset status")
|
|
|
|
|
# Set the shutter setpoint to same as readback
|
|
|
|
|
# in case they are out of sync, i.e. retry error.
|
|
|
|
|
field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP")
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER NPP")
|
|
|
|
|
field(DOL1, 0)
|
|
|
|
|
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
|
|
|
|
|
field(SELM, "All")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
@@ -59,44 +47,73 @@ record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
field(ONAM, "Busy")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# The Exposed SPS Interface has an open register and a close register. You need
|
|
|
|
|
# to write 1 to the corresponding register to perform said action and make sure
|
|
|
|
|
# that the other bit is set back to 0. These two records, in combination with
|
|
|
|
|
# "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER", first clear both control bits and
|
|
|
|
|
# then maps the binay 0/1 to writing a 1 to the required register.
|
|
|
|
|
record(dfanout, "$(INSTR)$(SPS_REGISTER_NAME):CLEAR-CONTROL")
|
|
|
|
|
{
|
|
|
|
|
field(DOL, 0)
|
|
|
|
|
field(OUTA, "$(INSTR)$(SPS_REGISTER_NAME):CLOSE-SHUTTER PP")
|
|
|
|
|
field(OUTB, "$(INSTR)$(SPS_REGISTER_NAME):OPEN-SHUTTER PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-DELAY PP")
|
|
|
|
|
field(SELM, "All")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-DELAY")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Delays Internal Trigger as SPS too slow")
|
|
|
|
|
field(DOL0, 1)
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL.PROC PP")
|
|
|
|
|
field(DLY0, 0.5)
|
|
|
|
|
field(SELM, "All")
|
|
|
|
|
field(PINI, "NO")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL")
|
|
|
|
|
{
|
|
|
|
|
field(SELM, "Specified")
|
|
|
|
|
field(SELL, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER.VAL NPP")
|
|
|
|
|
field(DO0, 1)
|
|
|
|
|
field(DO1, 1)
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):CLOSE-SHUTTER PP")
|
|
|
|
|
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):OPEN-SHUTTER PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS.PROC PP")
|
|
|
|
|
field(DO0, 0x02)
|
|
|
|
|
field(DO1, 0x01)
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-TRIGGER PP")
|
|
|
|
|
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-TRIGGER PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# This is a hack, the SPS sometimes doesn't registers the open/close
|
|
|
|
|
# command.
|
|
|
|
|
#
|
|
|
|
|
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY")
|
|
|
|
|
{
|
|
|
|
|
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
|
|
|
|
|
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):OPEN")
|
|
|
|
|
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
|
|
|
|
|
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
|
|
|
|
|
field(CALC, "A#B&&C#0&&D=0&&E=0?1:0")
|
|
|
|
|
field(DOPT, "Use CALC")
|
|
|
|
|
field(OOPT, "When Non-zero")
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL.PROC PP")
|
|
|
|
|
field(SCAN, "1 second")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK")
|
|
|
|
|
{
|
|
|
|
|
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
field(CALC, "A")
|
|
|
|
|
field(OOPT, "When Non-zero")
|
|
|
|
|
field(DOPT, "Use OCAL")
|
|
|
|
|
field(OCAL, "A-1")
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):DELAY-RETRY-ERROR")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Delay check for retry error, not this happens after each retry.
|
|
|
|
|
# But we gate the retry error wih checking if busy is 0
|
|
|
|
|
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):DELAY-RETRY-ERROR")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Delays checking if retry error occurred")
|
|
|
|
|
field(DOL0, 1)
|
|
|
|
|
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR.PROC PP")
|
|
|
|
|
field(DLY0, 0.5)
|
|
|
|
|
field(SELM, "All")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR")
|
|
|
|
|
{
|
|
|
|
|
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
|
|
|
|
|
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):OPEN")
|
|
|
|
|
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
|
|
|
|
|
field(CALC, "A#B&&C=0&&D=0?1:0")
|
|
|
|
|
field(OOPT, "When Non-zero")
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS PP")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# We can't just compare the Write and Readback values, as the readback
|
|
|
|
|
# seems to change instantly, and doesn't wait for the shutter to
|
|
|
|
|
# actually be open.
|
|
|
|
|
# This record has a FLNK from MOVES bit, processing it when all
|
|
|
|
|
# Status bits are freshly arrived.
|
|
|
|
|
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Maps Status Variables to singular status")
|
|
|
|
|
@@ -108,24 +125,15 @@ record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
|
|
|
|
|
field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):MOVES NPP")
|
|
|
|
|
field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
|
|
|
|
|
field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
|
|
|
|
|
field(CALC, "(G=0||H=0||E=0||B=0)?3:(A=0||D=0)?2:(F=1)?1:C=0?3:0")
|
|
|
|
|
field(SCAN, ".1 second")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY PP")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):INTERNAL-STATUS")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Maps Status Variables to singular status")
|
|
|
|
|
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS NPP")
|
|
|
|
|
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
|
|
|
|
|
field(CALC, "( A<2 && B=1 ) ? 1 : A")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
|
|
|
|
|
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
|
|
|
|
|
field(CALC, "(G=0||H=0||E=0||B=0||I=1)?3:(A=0||D=0)?2:(F=1)?1:C=0?3:0")
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(mbbi, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Status of Shutter")
|
|
|
|
|
field(INP, "$(INSTR)$(SPS_REGISTER_NAME):INTERNAL-STATUS NPP")
|
|
|
|
|
field(INP, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS NPP")
|
|
|
|
|
field(ZRVL, "0")
|
|
|
|
|
field(ZRST, "Okay")
|
|
|
|
|
field(ONVL, "1")
|
|
|
|
|
@@ -151,6 +159,12 @@ record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Connection-Msg")
|
|
|
|
|
field(VAL, "Connection to SPS Disrupted")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Shutter max retries failed message")
|
|
|
|
|
field(VAL, "Failure while retrying to change state")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
|
|
|
|
|
{
|
|
|
|
|
field(DESC, "Status Message")
|
|
|
|
|
@@ -164,6 +178,7 @@ record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
|
|
|
|
|
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
|
|
|
|
|
field(INPJ, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
|
|
|
|
|
field(INPK, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
|
|
|
|
|
field(INPL, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
|
|
|
|
|
field(INAA, "$(INSTR)$(SPS_REGISTER_NAME):OPEN-Msg NPP")
|
|
|
|
|
field(INBB, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-Msg NPP")
|
|
|
|
|
field(INCC, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY-Msg NPP")
|
|
|
|
|
@@ -173,5 +188,19 @@ record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
|
|
|
|
|
field(INGG, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK-Msg NPP")
|
|
|
|
|
field(INHH, "$(INSTR)$(SPS_REGISTER_NAME):MOTION-Msg NPP")
|
|
|
|
|
field(INII, "$(INSTR)$(SPS_REGISTER_NAME):Connection-Msg NPP")
|
|
|
|
|
field(CALC, '(I=0||J=0)?II:(H=1||K=1)?HH:G=0?DD:D=0?(EE+": "+FF):F=0?GG:C=0?CC:E=0?BB:AA')
|
|
|
|
|
field(INJJ, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg NPP")
|
|
|
|
|
field(CALC, 'I=0||J=0?II:H=1||K=1?HH:G=0?DD:D=0?(EE+": "+FF):F=0?GG:L=1?JJ:C=0?CC:E=0?BB:AA')
|
|
|
|
|
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
|
|
|
|
|
{
|
|
|
|
|
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
|
|
|
|
|
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
|
|
|
|
|
field(CALC, "A&&B")
|
|
|
|
|
field(OOPT, "Transition To Non-zero")
|
|
|
|
|
field(DOPT, "Use OCAL")
|
|
|
|
|
field(OCAL, "0")
|
|
|
|
|
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
I think this should be