214 lines
6.1 KiB
Plaintext
214 lines
6.1 KiB
Plaintext
# EPICS Database for streamdevice specific to measurement channels
|
|
#
|
|
# Macros
|
|
# INSTR - Prefix
|
|
# NAME - the device name, e.g. EL737
|
|
# PROTO - Stream device protocol file
|
|
# ASYN_PORT - Low level Asyn IP Port to DAQ
|
|
# CHANNEL - the number associated with the measurment channel
|
|
|
|
################################################################################
|
|
# 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)")
|
|
{
|
|
field(DESC, "Trigger Clearing Status")
|
|
field(VAL, 1)
|
|
field(OUT, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED PP")
|
|
}
|
|
|
|
# Trigger a change in status as value returned to 0
|
|
record(seq, "$(INSTR)$(NAME):O$(CHANNEL)")
|
|
{
|
|
field(DESC, "Trigger Returned to 0 Status")
|
|
field(DO0, 0)
|
|
field(LNK0, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED PP")
|
|
field(SELM, "Specified")
|
|
field(SELL, "$(INSTR)$(NAME):M$(CHANNEL).VAL")
|
|
field(FLNK, "$(INSTR)$(NAME):S$(CHANNEL)")
|
|
}
|
|
|
|
record(bi, "$(INSTR)$(NAME):M$(CHANNEL)_CLEARED")
|
|
{
|
|
field(DESC, "Channel Status")
|
|
field(VAL, 0)
|
|
field(ZNAM, "OK")
|
|
field(ONAM, "CLEARING")
|
|
}
|
|
|
|
# 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(INPC, "$(INSTR)$(NAME):M$(CHANNEL)_PRESET NPP")
|
|
field(CALC, "A == 1 || B || C")
|
|
field(FLNK, "$(INSTR)$(NAME):MTS$(CHANNEL)")
|
|
}
|
|
|
|
# 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):M$(CHANNEL)_SET")
|
|
}
|
|
|
|
# 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(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")
|
|
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")
|
|
}
|
|
|
|
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
|
|
|
|
# Unfortunately, clearing the channels is somewhat complicated as a result of
|
|
# the addition of more channels over time and minimal changes to the underlying interface
|
|
#
|
|
# Urs Greuter provided the following explanation:
|
|
#
|
|
# bei den Befehlen CC r und HC r ist der Parameter r als bit-Maske zu verstehen:
|
|
#
|
|
# Bit0: Zähler Channel 1
|
|
# Bit2: Zähler Channel 2
|
|
# Bit3: Zähler Channel 3
|
|
# Bit4: Zähler Channel 4
|
|
# Bit5: Zähler Channel Timer
|
|
# Bit6: Zähler Channel 5
|
|
# Bit7: Zähler Channel 6
|
|
# Bit8: Zähler Channel 7
|
|
# Bit9: Zähler Channel 8
|
|
#
|
|
# Beispiele:
|
|
# CC 1 setzt den Zähler des Channels 1 zurück
|
|
# CC 4 setzt den Zähler des Channels 3 zurück
|
|
# CC 5 setzt gleichzeitig die Zähler der Channels 1 und 3 zurück
|
|
# CC 16 ist gleichbedeutend wie CT (Timer zurücksetzen)
|
|
# CC 511 setzt gleichzeitig die Zähler aller Kanäle (auch des Timers) zurück.
|
|
|
|
record(calc, "$(INSTR)$(NAME):BM$(CHANNEL)")
|
|
{
|
|
field(DESC, "Bit Mask for Channel")
|
|
field(INPA, $(CHANNEL))
|
|
field(CALC, "A > 4 ? 2 ^ A : 2 ^ (A-1)")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(longout, "$(INSTR)$(NAME):C$(CHANNEL)")
|
|
{
|
|
field(DESC, "Clear the current channel count")
|
|
field(DTYP, "stream")
|
|
field(OMSL, "closed_loop")
|
|
field(DOL, "$(INSTR)$(NAME):BM$(CHANNEL) NPP")
|
|
field(OUT, "@$(PROTO) clearChannel($(INSTR)$(NAME):) $(ASYN_PORT)")
|
|
field(FLNK, "$(INSTR)$(NAME):T$(CHANNEL)")
|
|
}
|
|
|
|
record(ao,"$(INSTR)$(NAME):THRESH$(CHANNEL)")
|
|
{
|
|
field(DESC, "Sets min rate for counting to proceed")
|
|
field(OMSL, "supervisory")
|
|
field(OROC, "0")
|
|
field(OUT, "@$(PROTO) setMinRate($(INSTR)$(NAME):, $(CHANNEL)) $(ASYN_PORT)")
|
|
field(DTYP, "stream")
|
|
}
|
|
|
|
################################################################################
|
|
# Read all monitors values
|
|
|
|
record(int64in, "$(INSTR)$(NAME):M$(CHANNEL)")
|
|
{
|
|
field(DESC, "DAQ CH$(CHANNEL)")
|
|
field(EGU, "cts")
|
|
field(FLNK, "$(INSTR)$(NAME):O$(CHANNEL)")
|
|
}
|
|
|
|
record(ai, "$(INSTR)$(NAME):R$(CHANNEL)")
|
|
{
|
|
field(DESC, "Rate of DAQ CH$(CHANNEL)")
|
|
field(INP, "@$(PROTO) readRate($(INSTR)$(NAME):, $(CHANNEL)) $(ASYN_PORT)")
|
|
field(DTYP, "stream")
|
|
field(EGU, "cts/sec")
|
|
field(SCAN, "1 second")
|
|
}
|