record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-INIT") { field(DESC, "Initialises SHUTTER PV") field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER NPP") field(DOL, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP") field(OMSL, "closed_loop") field(PINI, "YES") } record(bo, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER") { field(DESC, "Open or close the shutter") field(DTYP, "Soft Channel") field(OMSL, "supervisory") field(ZNAM, "Closed") field(ONAM, "Open") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY") } record(longout, "$(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):SHUTTER-CONTROL") } # Reset status record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET") { 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") { field(DESC, "Internal Busy State") field(VAL, 0) field(ZNAM, "Ready") field(ONAM, "Busy") } record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL") { field(SELM, "Specified") field(SELL, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER.VAL NPP") 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") field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY NPP") field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):NOT-LOCKED NPP") field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-OKAY NPP") field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK NPP") field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-OFF NPP") 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(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):SHUTTER-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 PP") } record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):MOTION-Msg") { field(DESC, "Shutter opening/closing message") field(VAL, "Shutter in motion") } record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Connection-Msg") { field(DESC, "Shutter connection disrupted message") 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") field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP") field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY NPP") field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):NOT-LOCKED NPP") field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-OKAY NPP") field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK NPP") field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-OFF NPP") field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):MOVES NPP") 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") field(INDD, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-Msg NPP") field(INEE, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-Msg NPP") field(INFF, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-REASON-Msg NPP") 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(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") }