From 30bd8c66dc783d9792316e2333925083d895f6da Mon Sep 17 00:00:00 2001 From: Edward Wall Date: Fri, 8 May 2026 14:45:25 +0200 Subject: [PATCH] presets all managed on epics side, separates presets from starting --- db/channels.db | 48 ++++++++++++++++ db/daq_2nd_gen.db | 81 +++++++++++++++++++++++++- db/daq_4ch.db | 26 +++++++++ db/daq_8ch.db | 34 +++++++++++ db/daq_common.db | 142 +++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 321 insertions(+), 10 deletions(-) diff --git a/db/channels.db b/db/channels.db index 892d237..bf95320 100644 --- a/db/channels.db +++ b/db/channels.db @@ -26,6 +26,7 @@ record(seq, "$(INSTR)$(NAME):O$(CHANNEL)") field(DO0, 0) field(SELM, "Specified") field(SELL, "$(INSTR)$(NAME):M$(CHANNEL).VAL") + field(FLNK, "$(INSTR)$(NAME):MTS$(CHANNEL)") } # Current Status of Channel, i.e. is it ready to count? @@ -37,6 +38,53 @@ record(bi, "$(INSTR)$(NAME):S$(CHANNEL)") field(ONAM, "CLEARING") } +# If set, stop count once threshold reached +record(int64in, "$(INSTR)$(NAME):MT$(CHANNEL)") +{ + field(DESC, "Monitor Count Threshold") + field(VAL, 0) + field(FLNK, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL)") +} + +# Stop the count, if threshold is reached +record(calcout, "$(INSTR)$(NAME):MTS$(CHANNEL)") +{ + field(INPA, "$(INSTR)$(NAME):M$(CHANNEL) NPP") + field(INPB, "$(INSTR)$(NAME):MT$(CHANNEL) NPP") + field(CALC, "B > 0 && A >= B") + field(OOPT, "When Non-zero") + field(OUT, "$(INSTR)$(NAME):STOP.PROC") +} + +record(calcout, "$(INSTR)$(NAME):SET-TYPE-MON$(CHANNEL)") +{ + field(DESC, "Set to HW Mon Type if possible") + field(INPA, "$(INSTR)$(NAME):PRESET-TYPE NPP") + field(INPB, "$(INSTR)$(NAME):MT$(CHANNEL) NPP") + field(INPC, "$(INSTR)$(NAME):MONITOR-CHANNEL.DRVH NPP") + field(CALC, "A=0 && B>0 && $(CHANNEL)<=C") + field(OOPT, "When Non-zero") + field(DOPT, "Use OCAL") + field(OCAL, "1") + 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") + field(DOL, $(CHANNEL)) + field(OUT, "$(INSTR)$(NAME):MONITOR-CHANNEL PP") + field(FLNK, "$(INSTR)$(NAME):SET-TYPE-MON2$(CHANNEL) PP") +} + +record(ao, "$(INSTR)$(NAME):SET-TYPE-MON2$(CHANNEL)") +{ + field(OMSL, "closed_loop") + field(DOL, 2) + field(OUT, "$(INSTR)$(NAME):PRESET-TYPE PP") +} + ################################################################################ # Count Commands diff --git a/db/daq_2nd_gen.db b/db/daq_2nd_gen.db index 84c72e5..dafb9ce 100644 --- a/db/daq_2nd_gen.db +++ b/db/daq_2nd_gen.db @@ -20,12 +20,13 @@ record(longout, "$(INSTR)$(NAME):MONITOR-CHANNEL") field(FLNK, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV.PROC") } +# TODO we might need to make sure we wait, when the channel is changed record(longin, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV") { field(DESC, "PRESET-COUNT Monitors this channel") field(DTYP, "stream") field(INP, "@$(PROTO) readPresetMonitor($(INSTR)$(NAME):) $(ASYN_PORT)") - field(SCAN, "1 second") + field(SCAN, ".5 second") field(FLNK, "$(INSTR)$(NAME):CORRECT-MONITOR-CHANNEL.PROC") } @@ -38,6 +39,84 @@ record(seq, "$(INSTR)$(NAME):CORRECT-MONITOR-CHANNEL") field(LNK0, "$(INSTR)$(NAME):MONITOR-CHANNEL PP") } +record(sel, "$(INSTR)$(NAME):HW_MT") +{ + field(DESC, "Monitor threshold to actually use") + field(SELM, "Specified") + field(NVL, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV.VAL NPP") + # Skip A as it corresponds to 0 + field(INPB, "$(INSTR)$(NAME):MT1 NPP") + field(INPC, "$(INSTR)$(NAME):MT2 NPP") + field(INPD, "$(INSTR)$(NAME):MT3 NPP") + field(INPE, "$(INSTR)$(NAME):MT4 NPP") + field(INPF, "$(INSTR)$(NAME):MT5 NPP") + field(INPG, "$(INSTR)$(NAME):MT6 NPP") + field(INPH, "$(INSTR)$(NAME):MT7 NPP") + field(INPI, "$(INSTR)$(NAME):MT8 NPP") + field(INPJ, "$(INSTR)$(NAME):MT9 NPP") + field(INPK, "$(INSTR)$(NAME):MT10 NPP") +} + +record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):RESET_HW_MT1 PP") + field(OUTB, "$(INSTR)$(NAME):RESET_HW_MT2 PP") +} + +record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT1") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):MT1 PP") + field(OUTB, "$(INSTR)$(NAME):MT2 PP") + field(OUTC, "$(INSTR)$(NAME):MT3 PP") + field(OUTD, "$(INSTR)$(NAME):MT4 PP") + field(OUTE, "$(INSTR)$(NAME):MT5 PP") + field(OUTF, "$(INSTR)$(NAME):MT6 PP") + field(OUTG, "$(INSTR)$(NAME):MT7 PP") + field(OUTH, "$(INSTR)$(NAME):MT8 PP") +} + +record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT2") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):MT9 PP") + field(OUTB, "$(INSTR)$(NAME):MT10 PP") +} + +record(dfanout,"$(INSTR)$(NAME):CMONITORS") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):CMONITORS1 PP") + field(OUTB, "$(INSTR)$(NAME):CMONITORS2 PP") +} + +record(dfanout,"$(INSTR)$(NAME):CMONITORS1") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):C1 PP") + field(OUTB, "$(INSTR)$(NAME):C2 PP") + field(OUTC, "$(INSTR)$(NAME):C3 PP") + field(OUTD, "$(INSTR)$(NAME):C4 PP") + field(OUTE, "$(INSTR)$(NAME):C5 PP") + field(OUTF, "$(INSTR)$(NAME):C6 PP") + field(OUTG, "$(INSTR)$(NAME):C7 PP") + field(OUTH, "$(INSTR)$(NAME):C8 PP") +} + +record(dfanout,"$(INSTR)$(NAME):CMONITORS2") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):C9 PP") + field(OUTB, "$(INSTR)$(NAME):C10 PP") +} + ################################################################################ # Count Commands diff --git a/db/daq_4ch.db b/db/daq_4ch.db index ca34dd5..6a8713f 100644 --- a/db/daq_4ch.db +++ b/db/daq_4ch.db @@ -25,6 +25,32 @@ record(longin, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV") field(DISP, 1) } +record(ai, "$(INSTR)$(NAME):HW_MT") +{ + field(DESC, "Monitor threshold to actually use") + field(INP, "$(INSTR)$(NAME):MT1 NPP") +} + +record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT") +{ + field(OMSL, "supervisory") + field(SELM, "All") + field(OUTA, "$(INSTR)$(NAME):MT1 PP") + field(OUTB, "$(INSTR)$(NAME):MT2 PP") + field(OUTC, "$(INSTR)$(NAME):MT3 PP") + field(OUTD, "$(INSTR)$(NAME):MT4 PP") +} + +record(dfanout,"$(INSTR)$(NAME):CMONITORS") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):C1 PP") + field(OUTB, "$(INSTR)$(NAME):C2 PP") + field(OUTC, "$(INSTR)$(NAME):C3 PP") + field(OUTD, "$(INSTR)$(NAME):C4 PP") +} + ################################################################################ # Count Commands diff --git a/db/daq_8ch.db b/db/daq_8ch.db index fa49da6..2a2ff47 100644 --- a/db/daq_8ch.db +++ b/db/daq_8ch.db @@ -25,6 +25,40 @@ record(longin, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV") field(DISP, 1) } +record(ai, "$(INSTR)$(NAME):HW_MT") +{ + field(DESC, "Monitor threshold to actually use") + field(INP, "$(INSTR)$(NAME):MT1 NPP") +} + +record(dfanout,"$(INSTR)$(NAME):RESET_HW_MT") +{ + field(OMSL, "supervisory") + field(SELM, "All") + field(OUTA, "$(INSTR)$(NAME):MT1 PP") + field(OUTB, "$(INSTR)$(NAME):MT2 PP") + field(OUTC, "$(INSTR)$(NAME):MT3 PP") + field(OUTD, "$(INSTR)$(NAME):MT4 PP") + field(OUTE, "$(INSTR)$(NAME):MT5 PP") + field(OUTF, "$(INSTR)$(NAME):MT6 PP") + field(OUTG, "$(INSTR)$(NAME):MT7 PP") + field(OUTH, "$(INSTR)$(NAME):MT8 PP") +} + +record(dfanout,"$(INSTR)$(NAME):CMONITORS") +{ + field(SELM, "All") + field(OMSL, "supervisory") + field(OUTA, "$(INSTR)$(NAME):C1 PP") + field(OUTB, "$(INSTR)$(NAME):C2 PP") + field(OUTC, "$(INSTR)$(NAME):C3 PP") + field(OUTD, "$(INSTR)$(NAME):C4 PP") + field(OUTE, "$(INSTR)$(NAME):C5 PP") + field(OUTF, "$(INSTR)$(NAME):C6 PP") + field(OUTG, "$(INSTR)$(NAME):C7 PP") + field(OUTH, "$(INSTR)$(NAME):C8 PP") +} + ################################################################################ # Count Commands diff --git a/db/daq_common.db b/db/daq_common.db index f7b68af..c3aea46 100644 --- a/db/daq_common.db +++ b/db/daq_common.db @@ -107,6 +107,13 @@ record(bi, "$(INSTR)$(NAME):IS_PAUSED") field(ONAM, "PAUSED") } +record(longin, "$(INSTR)$(NAME):COUNT_STARTED") +{ + field(DESC, "Internal Sent Start Count") + field(VAL, 0) + field(PINI, "YES") +} + record(calc, "$(INSTR)$(NAME):MAP-STATUS") { field(DESC, "Maps Raw Status to State") @@ -116,7 +123,8 @@ record(calc, "$(INSTR)$(NAME):MAP-STATUS") field(INPD, "$(INSTR)$(NAME):COUNTING_PRESET PP MS") field(INPE, "$(INSTR)$(NAME):IS_LOWRATE PP MS") field(INPF, "$(INSTR)$(NAME):IS_PAUSED PP MS") - field(CALC, "(A=1||B=1)?4:(F=1)?3:(C=0&&D=0)?0:(E=1)?2:1") + field(INPG, "$(INSTR)$(NAME):COUNT_STARTED NPP MS") + field(CALC, "(A=1||B=1)?4:(F=1)?3:(C=0&&D=0&&G<=0)?0:(E=1)?2:1") field(FLNK, "$(INSTR)$(NAME):STATUS") } @@ -135,6 +143,52 @@ record(mbbi, "$(INSTR)$(NAME):STATUS") # 4 should never happen, if it does it means the DAQ reports undocumented statusbits field(FRVL, "4") field(FRST, "INVALID") + field(FLNK, "$(INSTR)$(NAME):RESET-P-PRESET") +} + +record(calcout, "$(INSTR)$(NAME):RESET-P-PRESET") +{ + field(INPA, "$(INSTR)$(NAME):STATUS NPP") + field(CALC, "A") + field(OOPT, "Transition To Zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + field(OUT, "$(INSTR)$(NAME):PRESET-TYPE PP") + field(FLNK, "$(INSTR)$(NAME):RESET-HW_ETT") +} + +record(calcout, "$(INSTR)$(NAME):RESET-HW_ETT") +{ + field(INPA, "$(INSTR)$(NAME):STATUS NPP") + field(CALC, "A") + field(OOPT, "Transition To Zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + field(OUT, "$(INSTR)$(NAME):HW_ETT PP") + field(FLNK, "$(INSTR)$(NAME):RESET-HW-PRESET") +} + +record(calcout, "$(INSTR)$(NAME):RESET-HW-PRESET") +{ + field(INPA, "$(INSTR)$(NAME):STATUS NPP") + field(CALC, "A") + field(OOPT, "Transition To Zero") + field(DOPT, "Use OCAL") + field(OCAL, "0") + field(OUT, "$(INSTR)$(NAME):RESET_HW_MT PP") + field(FLNK, "$(INSTR)$(NAME):Z_COUNT_STARTED") +} + +record(calcout, "$(INSTR)$(NAME):Z_COUNT_STARTED") +{ + field(INPA, "$(INSTR)$(NAME):COUNT_STARTED NPP") + field(INPB, "$(INSTR)$(NAME):COUNTING_TIME NPP MS") + field(INPC, "$(INSTR)$(NAME):COUNTING_PRESET NPP MS") + field(CALC, "A") + field(DOPT, "Use OCAL") + field(OCAL, "(B||C)?0:A-1") + field(OOPT, "When Non-zero") + field(OUT, "$(INSTR)$(NAME):COUNT_STARTED PP") } record(longin, "$(INSTR)$(NAME):CHANNELS") @@ -171,30 +225,100 @@ record(bi, "$(INSTR)$(NAME):ETS") field(ONAM, "CLEARING") } +# Time Threshold +record(int64in, "$(INSTR)$(NAME):HW_ETT") +{ + field(DESC, "Time Threshold") + field(VAL, 0) + field(FLNK, "$(INSTR)$(NAME):SET-TYPE-TIME") +} + +record(calcout, "$(INSTR)$(NAME):SET-TYPE-TIME") +{ + field(INPA, "$(INSTR)$(NAME):PRESET-TYPE NPP") + field(INPB, "$(INSTR)$(NAME):HW_ETT NPP") + field(CALC, "A=0 && B>0") + field(OOPT, "When Non-zero") + field(DOPT, "Use OCAL") + field(OCAL, "1") + field(OUT, "$(INSTR)$(NAME):PRESET-TYPE PP") +} + ################################################################################ # Count Commands -record(ao,"$(INSTR)$(NAME):PRESET-COUNT") +record(mbbi, "$(INSTR)$(NAME):PRESET-TYPE") { - field(DESC, "Count until preset reached") - field(DTYP, "stream") - field(OUT, "@$(PROTO) startWithCountPreset$(CHANNELS)($(INSTR)$(NAME):) $(ASYN_PORT)") - field(VAL, 0) - field(PREC, 2) - field(FLNK, "$(INSTR)$(NAME):RAW-STATUS") + field(DESC, "Type of Hardware Preset") + field(ZRVL, "0") + field(ZRST, "Unset") + field(ONVL, "1") + field(ONST, "Time") + field(TWVL, "2") + field(TWST, "Monitor") + field(VAL, 0) + field(PINI, "YES") +} + +record(bo,"$(INSTR)$(NAME):START") +{ + field(DESC, "Zero, then trigger") + field(FLNK, "$(INSTR)$(NAME):PREPARE") +} + +record(dfanout,"$(INSTR)$(NAME):PREPARE") +{ + field(DESC, "Zero channels") + field(SELM, "All") + field(OMSL, "supervisory") + # Elapsed Time + field(OUTA, "$(INSTR)$(NAME):CT PP") + field(OUTB, "$(INSTR)$(NAME):CMONITORS PP") + field(FLNK, "$(INSTR)$(NAME):TRIGGER") +} + +record(seq,"$(INSTR)$(NAME):TRIGGER") +{ + field(DESC, "Actually triggers sending start") + field(DO1, 1) + field(LNK1, "$(INSTR)$(NAME):PRESET-TIME.PROC") + field(DO2, 1) + field(LNK2, "$(INSTR)$(NAME):PRESET-COUNT.PROC") + field(SELM, "Specified") + field(SELL, "$(INSTR)$(NAME):PRESET-TYPE NPP") + field(FLNK, "$(INSTR)$(NAME):O_COUNT_STARTED") +} + +record(longout, "$(INSTR)$(NAME):O_COUNT_STARTED") +{ + field(OMSL, "closed_loop") + field(DOL, 5) + field(OUT, "$(INSTR)$(NAME):COUNT_STARTED PP") } record(ao,"$(INSTR)$(NAME):PRESET-TIME") { field(DESC, "Count for specified time") field(DTYP, "stream") + field(OMSL, "closed_loop") + field(DOL, "$(INSTR)$(NAME):HW_ETT NPP") field(OUT, "@$(PROTO) startWithTimePreset$(CHANNELS)($(INSTR)$(NAME):) $(ASYN_PORT)") - field(VAL, 0) field(PREC, 2) field(EGU, "seconds") field(FLNK, "$(INSTR)$(NAME):RAW-STATUS") } +record(ao,"$(INSTR)$(NAME):PRESET-COUNT") +{ + field(DESC, "Count until preset reached") + field(DTYP, "stream") + field(OMSL, "closed_loop") + field(DOL, "$(INSTR)$(NAME):HW_MT PP") + field(OUT, "@$(PROTO) startWithCountPreset$(CHANNELS)($(INSTR)$(NAME):) $(ASYN_PORT)") + field(PREC, 0) + field(FLNK, "$(INSTR)$(NAME):RAW-STATUS") +} + record(bo,"$(INSTR)$(NAME):PAUSE") { field(DESC, "Pause the current count")