From c1504819682edfca0385a1d917539508ac3afe7f Mon Sep 17 00:00:00 2001 From: soederqvist_a Date: Wed, 8 Apr 2026 16:04:43 +0200 Subject: [PATCH 1/8] Improvements to shutter Based on work with NEUTRA N-Shutter or experiment shutter. --- db/readbit.db | 1 + db/shutter.db | 121 ++++++++++++++++---------------- scripts/shutter.cmd | 4 +- templates/shutter.substitutions | 33 +++++---- 4 files changed, 83 insertions(+), 76 deletions(-) diff --git a/db/readbit.db b/db/readbit.db index c69cc0b..35176bc 100644 --- a/db/readbit.db +++ b/db/readbit.db @@ -7,4 +7,5 @@ record(bi,"$(INSTR)$(SPS_REGISTER_NAME):$(BIT_NAME)") field(SCAN, "I/O Intr") field(ZNAM, "$(ZNAM=0)") field(ONAM, "$(ONAM=1)") + field(FLNK, "$(FLNK=)") } diff --git a/db/shutter.db b/db/shutter.db index 65df2bf..d0c5733 100644 --- a/db/shutter.db +++ b/db/shutter.db @@ -14,9 +14,19 @@ 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(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") +} + + record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET") { field(DESC, "NICOS can't write to PROC field") @@ -30,25 +40,7 @@ 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") -{ - field(DESC, "Trigger Internal Busy Status") - field(VAL, 1) - field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):CLEAR-CONTROL PP") -} - -record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") -{ - 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(OUT, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP") } record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") @@ -59,44 +51,49 @@ 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(CALC, "A#B&&C#0&&D=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") } # 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") @@ -109,23 +106,13 @@ record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS") 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(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") @@ -174,4 +161,16 @@ record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg") 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(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") } + +record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") +{ + field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):MOVES") + field(CALC, "A") + field(OOPT, "Transition To Zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") +} + diff --git a/scripts/shutter.cmd b/scripts/shutter.cmd index be826d2..b09fa2e 100644 --- a/scripts/shutter.cmd +++ b/scripts/shutter.cmd @@ -23,13 +23,13 @@ $(SET_SIM_MODE=#) $(SET_SIM_MODE) system "$(sinqSPS_DIR)shutter_sim.py $(FETCH_P $(SET_SIM_MODE=#) $(SET_SIM_MODE) sleep 3 -s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FETCH_DB),0,$(SPS_FETCH_SIZE)", "$(WRITE_PORT=2001),1,$(WRITE_DB=$(FETCH_DB)),0,$(SPS_WRITE_SIZE)", "$(SPS_ENDIANNESS=1)", "$(SPS_RECEIVE_TIMEOUT=1000)", "$(SPS_RECEIVE_DELAY=200)", "0") +s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FETCH_DB),0,$(SPS_FETCH_SIZE)", "$(WRITE_PORT=2001),1,$(WRITE_DB=$(FETCH_DB)),0,$(SPS_WRITE_SIZE)", "$(SPS_ENDIANNESS=1)", "$(SPS_RECEIVE_TIMEOUT=1000)", "$(SPS_RECEIVE_DELAY=600)", "0", 1) # Provides Connection Status PVs dbLoadRecords("$(sinqSPS_DB)/sps_status.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") # Shutter PVs -dbLoadTemplate("$(sinqSPS_DB)/shutter.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") +dbLoadTemplate("$(sinqSPS_DB)/shutter.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME), STATUS_FLNK=$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS") # Additional Mapping PVs dbLoadRecords("$(sinqSPS_DB)/shutter.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") diff --git a/templates/shutter.substitutions b/templates/shutter.substitutions index 62e4ab9..519de98 100644 --- a/templates/shutter.substitutions +++ b/templates/shutter.substitutions @@ -1,23 +1,30 @@ -file "$(sinqSPS_DB)/writebit.db" +#file "$(sinqSPS_DB)/writebit.db" +#{ +# pattern +# {OFFSET, BIT, BIT_NAME , DESC } +# {0 , 0 , "OPEN-SHUTTER" , "Opens the Shutter" } +# {0 , 1 , "CLOSE-SHUTTER", "Closes the Shutter"} +#} + +file "$(sinqSPS_DB)/writeusint.db" { pattern - {OFFSET, BIT, BIT_NAME , DESC } - {0 , 0 , "OPEN-SHUTTER" , "Opens the Shutter" } - {0 , 1 , "CLOSE-SHUTTER", "Closes the Shutter"} + {OFFSET, UINT_NAME, DESC } + {0 , "SHUTTER-TRIGGER" , "Trigger Shutter" } } file "$(sinqSPS_DB)/readbit.db" { pattern - {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC} - {1 , 0 , "PSYS-OK" , "" , "" , "" } - {1 , 1 , "SHUTTER-READY" , "No" , "Yes" , "" } - {1 , 2 , "EMERGENCY-STOP-OFF", "" , "" , "" } - {1 , 3 , "NOT-LOCKED" , "" , "" , "" } - {1 , 4 , "CLOSED" , "Open" , "Closed" , "" } - {1 , 5 , "OPEN" , "Closed" , "Open" , "" } - {1 , 6 , "REMOTE-OKAY" , "" , "" , "" } - {1 , 7 , "MOVES" , "Stationary" , "Moving" , "" } + {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC, FLNK} + {1 , 0 , "PSYS-OK" , "" , "" , "", ""} + {1 , 1 , "SHUTTER-READY" , "No" , "Yes" , "", ""} + {1 , 2 , "EMERGENCY-STOP-OFF", "" , "" , "", ""} + {1 , 3 , "NOT-LOCKED" , "" , "" , "", ""} + {1 , 4 , "CLOSED" , "Open" , "Closed" , "", ""} + {1 , 5 , "OPEN" , "Closed" , "Open" , "", ""} + {1 , 6 , "REMOTE-OKAY" , "" , "" , "", ""} + {1 , 7 , "MOVES" , "Stationary" , "Moving" , "", "$(STATUS_FLNK)"} } # The way that the strings are currently implemented in the SPS, the first two -- 2.52.0 From d6a500f18b59babd0a59e30b943581609683623f Mon Sep 17 00:00:00 2001 From: soederqvist_a Date: Thu, 9 Apr 2026 10:13:14 +0200 Subject: [PATCH 2/8] Add error for retries, don't retry unless status is ok --- db/shutter.db | 59 +++++++++++++++++++++++++++++++++------------ scripts/shutter.cmd | 2 +- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/db/shutter.db b/db/shutter.db index d0c5733..d63eb4d 100644 --- a/db/shutter.db +++ b/db/shutter.db @@ -26,21 +26,17 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL") } - +# Reset status 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(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") - 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):STATUS PP") } record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") @@ -71,7 +67,8 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY") 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(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") @@ -87,6 +84,29 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK") 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 @@ -105,7 +125,8 @@ 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(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") } @@ -138,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") @@ -151,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") @@ -160,7 +188,8 @@ 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") } diff --git a/scripts/shutter.cmd b/scripts/shutter.cmd index b09fa2e..ecb135a 100644 --- a/scripts/shutter.cmd +++ b/scripts/shutter.cmd @@ -23,7 +23,7 @@ $(SET_SIM_MODE=#) $(SET_SIM_MODE) system "$(sinqSPS_DIR)shutter_sim.py $(FETCH_P $(SET_SIM_MODE=#) $(SET_SIM_MODE) sleep 3 -s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FETCH_DB),0,$(SPS_FETCH_SIZE)", "$(WRITE_PORT=2001),1,$(WRITE_DB=$(FETCH_DB)),0,$(SPS_WRITE_SIZE)", "$(SPS_ENDIANNESS=1)", "$(SPS_RECEIVE_TIMEOUT=1000)", "$(SPS_RECEIVE_DELAY=600)", "0", 1) +s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FETCH_DB),0,$(SPS_FETCH_SIZE)", "$(WRITE_PORT=2001),1,$(WRITE_DB=$(FETCH_DB)),0,$(SPS_WRITE_SIZE)", "$(SPS_ENDIANNESS=1)", "$(SPS_RECEIVE_TIMEOUT=1000)", "$(SPS_RECEIVE_DELAY=200)", "0") # Provides Connection Status PVs dbLoadRecords("$(sinqSPS_DB)/sps_status.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") -- 2.52.0 From 4f76abd8e758419a44e66efe10a6622ef140cd3c Mon Sep 17 00:00:00 2001 From: soederqvist_a Date: Fri, 10 Apr 2026 10:22:15 +0200 Subject: [PATCH 3/8] Shutter: Move status FLNK to last strin msg --- db/readstring.db | 1 + templates/shutter.substitutions | 26 +++++++++----------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/db/readstring.db b/db/readstring.db index f625d33..c35e420 100644 --- a/db/readstring.db +++ b/db/readstring.db @@ -4,4 +4,5 @@ record(stringin, "$(INSTR)$(SPS_REGISTER_NAME):$(STRING_NAME)-Msg") field(INP, "@$(SPS_REGISTER_NAME)/$(OFFSET) L=$(LENGTH)") field(PINI, "YES") field(SCAN, "I/O Intr") + field(FLNK, "$(FLNK=)") } diff --git a/templates/shutter.substitutions b/templates/shutter.substitutions index 519de98..aea7575 100644 --- a/templates/shutter.substitutions +++ b/templates/shutter.substitutions @@ -1,11 +1,3 @@ -#file "$(sinqSPS_DB)/writebit.db" -#{ -# pattern -# {OFFSET, BIT, BIT_NAME , DESC } -# {0 , 0 , "OPEN-SHUTTER" , "Opens the Shutter" } -# {0 , 1 , "CLOSE-SHUTTER", "Closes the Shutter"} -#} - file "$(sinqSPS_DB)/writeusint.db" { pattern @@ -24,7 +16,7 @@ file "$(sinqSPS_DB)/readbit.db" {1 , 4 , "CLOSED" , "Open" , "Closed" , "", ""} {1 , 5 , "OPEN" , "Closed" , "Open" , "", ""} {1 , 6 , "REMOTE-OKAY" , "" , "" , "", ""} - {1 , 7 , "MOVES" , "Stationary" , "Moving" , "", "$(STATUS_FLNK)"} + {1 , 7 , "MOVES" , "Stationary" , "Moving" , "", ""} } # The way that the strings are currently implemented in the SPS, the first two @@ -34,12 +26,12 @@ file "$(sinqSPS_DB)/readbit.db" file "$(sinqSPS_DB)/readstring.db" { pattern - {OFFSET, LENGTH, STRING_NAME } - {4 , 14 , "PSYS-OK" } - {20 , 17 , "SHUTTER-READY" } - {40 , 17 , "EMERGENCY-STOP" } - {60 , 19 , "BLOCKED" } - {82 , 24 , "BLOCKED-REASON" } - {108 , 14 , "OPEN" } - {124 , 27 , "REMOTE" } + {OFFSET, LENGTH, STRING_NAME FLNK} + {4 , 14 , "PSYS-OK", ""} + {20 , 17 , "SHUTTER-READY", ""} + {40 , 17 , "EMERGENCY-STOP", ""} + {60 , 19 , "BLOCKED", ""} + {82 , 24 , "BLOCKED-REASON", ""} + {108 , 14 , "OPEN", ""} + {124 , 27 , "REMOTE", "$(STATUS_FLNK)"} } -- 2.52.0 From a360d7fe1732e877563381d761d50c1c2e94f2c5 Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Thu, 9 Apr 2026 16:08:14 +0200 Subject: [PATCH 4/8] adds a similar retry mechanism as was implemented with the shutter --- db/readusint.db | 1 + db/sans_llb_beamstop.db | 114 +++++++++++++++++++++- db/shutter.db | 1 - scripts/sans_llb_beamstop.cmd | 2 +- templates/sans_llb_beamstop.substitutions | 16 +-- 5 files changed, 121 insertions(+), 13 deletions(-) diff --git a/db/readusint.db b/db/readusint.db index d088264..3b1b374 100644 --- a/db/readusint.db +++ b/db/readusint.db @@ -5,4 +5,5 @@ record(longin, "$(INSTR)$(SPS_REGISTER_NAME):$(UINT_NAME)") field(INP, "@$(SPS_REGISTER_NAME)/$(OFFSET) T=BYTE") field(PINI, "YES") field(SCAN, "I/O Intr") + field(FLNK, "$(FLNK=)") } diff --git a/db/sans_llb_beamstop.db b/db/sans_llb_beamstop.db index 39011e3..29f09c0 100644 --- a/db/sans_llb_beamstop.db +++ b/db/sans_llb_beamstop.db @@ -1,8 +1,8 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-INIT") { field(DESC, "Initialises BEAMSTOP PV") - field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP") field(DOL, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP") + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP") field(OMSL, "closed_loop") field(PINI, "YES") } @@ -22,12 +22,42 @@ record(seq, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY") { field(DESC, "Delays Internal Trigger as SPS too slow") field(DOL0, 1) - field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER PP") + field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY.PROC PP") field(DLY0, 0.5) field(SELM, "All") field(PINI, "NO") } +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):TRIGGER") +} + +# 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") +} + +record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") +{ + field(DESC, "Internal Busy State") + field(VAL, 0) + field(ZNAM, "Ready") + field(ONAM, "Busy") +} + record(longout, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER") { field(DESC, "Internal Trigger") @@ -38,6 +68,57 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS PP") } +# 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") + field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV") + 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):TRIGGER.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):BEAMSTOP") + field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV") + 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):MAP-STATUS PP") +} + record(calc, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS") { field(DESC, "Maps Status Variables to singular status") @@ -51,7 +132,6 @@ record(calc, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS") field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP") field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP_RBV NPP") field(CALC, "(F=0||G=0||D=1)?3:(A=1)?2:(C=1||H#I)?1:(B=0)?3:0") - field(SCAN, ".1 second") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP") } @@ -69,4 +149,32 @@ record(mbbi, "$(INSTR)$(SPS_REGISTER_NAME):STATUS") 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") +} + +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") +} + +record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") +{ + field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):MOVES") + field(CALC, "A") + field(OOPT, "Transition To Zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") +} + diff --git a/db/shutter.db b/db/shutter.db index d63eb4d..e8c02a7 100644 --- a/db/shutter.db +++ b/db/shutter.db @@ -202,4 +202,3 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") field(OCAL, "0") field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") } - diff --git a/scripts/sans_llb_beamstop.cmd b/scripts/sans_llb_beamstop.cmd index 42159de..0fb9b03 100644 --- a/scripts/sans_llb_beamstop.cmd +++ b/scripts/sans_llb_beamstop.cmd @@ -19,7 +19,7 @@ s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FE dbLoadRecords("$(sinqSPS_DB)/sps_status.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") # Shutter PVs -dbLoadTemplate("$(sinqSPS_DB)/sans_llb_beamstop.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") +dbLoadTemplate("$(sinqSPS_DB)/sans_llb_beamstop.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME), STATUS_FLNK=$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS") # Additional Mapping PVs dbLoadRecords("$(sinqSPS_DB)/sans_llb_beamstop.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") diff --git a/templates/sans_llb_beamstop.substitutions b/templates/sans_llb_beamstop.substitutions index 4a6c16c..ddb5cb3 100644 --- a/templates/sans_llb_beamstop.substitutions +++ b/templates/sans_llb_beamstop.substitutions @@ -23,17 +23,17 @@ file "$(sinqSPS_DB)/readusint.db" file "$(sinqSPS_DB)/readbit.db" { pattern - {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC} - {6 , 0 , "SERVICE-MODE" , "disabled", "enabled", "" } - {6 , 1 , "IN-POSITION" , "no" , "yes" , "" } - {6 , 2 , "MOVES" , "no" , "yes" , "" } - {6 , 3 , "ERROR" , "no" , "yes" , "" } - {6 , 4 , "EXECUTE-POSSIBLE" , "no" , "yes" , "" } + {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC, FLNK } + {6 , 0 , "SERVICE-MODE" , "disabled", "enabled", "" , "" } + {6 , 1 , "IN-POSITION" , "no" , "yes" , "" , "" } + {6 , 2 , "MOVES" , "no" , "yes" , "" , "" } + {6 , 3 , "ERROR" , "no" , "yes" , "" , "" } + {6 , 4 , "EXECUTE-POSSIBLE" , "no" , "yes" , "" , "$(STATUS_FLNK)"} } file "$(sinqSPS_DB)/readstring.db" { pattern - {OFFSET, LENGTH, STRING_NAME } - {8 , 30 , "BLOCKED-REASON" } + {OFFSET, LENGTH, STRING_NAME , FLNK } + {8 , 30 , "BLOCKED-REASON", "$(STATUS_FLNK)"} } -- 2.52.0 From d8464021745fb759584502b375896737d12b8563 Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Fri, 10 Apr 2026 08:22:47 +0200 Subject: [PATCH 5/8] disables the bsx and bsy motors when the beamstop isn't in an okay state --- db/sans_llb_beamstop.db | 26 ++++++++++++++++++++++---- scripts/sans_llb_beamstop.cmd | 4 +++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/db/sans_llb_beamstop.db b/db/sans_llb_beamstop.db index 29f09c0..a2eda5a 100644 --- a/db/sans_llb_beamstop.db +++ b/db/sans_llb_beamstop.db @@ -22,7 +22,7 @@ record(seq, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY") { field(DESC, "Delays Internal Trigger as SPS too slow") field(DOL0, 1) - field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY.PROC PP") + field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY.PROC PP") field(DLY0, 0.5) field(SELM, "All") field(PINI, "NO") @@ -32,8 +32,8 @@ 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(VAL, 5) + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER") } @@ -103,7 +103,7 @@ 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(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR.PROC PP") field(DLY0, 0.5) field(SELM, "All") } @@ -176,5 +176,23 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") field(DOPT, "Use OCAL") field(OCAL, "0") field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS") } +record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS") +{ + field(DESC, "Whether to block bsx and bsy") + field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP") + field(CALC, "A=0?0:1") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK PP") +} + +record(seq, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK") +{ + field(DESC, "Block moving bsx and bsy") + field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS NPP") + field(LNK0, "$(BSX_MOT).DISV PP") + field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS NPP") + field(LNK1, "$(BSY_MOT).DISV PP") + field(SELM, "All") +} diff --git a/scripts/sans_llb_beamstop.cmd b/scripts/sans_llb_beamstop.cmd index 0fb9b03..d3728de 100644 --- a/scripts/sans_llb_beamstop.cmd +++ b/scripts/sans_llb_beamstop.cmd @@ -9,6 +9,8 @@ # # out IO Interrupt Delay (if 0 then only reacts on a change) # ) +# Expects as an argument, the PV's for the motors bsx and bsy. + epicsEnvSet("SPS_REGISTER_NAME", "SPS-BEAMSTOP") epicsEnvSet("SPS_FETCH_SIZE", "40") epicsEnvSet("SPS_WRITE_SIZE", "2") @@ -22,4 +24,4 @@ dbLoadRecords("$(sinqSPS_DB)/sps_status.db", "INSTR=$(INSTR), SPS_REGISTER_NAME= dbLoadTemplate("$(sinqSPS_DB)/sans_llb_beamstop.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME), STATUS_FLNK=$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS") # Additional Mapping PVs -dbLoadRecords("$(sinqSPS_DB)/sans_llb_beamstop.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)") +dbLoadRecords("$(sinqSPS_DB)/sans_llb_beamstop.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME), BSX_MOT=$(BSX_MOT), BSY_MOT=$(BSY_MOT)") -- 2.52.0 From 6541ef13cb1f165560bffd61b0505971c8617e7c Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Fri, 10 Apr 2026 10:13:22 +0200 Subject: [PATCH 6/8] set DISV to ~DISA --- db/sans_llb_beamstop.db | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/db/sans_llb_beamstop.db b/db/sans_llb_beamstop.db index a2eda5a..ffa39cd 100644 --- a/db/sans_llb_beamstop.db +++ b/db/sans_llb_beamstop.db @@ -179,20 +179,30 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS") } -record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS") +record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX") { field(DESC, "Whether to block bsx and bsy") field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP") - field(CALC, "A=0?0:1") + field(INPB, "$(BSX_MOT).DISA NPP") + field(CALC, "A=0?!B:B") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY PP") +} + +record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY") +{ + field(DESC, "Whether to block bsx and bsy") + field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP") + field(INPB, "$(BSY_MOT).DISA NPP") + field(CALC, "A=0?!B:B") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK PP") } record(seq, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK") { field(DESC, "Block moving bsx and bsy") - field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS NPP") + field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX NPP") field(LNK0, "$(BSX_MOT).DISV PP") - field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS NPP") + field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY NPP") field(LNK1, "$(BSY_MOT).DISV PP") field(SELM, "All") } -- 2.52.0 From 171ee7227e18cf754c0f74c2795645e62d3964dd Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Fri, 10 Apr 2026 13:59:54 +0200 Subject: [PATCH 7/8] correct set-ready logic --- db/sans_llb_beamstop.db | 12 +++++++----- templates/sans_llb_beamstop.substitutions | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/db/sans_llb_beamstop.db b/db/sans_llb_beamstop.db index ffa39cd..1cf4bbb 100644 --- a/db/sans_llb_beamstop.db +++ b/db/sans_llb_beamstop.db @@ -88,7 +88,7 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY") record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK") { - field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") + field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP") field(CALC, "A") field(OOPT, "When Non-zero") field(DOPT, "Use OCAL") @@ -131,7 +131,8 @@ record(calc, "$(INSTR)$(SPS_REGISTER_NAME):MAP-STATUS") 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(CALC, "(F=0||G=0||D=1)?3:(A=1)?2:(C=1||H#I)?1:(B=0)?3:0") + field(INPK, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP") + field(CALC, "(F=0||G=0||D=1||K=1)?3:(A=1)?2:(C=1||H#I)?1:(B=0)?3:0") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP") } @@ -171,12 +172,13 @@ record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg") record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") { field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):MOVES") - field(CALC, "A") - field(OOPT, "Transition To Zero") + field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") + field(CALC, "B?A:0") + field(OOPT, "Transition To Non-zero") field(DOPT, "Use OCAL") field(OCAL, "0") field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-MOTORS") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX") } record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX") diff --git a/templates/sans_llb_beamstop.substitutions b/templates/sans_llb_beamstop.substitutions index ddb5cb3..539b130 100644 --- a/templates/sans_llb_beamstop.substitutions +++ b/templates/sans_llb_beamstop.substitutions @@ -23,12 +23,12 @@ file "$(sinqSPS_DB)/readusint.db" file "$(sinqSPS_DB)/readbit.db" { pattern - {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC, FLNK } - {6 , 0 , "SERVICE-MODE" , "disabled", "enabled", "" , "" } - {6 , 1 , "IN-POSITION" , "no" , "yes" , "" , "" } - {6 , 2 , "MOVES" , "no" , "yes" , "" , "" } - {6 , 3 , "ERROR" , "no" , "yes" , "" , "" } - {6 , 4 , "EXECUTE-POSSIBLE" , "no" , "yes" , "" , "$(STATUS_FLNK)"} + {OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC} + {6 , 0 , "SERVICE-MODE" , "disabled", "enabled", "" } + {6 , 1 , "IN-POSITION" , "no" , "yes" , "" } + {6 , 2 , "MOVES" , "no" , "yes" , "" } + {6 , 3 , "ERROR" , "no" , "yes" , "" } + {6 , 4 , "EXECUTE-POSSIBLE" , "no" , "yes" , "" } } file "$(sinqSPS_DB)/readstring.db" -- 2.52.0 From 5ceec94f9614ce81a35737d6e7ce8f1fddcfbcbb Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Fri, 10 Apr 2026 14:46:51 +0200 Subject: [PATCH 8/8] simplifies motor disabling --- db/sans_llb_beamstop.db | 89 +++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/db/sans_llb_beamstop.db b/db/sans_llb_beamstop.db index 1cf4bbb..f2651b7 100644 --- a/db/sans_llb_beamstop.db +++ b/db/sans_llb_beamstop.db @@ -9,32 +9,11 @@ record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-INIT") record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP") { - field(DESC, "Move to new Beamstop") - field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-RAW PP") - field(OMSL, "supervisory") + field(DESC, "Select new Beamstop") field(DRVL, 1) field(DRVH, 3) field(PINI, "NO") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY PP") -} - -record(seq, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY") -{ - field(DESC, "Delays Internal Trigger as SPS too slow") - field(DOL0, 1) - field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY.PROC PP") - field(DLY0, 0.5) - field(SELM, "All") - field(PINI, "NO") -} - -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):TRIGGER") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY.PROC PP") } # Reset status @@ -58,6 +37,37 @@ record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY") field(ONAM, "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):BEAMSTOP-OUT") +} + +record(longout, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT") +{ + field(DESC, "Send new selection to SPS") + field(DOL, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP NPP") + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-RAW PP") + field(OMSL, "closed_loop") + field(DRVL, 1) + field(DRVH, 3) + field(PINI, "NO") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY") +} + +record(seq, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER-DELAY") +{ + field(DESC, "Delays Internal Trigger as SPS too slow") + field(DOL0, 1) + field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER.PROC PP") + field(DLY0, 0.5) + field(SELM, "All") + field(PINI, "NO") +} + record(longout, "$(INSTR)$(SPS_REGISTER_NAME):TRIGGER") { field(DESC, "Internal Trigger") @@ -81,8 +91,8 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY") 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):TRIGGER.PROC PP") - field(SCAN, "1 second") + field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-OUT.PROC PP") + field(SCAN, "2 second") field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK") } @@ -104,7 +114,7 @@ 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(DLY0, 1) field(SELM, "All") } @@ -178,33 +188,26 @@ record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY") field(DOPT, "Use OCAL") field(OCAL, "0") field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSX") } -record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX") +record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSX") { - field(DESC, "Whether to block bsx and bsy") + field(DESC, "Disable BSX during change") field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP") field(INPB, "$(BSX_MOT).DISA NPP") field(CALC, "A=0?!B:B") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY PP") + field(DOPT, "Use CALC") + field(OUT, "$(BSX_MOT).DISV PP") + field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSY") } -record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY") +record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):BLOCK-BSY") { - field(DESC, "Whether to block bsx and bsy") + field(DESC, "Disable BSY during change") field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):STATUS NPP") field(INPB, "$(BSY_MOT).DISA NPP") field(CALC, "A=0?!B:B") - field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK PP") -} - -record(seq, "$(INSTR)$(SPS_REGISTER_NAME):BEAMSTOP-MOTOR-BLOCK") -{ - field(DESC, "Block moving bsx and bsy") - field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSX NPP") - field(LNK0, "$(BSX_MOT).DISV PP") - field(DOL1, "$(INSTR)$(SPS_REGISTER_NAME):SHOULD-BLOCK-BSY NPP") - field(LNK1, "$(BSY_MOT).DISV PP") - field(SELM, "All") + field(DOPT, "Use CALC") + field(OUT, "$(BSY_MOT).DISV PP") } -- 2.52.0