diff --git a/IPS/IPS-IOC-01App/Db/Makefile b/IPS/IPS-IOC-01App/Db/Makefile index 5e0e290b2..f601d4fea 100644 --- a/IPS/IPS-IOC-01App/Db/Makefile +++ b/IPS/IPS-IOC-01App/Db/Makefile @@ -10,7 +10,12 @@ include $(TOP)/configure/CONFIG #---------------------------------------------------- # Create and install (or just install) into /db # databases, templates, substitutions like this -DB += ips.db +DB += ips_common.db +DB += ips_legacy.db +DB += ips_scpi.db +DB += ips_scpi_levels.db +DB += scpi_system_alarms.db +DB += scpi_system_alarms_discrete.db #---------------------------------------------------- # If .db template is not named *.template add diff --git a/IPS/IPS-IOC-01App/Db/ips.db b/IPS/IPS-IOC-01App/Db/ips_common.db similarity index 56% rename from IPS/IPS-IOC-01App/Db/ips.db rename to IPS/IPS-IOC-01App/Db/ips_common.db index a820c7c22..99a411c45 100644 --- a/IPS/IPS-IOC-01App/Db/ips.db +++ b/IPS/IPS-IOC-01App/Db/ips_common.db @@ -24,11 +24,11 @@ record(bo, "$(P)DISABLE") # # Run the Version command, V. # # The string was too long to put model and version into same record. # # Scan this once, probably not needed again. -# The reply comes back and is split amongst other records. +# The reply comes back and is split amongst other records in the StreamDevice protocol file. record(stringin, "$(P)GET:VERSION") { field(DESC, "Examine status") field(DTYP, "stream") - field(INP, "@OxInstIPS.protocol getVersion($(P)) $(PORT)") + field(INP, "@$(PROTO) getVersion($(P)) $(PORT)") field(PINI, "YES") field(FLNK, "$(P)MODEL") field(SCAN, "Passive") @@ -37,6 +37,7 @@ record(stringin, "$(P)GET:VERSION") { field(SDIS, "$(P)DISABLE") } +# Updated in GET:VERSION call to getVersion() record(stringin, "$(P)MODEL") { field(DESC, "Model") field(DTYP, "Soft Channel") @@ -44,112 +45,22 @@ record(stringin, "$(P)MODEL") { field(FLNK, "$(P)VERSION") } +# Updated in GET:VERSION call to getVersion() record(stringin, "$(P)VERSION") { field(DESC, "Firmware version.") field(DTYP, "Soft Channel") field(SCAN, "Passive") } -# # Readback from Cn part of Examine command return. -record(mbbi, "$(P)CONTROL") { - field(DESC, "Control status") - field(DTYP, "Soft Channel") - field(SCAN, "1 second") - field(ZRST, "Local & Locked") - field(ZRVL, "0") - field(ZRSV, "NO_ALARM") - field(ONST, "Remote & Locked") - field(ONVL, "1") - field(ONSV, "NO_ALARM") - field(TWST, "Local & Unlocked") - field(TWVL, "2") - field(TWSV, "NO_ALARM") - field(THST, "Remote & Unlocked") - field(THVL, "3") - field(THSV, "NO_ALARM") - - # Modes 4-7 come back from device. Manual does not make it clear what the - # differences are. Keeping them as separate items in case they are useful - # for diagnostics later on. - field(FRST, "Auto-Run-Down") - field(FRVL, "4") - field(FRSV, "MAJOR") - field(FVST, "Auto-Run-Down") - field(FVVL, "5") - field(FVSV, "MAJOR") - field(SXST, "Auto-Run-Down") - field(SXVL, "6") - field(SXSV, "MAJOR") - field(SVST, "Auto-Run-Down") - field(SVVL, "7") - field(SVSV, "MAJOR") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:CONTROL") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") - info(alarm, "IPS") -} - -# Grab remote vs local control -record(mbbo, "$(P)CONTROL:SP") { - field(DESC, "Set remote/local control") - field(DTYP, "stream") - field(SCAN, "Passive") - field(OUT, "@OxInstIPS.protocol setControl $(PORT)") - field(ZRST, "Local & Locked") - field(ZRVL, "0") - field(ONST, "Remote & Locked") - field(ONVL, "1") - field(TWST, "Local & Unlocked") - field(TWVL, "2") - field(THST, "Remote & Unlocked") - field(THVL, "3") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:CONTROL:SP") - field(SDIS, "$(P)DISABLE") -} - -# Readback from An part of Examine command return. # Hold means maintaining present current. -# Clamped means you cannot adjust it - powers up in this -# state. Only the set activity hold command can get out -# of the clamped state. Hold will interrupt a sweep. -record(mbbi, "$(P)ACTIVITY") { - field(DESC, "Activity status") - field(DTYP, "Soft Channel") - field(SCAN, "1 second") - field(ZRST, "Hold") - field(ZRVL, "0") - field(ZRSV, "NO_ALARM") - field(ONST, "To Setpoint") - field(ONVL, "1") - field(ONSV, "NO_ALARM") - field(TWST, "To Zero") - field(TWVL, "2") - field(TWSV, "NO_ALARM") - field(FRST, "Clamped") - field(FRVL, "4") - field(FRSV, "MAJOR") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:ACTIVITY") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} - -# Hold means maintaining present current. -# Clamped means you cannot adjust it - powers up in this +# Clamped means you cannot adjust it - powers up in this # state. Only the set activity hold command can get out # of the clamped state. Hold will interrupt a sweep. record(mbbo, "$(P)ACTIVITY:SP") { field(DESC, "Activity control") field(DTYP, "stream") field(SCAN, "Passive") - field(OUT, "@OxInstIPS.protocol setActivity $(PORT)") + field(OUT, "@$(PROTO) setActivity $(PORT)") field(ZRST, "Hold") field(ZRVL, "0") field(ONST, "To Setpoint") @@ -158,7 +69,7 @@ record(mbbo, "$(P)ACTIVITY:SP") { field(TWVL, "2") field(FRST, "Clamp") field(FRVL, "4") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:ACTIVITY:SP") field(SDIS, "$(P)DISABLE") @@ -169,14 +80,14 @@ record(ai, "$(P)CURR") { field(DESC, "Demand current readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getDemandCurrent $(PORT)") + field(INP, "@$(PROTO) getDemandCurrent $(PORT)") field(EGU, "A") field(PREC, "4") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:CURRENT") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } @@ -185,14 +96,14 @@ record(ai, "$(P)CURR:SP:RBV") { field(DESC, "Setpoint current readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getSetpointCurrent $(PORT)") + field(INP, "@$(PROTO) getSetpointCurrent $(PORT)") field(EGU, "A") field(PREC, "4") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:CURRENT") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } @@ -201,16 +112,16 @@ record(ai, "$(P)SUPPLY:VOLT") { field(DESC, "Supply voltage readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getSupplyVoltage $(PORT)") + field(INP, "@$(PROTO) getSupplyVoltage $(PORT)") field(EGU, "V") field(PREC, "8") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:SUPPLY:VOLT") field(SDIS, "$(P)DISABLE") - + field(FLNK, "$(P)SUPPLY:VOLT:_STABILITY:BUF") - + info(archive, "VAL") } @@ -256,14 +167,14 @@ record(ai, "$(P)MAGNET:CURR:MEAS") { field(DESC, "Measured magnet current readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getMeasuredMagnetCurrent $(PORT)") + field(INP, "@$(PROTO) getMeasuredMagnetCurrent $(PORT)") field(EGU, "A") field(PREC, "4") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:MAGNET:CURR:MEAS") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } @@ -272,14 +183,14 @@ record(ai, "$(P)CURR:RATE") { field(DESC, "Current sweep rate readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getCurrentSweepRate $(PORT)") + field(INP, "@$(PROTO) getCurrentSweepRate $(PORT)") field(EGU, "A/min") field(PREC, "3") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:CURR:RATE") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } @@ -288,14 +199,14 @@ record(ai, "$(P)FIELD") { field(DESC, "Demand field readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getDemandField $(PORT)") + field(INP, "@$(PROTO) getDemandField $(PORT)") field(EGU, "T") field(PREC, "5") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD") field(SDIS, "$(P)DISABLE") - + info(INTEREST, "LOW") info(archive, "VAL") } @@ -307,7 +218,7 @@ record(ao, "$(P)FIELD:SP") { field(PREC, "5") field(DRVH, "$(MAX_FIELD)") field(DRVL, "-$(MAX_FIELD)") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD") field(SDIS, "$(P)DISABLE") @@ -319,12 +230,12 @@ record(ao, "$(P)FIELD:SP:_RAW") { field(DESC, "Send raw field to box") field(DTYP, "stream") field(SCAN, "Passive") - field(OUT, "@OxInstIPS.protocol setSetpointField $(PORT)") + field(OUT, "@$(PROTO) setSetpointField $(PORT)") field(EGU, "T") field(PREC, "5") field(DRVH, "$(MAX_FIELD)") field(DRVL, "-$(MAX_FIELD)") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD") field(SDIS, "$(P)DISABLE") @@ -337,10 +248,10 @@ record(ai, "$(P)FIELD:SP:RBV") { field(DESC, "Setpoint field readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getSetpointField $(PORT)") + field(INP, "@$(PROTO) getSetpointField $(PORT)") field(EGU, "T") field(PREC, "5") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD") field(SDIS, "$(P)DISABLE") @@ -352,13 +263,13 @@ record(ai, "$(P)FIELD:RATE") { field(DESC, "Field sweep rate readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getFieldSweepRate $(PORT)") + field(INP, "@$(PROTO) getFieldSweepRate $(PORT)") field(EGU, "T/min") field(PREC, "4") - + field(LOLO, "0") field(LLSV, "MAJOR") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD:RATE") field(SDIS, "$(P)DISABLE") @@ -370,13 +281,13 @@ record(ao, "$(P)FIELD:RATE:SP") { field(DESC, "Set field sweep rate") field(DTYP, "stream") field(SCAN, "Passive") - field(OUT, "@OxInstIPS.protocol setFieldSweepRate $(PORT)") + field(OUT, "@$(PROTO) setFieldSweepRate $(PORT)") field(EGU, "T/min") field(PREC, "4") field(DRVH, "$(MAX_SWEEP_RATE)") field(DRVL, "0") field(ASG, "$(MANAGER_ASG)") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:FIELD:RATE:SP") field(SDIS, "$(P)DISABLE") @@ -388,10 +299,10 @@ record(ai, "$(P)VOLT:LIMIT:SOFTWARE") { field(DESC, "Software voltage limit readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getSoftwareVoltageLimit $(PORT)") + field(INP, "@$(PROTO) getSoftwareVoltageLimit $(PORT)") field(EGU, "V") field(PREC, "8") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:SOFTWAREVOLTAGELIMIT") field(SDIS, "$(P)DISABLE") @@ -404,33 +315,14 @@ record(ai, "$(P)MAGNET:CURR:PERSISTENT") { field(DESC, "Persistent magnet current readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getPersistentMagnetCurrent $(PORT)") + field(INP, "@$(PROTO) getPersistentMagnetCurrent $(PORT)") field(EGU, "A") field(PREC, "4") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:PERSISTENTMAGNETCURRENT") field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} -# The current at which a trip last occurred. Am not sure if by trip, they mean -# a quench or a problem with the level meter. Believe the unit will take the current -# and field to zero if there is a trip, so this parameter preserves what was happening -# at the time of the trip. -record(ai, "$(P)CURR:TRIP") { - field(DESC, "Trip current readback") - field(DTYP, "stream") - field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getTripCurrent $(PORT)") - field(EGU, "A") - field(PREC, "4") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:TRIPCURRENT") - field(SDIS, "$(P)DISABLE") - info(archive, "VAL") } @@ -439,83 +331,16 @@ record(ai, "$(P)MAGNET:FIELD:PERSISTENT") { field(DESC, "Persistent magnet field readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getPersistentMagnetField $(PORT)") + field(INP, "@$(PROTO) getPersistentMagnetField $(PORT)") field(EGU, "T") field(PREC, "5") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:PERSISTENTMAGNETFIELD") - field(SDIS, "$(P)DISABLE") - - info(INTEREST, "LOW") - - info(archive, "VAL") -} -# The field at which a trip last occurred. See current for explanation. -record(ai, "$(P)FIELD:TRIP") { - field(DESC, "Trip field readback") - field(DTYP, "stream") - field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getTripField $(PORT)") - field(EGU, "T") - field(PREC, "5") - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:TRIPFIELD") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} - -# The current being provided to the heater. -# Our magnets do not have heaters, so this is not relevant. -record(ai, "$(P)HEATER:CURR") { - field(DESC, "Heater current readback") - field(DTYP, "stream") - field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getHeaterCurrent $(PORT)") - field(EGU, "mA") - field(PREC, "4") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:HEATERCURRENT") + field(SIOL, "$(P)SIM:PERSISTENTMAGNETFIELD") field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} -# The lower limit for the current. This refers to a limit on the controller and -# is nothing to do with EPICS record limit or alarm fields. -record(ai, "$(P)CURR:LIMIT:NEG") { - field(DESC, "Neg current limit readback") - field(DTYP, "stream") - field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getNegCurrentLimit $(PORT)") - field(EGU, "A") - field(PREC, "4") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:NEGCURRENTLIMIT") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} + info(INTEREST, "LOW") -# The higher limit for the current. This refers to a limit on the controller and -# is nothing to do with EPICS record limit or alarm fields. -record(ai, "$(P)CURR:LIMIT:POS") { - field(DESC, "Pos current limit readback") - field(DTYP, "stream") - field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getPosCurrentLimit $(PORT)") - field(EGU, "A") - field(PREC, "4") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:POSCURRENTLIMIT") - field(SDIS, "$(P)DISABLE") - info(archive, "VAL") } @@ -526,14 +351,14 @@ record(ai, "$(P)RESISTANCE:LEAD") { field(DESC, "Leadresistance readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getLeadResistance $(PORT)") + field(INP, "@$(PROTO) getLeadResistance $(PORT)") field(EGU, "mohm") field(PREC, "5") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:LEADRESISTANCE") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } @@ -543,117 +368,17 @@ record(ai, "$(P)MAGNET:INDUCTANCE") { field(DESC, "Magnet inductance readback") field(DTYP, "stream") field(SCAN, "1 second") - field(INP, "@OxInstIPS.protocol getMagnetInductance $(PORT)") + field(INP, "@$(PROTO) getMagnetInductance $(PORT)") field(EGU, "H") field(PREC, "5") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:MAGNETINDUCTANCE") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} -# # Run the Examine Status command, X. -# The reply comes back and is split amongst other records. -record(stringin, "$(P)GET:STATUS") { - field(DESC, "Examine status") - field(DTYP, "stream") - field(INP, "@OxInstIPS.protocol getStatus($(P)) $(PORT)") - field(SCAN, "1 second") - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:DONOTHING") + field(SIOL, "$(P)SIM:MAGNETINDUCTANCE") field(SDIS, "$(P)DISABLE") -} - -# # Readback from m of Xmn part of Examine command return. -record(mbbi, "$(P)STS:SYSTEM:FAULT") { - field(DESC, "System fault status") - field(DTYP, "Soft Channel") - field(SCAN, "Passive") - field(ZRST, "Normal") - field(ZRVL, "0") - field(ZRSV, "NO_ALARM") - field(ONST, "Quenched") - field(ONVL, "1") - field(ONSV, "MAJOR") - field(TWST, "Overheated") - field(TWVL, "2") - field(TWSV, "MAJOR") - field(FRST, "Warming Up") - field(FRVL, "4") - field(FRSV, "MAJOR") - field(EIST, "Fault") - field(EIVL, "8") - field(EISV, "MAJOR") - - info(archive, "VAL") -} -# # Readback from n of Xmn part of Examine command return. -record(mbbi, "$(P)STS:SYSTEM:LIMIT") { - field(DESC, "System limit status") - field(DTYP, "Soft Channel") - field(SCAN, "Passive") - field(ZRST, "Normal") - field(ZRVL, "0") - field(ZRSV, "NO_ALARM") - field(ONST, "On +ve V Limit") - field(ONVL, "1") - field(ONSV, "MINOR") - field(TWST, "On -ve V Limit") - field(TWVL, "2") - field(TWSV, "MINOR") - field(FRST, "Current too -ve") - field(FRVL, "4") - field(FRSV, "MINOR") - field(EIST, "Current too +ve") - field(EIVL, "8") - field(EISV, "MINOR") - info(archive, "VAL") } -# Readback from Hn part of Examine command return. -# 0 switch closed, 1 switch open, 2 switch closed, 5 heater is on but low current, 8 no switch fitted. -record(mbbi, "$(P)HEATER:STATUS") { - field(DESC, "Heater status") - field(DTYP, "Soft Channel") - field(SCAN, "Passive") - field(ZRST, "Off Mag at 0") - field(ZRVL, "0") - field(ONST, "On") - field(ONVL, "1") - field(TWST, "Off Mag at F") - field(TWVL, "2") - field(FVST, "Heater Fault") - field(FVVL, "5") - field(FVSV, "MAJOR") - field(EIST, "No Switch") - field(EIVL, "8") - field(EISV, "MAJOR") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:HEATER:STATUS") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} - -record(bo, "$(P)HEATER:STATUS:SP") { - field(DESC, "Set Remote/Local Control") - field(DTYP, "stream") - field(SCAN, "Passive") - field(OUT, "@OxInstIPS.protocol setHeaterStatus $(PORT)") - field(ZNAM, "Off") - field(ONAM, "On") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:HEATER:STATUS:SP") - field(SDIS, "$(P)DISABLE") -} - # Amount of time to wait for heater to warm up/cool down. **CAN CAUSE MAGNET TO QUENCH IF SET TOO LOW** # Oxford Instruments labview driver uses 30s. ISIS cryogenics have asked us to increase this to 60s, # which is more conservative. @@ -667,7 +392,7 @@ record(ao, "$(P)HEATER:WAITTIME") { info(archive, "VAL") } -# CALC record to coerce heater status values. Heater can be off in states 0 or 2, and in error in states 5 or 8, +# CALC record to coerce heater status values. Heater can be off in states 0 or 2, and in error in states 5 or 8, # and circular buffer (N to 1 Low Value) only looks for lowest (0). # Output 1 only if heater is on, 0 if off and all other states, including errors. @@ -678,6 +403,19 @@ record(calc, "$(P)HEATER:_STATUS_CALC") { info(archive, "VAL") } +record(bo, "$(P)HEATER:STATUS:SP") { + field(DESC, "Set Remote/Local Control") + field(DTYP, "stream") + field(SCAN, "Passive") + field(OUT, "@$(PROTO) setHeaterStatus $(PORT)") + field(ZNAM, "Off") + field(ONAM, "On") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:HEATER:STATUS:SP") + field(SDIS, "$(P)DISABLE") +} + # COMPRESS Record with circular buffer to store $(HEATER_WAITTIME) worth of HEATER:STATUS values # Used with second COMPRESS record below to check heater has been on for at least $(HEATER_WAITTIME) after starting IOC @@ -704,7 +442,8 @@ record(compress, "$(P)HEATER:_STATUS_BUFFER_LOWEST") { info(archive, "VAL") } -# BO record to indicate whether or not heater been on for at least $(HEATER_WAITTIME). Monitored by statemachine to determine whether or not OK to set field. +# BO record to indicate whether or not heater been on for at least $(HEATER_WAITTIME). +# Monitored by statemachine to determine whether or not OK to set field. record(bo, "$(P)HEATER:ONTIME_OK") { field(DESC, "Heater on for at least $(HEATER_WAITTIME)s") @@ -717,7 +456,6 @@ record(bo, "$(P)HEATER:ONTIME_OK") { info(archive, "VAL") } - # Readback from m of Mmn part of Examine command return. # The Display is in Amps or Tesla. The Magnet Sweep is fast or slow. record(mbbi, "$(P)SWEEPMODE:PARAMS") { @@ -744,53 +482,17 @@ record(mbbi, "$(P)SWEEPMODE:PARAMS") { field(EIVL, "8") field(NIST, "Tesla Unaffected") field(NIVL, "9") - + field(VAL, "3") field(PINI, "YES") - + field(SIML, "$(P)SIM") field(SIOL, "$(P)SIM:SWEEPMODE:PARAMS") field(SDIS, "$(P)DISABLE") - + info(archive, "VAL") } -# To set the sweep and display mode - its a bit confusing as there -# are duplicates, but we do not present this choice to the user. -# -record(mbbo, "$(P)SWEEPMODE:PARAMS:SP") { - field(DESC, "Set sweep and display mode.") - field(DTYP, "stream") - field(SCAN, "Passive") - field(ZRST, "Amps Fast") - field(ZRVL, "0") - field(ONST, "Tesla Fast") - field(ONVL, "1") - field(TWST, "Amps Fast") - field(TWVL, "2") - field(THST, "Tesla Fast") - field(THVL, "3") - field(FRST, "Amps Slow") - field(FRVL, "4") - field(FVST, "Tesla Slow") - field(FVVL, "5") - field(SXST, "Amps Slow") - field(SXVL, "6") - field(SVST, "Tesla Slow") - field(SVVL, "7") - field(EIST, "Amps Unaffected") - field(EIVL, "8") - field(NIST, "Tesla Unaffected") - field(NIVL, "9") - field(OUT, "@OxInstIPS.protocol setMode $(PORT)") - - field(VAL, "3") - field(PINI, "YES") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:SWEEPMODE:PARAMS:SP") - field(SDIS, "$(P)DISABLE") -} # Readback from n of Mmn part of Examine command return. # (Ignore the Pmn part of the Examine command return - no records for this.) @@ -807,58 +509,15 @@ record(mbbi, "$(P)STS:SWEEPMODE:SWEEP") { field(TWVL, "2") field(THST, "Swping & Lmting") field(THVL, "3") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:STS:SWEEPMODE:SWEEP") - field(SDIS, "$(P)DISABLE") - - info(archive, "VAL") -} -# To capture bits of mismatching status protocol. -# We do not do much with it at the moment. -record(stringin, "$(P)DBG:STS:MISMATCH") { - field(DESC, "Mismatching protocol string.") - field(DTYP, "Soft Channel") - field(SCAN, "Passive") -} - -# Diddle with the comms and reported resolution. -# This is the nasty Q command which does not reply and whose -# info does not get reported by the status command. -# This may be needed after power cycle of IPS or if it has -# been connected to the Oxford Instruments Windows Application -# to allow EPICS to talk to it and to allow the resolution to be extended. -# Are not supporting setting these things individually, just setting -# what we want. -record(ao, "$(P)SET:COMMSRES") { - field(DESC, "Set ext. resn, no LF") - field(DTYP, "stream") - field(SCAN, "Passive") - field(VAL, "6") - field(PINI, "YES") - field(OUT, "@OxInstIPS.protocol setCommsResExtended $(PORT)") - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:DONOTHING") + field(SIOL, "$(P)SIM:STS:SWEEPMODE:SWEEP") field(SDIS, "$(P)DISABLE") -} -# Diddle with the comms wait interval. -# Probably will not need this, but put it here in case we do. Will not put access to this -# on the GUI. -record(ao, "$(P)SET:WAITINTERVAL") { - field(DESC, "Set wait interval") - field(DTYP, "stream") - field(SCAN, "Passive") - field(EGU, "ms") - field(OUT, "@OxInstIPS.protocol setWaitInterval $(PORT)") - - field(SIML, "$(P)SIM") - field(SIOL, "$(P)SIM:DONOTHING") - field(SDIS, "$(P)DISABLE") + info(archive, "VAL") } +# PERSISTENT pv is the magnet persistent mode in the cryomagnet statemachine. record(bo, "$(P)PERSISTENT") { field(DESC, "Set magnet to persistent") field(ZNAM, "NO") @@ -870,15 +529,14 @@ record(bo, "$(P)PERSISTENT") { } # Play nicely with blocks/genie_python -alias("$(P)PERSISTENT", "$(P)PERSISTENT:SP") - +alias("$(P)PERSISTENT", "$(P)PERSISTENT:SP") record(mbbo, "$(P)STATEMACHINE") { field(DESC, "What the IOC is doing") - + field(ZRVL, "0") field(ZRST, "Initial state") - + field(ONVL, "1") field(ONST, "At field") @@ -899,7 +557,7 @@ record(mbbo, "$(P)STATEMACHINE") { field(SVVL, "7") field(SVST, "Set PSU to zero") - + info(archive, "VAL") } @@ -928,31 +586,6 @@ alias("$(P)FIELD:SP", "$(P)FIELD:USER:SP") # "User" setpoint is same as "normal record(ao, "$(P)SIM:DONOTHING") {} -record(mbbo, "$(P)SIM:SWEEPMODE:PARAMS") { - field(ZRST, "Amps Fast") - field(ZRVL, "0") - field(ONST, "Tesla Fast") - field(ONVL, "1") - field(TWST, "Amps Fast") - field(TWVL, "2") - field(THST, "Tesla Fast") - field(THVL, "3") - field(FRST, "Amps Slow") - field(FRVL, "4") - field(FVST, "Tesla Slow") - field(FVVL, "5") - field(SXST, "Amps Slow") - field(SXVL, "6") - field(SVST, "Tesla Slow") - field(SVVL, "7") - field(EIST, "Amps Unaffected") - field(EIVL, "8") - field(NIST, "Tesla Unaffected") - field(NIVL, "9") -} - -alias("$(P)SIM:SWEEPMODE:PARAMS", "$(P)SIM:SPEEPMODE:PARAMS:SP") - record(bo, "$(P)SIM:HEATER:STATUS") { field(ZNAM, "Off") field(ONAM, "On") @@ -987,16 +620,8 @@ record(mbbo, "$(P)SIM:ACTIVITY") { } alias("$(P)SIM:ACTIVITY", "$(P)SIM:ACTIVITY:SP") - -record(mbbo, "$(P)SIM:CONTROL") { - field(ZRST, "Local & Locked") - field(ZRVL, "0") - field(ONST, "Remote & Locked") - field(ONVL, "1") - field(TWST, "Local & Unlocked") - field(TWVL, "2") - field(THST, "Remote & Unlocked") - field(THVL, "3") +record(bo, "$(P)SIM:HEATER:STATUS") { + field(ZNAM, "Off") + field(ONAM, "On") } -alias("$(P)SIM:CONTROL", "$(P)SIM:CONTROL:SP") diff --git a/IPS/IPS-IOC-01App/Db/ips_legacy.db b/IPS/IPS-IOC-01App/Db/ips_legacy.db new file mode 100644 index 000000000..b3b39b2ac --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/ips_legacy.db @@ -0,0 +1,398 @@ +# Set the PROTOCOL PV to LEGACY +# This facilitates the UI to show/hide protocol specific settings +record (stringin, "$(P)PROTOCOL") +{ + field(DESC, "Inform the UI which protocol to use") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(VAL, "LEGACY") + field(PINI, "YES") +} + + +# # Readback from Cn part of Examine command return. +record(mbbi, "$(P)CONTROL") { + field(DESC, "Control status") + field(DTYP, "Soft Channel") + field(SCAN, "1 second") + field(ZRST, "Local & Locked") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "Remote & Locked") + field(ONVL, "1") + field(ONSV, "NO_ALARM") + field(TWST, "Local & Unlocked") + field(TWVL, "2") + field(TWSV, "NO_ALARM") + field(THST, "Remote & Unlocked") + field(THVL, "3") + field(THSV, "NO_ALARM") + + # Modes 4-7 come back from device. Manual does not make it clear what the + # differences are. Keeping them as separate items in case they are useful + # for diagnostics later on. + field(FRST, "Auto-Run-Down") + field(FRVL, "4") + field(FRSV, "MAJOR") + field(FVST, "Auto-Run-Down") + field(FVVL, "5") + field(FVSV, "MAJOR") + field(SXST, "Auto-Run-Down") + field(SXVL, "6") + field(SXSV, "MAJOR") + field(SVST, "Auto-Run-Down") + field(SVVL, "7") + field(SVSV, "MAJOR") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:CONTROL") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") + info(alarm, "IPS") +} + +# Grab remote vs local control +record(mbbo, "$(P)CONTROL:SP") { + field(DESC, "Set remote/local control") + field(DTYP, "stream") + field(SCAN, "Passive") + field(OUT, "@OxInstIPS.protocol setControl $(PORT)") + field(ZRST, "Local & Locked") + field(ZRVL, "0") + field(ONST, "Remote & Locked") + field(ONVL, "1") + field(TWST, "Local & Unlocked") + field(TWVL, "2") + field(THST, "Remote & Unlocked") + field(THVL, "3") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:CONTROL:SP") + field(SDIS, "$(P)DISABLE") +} + +# Readback from An part of Examine command return. +# Hold means maintaining present current. +# Clamped means you cannot adjust it - powers up in this +# state. Only the set activity hold command can get out +# of the clamped state. Hold will interrupt a sweep. +record(mbbi, "$(P)ACTIVITY") { + field(DESC, "Activity status") + field(DTYP, "Soft Channel") + field(SCAN, "1 second") + field(ZRST, "Hold") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "To Setpoint") + field(ONVL, "1") + field(ONSV, "NO_ALARM") + field(TWST, "To Zero") + field(TWVL, "2") + field(TWSV, "NO_ALARM") + field(FRST, "Clamped") + field(FRVL, "4") + field(FRSV, "MAJOR") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:ACTIVITY") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + +# The current at which a trip last occurred. Am not sure if by trip, they mean +# a quench or a problem with the level meter. Believe the unit will take the current +# and field to zero if there is a trip, so this parameter preserves what was happening +# at the time of the trip. +record(ai, "$(P)CURR:TRIP") { + field(DESC, "Trip current readback") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS.protocol getTripCurrent $(PORT)") + field(EGU, "A") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:TRIPCURRENT") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + +# The field at which a trip last occurred. See current for explanation. +record(ai, "$(P)FIELD:TRIP") { + field(DESC, "Trip field readback") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS.protocol getTripField $(PORT)") + field(EGU, "T") + field(PREC, "5") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:TRIPFIELD") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + +# The current being provided to the heater. +record(ai, "$(P)HEATER:CURR") { + field(DESC, "Heater current readback") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS.protocol getHeaterCurrent $(PORT)") + field(EGU, "mA") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:HEATERCURRENT") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + +# The lower limit for the current. This refers to a limit on the controller and +# is nothing to do with EPICS record limit or alarm fields. +record(ai, "$(P)CURR:LIMIT:NEG") { + field(DESC, "Neg current limit readback") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS.protocol getNegCurrentLimit $(PORT)") + field(EGU, "A") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:NEGCURRENTLIMIT") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + +# The higher limit for the current. This refers to a limit on the controller and +# is nothing to do with EPICS record limit or alarm fields. +record(ai, "$(P)CURR:LIMIT:POS") { + field(DESC, "Pos current limit readback") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS.protocol getPosCurrentLimit $(PORT)") + field(EGU, "A") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:POSCURRENTLIMIT") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + +# # Run the Examine Status command, X. +# The reply comes back and is split amongst other records. +record(stringin, "$(P)GET:STATUS") { + field(DESC, "Examine status") + field(DTYP, "stream") + field(INP, "@OxInstIPS.protocol getStatus($(P)) $(PORT)") + field(SCAN, "1 second") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:DONOTHING") + field(SDIS, "$(P)DISABLE") +} + +# # Readback from m of Xmn part of Examine command return. +record(mbbi, "$(P)STS:SYSTEM:FAULT") { + field(DESC, "System fault status") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(ZRST, "Normal") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "Quenched") + field(ONVL, "1") + field(ONSV, "MAJOR") + field(TWST, "Overheated") + field(TWVL, "2") + field(TWSV, "MAJOR") + field(FRST, "Warming Up") + field(FRVL, "4") + field(FRSV, "MAJOR") + field(EIST, "Fault") + field(EIVL, "8") + field(EISV, "MAJOR") + + info(archive, "VAL") +} + +# # Readback from n of Xmn part of Examine command return. +record(mbbi, "$(P)STS:SYSTEM:LIMIT") { + field(DESC, "System limit status") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(ZRST, "Normal") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "On +ve V Limit") + field(ONVL, "1") + field(ONSV, "MINOR") + field(TWST, "On -ve V Limit") + field(TWVL, "2") + field(TWSV, "MINOR") + field(FRST, "Current too -ve") + field(FRVL, "4") + field(FRSV, "MINOR") + field(EIST, "Current too +ve") + field(EIVL, "8") + field(EISV, "MINOR") + + info(archive, "VAL") +} + +# Readback from Hn part of Examine command return. +# 0 switch closed, 1 switch open, 2 switch closed, 5 heater is on but low current, 8 no switch fitted. +record(mbbi, "$(P)HEATER:STATUS") { + field(DESC, "Heater status") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(ZRST, "Off Mag at 0") + field(ZRVL, "0") + field(ONST, "On") + field(ONVL, "1") + field(TWST, "Off Mag at F") + field(TWVL, "2") + field(FVST, "Heater Fault") + field(FVVL, "5") + field(FVSV, "MAJOR") + field(EIST, "No Switch") + field(EIVL, "8") + field(EISV, "MAJOR") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:HEATER:STATUS") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + +# To capture bits of mismatching status protocol. +# We do not do much with it at the moment. +record(stringin, "$(P)DBG:STS:MISMATCH") { + field(DESC, "Mismatching protocol string.") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") +} + +# Diddle with the comms and reported resolution. +# This is the nasty Q command which does not reply and whose +# info does not get reported by the status command. +# This may be needed after power cycle of IPS or if it has +# been connected to the Oxford Instruments Windows Application +# to allow EPICS to talk to it and to allow the resolution to be extended. +# Are not supporting setting these things individually, just setting +# what we want. +record(ao, "$(P)SET:COMMSRES") { + field(DESC, "Set ext. resn, no LF") + field(DTYP, "stream") + field(SCAN, "Passive") + field(VAL, "6") + field(PINI, "YES") + field(OUT, "@OxInstIPS.protocol setCommsResExtended $(PORT)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:DONOTHING") + field(SDIS, "$(P)DISABLE") +} + +# Diddle with the comms wait interval. +# Probably will not need this, but put it here in case we do. Will not put access to this +# on the GUI. +record(ao, "$(P)SET:WAITINTERVAL") { + field(DESC, "Set wait interval") + field(DTYP, "stream") + field(SCAN, "Passive") + field(EGU, "ms") + field(OUT, "@OxInstIPS.protocol setWaitInterval $(PORT)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:DONOTHING") + field(SDIS, "$(P)DISABLE") +} + +record(mbbo, "$(P)SIM:SWEEPMODE:PARAMS") { + field(ZRST, "Amps Fast") + field(ZRVL, "0") + field(ONST, "Tesla Fast") + field(ONVL, "1") + field(TWST, "Amps Fast") + field(TWVL, "2") + field(THST, "Tesla Fast") + field(THVL, "3") + field(FRST, "Amps Slow") + field(FRVL, "4") + field(FVST, "Tesla Slow") + field(FVVL, "5") + field(SXST, "Amps Slow") + field(SXVL, "6") + field(SVST, "Tesla Slow") + field(SVVL, "7") + field(EIST, "Amps Unaffected") + field(EIVL, "8") + field(NIST, "Tesla Unaffected") + field(NIVL, "9") +} + +# To set the sweep and display mode - its a bit confusing as there +# are duplicates, but we do not present this choice to the user. +# +record(mbbo, "$(P)SWEEPMODE:PARAMS:SP") { + field(DESC, "Set sweep and display mode.") + field(DTYP, "stream") + field(SCAN, "Passive") + field(ZRST, "Amps Fast") + field(ZRVL, "0") + field(ONST, "Tesla Fast") + field(ONVL, "1") + field(TWST, "Amps Fast") + field(TWVL, "2") + field(THST, "Tesla Fast") + field(THVL, "3") + field(FRST, "Amps Slow") + field(FRVL, "4") + field(FVST, "Tesla Slow") + field(FVVL, "5") + field(SXST, "Amps Slow") + field(SXVL, "6") + field(SVST, "Tesla Slow") + field(SVVL, "7") + field(EIST, "Amps Unaffected") + field(EIVL, "8") + field(NIST, "Tesla Unaffected") + field(NIVL, "9") + field(OUT, "@$(PROTO) setMode $(PORT)") + + field(VAL, "3") + field(PINI, "YES") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:SWEEPMODE:PARAMS:SP") + field(SDIS, "$(P)DISABLE") +} + +alias("$(P)SIM:SWEEPMODE:PARAMS", "$(P)SIM:SPEEPMODE:PARAMS:SP") + + +record(mbbo, "$(P)SIM:CONTROL") { + field(ZRST, "Local & Locked") + field(ZRVL, "0") + field(ONST, "Remote & Locked") + field(ONVL, "1") + field(TWST, "Local & Unlocked") + field(TWVL, "2") + field(THST, "Remote & Unlocked") + field(THVL, "3") +} + +alias("$(P)SIM:CONTROL", "$(P)SIM:CONTROL:SP") diff --git a/IPS/IPS-IOC-01App/Db/ips_scpi.db b/IPS/IPS-IOC-01App/Db/ips_scpi.db new file mode 100644 index 000000000..510b28ba9 --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/ips_scpi.db @@ -0,0 +1,271 @@ +# Set the PROTOCOL PV to SCPI +# This facilitates the UI to show/hide protocol specific settings +record (stringin, "$(P)PROTOCOL") +{ + field(DESC, "Inform the UI which protocol to use") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(VAL, "SCPI") + field(PINI, "YES") +} + + +# Readback from STAT:DEV:GRPZ:PSU:ACTN command return (in getActivity()). +# Hold means maintaining present current. +# Clamped means you cannot adjust it - powers up in this +# state. Only the set activity hold command can get out +# of the clamped state. Hold will interrupt a sweep. +record(mbbi, "$(P)ACTIVITY") { + field(DESC, "Activity status") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS_SCPI.protocol getActivity($(P)) $(PORT)") + field(ZRST, "Hold") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "To Setpoint") + field(ONVL, "1") + field(ONSV, "NO_ALARM") + field(TWST, "To Zero") + field(TWVL, "2") + field(TWSV, "NO_ALARM") + field(FRST, "Clamped") + field(FRVL, "4") + field(FRSV, "MAJOR") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:ACTIVITY") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + + + + +# --------------- The following work around limitation of getting legacy status from SCPI protocol ------------- +# Note that the mbbiDirect is split into individual bi records for each status bit, via the +# scpi_system_alarms_discrete.template and substitution files. + +# Get the status DWORD from each group UID +record(mbbiDirect, "$(P)GET:MAGNET:SUPPLY:STATUS") { + field(DESC, "Examine status") + field(DTYP, "stream") + field(INP, "@OxInstIPS_SCPI.protocol getMagnetSupplyStatus($(P)) $(PORT)") + field(NOBT, "32") + field(SCAN, "1 second") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:DONOTHING") + field(SDIS, "$(P)DISABLE") +} + +# The over temperature status should be an or'd output from the numerous temperature alarms +record(calc, "$(P)MAGNET:SUPPLY:STATUS:OVERTEMP:CALC") { + field(DESC, "Temperature status calc (combined)") + field(SCAN, "Passive") + field(INPA, "$(P)MAGNET:SUPPLY:STATUS:OTRUNDOWNRES CP MS") + field(INPB, "$(P)MAGNET:SUPPLY:STATUS:OTSENSERES CP MS") + field(INPC, "$(P)MAGNET:SUPPLY:STATUS:OTPCB CP MS") + field(INPD, "$(P)MAGNET:SUPPLY:STATUS:OTSENSEAMP CP MS") + field(INPE, "$(P)MAGNET:SUPPLY:STATUS:OTAMP1 CP MS") + field(INPF, "$(P)MAGNET:SUPPLY:STATUS:OTAMP2 CP MS") + field(CALC, "A|B|C|D|E|F") +} + +# Determine the Over Temperature status from the or'd calc record (OVERTEMP:CALC) +record(bi, "$(P)MAGNET:SUPPLY:STATUS:OVERTEMP") { + field(DESC, "Temperature status (combined)") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(INP, "$(P)MAGNET:SUPPLY:STATUS:OVERTEMP:CALC CP MS") + field(ZNAM, "No") + field(ONAM, "Yes") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") +} + +# -------------------------------------------------------------------------------------------------------------- + +## Derive the SYSTEM:HWFAULT status from the status bits +## This collates the various possible hardware faults into a single record, +## which in the legacy protocol is a single value (Xm bit 4). +record(calc, "$(P)STS:SYSTEM:HWFAULT:CALC") { + field(DESC, "System hardware fault status calc") + field(SCAN, "Passive") + field(INPA, "$(P)MAGNET:SUPPLY:STATUS:SWHTRMISMATCH CP MS") + field(INPB, "$(P)MAGNET:SUPPLY:STATUS:CALIBFAIL CP MS") + field(INPC, "$(P)MAGNET:SUPPLY:STATUS:FWFAIL CP MS") + field(INPD, "$(P)MAGNET:SUPPLY:STATUS:RRFAIL CP MS") + field(INPE, "$(P)MAGNET:SUPPLY:STATUS:RS485FAIL CP MS") + field(INPF, "$(P)MAGNET:SUPPLY:STATUS:CATCH CP MS") + field(INPG, "$(P)MAGNET:SUPPLY:STATUS:PWMCUTOFF CP MS") + field(INPH, "$(P)MAGNET:SUPPLY:STATUS:VADCERROR CP MS") + field(INPI, "$(P)MAGNET:SUPPLY:STATUS:IADCERROR CP MS") + field(CALC, "(A>0||B>0||C>0||D>0||E>0||F>0||G>0||H>0||I>0) ? 1 : 0") +} + +## Derive the SYSTEM:FAULT status from the status bits +## This collates the various possible faults into a single record, in alignment with the legacy protocol. +record(calc, "$(P)STS:SYSTEM:FAULT:CALC") { + field(DESC, "System fault status calc") + field(SCAN, "Passive") + field(INPA, "$(P)MAGNET:SUPPLY:STATUS:QUENCHED CP MS") + field(INPB, "$(P)MAGNET:SUPPLY:STATUS:OVERTEMP CP MS") + field(INPC, "$(P)STS:SYSTEM:HWFAULT:CALC CP MS") + field(CALC, "(A>0) ? 1 : (B>0) ? 2 : (C>0) ? 8 : 0") +} + +# # Readback from m of Xmn part of Examine command return. +record(mbbi, "$(P)STS:SYSTEM:FAULT") { + field(DESC, "System fault status") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(INP, "$(P)STS:SYSTEM:FAULT:CALC CP MS") + field(ZRST, "Normal") + field(ZRVL, "0") + field(ZRSV, "NO_ALARM") + field(ONST, "Quenched") + field(ONVL, "1") + field(ONSV, "MAJOR") + field(TWST, "Overheated") + field(TWVL, "2") + field(TWSV, "MAJOR") + field(FRST, "Warming Up") + field(FRVL, "4") + field(FRSV, "MAJOR") + field(EIST, "Fault") + field(EIVL, "8") + field(EISV, "MAJOR") + + info(archive, "VAL") +} + +# Readback from SWHT command. +# OFF -> switch closed, ON -> switch open. +record(mbbi, "$(P)HEATER:STATUS") { + field(DESC, "Heater status") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS_SCPI.protocol getHeaterStatus $(PORT)") + field(ZRST, "Off") + field(ZRVL, "0") + field(ONST, "On") + field(ONVL, "1") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:HEATER:STATUS") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + + +# To capture bits of mismatching status protocol. +# We do not do much with it at the moment. +record(stringin, "$(P)DBG:STS:MISMATCH") { + field(DESC, "Mismatching protocol string.") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") +} + +# In the legacy version, this used to be the readback from n of Mmn part of Examine command return. +# 0 output constant, 1, 2, 3 output changing +# The SCPI protocol doesn't directly offer this, so it has to be derived via the ACTIVITY record (DEV:GRPZ:PSU:ACTN) +# Direction from Alex Jones: "A response of HOLD or CLMP would be equivalent to n=0 in the response of the X command +# in the old protocol. Responses of RTOS or RTOZ would be equivalent to n=1. +# There is no equivalent for the m=0,1 fast/slow ramps, but we do not use this feature anyway." + +record(calcout, "$(P)_SWEEPMODE:SWEEP:CALC") { + field(INPA, "$(P)ACTIVITY.RVAL CP") + # 0 = HOLD, 1 = RTOS, 2 = RTOZ, 4 = CLMP + field(CALC, "((A==0)||(A==4))?0:1") + field(OUT, "$(P)STS:SWEEPMODE:SWEEP PP") + field(OOPT, "Every Time") +} + +# This record has been added to the SCPI implementation simply to satisfy the state machine logic +# in cryomagnet.st. The legacy record is mbbo, but this is mbbi as it does not actually set +# anything in the device. +# +record(mbbi, "$(P)SWEEPMODE:PARAMS:SP") { + field(DESC, "Set sweep and display mode.") + field(DTYP, "stream") + field(SCAN, "Passive") + field(ZRST, "Amps Fast") + field(ZRVL, "0") + field(ONST, "Tesla Fast") + field(ONVL, "1") + field(TWST, "Amps Fast") + field(TWVL, "2") + field(THST, "Tesla Fast") + field(THVL, "3") + field(FRST, "Amps Slow") + field(FRVL, "4") + field(FVST, "Tesla Slow") + field(FVVL, "5") + field(SXST, "Amps Slow") + field(SXVL, "6") + field(SVST, "Tesla Slow") + field(SVVL, "7") + field(EIST, "Amps Unaffected") + field(EIVL, "8") + field(NIST, "Tesla Unaffected") + field(NIVL, "9") + + field(VAL, "3") + field(PINI, "YES") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:SWEEPMODE:PARAMS:SP") + field(SDIS, "$(P)DISABLE") +} + +# The temperature of the magnet MB1.T1 +record(ai, "$(P)TEMP:MAGNET") { + field(DESC, "Magnet temperature") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS_SCPI.protocol getMagnetTemperature $(PORT)") + field(EGU, "K") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:TEMP:MAGNET") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + +# The temperature of the lambda plate DB8.T1 +record(ai, "$(P)TEMP:LAMBDAPLATE") { + field(DESC, "DB8.T1 temperature") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS_SCPI.protocol getLambdaPlateTemperature $(PORT)") + field(EGU, "K") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:TEMP:LAMBDAPLATE") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} + +# The temperature of the lambda plate DB8.T1 +record(ai, "$(P)PRESSURE") { + field(DESC, "DB5.P1 pressure") + field(DTYP, "stream") + field(SCAN, "1 second") + field(INP, "@OxInstIPS_SCPI.protocol getPressure $(PORT)") + field(EGU, "mBar") + field(PREC, "4") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:PRESSURE") + field(SDIS, "$(P)DISABLE") + + info(archive, "VAL") +} diff --git a/IPS/IPS-IOC-01App/Db/ips_scpi_levels.db b/IPS/IPS-IOC-01App/Db/ips_scpi_levels.db new file mode 100644 index 000000000..62ecf85fb --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/ips_scpi_levels.db @@ -0,0 +1,312 @@ +#################################################################### +# This provide the records for the Mercury IPS Level Sensor board +#################################################################### + +# ========= HELIUM ========= # + +record(ai, "$(P)LVL:HE:EMPTY:RES") { + field(DESC, "Get empty helium resistance value") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeEmptyRes $(PORT)") + field(EGU, "Ohm") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:EMPTY:RES") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:HE:EMPTY:RES:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set empty helium resistance value") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelHeEmptyRes $(PORT)") + field(EGU, "Ohm") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:EMPTY:RES:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:HE:FULL:RES") { + field(DESC, "Get full helium resistance value") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeFullRes $(PORT)") + field(EGU, "Ohm") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:FULL:RES") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:HE:FULL:RES:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set full helium resistance value") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelHeFullRes $(PORT)") + field(EGU, "Ohm") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:FULL:RES:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:HE:REFILL:START") { + field(DESC, "Get high He level that starts the refill") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeFillStartThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:REFILL:START") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:HE:REFILL:START:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set high He level that starts the refill") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelHeFillStartThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)LVL:HE:REFILL:START:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:HE:REFILL:STOP") { + field(DESC, "Get high He level that stops the refill") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeFillStopThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:REFILL:STOP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:HE:REFILL:STOP:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set high He level that stops the refill") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelHeFillStopThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)LVL:HE:REFILL:STOP:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:HE:LEVEL") { + field(DESC, "Get helium level") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeliumLevel $(PORT)") + field(EGU, "%") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:LEVEL") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(bi, "$(P)LVL:HE:PULSE:READ:RATE") { + field(DESC, "Get high helium reading pulse rate") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelHeReadingRate $(PORT)") + field(ZNAM, "Fast") + field(ONAM, "Slow") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:PULSE:READ:RATE") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(bo, "$(P)LVL:HE:PULSE:READ:RATE:SP") { + field(DESC, "Set high helium reading pulse rate") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelHeReadingRate $(PORT)") + field(ZNAM, "Fast") + field(ONAM, "Slow") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:HE:PULSE:READ:RATE:SP") + field(SDIS, "$(P)DISABLE") +} + + + +# ========= NITROGEN ========= ## + +record(ai, "$(P)LVL:NIT:READ:INTERVAL") { + field(DESC, "Get the N2 sensor read interval (ms)") + field(DTYP, "stream") + field(SCAN, "5 second") + field(EGU, "ms") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitReadInterval $(PORT)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:READ:INTERVAL") + field(SDIS, "$(P)DISABLE") +} + +record(ao, "$(P)LVL:NIT:READ:INTERVAL:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set the N2 sensor read interval (ms)") + field(DTYP, "stream") + field(EGU, "ms") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelNitReadInterval $(PORT)") + field(DRVH, "$(MAX_N2_READ_INTERVAL=5000)") + field(DRVL, "$(MIN_N2_READ_INTERVAL=0)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:FREQ:FULL:SP") + field(SDIS, "$(P)DISABLE") +} + +record(ai, "$(P)LVL:NIT:FREQ:ZERO") { + field(DESC, "Get the N2 zero freq value") + field(DTYP, "stream") + field(SCAN, "5 second") + field(EGU, "Hz") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitFreqZero $(PORT)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:FREQ:ZERO") + field(SDIS, "$(P)DISABLE") +} + +record(ao, "$(P)LVL:NIT:FREQ:ZERO:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set zero freq value for nitrogen level") + field(DTYP, "stream") + field(EGU, "Hz") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelNitFreqZero $(PORT)") + field(FLNK, "$(P)LVL:NIT:FREQ:ZERO") + field(DRVH, "$(MAX_N2_FREQ=65000)") + field(DRVL, "$(MIN_N2_FREQ=5000)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:FREQ:ZERO:SP") + field(SDIS, "$(P)DISABLE") +} + +record(ai, "$(P)LVL:NIT:FREQ:FULL") { + field(DESC, "Get the N2 full freq value") + field(DTYP, "stream") + field(EGU, "Hz") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitFreqFull $(PORT)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:FREQ:FULL") + field(SDIS, "$(P)DISABLE") +} + +record(ao, "$(P)LVL:NIT:FREQ:FULL:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set full freq value for nitrogen level") + field(DTYP, "stream") + field(EGU, "Hz") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelNitFreqFull $(PORT)") + field(FLNK, "$(P)LVL:NIT:FREQ:FULL") + field(DRVH, "$(MAX_N2_FREQ=65000)") + field(DRVL, "$(MIN_N2_FREQ=5000)") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:FREQ:FULL:SP") + field(SDIS, "$(P)DISABLE") +} + +record(ai, "$(P)LVL:NIT:REFILL:START") { + field(DESC, "Get high N2 level that starts the refill") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitFillStartThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:REFILL:START") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:NIT:REFILL:START:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set high N2 level that starts the refill") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelNitFillStartThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)LVL:NIT:REFILL:START:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:NIT:REFILL:STOP") { + field(DESC, "Get high N2 level that stops the refill") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitFillStopThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:REFILL:STOP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ao, "$(P)LVL:NIT:REFILL:STOP:SP") { + field(ASG, "$(MANAGER_ASG)") + field(DESC, "Set high N2 level that stops the refill") + field(DTYP, "stream") + field(OUT, "@OxInstIPS_SCPI.protocol setLevelNitFillStopThreshold $(PORT)") + field(EGU, "%") + field(PREC, "0") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)LVL:NIT:REFILL:STOP:SP") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + +record(ai, "$(P)LVL:NIT:LEVEL") { + field(DESC, "Get nitrogen level") + field(DTYP, "stream") + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getLevelNitrogenLevel $(PORT)") + field(EGU, "%") + field(PREC, "2") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:LVL:NIT:LEVEL") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} + diff --git a/IPS/IPS-IOC-01App/Db/scpi_system_alarms.db b/IPS/IPS-IOC-01App/Db/scpi_system_alarms.db new file mode 100644 index 000000000..c5837ac82 --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/scpi_system_alarms.db @@ -0,0 +1,235 @@ +# This contains all the records which handle responses to the READ:SYS:ALRM command. +# The precise protocol was determined empirically by sending the command and observing the response +# directly from the instrument. +# Discrete records are generated for each board type and each alarm by the +# scpi_system_alarms_discrete.template and substitutions files. +# +# The base response is: READ:SYS:ALRM: which may (or may not) be followed by a board identifier, +# a tab character (9) an alarm string and a semicolon. +# +# In ABNF: +# response = "READ:SYS:ALRM:" *(error) +# error = board_id TAB error_message SEMICOLON +# board_id = 1*(ALPHA / DIGIT / ".") ; e.g. MB1.T1 +# error_message = 1*(ALPHA / DIGIT / ".") ; e.g. "Open circuit" +# TAB = %x09 ; tab character +# SEMICOLON = %x3B ; semicolon ";" +# +# The board identifiers are provided as macros: +# Macro Default +# BOARDID_MAG MB1.T1 +# BOARDID_10TMAG DB8.T1 +# BOARDID_PRESS DB5.P1 +# BOARDID_LEVEL DB1.L1 +# +# Poll system alarms: This record repeatedly sends the READ:SYS:ALRM command +# and the response is read as a string and parsed by the aSub record below. +# +record(waveform, "$(P)STS:_POLLSYSTEM:ALARMS") { + field(DESC, "Poll system alarms") + field(DTYP, "stream") + field(FTVL, "CHAR") + field(NELM, "1000") # Adjust size as needed + field(SCAN, "5 second") + field(INP, "@OxInstIPS_SCPI.protocol getSysAlarms $(PORT)") + field(FLNK, "$(P)STS:_POLLSYSTEM:ALARMS_SUB") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:_POLLSYSTEM:ALARMS") + field(SDIS, "$(P)DISABLE") +} + +# The following stringout records are used to provide the board identifiers +record(stringout, "$(P)STS:SYSTEM:ALARMS:_NAME:TBOARD") { + field(DESC, "Temperature board UID name") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(PINI, "YES") + field(VAL, "$(BOARDID_MAG)") + field(OUT, "") + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARMS:_NAME:TBOARD") + field(SDIS, "$(P)DISABLE") +} +record(stringout, "$(P)STS:SYSTEM:ALARMS:_NAME:10TBOARD") { + field(DESC, "Temperature 10T board UID name") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(PINI, "YES") + field(VAL, "$(BOARDID_10TMAG)") + field(OUT, "") + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARMS:_NAME:10TBOARD") + field(SDIS, "$(P)DISABLE") +} +record(stringout, "$(P)STS:SYSTEM:ALARMS:_NAME:LBOARD") { + field(DESC, "Level board UID name") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(PINI, "YES") + field(VAL, "$(BOARDID_LEVEL)") + field(OUT, "") + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARMS:_NAME:LTBOARD") + field(SDIS, "$(P)DISABLE") +} +record(stringout, "$(P)STS:SYSTEM:ALARMS:_NAME:PBOARD") { + field(DESC, "Pressure board UID name") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(PINI, "YES") + field(VAL, "$(BOARDID_PRESS)") + field(OUT, "") + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARMS:_NAME:PBOARD") + field(SDIS, "$(P)DISABLE") +} + +# This record is triggered by the stringin record above and parses the response. +# It extracts the board identifier and the alarm message, and writes them to the appropriate +# output fields. The output fields are then used by the mbbi and bi records below to set the +# alarm status for each board. +# Board identifiers are provided as macros and passed to the aSub as input fields B-E. +# +record(aSub, "$(P)STS:_POLLSYSTEM:ALARMS_SUB") { + field(SNAM, "handle_system_alarm_status") + field(INPA, "$(P)STS:_POLLSYSTEM:ALARMS NPP NMS") +# field(INPB, "$(P):STS:SYSTEM:ALARMS:_NAME:TBOARD") +# field(INPC, "$(P):STS:SYSTEM:ALARMS:_NAME:10TBOARD") +# field(INPD, "$(P):STS:SYSTEM:ALARMS:_NAME:LBOARD") +# field(INPE, "$(P):STS:SYSTEM:ALARMS:_NAME:PBOARD") + field(FTA, "CHAR") + field(FTB, "STRING") + field(FTC, "STRING") + field(FTD, "STRING") + field(FTE, "STRING") + field(NOA, "1000") + field(NOB, "1") + field(NOC, "1") + field(NOD, "1") + field(NOE, "1") + + field(OUTA, "$(P)STS:SYSTEM:ALARM:TBOARD PP") + field(OUTB, "$(P)STS:SYSTEM:ALARM:10TBOARD PP") + field(OUTC, "$(P)STS:SYSTEM:ALARM:LBOARD PP") + field(OUTD, "$(P)STS:SYSTEM:ALARM:PBOARD PP") + field(FTVA, "LONG") + field(FTVB, "LONG") + field(FTVC, "LONG") + field(FTVD, "LONG") + field(NOVA, "1") + field(NOVB, "1") + field(NOVC, "1") + field(NOVD, "1") +} + +### =============== Temperature board alarm status =============== ### +# Bit set Definition +# 0 Open Circuit +# 1 Short Circuit +# 2 Calibration Error +# 3 Firmware Error +# 4 Board Not Configured +# +record(mbbiDirect, "$(P)STS:SYSTEM:ALARM:TBOARD") { + field(DESC, "Temperature board alarm status") + field(DTYP, "Soft Channel") + field(INP, "0") + field(PINI, "YES") + field(NOBT, "32") + field(SCAN, "Passive") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARM:TBOARD") + field(SDIS, "$(P)DISABLE") +} + + +### =============== 10 Temperature board alarm status =============== ### +# Bit set Definition +# 0 Open Circuit +# 1 Short Circuit +# 2 Calibration Error +# 3 Firmware Error +# 4 Board Not Configured +# +record(mbbiDirect, "$(P)STS:SYSTEM:ALARM:10TBOARD") { + field(DESC, "10T Temperature board alarm status") + field(DTYP, "Soft Channel") + field(INP, "0") + field(PINI, "YES") + field(NOBT, "32") + field(SCAN, "Passive") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARM:10TBOARD") + field(SDIS, "$(P)DISABLE") +} + + +### =============== Levels board alarm status =============== ### +# Bit set Definition +# 0 Open Circuit +# 1 Short Circuit +# 2 ADC Error +# 3 Over demand +# 4 Over temperature +# 5 Firmware Error +# 6 Board Not Configured +# 7 No Reserve +# 8 Magnet Safety +# +record(mbbiDirect, "$(P)STS:SYSTEM:ALARM:LBOARD") { + field(DESC, "Levels board alarm status") + field(DTYP, "Soft Channel") + field(INP, "0") + field(PINI, "YES") + field(NOBT, "32") + field(SCAN, "Passive") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARM:LBOARD") + field(SDIS, "$(P)DISABLE") +} + + +### =============== Pressure board alarm status =============== ### +# Bit set Definition +# 0 Open Circuit +# 1 Short Circuit +# 2 Calibration Error +# 3 Firmware Error +# 4 Board Not Configured +# 5 Over current +# 6 Current leakage +# 7 Power on fail +# 8 Checksum fail +# 9 Clock fail +# 10 ADC fail +# 11 Mains fail +# 12 Reference fail +# 13 +12V fail +# 14 -12V fail +# 15 +8V fail +# 16 -8V fail +# 17 Amp gain error +# 18 Amp offset error +# 19 ADC offset error +# 20 ADC PGA error +# 21 ADC XTAL error +# 22 Excitation + error +# 23 Excitation - error +# +record(mbbiDirect, "$(P)STS:SYSTEM:ALARM:PBOARD") { + field(DESC, "Pressure board alarm status") + field(DTYP, "Soft Channel") + field(INP, "0") + field(PINI, "YES") + field(NOBT, "32") + field(SCAN, "Passive") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:STS:SYSTEM:ALARM:PBOARD") + field(SDIS, "$(P)DISABLE") +} + diff --git a/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.substitutions b/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.substitutions new file mode 100644 index 000000000..f09c07eb1 --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.substitutions @@ -0,0 +1,68 @@ +file scpi_system_alarms_discrete.template { + +pattern {P, ALARM_NAME, ALARM_DESC, ALARM_INP} +{"\$(P)", "STS:SYSTEM:ALARM:TBOARD:OPENCIRCUIT", "Temperature board Open Circuit", "STS:SYSTEM:ALARM:TBOARD.B0"} +{"\$(P)", "STS:SYSTEM:ALARM:TBOARD:SHORTCIRCUIT", "Temperature board Short Circuit", "STS:SYSTEM:ALARM:TBOARD.B1"} +{"\$(P)", "STS:SYSTEM:ALARM:TBOARD:CALIBERR", "Temperature board Calibn error", "STS:SYSTEM:ALARM:TBOARD.B2"} +{"\$(P)", "STS:SYSTEM:ALARM:TBOARD:FWERR", "Temperature board fw error", "STS:SYSTEM:ALARM:TBOARD.B3"} +{"\$(P)", "STS:SYSTEM:ALARM:TBOARD:NOTCONFIGD", "Temperature board not configd", "STS:SYSTEM:ALARM:TBOARD.B4"} + +{"\$(P)", "STS:SYSTEM:ALARM:10TBOARD:OPENCIRCUIT", "Temperature board Open Circuit", "STS:SYSTEM:ALARM:10TBOARD.B0"} +{"\$(P)", "STS:SYSTEM:ALARM:10TBOARD:SHORTCIRCUIT", "Temperature board Short Circuit", "STS:SYSTEM:ALARM:10TBOARD.B1"} +{"\$(P)", "STS:SYSTEM:ALARM:10TBOARD:CALIBERR", "Temperature board Calibn error", "STS:SYSTEM:ALARM:10TBOARD.B2"} +{"\$(P)", "STS:SYSTEM:ALARM:10TBOARD:FWERR", "Temperature board fw error", "STS:SYSTEM:ALARM:10TBOARD.B3"} +{"\$(P)", "STS:SYSTEM:ALARM:10TBOARD:NOTCONFIGD", "Temperature board not configd", "STS:SYSTEM:ALARM:10TBOARD.B4"} + +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:OPENCIRCUIT", "Levels board Open Circuit", "STS:SYSTEM:ALARM:LBOARD.B0"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:SHORTCIRCUIT", "Levels board Short Circuit", "STS:SYSTEM:ALARM:LBOARD.B1"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:ADCERR", "Levels board ADC error", "STS:SYSTEM:ALARM:LBOARD.B2"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:OVERDEMAND", "Levels board over demand", "STS:SYSTEM:ALARM:LBOARD.B3"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:OVERTEMP", "Levels board over temp", "STS:SYSTEM:ALARM:LBOARD.B4"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:FWERROR", "Levels board fw error", "STS:SYSTEM:ALARM:LBOARD.B5"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:NOTCONFIGD", "Levels board not confgd", "STS:SYSTEM:ALARM:LBOARD.B6"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:NORESERVE", "Levels board no reserve", "STS:SYSTEM:ALARM:LBOARD.B7"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:NORESERVE", "Levels board no reserve", "STS:SYSTEM:ALARM:LBOARD.B7"} +{"\$(P)", "STS:SYSTEM:ALARM:LBOARD:MAGNETSAFETY", "Levels board magnet safety", "STS:SYSTEM:ALARM:LBOARD.B8"} + +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:OPENCIRCUIT", "Pressure board Open Circuit", "STS:SYSTEM:ALARM:PBOARD.B0"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:SHORTCIRCUIT", "Pressure board Short Circuit", "STS:SYSTEM:ALARM:PBOARD.B1"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:CALIBERR", "Pressure board calib error", "STS:SYSTEM:ALARM:PBOARD.B2"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:FWERR", "Pressure board fw error", "STS:SYSTEM:ALARM:PBOARD.B3"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:NOTCONFIGD", "Pressure board not confgd", "STS:SYSTEM:ALARM:PBOARD.B4"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:OVERCURRENT", "Pressure board over current", "STS:SYSTEM:ALARM:PBOARD.B5"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:CURRENTLEAK", "Pressure board current leak", "STS:SYSTEM:ALARM:PBOARD.B6"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:PWONFAIL", "Pressure board power on fail", "STS:SYSTEM:ALARM:PBOARD.B7"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:CHKSUMERR", "Pressure board chksum error", "STS:SYSTEM:ALARM:PBOARD.B8"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:CLKFAIL", "Pressure board clk fail", "STS:SYSTEM:ALARM:PBOARD.B9"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:ADCFAIL", "Pressure board ADC fail", "STS:SYSTEM:ALARM:PBOARD.BA"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:MAINSFAIL", "Pressure board mains fail", "STS:SYSTEM:ALARM:PBOARD.BB"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:REFSFAIL", "Pressure board ref fail", "STS:SYSTEM:ALARM:PBOARD.BC"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:PLUS12VFAIL", "Pressure board +12V fail", "STS:SYSTEM:ALARM:PBOARD.BD"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:MINUS12VFAIL", "Pressure board -12V fail", "STS:SYSTEM:ALARM:PBOARD.BE"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:PLUS8VFAIL", "Pressure board +8V fail", "STS:SYSTEM:ALARM:PBOARD.BF"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:MINUS8VFAIL", "Pressure board -9V fail", "STS:SYSTEM:ALARM:PBOARD.B10"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:AMPGAINERR", "Pressure board amp gain err", "STS:SYSTEM:ALARM:PBOARD.B11"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:AMPOFFSETERR", "Pressure board amp offset err", "STS:SYSTEM:ALARM:PBOARD.B12"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:ADCPGAERR", "Pressure board ADC PGA offset err", "STS:SYSTEM:ALARM:PBOARD.B14"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:ADCXTALERR", "Pressure board ADC XTAL offset err", "STS:SYSTEM:ALARM:PBOARD.B15"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:PLUSEXCITEERR", "Pressure board excitation + error", "STS:SYSTEM:ALARM:PBOARD.B16"} +{"\$(P)", "STS:SYSTEM:ALARM:PBOARD:MINUSEXCITEERR", "Pressure board excitation - error", "STS:SYSTEM:ALARM:PBOARD.B17"} + +{"\$(P)", "MAGNET:SUPPLY:STATUS:SWHTRMISMATCH", "Switch heater mismatch status", "GET:MAGNET:SUPPLY:STATUS.B0"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTRUNDOWNRES", "Over temp rundown resistors status", "GET:MAGNET:SUPPLY:STATUS.B1"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTSENSERES", "Over temp sense resistor status", "GET:MAGNET:SUPPLY:STATUS.B2"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTPCB", "Over temp PCB status", "GET:MAGNET:SUPPLY:STATUS.B3"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:CALIBFAIL", "Calibration failure status", "GET:MAGNET:SUPPLY:STATUS.B4"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:FWFAIL", "Firmware failure status", "GET:MAGNET:SUPPLY:STATUS.B5"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:RRFAIL", "Rundown resistors failure status", "GET:MAGNET:SUPPLY:STATUS.B6"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:RS485FAIL", "MSP430 RS485 failure status", "GET:MAGNET:SUPPLY:STATUS.B7"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:QUENCHED", "Quench status", "GET:MAGNET:SUPPLY:STATUS.B8"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:CATCH", "PSU Catch status", "GET:MAGNET:SUPPLY:STATUS.B9"} +# Intentional gap in bits BA and BB in accordance with OI information +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTSENSEAMP", "Over temp sense amp", "GET:MAGNET:SUPPLY:STATUS.BC"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTAMP1", "Over temp amp 1", "GET:MAGNET:SUPPLY:STATUS.BD"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:OTAMP2", "Over temp amp 2", "GET:MAGNET:SUPPLY:STATUS.BE"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:PWMCUTOFF", "PWM Cutoff status", "GET:MAGNET:SUPPLY:STATUS.BF"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:VADCERROR", "Voltage ADC error status", "GET:MAGNET:SUPPLY:STATUS.B10"} +{"\$(P)", "MAGNET:SUPPLY:STATUS:IADCERROR", "Current ADC error status", "GET:MAGNET:SUPPLY:STATUS.B11"} +} diff --git a/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.template b/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.template new file mode 100644 index 000000000..c14267394 --- /dev/null +++ b/IPS/IPS-IOC-01App/Db/scpi_system_alarms_discrete.template @@ -0,0 +1,19 @@ +# SCPI System Alarms Discrete Template +# This file defines the discrete alarms for the SCPI system, which are derived from the +# relevant mbbidirect records +# +record(bi, "$(P)$(ALARM_NAME)") { + field(DESC, "$(ALARM_DESC)") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") + field(INP, "$(P)$(ALARM_INP) CP MS") + field(ZNAM, "No") + field(ONAM, "Yes") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + + field(SIML, "$(P)SIM") + field(SIOL, "$(P)SIM:$(ALARM_NAME)") + field(SDIS, "$(P)DISABLE") + info(archive, "VAL") +} diff --git a/IPS/IPS-IOC-01App/src/build.mak b/IPS/IPS-IOC-01App/src/build.mak index 848fac255..962a843ee 100644 --- a/IPS/IPS-IOC-01App/src/build.mak +++ b/IPS/IPS-IOC-01App/src/build.mak @@ -30,6 +30,7 @@ $(APPNAME)_DBD += stream.dbd $(APPNAME)_DBD += ReadASCII.dbd $(APPNAME)_DBD += FileList.dbd $(APPNAME)_DBD += cryomagnet.dbd +$(APPNAME)_DBD += OxInstIPS.dbd # Add all the support libraries needed by this IOC ## ISIS standard libraries ## @@ -48,6 +49,7 @@ $(APPNAME)_LIBS += calc sscan $(APPNAME)_LIBS += pcrecpp pcre libjson zlib $(APPNAME)_LIBS += efsw $(APPNAME)_LIBS += seq pv +$(APPNAME)_LIBS += OxInstIPS # FERMCHOP-IOC-01_registerRecordDeviceDriver.cpp derives from IPS-IOC-01.dbd $(APPNAME)_SRCS += $(APPNAME)_registerRecordDeviceDriver.cpp diff --git a/IPS/IPS-IOC-01App/src/cryomagnet.st b/IPS/IPS-IOC-01App/src/cryomagnet.st index 615af4866..7e1acf35a 100644 --- a/IPS/IPS-IOC-01App/src/cryomagnet.st +++ b/IPS/IPS-IOC-01App/src/cryomagnet.st @@ -127,7 +127,7 @@ ss cryomagnet PVPUT(activity_sp, ACTIVITY_TO_SP); epicsThreadSleep(1.0); PVPUT(sweepmode_sp, SWEEP_MODE); - } + } when( within_tolerance(field_setpoint_readback, magnet_field, field_tolerance) diff --git a/IPS/iocBoot/iocIPS-IOC-01/config.xml b/IPS/iocBoot/iocIPS-IOC-01/config.xml index 08a1ab545..6973ad26a 100644 --- a/IPS/iocBoot/iocIPS-IOC-01/config.xml +++ b/IPS/iocBoot/iocIPS-IOC-01/config.xml @@ -8,6 +8,7 @@ + diff --git a/IPS/iocBoot/iocIPS-IOC-01/st.cmd b/IPS/iocBoot/iocIPS-IOC-01/st.cmd index 2a56d86f6..fa4f7b8cf 100644 --- a/IPS/iocBoot/iocIPS-IOC-01/st.cmd +++ b/IPS/iocBoot/iocIPS-IOC-01/st.cmd @@ -4,7 +4,8 @@ ## everywhere it appears in this file # Increase this if you get <> or discarded messages warnings in your errlog output -errlogInit2(65536, 256) +#errlogInit2(65536, 256) +errlogInit2(65536, 1024) < envPaths @@ -41,6 +42,10 @@ $(IFNOTDEVSIM) $(IFNOTRECSIM) asynSetOption("L0",0,"crtscts","N") $(IFNOTDEVSIM) $(IFNOTRECSIM) asynSetOption("L0",0,"ixon","N") $(IFNOTDEVSIM) $(IFNOTRECSIM) asynSetOption("L0",0,"ixoff","N") +# Uncomment these for StreamDevice debugging +#asynSetTraceMask("L0", -1, 0x9) +#asynSetTraceIOMask("L0", -1, 0x2) + ## Load record instances ##ISIS## Load common DB records @@ -48,17 +53,41 @@ $(IFNOTDEVSIM) $(IFNOTRECSIM) asynSetOption("L0",0,"ixoff","N") epicsEnvSet("P", "$(MYPVPREFIX)$(IOCNAME):") +## Useful for debugging - giving a pause to allow the user to attach a debugger +## msgBox "Hello" + +# The STREAMPROTOCOL env var should be set to either "LEGACY" (default) or "SCPI" +# Set the database and protocol file names accordingly +stringiftest("STREAMPROTOCOL_SCPI", "$(STREAMPROTOCOL=)", 4, "SCPI") +$(IFNOTSTREAMPROTOCOL_SCPI) epicsEnvSet "DBFILE" "ips_legacy.db" +$(IFSTREAMPROTOCOL_SCPI) epicsEnvSet "DBFILE" "ips_scpi.db" +$(IFNOTSTREAMPROTOCOL_SCPI) epicsEnvSet "PROTOCOLFILE" "OxInstIPS.protocol" +$(IFSTREAMPROTOCOL_SCPI) epicsEnvSet "PROTOCOLFILE" "OxInstIPS_SCPI.protocol" + +### IJG Diagnostics during development +#var streamError 1 +#var streamDebug 1 +#var streamDebugColored 1 +#var streamErrorDeadTime 30 +#var streamMsgTimeStamped 1 +#streamSetLogfile("streamdevice_logfile.txt") +################## + ## Load our record instances -dbLoadRecords("db/ips.db","PVPREFIX=$(MYPVPREFIX),P=$(P),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),MAX_FIELD=$(MAX_FIELD=7.0),MAX_SWEEP_RATE=$(MAX_SWEEP_RATE=1.0),STABILITY_VOLTAGE=$(STABILITY_VOLTAGE=0.1),HEATER_WAITTIME=$(HEATER_WAITTIME=60),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") +dbLoadRecords("db/ips_common.db","PVPREFIX=$(MYPVPREFIX),P=$(P),PROTO=$(PROTOCOLFILE),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),MAX_FIELD=$(MAX_FIELD=7.0),MAX_SWEEP_RATE=$(MAX_SWEEP_RATE=1.0),STABILITY_VOLTAGE=$(STABILITY_VOLTAGE=0.1),HEATER_WAITTIME=$(HEATER_WAITTIME=60),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") +dbLoadRecords("db/$(DBFILE)","PVPREFIX=$(MYPVPREFIX),P=$(P),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),MAX_FIELD=$(MAX_FIELD=7.0),MAX_SWEEP_RATE=$(MAX_SWEEP_RATE=1.0),STABILITY_VOLTAGE=$(STABILITY_VOLTAGE=0.1),HEATER_WAITTIME=$(HEATER_WAITTIME=60),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") +$(IFSTREAMPROTOCOL_SCPI) dbLoadRecords("db/ips_scpi_levels.db","PVPREFIX=$(MYPVPREFIX),P=$(P),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),MIN_N2_FREQ=$(MIN_N2_FREQ=5000),MAX_N2_FREQ=$(MAX_N2_FREQ=65000),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") +$(IFSTREAMPROTOCOL_SCPI) dbLoadRecords("db/scpi_system_alarms.db","PVPREFIX=$(MYPVPREFIX),P=$(P),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),BOARDID_MAG=$(BOARDID_MAG=MB1.T1),BOARDID_10TMAG=$(BOARDID_10TMAG=DB8.T1),BOARDID_PRESS=$(BOARDID_PRESS=DB5.P1),BOARDID_LEVEL=$(BOARDID_LEVEL=DB1.L1),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") +$(IFSTREAMPROTOCOL_SCPI) dbLoadRecords("db/scpi_system_alarms_discrete.db","PVPREFIX=$(MYPVPREFIX),P=$(P),RECSIM=$(RECSIM=0),DISABLE=$(DISABLE=0),PORT=$(DEVICE),MANAGER_ASG=$(MANAGER_ASG=MANAGER)") -##ISIS## Stuff that needs to be done after all records are loaded but before iocInit is called +##ISIS## Stuff that needs to be done after all records are loaded but before iocInit is called < $(IOCSTARTUP)/preiocinit.cmd cd "${TOP}/iocBoot/${IOC}" iocInit ## Start any sequence programs -seq cryomagnet, "FIELD=$(P)FIELD,FIELD_SETPOINT=$(P)FIELD:SP,FIELD_SETPOINT_ALARM=$(P)FIELD:SP.SEVR,FIELD_SETPOINT_READBACK=$(P)FIELD:SP:RBV,FIELD_SETPOINT_RAW=$(P)FIELD:SP:_RAW,PERSISTENT=$(P)PERSISTENT,MAGNET_FIELD=$(P)MAGNET:FIELD:PERSISTENT,HEATER_STATUS=$(P)HEATER:STATUS,HEATER_STATUS_SP=$(P)HEATER:STATUS:SP,HEATER_WAIT_TIME=$(P)HEATER:WAITTIME,ACTIVITY=$(P)ACTIVITY,ACTIVITY_SP=$(P)ACTIVITY:SP,SWEEPMODE=$(P)SWEEPMODE:PARAMS,SWEEPMODE_SP=$(P)SWEEPMODE:PARAMS:SP,SUPPLYVOLTAGE_STABLE=$(P)SUPPLY:VOLT:STABLE,SWEEP_ACTIVE=$(P)STS:SWEEPMODE:SWEEP,STATEMACHINE=$(P)STATEMACHINE,HEATER_ONTIME_OK=$(P)HEATER:ONTIME_OK" +seq cryomagnet, "FIELD=$(P)FIELD,FIELD_SETPOINT=$(P)FIELD:SP,FIELD_SETPOINT_ALARM=$(P)FIELD:SP.SEVR,FIELD_SETPOINT_READBACK=$(P)FIELD:SP:RBV,FIELD_SETPOINT_RAW=$(P)FIELD:SP:_RAW,PERSISTENT=$(P)PERSISTENT,MAGNET_FIELD=$(P)MAGNET:FIELD:PERSISTENT,HEATER_STATUS=$(P)HEATER:STATUS,HEATER_STATUS_SP=$(P)HEATER:STATUS:SP,HEATER_WAIT_TIME=$(P)HEATER:WAITTIME,ACTIVITY=$(P)ACTIVITY,ACTIVITY_SP=$(P)ACTIVITY:SP,SWEEPMODE=$(P)SWEEPMODE:PARAMS,SWEEPMODE_SP=$(P)SWEEPMODE:PARAMS:SP,SUPPLYVOLTAGE_STABLE=$(P)SUPPLY:VOLT:STABLE,SWEEP_ACTIVE=$(P)STS:SWEEPMODE:SWEEP,STATEMACHINE=$(P)STATEMACHINE,HEATER_ONTIME_OK=$(P)HEATER:ONTIME_OK") ##ISIS## Stuff that needs to be done after iocInit is called e.g. sequence programs < $(IOCSTARTUP)/postiocinit.cmd