From a413fecc4399a0312aab40f527485857cd604ca4 Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Mon, 11 May 2026 10:41:04 +0200 Subject: [PATCH] adds software time preset, improves preset monitor switching logic --- db/channels.db | 53 +++++++++++++++++++++++++++++++++++++++++++---- db/daq_2nd_gen.db | 31 +++++++++++++++++++++++++++ db/daq_4ch.db | 10 +++++++++ db/daq_8ch.db | 14 +++++++++++++ db/daq_common.db | 29 ++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 4 deletions(-) diff --git a/db/channels.db b/db/channels.db index c45c220..8c2971f 100644 --- a/db/channels.db +++ b/db/channels.db @@ -10,6 +10,15 @@ ################################################################################ # Status Variables +# record(dfanout, "$(INSTR)$(NAME):RESET_MT$(CHANNEL)") +# { +# field(DESC, "Resets Internal Variables") +# field(SELM, "All") +# field(OMSL, "supervisory") +# field(OUTA, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED PP") +# field(OUTB, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET PP") +# } + # Trigger a change in status as clearing record(bo, "$(INSTR)$(NAME):T$(CHANNEL)") { @@ -37,13 +46,14 @@ record(bi, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED") field(ONAM, "CLEARING") } -# Current Status of Channel, i.e. is it ready to count? +# Current Status of Channel, i.e. is it ready for a new operation? record(calc, "$(INSTR)$(NAME):S$(CHANNEL)") { field(DESC, "Stupid Nicos Stuff") field(INPA, "$(INSTR)$(NAME):STATUS NPP") field(INPB, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED NPP") - field(CALC, "A == 1 || B") + field(INPC, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET NPP") + field(CALC, "A == 1 || B || C") field(FLNK, "$(INSTR)$(NAME):MTS$(CHANNEL)") } @@ -52,7 +62,7 @@ record(int64in, "$(INSTR)$(NAME):MT$(CHANNEL)") { field(DESC, "Monitor Count Threshold") field(VAL, 0) - field(FLNK, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL)") + field(FLNK, "$(INSTR)$(NAME):M$(CHANNEL)_SET") } # Stop the count, if threshold is reached @@ -65,6 +75,42 @@ record(calcout, "$(INSTR)$(NAME):MTS$(CHANNEL)") field(OUT, "$(INSTR)$(NAME):STOP.PROC") } +record(dfanout, "$(INSTR)$(NAME):M$(CHANNEL)_SET") +{ + field(DESC, "Trigger setting HW preset") + field(SELM, "All") + field(OMSL, "closed_loop") + field(DOL, 1) + field(OUTA, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET PP") + field(OUTB, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL).PROC PP") +} + +record(calcout, "$(INSTR)$(NAME):M$(CHANNEL)_CHECK_SET") +{ + field(SCAN, ".1 second") + field(INPA, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET NPP") + field(INPB, "$(INSTR)$(NAME):MONITOR-CHANNEL NPP") + field(INPC, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV NPP") + field(CALC, "A && ( ($(CHANNEL) # B) || (B = C) )") + field(OOPT, "When Non-zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + # This is just a delay, as otherwise, Nicos will not see + # the $(INSTR)$(NAME):M$(CHANNEL)_PRESET state change + # when not changing which monitor channel the preset + # applies to. Is there a better way? + field(ODLY, .5) + field(OUT, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET PP") +} + +record(bi, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET") +{ + field(DESC, "Channel Status") + field(VAL, 0) + field(ZNAM, "OK") + field(ONAM, "SETTING") +} + record(calcout, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL)") { field(DESC, "Set to HW Mon Type if possible") @@ -78,7 +124,6 @@ record(calcout, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL)") field(OUT, "$(INSTR)$(NAME):SET-HW-CHANNEL$(CHANNEL).PROC") } -# TODO, it might be necessary to wait for this to complete record(ao, "$(INSTR)$(NAME):SET-HW-CHANNEL$(CHANNEL)") { field(OMSL, "closed_loop") diff --git a/db/daq_2nd_gen.db b/db/daq_2nd_gen.db index dafb9ce..dbed757 100644 --- a/db/daq_2nd_gen.db +++ b/db/daq_2nd_gen.db @@ -87,6 +87,37 @@ record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT2") field(OUTB, "$(INSTR)$(NAME):MT10 PP") } +# record(dfanout,"$(INSTR)$(NAME):RESET_MT") +# { +# field(DESC, "Resets Internal Variables") +# field(SELM, "All") +# field(OMSL, "supervisory") +# field(OUTA, "$(INSTR)$(NAME):RESET_MT1 PP") +# field(OUTB, "$(INSTR)$(NAME):RESET_MT2 PP") +# } +# +# record(dfanout,"$(INSTR)$(NAME):RESET_MT1") +# { +# field(SELM, "All") +# field(OMSL, "supervisory") +# field(OUTA, "$(INSTR)$(NAME):RESET_MT1 PP") +# field(OUTB, "$(INSTR)$(NAME):RESET_MT2 PP") +# field(OUTC, "$(INSTR)$(NAME):RESET_MT3 PP") +# field(OUTD, "$(INSTR)$(NAME):RESET_MT4 PP") +# field(OUTE, "$(INSTR)$(NAME):RESET_MT5 PP") +# field(OUTF, "$(INSTR)$(NAME):RESET_MT6 PP") +# field(OUTG, "$(INSTR)$(NAME):RESET_MT7 PP") +# field(OUTH, "$(INSTR)$(NAME):RESET_MT8 PP") +# } +# +# record(dfanout,"$(INSTR)$(NAME):RESET_MT2") +# { +# field(SELM, "All") +# field(OMSL, "supervisory") +# field(OUTA, "$(INSTR)$(NAME):RESET_MT9 PP") +# field(OUTB, "$(INSTR)$(NAME):RESET_MT10 PP") +# } + record(dfanout,"$(INSTR)$(NAME):CMONITORS") { field(SELM, "All") diff --git a/db/daq_4ch.db b/db/daq_4ch.db index 6a8713f..81a3bf8 100644 --- a/db/daq_4ch.db +++ b/db/daq_4ch.db @@ -41,6 +41,16 @@ record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT") field(OUTD, "$(INSTR)$(NAME):MT4 PP") } +# record(dfanout,"$(INSTR)$(NAME):RESET_MT") +# { +# field(OMSL, "supervisory") +# field(SELM, "All") +# field(OUTA, "$(INSTR)$(NAME):RESET_MT1 PP") +# field(OUTB, "$(INSTR)$(NAME):RESET_MT2 PP") +# field(OUTC, "$(INSTR)$(NAME):RESET_MT3 PP") +# field(OUTD, "$(INSTR)$(NAME):RESET_MT4 PP") +# } + record(dfanout,"$(INSTR)$(NAME):CMONITORS") { field(SELM, "All") diff --git a/db/daq_8ch.db b/db/daq_8ch.db index 2a2ff47..ece1e16 100644 --- a/db/daq_8ch.db +++ b/db/daq_8ch.db @@ -45,6 +45,20 @@ record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT") field(OUTH, "$(INSTR)$(NAME):MT8 PP") } +# record(dfanout,"$(INSTR)$(NAME):RESET_MT") +# { +# field(OMSL, "supervisory") +# field(SELM, "All") +# field(OUTA, "$(INSTR)$(NAME):RESET_MT1 PP") +# field(OUTB, "$(INSTR)$(NAME):RESET_MT2 PP") +# field(OUTC, "$(INSTR)$(NAME):RESET_MT3 PP") +# field(OUTD, "$(INSTR)$(NAME):RESET_MT4 PP") +# field(OUTE, "$(INSTR)$(NAME):RESET_MT5 PP") +# field(OUTF, "$(INSTR)$(NAME):RESET_MT6 PP") +# field(OUTG, "$(INSTR)$(NAME):RESET_MT7 PP") +# field(OUTH, "$(INSTR)$(NAME):RESET_MT8 PP") +# } + record(dfanout,"$(INSTR)$(NAME):CMONITORS") { field(SELM, "All") diff --git a/db/daq_common.db b/db/daq_common.db index 2c8f3e8..1a75c10 100644 --- a/db/daq_common.db +++ b/db/daq_common.db @@ -22,6 +22,24 @@ record(longout, "$(INSTR)$(NAME):FULL-RESET") field(DTYP, "stream") } +record(dfanout, "$(INSTR)$(NAME):RESET") +{ + field(DESC, "Reset internal state") + field(SELM, "All") + field(OMSL, "closed_loop") + field(DOL, "0") + # Internal Count Timer + field(OUTA, "$(INSTR)$(NAME):COUNT_STARTED PP") + # Time Preset + # field(OUTB, "$(INSTR)$(NAME):HW_ETT PP") + # field(OUTC, "$(INSTR)$(NAME):ET_CLEARED PP") + # Monitor Presets + # field(OUTD, "$(INSTR)$(NAME):RESET_HW_MT PP") + # field(OUTE, "$(INSTR)$(NAME):RESET_MT PP") + # HW Preset Type + # field(OUTF, "$(INSTR)$(NAME):PRESET-TYPE PP") +} + ################################################################################ # Status Variables @@ -232,6 +250,7 @@ record(calc, "$(INSTR)$(NAME):ETS") field(INPA, "$(INSTR)$(NAME):STATUS NPP") field(INPB, "$(INSTR)$(NAME):ET_CLEARED NPP") field(CALC, "A == 1 || B") + field(FLNK, "$(INSTR)$(NAME):ETCHECK") } # Time Threshold @@ -242,6 +261,16 @@ record(int64in, "$(INSTR)$(NAME):HW_ETT") field(FLNK, "$(INSTR)$(NAME):SET-TYPE-TIME") } +# Stop the count, if threshold is reached +record(calcout, "$(INSTR)$(NAME):ETCHECK") +{ + field(INPA, "$(INSTR)$(NAME):ELAPSED-TIME NPP") + field(INPB, "$(INSTR)$(NAME):HW_ETT NPP") + field(CALC, "B > 0 && A >= B") + field(OOPT, "When Non-zero") + field(OUT, "$(INSTR)$(NAME):STOP.PROC") +} + record(calcout, "$(INSTR)$(NAME):SET-TYPE-TIME") { field(INPA, "$(INSTR)$(NAME):PRESET-TYPE NPP")