block motors before triggering SPS and make sure unblocked, before returning to okay status
Test And Build / Build (push) Successful in 3s

This commit is contained in:
2026-05-19 11:19:35 +02:00
parent 42d8332ece
commit a31ec09407
+230 -222
View File
@@ -23,31 +23,56 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP")
# Reset status
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET")
{
field(DESC, "Try to reset status")
# Set the beamstop setpoint to same as readback
# in case they are out of sync, i.e. retry error.
field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(DOL1, 0)
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
field(SELM, "All")
field(DESC, "Try to reset status")
# Set the beamstop setpoint to same as readback
# in case they are out of sync, i.e. retry error.
field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(DOL1, 0)
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
field(SELM, "All")
}
record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
{
field(DESC, "Internal Busy State")
field(VAL, 0)
field(ZNAM, "Ready")
field(ONAM, "Busy")
field(DESC, "Internal Busy State")
field(VAL, 0)
field(ZNAM, "Ready")
field(ONAM, "Busy")
}
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
# Make sure to disable motors before actually triggering SPS so there can be no
# chance, that they switch to a busy state in Nicos before being disabled
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
{
field(DESC, "Trigger Internal Busy Status")
# 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):BEAMSTOP-OUT")
field(DESC, "Trigger Internal Busy Status")
field(SELM, "All")
# This determines the number of max retry ticks
field(DOL0, 5)
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):BSX-DISV PP")
field(LNK1, "$(BS_MCU):bsx.DISV PP")
field(DOL2, "$(INSTR)$(SPS_REGISTER_NAME):BSY-DISV PP")
field(LNK2, "$(BS_MCU):bsy.DISV PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT")
}
# Can be used to disable BSX and BSY during
# a beamstop change
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):BSX-DISV")
{
field(INPA, "$(BS_MCU):bsx.DISA NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
field(CALC, "(B=0)&&(C=0)?!A:A")
}
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):BSY-DISV")
{
field(INPA, "$(BS_MCU):bsy.DISA NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
field(CALC, "(B=0)&&(C=0)?!A:A")
}
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT")
@@ -84,25 +109,19 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER")
# This is a hack, the SPS sometimes doesn't registers the beamstop
# execute command.
#
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
# Can't trust the SPS
field(INPD, "$(BS_MCU):BS:TARGET_RANGE NPP")
field(CALC, "A#B&&C#0&&D=0?1:0")
# field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
# field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
# field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
# field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):IN-POSITION NPP")
# field(CALC, "A#B&&C#0&&D=0&&F=1&&E=0?1:0")
field(DOPT, "Use CALC")
field(OOPT, "When Non-zero")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT.PROC PP")
field(SCAN, "2 second")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
# Can't trust the SPS, so instead monitor the MCU state
field(INPD, "$(BS_MCU):BS:TARGET_RANGE NPP")
field(CALC, "A#B&&C#0&&D=0?1:0")
field(DOPT, "Use CALC")
field(OOPT, "When Non-zero")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT.PROC PP")
field(SCAN, "2 second")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING")
}
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING")
@@ -123,13 +142,13 @@ record(calc, "$(INSTR)$(SPS_REGISTER_NAME):MCU-CHANGING")
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
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")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
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.
@@ -145,96 +164,86 @@ record(seq, "$(INSTR)$(SPS_REGISTER_NAME):DELAY-RETRY-ERROR")
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING NPP")
field(CALC, "A#B&&C=0&&D=0?1:0")
#field(OOPT, "When Non-zero")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING NPP")
field(CALC, "A#B&&C=0&&D=0?1:0")
#field(OOPT, "When Non-zero")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS")
}
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS")
{
field(DESC, "Maps Status Variables to singular status")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SERVICE-MODE NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING NPP")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):ERROR NPP")
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):EXECUTE-POSSIBLE NPP")
field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(INPK, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(CALC, "(F=0||G=0||D=1||K=1)?3:(A=1)?2:(B=1||H#I)?1:0")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSX")
field(DESC, "Maps Status Variables to singular status")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SERVICE-MODE NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):SPS-CHANGING NPP")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):ERROR NPP")
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):EXECUTE-POSSIBLE NPP")
field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP")
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP")
field(INPK, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(CALC, "(F=0||G=0||D=1||K=1)?3:(A=1)?2:(B=1||H#I)?1:0")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):UNBLOCK-MOTORS")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSX")
# Make sure, that motors are re-enabled before the status
# of the changer returns to "Okay".
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):UNBLOCK-MOTORS")
{
field(DESC, "Disable BSX during change")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP")
field(INPB, "$(BS_MCU):bsx.DISA NPP")
field(CALC, "A=0?!B:B")
field(DOPT, "Use CALC")
field(OUT, "$(BS_MCU):bsx.DISV PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSY")
field(DESC, "Trigger Internal Busy Status")
field(SELM, "All")
field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):BSX-DISV PP")
field(LNK1, "$(BS_MCU):bsx.DISV PP")
field(DOL2, "$(INSTR)$(SPS_REGISTER_NAME):BSY-DISV PP")
field(LNK2, "$(BS_MCU):bsy.DISV PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSY")
{
field(DESC, "Disable BSY during change")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP")
field(INPB, "$(BS_MCU):bsy.DISA NPP")
field(CALC, "A=0?!B:B")
field(DOPT, "Use CALC")
field(OUT, "$(BS_MCU):bsy.DISV PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
}
record(mbbi, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
{
field(DESC, "Status of Shutter")
field(INP, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS NPP")
field(ZRVL, "0")
field(ZRST, "Okay")
field(ONVL, "1")
field(ONST, "Busy")
field(TWVL, "2")
field(TWST, "Warning")
field(THVL, "3")
field(THST, "Error")
field(FRST, "4")
field(FRST, "Unknown")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
field(DESC, "Status of Beamstop Changer")
field(INP, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS NPP")
field(ZRVL, "0")
field(ZRST, "Okay")
field(ONVL, "1")
field(ONST, "Busy")
field(TWVL, "2")
field(TWST, "Warning")
field(THVL, "3")
field(THST, "Error")
field(FRST, "4")
field(FRST, "Unknown")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
}
record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg")
{
field(DESC, "Beamstop max retries failed message")
field(VAL, "Failed trying to change beamstop")
field(DESC, "Beamstop max retries failed message")
field(VAL, "Failed trying to change beamstop")
}
record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
{
field(DESC, "Status Message")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(INAA, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg NPP")
field(INBB, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-REASON-Msg NPP")
field(CALC, 'A=1?AA:BB')
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
field(DESC, "Status Message")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(INAA, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg NPP")
field(INBB, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-REASON-Msg NPP")
field(CALC, 'A=1?AA:BB')
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):MCU-CHANGING NPP")
field(CALC, "A?B:0")
field(OOPT, "Transition To Non-zero")
field(DOPT, "Use OCAL")
field(OCAL, "0")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):MCU-CHANGING NPP")
field(CALC, "A?B:0")
field(OOPT, "Transition To Non-zero")
field(DOPT, "Use OCAL")
field(OCAL, "0")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
}
################################################################################
@@ -242,144 +251,143 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
################################################################################
record(longin, "$(BS_MCU):BS:X_0") {
field(DESC, "X-Position of Beamstop 0")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q453) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "X-Position of Beamstop 0")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q453) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(longin, "$(BS_MCU):BS:X_1") {
field(DESC, "X-Position of Beamstop 1")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q454) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "X-Position of Beamstop 1")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q454) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(longin, "$(BS_MCU):BS:X_2") {
field(DESC, "X-Position of Beamstop 2")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q455) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "X-Position of Beamstop 2")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q455) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(longin, "$(BS_MCU):BS:X_3") {
field(DESC, "X-Position of Beamstop 3")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q456) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "X-Position of Beamstop 3")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q456) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(longin, "$(BS_MCU):BS:Y_GET") {
field(DESC, "Y Position for picking up Beamstop")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q553) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "Y Position for picking up Beamstop")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q553) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(longin, "$(BS_MCU):BS:Y_PUT") {
field(DESC, "Y Position under beamstops")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q554) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
field(DESC, "Y Position under beamstops")
field(DTYP, "stream")
field(INP , "@$(PROTO) pmac_get(Q554) $(BS_MCU_ASYN_PORT) 0")
field(PINI, "YES")
}
record(calcout, "$(BS_MCU):BS:ST") {
field(DESC, "Monitors beamstop changing")
field(DTYP, "stream")
field(OUT , "@$(PROTO) st() $(BS_MCU_ASYN_PORT) 0")
field(CALC, "0")
field(SCAN, ".1 second")
field(FLNK, "$(BS_MCU):BS:ST_FANOUT.PROC")
field(DESC, "Monitors beamstop changing")
field(DTYP, "stream")
field(OUT , "@$(PROTO) st() $(BS_MCU_ASYN_PORT) 0")
field(CALC, "0")
field(SCAN, ".1 second")
field(FLNK, "$(BS_MCU):BS:ST_FANOUT1")
}
record(fanout, "$(BS_MCU):BS:ST_FANOUT1") {
field(LNK1, "$(BS_MCU):BS:TARGET")
field(LNK2, "$(BS_MCU):BS:TARGET_X")
field(LNK3, "$(BS_MCU):BS:TARGET_Y")
field(LNK5, "$(BS_MCU):BS:TARGET_BS_RAW")
field(LNK6, "$(BS_MCU):BS:TARGET_BS")
field(LNK7, "$(BS_MCU):BS:ST_FANOUT2")
field(SCAN, ".1 second")
field(LNK1, "$(BS_MCU):BS:TARGET")
field(LNK2, "$(BS_MCU):BS:TARGET_X")
field(LNK3, "$(BS_MCU):BS:TARGET_Y")
field(LNK5, "$(BS_MCU):BS:TARGET_BS_RAW")
field(LNK6, "$(BS_MCU):BS:TARGET_BS")
field(FLNK, "$(BS_MCU):BS:ST_FANOUT2")
}
record(fanout, "$(BS_MCU):BS:ST_FANOUT2") {
field(LNK1, "$(BS_MCU):BS:TARGET_RANGE_RAW")
field(LNK2, "$(BS_MCU):BS:TARGET_RANGE")
field(LNK3, "$(BS_MCU):BS:LOADED_RAW")
field(LNK4, "$(BS_MCU):BS:INVALID")
field(LNK1, "$(BS_MCU):BS:TARGET_RANGE_RAW")
field(LNK2, "$(BS_MCU):BS:TARGET_RANGE")
field(LNK3, "$(BS_MCU):BS:LOADED_RAW")
field(LNK4, "$(BS_MCU):BS:INVALID")
}
record(longin, "$(BS_MCU):BS:TARGET") {
field(DESC, "Beamstop position being driven to")
field(INP, "$(BS_MCU):BS:ST.A NPP MS")
field(DESC, "Beamstop position being driven to")
field(INP, "$(BS_MCU):BS:ST.A NPP MS")
}
record(ai, "$(BS_MCU):BS:TARGET_X") {
field(DESC, "X Position being driven to")
field(INP, "$(BS_MCU):BS:ST.B NPP MS")
record(ai, "$(BS_MCU):BS:TARGET_X") {
field(DESC, "X Position being driven to")
field(INP, "$(BS_MCU):BS:ST.B NPP MS")
}
record(ai, "$(BS_MCU):BS:TARGET_Y") {
field(DESC, "Y Position being driven to")
field(INP, "$(BS_MCU):BS:ST.C NPP MS")
record(ai, "$(BS_MCU):BS:TARGET_Y") {
field(DESC, "Y Position being driven to")
field(INP, "$(BS_MCU):BS:ST.C NPP MS")
}
record(calc, "$(BS_MCU):BS:TARGET_BS_RAW") {
field(DESC, "Beamstop == TARGET_X")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_X NPP MS")
# Static Inputs
field(INPI, "$(BS_MCU):BS:X_0 NPP MS")
field(INPJ, "$(BS_MCU):BS:X_1 NPP MS")
field(INPK, "$(BS_MCU):BS:X_2 NPP MS")
field(INPL, "$(BS_MCU):BS:X_3 NPP MS")
# Maybe having a tolerance isn't really necessary?
# they get set exactly to the value in the MCU
field(CALC, "ABS(A-I)<1?0:ABS(A-J)<1?1:ABS(A-K)<1?2:ABS(A-L)<1?3:4")
# field(CALC, "A=I?0:A=J?1:A=K?2:A=L?3:4")
field(DESC, "Beamstop == TARGET_X")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_X NPP MS")
# Static Inputs
field(INPI, "$(BS_MCU):BS:X_0 NPP MS")
field(INPJ, "$(BS_MCU):BS:X_1 NPP MS")
field(INPK, "$(BS_MCU):BS:X_2 NPP MS")
field(INPL, "$(BS_MCU):BS:X_3 NPP MS")
# Maybe having a tolerance isn't really necessary?
# they get set exactly to the value in the MCU
field(CALC, "ABS(A-I)<1?0:ABS(A-J)<1?1:ABS(A-K)<1?2:ABS(A-L)<1?3:4")
# field(CALC, "A=I?0:A=J?1:A=K?2:A=L?3:4")
}
record(mbbi, "$(BS_MCU):BS:TARGET_BS") {
field(DESC, "Target Beamstop Holder")
field(DTYP, "Soft Channel")
field(INP, "$(BS_MCU):BS:TARGET_BS_RAW NPP MS")
field(ZRST, "No Beamstop")
field(ONST, "Beamstop 1")
field(TWST, "Beamstop 2")
field(THST, "Beamstop 3")
field(FRST, "User Mode")
field(DESC, "Target Beamstop Holder")
field(DTYP, "Soft Channel")
field(INP, "$(BS_MCU):BS:TARGET_BS_RAW NPP MS")
field(ZRST, "No Beamstop")
field(ONST, "Beamstop 1")
field(TWST, "Beamstop 2")
field(THST, "Beamstop 3")
field(FRST, "User Mode")
}
record(calc, "$(BS_MCU):BS:TARGET_RANGE_RAW") {
field(DESC, "Beamstop target y-range")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_Y NPP MS")
# Static Inputs
field(INPK, "$(BS_MCU):BS:Y_GET NPP MS")
field(INPL, "$(BS_MCU):BS:Y_PUT NPP MS")
# Maybe having a tolerance isn't really necessary?
# they get set exactly to the value in the MCU
field(CALC, "ABS(A-K)<1?1:ABS(A-L)<1?2:0")
field(DESC, "Beamstop target y-range")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_Y NPP MS")
# Static Inputs
field(INPK, "$(BS_MCU):BS:Y_GET NPP MS")
field(INPL, "$(BS_MCU):BS:Y_PUT NPP MS")
# Maybe having a tolerance isn't really necessary?
# they get set exactly to the value in the MCU
field(CALC, "ABS(A-K)<1?1:ABS(A-L)<1?2:0")
}
record(mbbi, "$(BS_MCU):BS:TARGET_RANGE") {
field(DESC, "Beamstop target y-range")
field(DTYP, "Soft Channel")
field(INP, "$(BS_MCU):BS:TARGET_RANGE_RAW NPP MS")
field(ZRST, "User Mode")
field(ONST, "Level with Beamstops")
field(TWST, "Under Beamstops")
field(DESC, "Beamstop target y-range")
field(DTYP, "Soft Channel")
field(INP, "$(BS_MCU):BS:TARGET_RANGE_RAW NPP MS")
field(ZRST, "User Mode")
field(ONST, "Level with Beamstops")
field(TWST, "Under Beamstops")
}
record(calcout, "$(BS_MCU):BS:LOADED_RAW")
{
field(INPA, "$(BS_MCU):BS:TARGET_BS NPP MS")
field(INPB, "$(BS_MCU):BS:TARGET_RANGE NPP MS")
field(CALC, "B=2")
field(OOPT, "Transition To Zero")
field(DOPT, "Use OCAL")
field(OCAL, "A")
field(OUT, "$(BS_MCU):BS:LOADED PP")
field(INPA, "$(BS_MCU):BS:TARGET_BS NPP MS")
field(INPB, "$(BS_MCU):BS:TARGET_RANGE NPP MS")
field(CALC, "B=2")
field(OOPT, "Transition To Zero")
field(DOPT, "Use OCAL")
field(OCAL, "A")
field(OUT, "$(BS_MCU):BS:LOADED PP")
}
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):LOADED-INIT")
@@ -393,34 +401,34 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):LOADED-INIT")
record(mbbi, "$(BS_MCU):BS:LOADED")
{
field(DESC, "Most recently lifted beamstop")
field(ZRST, "No Beamstop")
field(ONST, "Beamstop 1")
field(TWST, "Beamstop 2")
field(THST, "Beamstop 3")
field(DESC, "Most recently lifted beamstop")
field(ZRST, "No Beamstop")
field(ONST, "Beamstop 1")
field(TWST, "Beamstop 2")
field(THST, "Beamstop 3")
}
record(calcout, "$(BS_MCU):BS:INVALID") {
field(DESC, "Invalid Move STOP MOTORS!")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_BS NPP MS")
field(INPB, "$(BS_MCU):BS:TARGET_RANGE NPP MS")
field(INPC, "$(BS_MCU):BS:LOADED NPP MS")
field(CALC, "(A<4) && (B=1) && (A#C)")
field(OOPT, "Transition To Non-zero")
field(OUT, "$(BS_MCU):BS:IMMEDIATE_STOP.PROC PP")
field(DESC, "Invalid Move STOP MOTORS!")
# Dynamic Inputs
field(INPA, "$(BS_MCU):BS:TARGET_BS NPP MS")
field(INPB, "$(BS_MCU):BS:TARGET_RANGE NPP MS")
field(INPC, "$(BS_MCU):BS:LOADED NPP MS")
field(CALC, "(A<4) && (B=1) && (A#C)")
field(OOPT, "Transition To Non-zero")
field(OUT, "$(BS_MCU):BS:IMMEDIATE_STOP.PROC PP")
}
record(longout, "$(BS_MCU):BS:IMMEDIATE_STOP") {
field(DESC, "Invalid Move STOP MOTORS!")
# For Test
# field(OUT, "TEST_RECORD PP")
# field(OMSL, "closed_loop")
# field(DOL, "1")
# TODO not currently activated
# FOR REAL
# field(DTYP, "stream")
# field(OUT , "@$(PROTO) stop() $(BS_MCU_ASYN_PORT) 0")
field(DESC, "Invalid Move STOP MOTORS!")
# For Test
# field(OUT, "TEST_RECORD PP")
# field(OMSL, "closed_loop")
# field(DOL, "1")
# TODO not currently activated
# FOR REAL
# field(DTYP, "stream")
# field(OUT , "@$(PROTO) stop() $(BS_MCU_ASYN_PORT) 0")
}
# record(longin, "TEST_RECORD") {