diff --git a/ipApp/Db/XGS600-gauge.template b/ipApp/Db/XGS600-gauge.template new file mode 100644 index 0000000..0f0a864 --- /dev/null +++ b/ipApp/Db/XGS600-gauge.template @@ -0,0 +1,23 @@ +# +# Database to read gauge pressure from Agilent XGS600 controllers. +# +# Parameters: +# $(SYSTEM): PV prefix +# $(CONTROLLER): Controller name from st.cmd +# $(CHANNEL): Channel number +# + +record(ai, "$(SYSTEM):getPressure") +{ + field(DESC, "Reads Cell $(CONTROLLER) Pressure") + field(SCAN, "1 second") + field(DTYP, "stream") + field(INP, "@XGS600.proto getPressure($(CHANNEL)) $(CONTROLLER)") + field(PINI, "YES") + field(EGU, "mbar") + field(VAL, "0") + field(PREC, "3") + field(LOLO, "1.333E-12") field(LLSV, "MAJOR") + field(HIGH, "1E-7") field(HSV, "MINOR") + field(HIHI, "1E-6") field(HHSV, "MAJOR") +} diff --git a/ipApp/Db/XGS600-setpoints.template b/ipApp/Db/XGS600-setpoints.template new file mode 100644 index 0000000..5c5b61e --- /dev/null +++ b/ipApp/Db/XGS600-setpoints.template @@ -0,0 +1,96 @@ +# +# Agilent XGS600 controllers setpoints control system. +# +# Description +# - Database designed to assign two relays setpoints to a single gauge. +# - Set both relays numbers to same value in case of single relay setup. +# - Off setpoint: pressure in which the gauge generates interlock signal. +# - On setpoint: pressure in which the gauge clears the interlock +# - When pressure reaches OFF level, it must reach ON level so the interlock +# is cleared +# - OFF > ON +# +# Parameters: +# - $(SYSTEM): PV prefix. +# - $(CHANNEL): Channel number with regard to the IOC +# - $(CONTROLLER): Controller name from st.cmd +# - $(PORT): Channel number with regard to the controller +# - $(SP1): 1st setpoint relay +# - $(SP2): 2nd setpoint relay +# + +record(ao, "$(SYSTEM):setOffSetpoint$(CHANNEL)") +{ + field(DESC, "Sets Cell $(CONTROLLER) Off pressure setpoint") + field(DTYP, "stream") + field(OUT, "@XGS600.proto setRedundantOffSp($(PORT),$(SP1),$(SP2),$(SYSTEM):setOnSetpoint$(CHANNEL)) $(CONTROLLER)") + field(PINI, "NO") + field(PREC, "3") + field(EGU, "mbar") + field(LOLO, "") field(LLSV, "NO_ALARM") + field(HIHI, "") field(HHSV, "NO_ALARM") +} + +record(ao, "$(SYSTEM):setOnSetpoint$(CHANNEL)") +{ + field(DESC, "Sets Cell $(CONTROLLER) Off pressure setpoint") + field(DTYP, "stream") + field(OUT, "@XGS600.proto setRedundantOnSp($(PORT),$(SP1),$(SP2)) $(CONTROLLER)") + field(PINI, "NO") + field(PREC, "3") + field(EGU, "mbar") + field(LOLO, "") field(LLSV, "NO_ALARM") + field(HIHI, "") field(HHSV, "NO_ALARM") +} + +record(ai, "$(SYSTEM):getOffSetpoint$(CHANNEL)") +{ + field(DESC, "Reads Cell $(CONTROLLER) Off pressure setpoint") + field(SCAN, "1 second") + field(DTYP, "stream") + field(INP, "@XGS600.proto getOffSetpoint($(SP1)) $(CONTROLLER)") + field(PINI, "YES") + field(PREC, "3") + field(EGU, "mbar") + field(LOLO, "") field(LLSV, "NO_ALARM") + field(HIGH, "") field(HSV, "NO_ALARM") + field(HIHI, "") field(HHSV, "NO_ALARM") +} + +record(ai, "$(SYSTEM):getOnSetpoint$(CHANNEL)") +{ + field(DESC, "Reads Cell $(CONTROLLER) Off pressure setpoint") + field(SCAN, "1 second") + field(DTYP, "stream") + field(INP, "@XGS600.proto getOnSetpoint($(SP1)) $(CONTROLLER)") + field(PINI, "YES") + field(PREC, "3") + field(EGU, "mbar") + field(LOLO, "") field(LLSV, "NO_ALARM") + field(HIGH, "") field(HSV, "NO_ALARM") + field(HIHI, "") field(HHSV, "NO_ALARM") +} + +record(mbbi, "$(SYSTEM):getChannel$(CHANNEL)Relay1State") +{ + field(DESC, "Read channel $(CHANNEL) relay 1 state") + field(DTYP, "stream") + field(INP, "@XGS600.proto getSetpointState($(SP1)) $(CONTROLLER)") + field(SCAN, "1 second") + field(PINI, "YES") + field(ZRVL, "0") field(ZRST, "OFF") field(ZRSV, "MAJOR") + field(ONVL, "1") field(ONST, "ON") field(ONSV, "MAJOR") + field(TWVL, "3") field(TWST, "Auto") field(TWSV, "NO_ALARM") +} + +record(mbbi, "$(SYSTEM):getChannel$(CHANNEL)Relay2State") +{ + field(DESC, "Read channel $(CHANNEL) relay 2 state") + field(DTYP, "stream") + field(INP, "@XGS600.proto getSetpointState($(SP2)) $(CONTROLLER)") + field(SCAN, "1 second") + field(PINI, "YES") + field(ZRVL, "0") field(ZRST, "OFF") field(ZRSV, "MAJOR") + field(ONVL, "1") field(ONST, "ON") field(ONSV, "MAJOR") + field(TWVL, "3") field(TWST, "Auto") field(TWSV, "NO_ALARM") +} diff --git a/ipApp/Db/XGS600.proto b/ipApp/Db/XGS600.proto new file mode 100644 index 0000000..63d5807 --- /dev/null +++ b/ipApp/Db/XGS600.proto @@ -0,0 +1,75 @@ +# +# XGS600.proto +# +# Stream device protocol file for Agilent XGS600 vacuum gauge controllers +# +# Abdalla Al-Dalleh +# August 13, 2026 +# + +Terminator = CR; + +# $1: Channel Number [1-5] +getPressure +{ + out "#0002I\$1"; + in "%*1c%E"; + + @mismatch { + in "%*1c%E"; + } +} + +# $1: Relay Number [1-8] +getOffSetpoint +{ + out "#009\$1"; + in "%*1c%E"; +} + +getOnSetpoint +{ + out "#008\$1"; + in "%*1c%E"; +} + +# $1: Channel Number [1-5] +# $2 $3: Relay Number [1-8] +setRedundantOffSp +{ + out "#006\$2I\$1%(\$4.VAL)1.3E"; + in ">"; + out "#007\$2I\$1%1.3E"; + in ">"; + + out "#006\$3I\$1%(\$4.VAL)1.3E"; + in ">"; + out "#007\$3I\$1%1.3E"; + in ">"; +} + +setRedundantOnSp +{ + out "#006\$2I\$1%1.3E"; + in ">"; + out "#006\$3I\$1%1.3E"; + in ">"; +} + +setSetpointState +{ + out "#005E%(\$1)u%d"; +} + +getSetpointState +{ + out "#005F\$1"; + in "%*1c%u"; +} + +debug +{ + ExtraInput = Ignore; + out "%s"; + in "%50c"; +}