Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions BEAMCORR/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# SPDX-FileCopyrightText: 2022 Argonne National Laboratory
#
# SPDX-License-Identifier: EPICS

# Install directories
/bin/
/cfg/
/db/
/dbd/
/html/
/include/
/lib/
/templates/
/data/

# Local configuration files
/configure/*.local

# iocBoot generated files
/iocBoot/*ioc*/cdCommands
/iocBoot/*ioc*/dllPath*.bat
/iocBoot/*ioc*/dllCopy.bat
/iocBoot/*ioc*/runIOC.bat
/iocBoot/*ioc*/runIOC.sh
/iocBoot/*ioc*/envPaths
/iocBoot/*ioc*/relPaths.sh

# iocsh
.iocsh_history

# Build directories
O.*/

# Common files created by other tools
/QtC-*
/.vscode/
*.orig
*.log
.*.swp
.DS_Store
24 changes: 24 additions & 0 deletions BEAMCORR/BEAMCORR-IOC-01App/Db/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# SPDX-FileCopyrightText: 1998 Argonne National Laboratory
#
# SPDX-License-Identifier: EPICS

TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE

#----------------------------------------------------
# Create and install (or just install) into <top>/db
# databases, templates, substitutions like this
DB += beamcorr.db
DB += coefficients.db
DB += steering.db

#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_template = <templatename>

include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE

286 changes: 286 additions & 0 deletions BEAMCORR/BEAMCORR-IOC-01App/Db/beamcorr.db
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
### Generic Records

record(bo, "$(P)SIM")
{
field(SCAN, "Passive")
field(DTYP, "Soft Channel")
field(ZNAM, "NO")
field(ONAM, "YES")
field(VAL, "$(RECSIM)")
}

record(bo, "$(P)DISABLE")
{
field(DESC, "Disable comms")
field(PINI, "YES")
field(VAL, "$(DISABLE)")
field(OMSL, "supervisory")
field(ZNAM, "COMMS ENABLED")
field(ONAM, "COMMS DISABLED")

}

### Enable Beam Corrections

record(bo, "$(P)ENABLE:CORR")
{
field(DESC, "Enable Beam Corrections")
field(ZNAM, "DISABLED")
field(ONAM, "ENABLED")
field(VAL, "$(ENABLED_DEFAULT)")
info(INTEREST, "MEDIUM")
info(alarm, "BEAMCORR")
}

record(ao, "$(P)NUM:STEER_MAG"){
field(DESC, "Number of Steering Magnets")
field(VAL, "$(NUM_STEER)")
field(EGU, "")
info(INTEREST, "MEDIUM")
}

# Equation for a single steering magnet offset
# bx = ax + (cx1 * m1 + cx2 * m2 +... + cxn * mn)
# where b = The output steering value
# a = the initital steering value
# x = the steering magnet
# cx1 through cxn = the coefficients of the interfering magnets to steering magnet x (set by scientists)
# m1 through mn = the current value of the interferring magnets

record(ai, "$(P)HIFI_PV:MAIN"){
field(DESC, "Readback for main HIFI magnet")
field(INP, "$(HIFI_PV_MAIN) CP MS")
field(SIOL, "$(P)SIM:HIFI_PV:MAIN")
field(SIML, "$(P)SIM")
field(PREC, "3")
}

record(stringout, "$(P)HIFI_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(HIFI_PV_MAIN).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)HIFI_PV:MAIN.EGU NPP")
field(SIOL, "$(P)SIM:HIFI_PV:MAIN:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

record(ai, "$(P)HIFI_PV:TRANS_X"){
field(DESC, "Readback for x transverse HIFI magnet")
field(INP, "$(HIFI_PV_TRANS_X) CP MS")
field(SIOL, "$(P)SIM:HIFI_PV:TRANS_X")
field(SIML, "$(P)SIM")
field(PREC, "3")
}

record(stringout, "$(P)HIFI_PV:TRANS_X:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(HIFI_PV_TRANS_X).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)HIFI_PV:TRANS_X.EGU NPP")
field(SIOL, "$(P)SIM:HIFI_PV:TRANS_X:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

record(ai, "$(P)HIFI_PV:TRANS_Y"){
field(DESC, "Readback for y transverse HIFI magnet")
field(INP, "$(HIFI_PV_TRANS_Y) CP MS")
field(SIOL, "$(P)SIM:HIFI_PV:TRANS_Y")
field(SIML, "$(P)SIM")
field(PREC, "3")
}

record(stringout, "$(P)HIFI_PV:TRANS_Y:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(HIFI_PV_TRANS_Y).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)HIFI_PV:TRANS_Y.EGU NPP")
field(SIOL, "$(P)SIM:HIFI_PV:TRANS:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

record(ai, "$(P)EMU_PV:MAIN"){
field(DESC, "Readback for main EMU magnet")
field(INP, "$(EMU_PV_MAIN) CP MS")
field(SIOL, "$(P)SIM:EMU_PV:MAIN")
field(SIML, "$(P)SIM")
field(PREC, "3")
}

record(stringout, "$(P)EMU_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(EMU_PV_MAIN).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)EMU_PV:MAIN.EGU NPP")
field(SIOL, "$(P)SIM:EMU_PV:MAIN:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

record(ai, "$(P)EMU_PV:TRANS"){
field(DESC, "Readback for transverse EMU magnet")
field(INP, "$(EMU_PV_TRANS) CP MS")
field(SIOL, "$(P)SIM:EMU_PV:TRANS")
field(SIML, "$(P)SIM")
field(PREC, "3")
}

record(stringout, "$(P)EMU_PV:TRANS:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(EMU_PV_TRANS).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)EMU_PV:TRANS.EGU NPP")
field(SIOL, "$(P)SIM:EMU_PV:TRANS:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

### When MUSR replaces direction with second set of magnets, uncomment input field and remove MUSR
### Rotation calcouts.
record(ai, "$(P)MUSR_PV:MAIN"){
field(DESC, "Readback for main MUSR magnet")
# field(INP, "$(MUSR_PV_MAIN) CP MS")
# field(SIOL, "$(P)SIM:MUSR_PV:MAIN")
# field(SIML, "$(P)SIM")
# field(PREC, "3")
}

record(stringout, "$(P)MUSR_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(MUSR_PV_MAIN).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)MUSR_PV:MAIN.EGU NPP")
field(SIOL, "$(P)SIM:MUSR_PV:MAIN:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

### When MUSR replaces direction with second set of magnets, uncomment input field and remove MUSR
### Rotation calcouts.
record(ai, "$(P)MUSR_PV:TRANS"){
field(DESC, "Readback for transverse MUSR magnet")
# field(INP, "$(MUSR_PV_TRANS) CP MS")
# field(SIOL, "$(P)SIM:MUSR_PV:TRANS")
# field(SIML, "$(P)SIM")
# field(PREC, "3")
}

record(stringout, "$(P)MUSR_PV:TRANS:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(DOL, "$(MUSR_PV_TRANS).EGU CP")
field(OMSL, "closed_loop")
field(OUT, "$(P)MUSR_PV:TRANS.EGU NPP")
field(SIOL, "$(P)SIM:MUSR_PV:TRANS:UNITS_SET PP")
field(SIML, "$(P)SIM")
}

record(calcout, "$(P)MUSR_ROTATION:ISLONG"){
field(DESC, "Handle MUSR Direction")
field(CALC, "(A==0)?B:0")
$(IFNOTRECSIM) field(INPA, "IN:MUSR:MUSR_ROTATION CP MS")
$(IFRECSIM) field(INPA, "$(P)SIM:MUSR_ROTATION CP MS")
$(IFNOTRECSIM) field(INPB, "$(MUSR_PV_MAIN) CP MS")
$(IFRECSIM) field(INPB, "$(P)SIM:MUSR_PV:MAIN CP MS")
field(OUT, "$(P)MUSR_PV:MAIN PP")
}

record(calcout, "$(P)MUSR_ROTATION:ISTRANS"){
field(DESC, "Handle MUSR Direction")
field(CALC, "(A==1)?B:0")
$(IFNOTRECSIM) field(INPA, "IN:MUSR:MUSR_ROTATION CP MS")
$(IFRECSIM) field(INPA, "$(P)SIM:MUSR_ROTATION CP MS")
$(IFNOTRECSIM)field(INPB, "$(MUSR_PV_MAIN) CP MS")
$(IFRECSIM) field(INPB, "$(P)SIM:MUSR_PV:MAIN CP MS")
field(OUT, "$(P)MUSR_PV:TRANS PP")
}

### Sim Records

record(mbbo, "$(P)SIM:MUSR_ROTATION"){
field(DESC, "SIM MUSR Direction for testing")
field(ZRST, "Longitudinal")
field(ONST, "Transverse")
field(TWST, "Indeterminate")
}

record(ai, "$(P)SIM:HIFI_PV:MAIN"){
field(DESC, "SIM Hifi main magnet")
field(FLNK, "$(P)HIFI_PV:MAIN")
}

record(stringout, "$(P)SIM:HIFI_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)HIFI_PV:MAIN.EGU NPP")
}

record(ai, "$(P)SIM:HIFI_PV:TRANS_X"){
field(DESC, "SIM Hifi trans X magnet")
field(FLNK, "$(P)HIFI_PV:TRANS_X")
}

record(stringout, "$(P)SIM:HIFI_PV:TRANS_X:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)HIFI_PV:TRANS_X.EGU NPP")
}

record(ai, "$(P)SIM:HIFI_PV:TRANS_Y"){
field(DESC, "SIM Hifi trans Y magnet")
field(FLNK, "$(P)HIFI_PV:TRANS_Y")
}

record(stringout, "$(P)SIM:HIFI_PV:TRANS_Y:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)HIFI_PV:TRANS_Y.EGU NPP")
}


record(ai, "$(P)SIM:EMU_PV:MAIN"){
field(DESC, "SIM Emu main magnet")
field(FLNK, "$(P)EMU_PV:MAIN")
}

record(stringout, "$(P)SIM:EMU_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)EMU_PV:MAIN.EGU NPP")
}

record(ai, "$(P)SIM:EMU_PV:TRANS"){
field(DESC, "SIM Emu transverse magnet")
field(FLNK, "$(P)EMU_PV:TRANS")
}

record(stringout, "$(P)SIM:EMU_PV:TRANS:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)EMU_PV:TRANS.EGU NPP")
}

record(ai, "$(P)SIM:MUSR_PV:MAIN"){
field(DESC, "SIM MUSR main magnet")
field(FLNK, "$(P)MUSR_PV:MAIN")
}

record(stringout, "$(P)SIM:MUSR_PV:MAIN:UNITS_SET")
{
field(DESC, "Push units from one pv to another")
field(OUT, "$(P)MUSR_PV:MAIN.EGU NPP")
}

# Uncomment for super musr
#record(ai, "$(P)SIM:MUSR_PV:TRANS"){
# field(DESC, "SIM MUSR transverse magnet")
# field(FLNK, "$(P)MUSR_PV:TRANS")
#}

#record(stringout, "$(P)SIM:MUSR_PV:TRANS:UNITS_SET")
#{
# field(DESC, "Push units from one pv to another")
# field(OUT, "$(P)MUSR_PV:TRANS.EGU NPP")
#}
10 changes: 10 additions & 0 deletions BEAMCORR/BEAMCORR-IOC-01App/Db/coefficients.substitutions
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
file coefficients.template {
pattern { INT_MAG, INP, DIRECTION}
{ "HIFI", "A", "MAIN"}
{ "HIFI", "B", "TRANS_X" }
{ "HIFI", "C", "TRANS_Y"}
{ "EMU", "D", "MAIN"}
{ "EMU", "E", "TRANS" }
{ "MUSR", "F", "MAIN"}
{ "MUSR", "G" "TRANS" }
}
33 changes: 33 additions & 0 deletions BEAMCORR/BEAMCORR-IOC-01App/Db/coefficients.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
record(ao, "$(P)STEER_$(STEER_MAG):$(INT_MAG)_$(DIRECTION):COEFF")
{
field(DESC, "Coefficient for steering $(STEER_MAG) $(INT_MAG)_$(DIRECTION)")
field(PREC, "3")
info(autosaveFields, "VAL")
info(INTEREST, "LOW")
field(EGU, "")
field(UDFS, "NO_ALARM")
}

# Equation for a single steering magnet
# bx = ax + (cx1 * m1 + cx2 * m2 +... + cxn * mn)
# where b = The output steering value
# a = the initital steering value
# x = the steering magnet
# cx1 through cxn = the coefficients of the interfering magnets to steering magnet x (set by scientists)
# m1 through mn = the current value of the interferring magnets

record(calc, $(P)STEERING_$(STEER_MAG):$(DIRECTION)_$(INT_MAG)){
field(DESC, "$(INT_MAG) $(DIRECTION) X Coeff for STEER $(STEER_MAG)")
field(CALC, "A*B")
field(INPA, "$(P)STEER_$(STEER_MAG):$(INT_MAG)_$(DIRECTION):COEFF CP MS")
field(INPB, "$(P)$(INT_MAG)_PV:$(DIRECTION) CP MS")
}

record(calc, "$(P)STEERING_$(STEER_MAG):OFFSET"){
field(DESC, "Offset for steer magnet $(STEER_MAG)")
field(CALC, "A + B + C + D + E + F + G")
field(PREC, "3")
field(INP$(INP), "$(P)STEERING_$(STEER_MAG):$(DIRECTION)_$(INT_MAG) CP MS")
info(INTEREST, "LOW")
field(ASG, "READONLY")
}
Loading