Added some flags for NICOS and refactored some records from pmacv3 to
sinqMotor
This commit is contained in:
118
db/sinqMotor.db
118
db/sinqMotor.db
@ -17,13 +17,13 @@ record(waveform, "$(P)$(M)-MsgTxt") {
|
||||
field(DTYP, "asynOctetRead")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_MESSAGE_TEXT")
|
||||
field(FTVL, "CHAR")
|
||||
field(NELM, "$(MsgTxtSize=200)") # Should be the same as MAXBUF in the driver code
|
||||
field(NELM, "$(MSGTEXTSIZE=200)") # Should be the same as MAXBUF in the driver code
|
||||
field(SCAN, "I/O Intr")
|
||||
}
|
||||
|
||||
# Provides the motor resolution MRES via an additional PV as explained here:
|
||||
# https://epics.anl.gov/tech-talk/2020/msg00378.php
|
||||
record(ao,"$(P)$(M):Resolution") {
|
||||
record(ao,"$(P)$(M):RecResolution") {
|
||||
field(DESC, "$(M) resolution")
|
||||
field(DOL, "$(P)$(M).MRES CP MS")
|
||||
field(OMSL, "closed_loop")
|
||||
@ -31,24 +31,35 @@ record(ao,"$(P)$(M):Resolution") {
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_REC_RESOLUTION")
|
||||
}
|
||||
|
||||
# Disables the motor for an input of zero and enables it otherwise
|
||||
record(longout, "$(P)$(M):Enable") {
|
||||
field(DTYP, "asynInt32")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) ENABLE_AXIS")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_ENABLE")
|
||||
field(PINI, "NO")
|
||||
}
|
||||
|
||||
# If this PV value is zero, the motor is disabled, otherwise it is enabled
|
||||
record(longin, "$(P)$(M):Enable_RBV") {
|
||||
field(DTYP, "asynInt32")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) ENABLE_AXIS_RBV")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_ENABLE_RBV")
|
||||
field(PINI, "NO")
|
||||
field(SCAN, "I/O Intr")
|
||||
}
|
||||
|
||||
record(longout, "$(P)$(M):EnableWatchdog") {
|
||||
# If this PV value is zero, the motor cannot be disabled, otherwise it can
|
||||
record(longin, "$(P)$(M):CanDisable") {
|
||||
field(DTYP, "asynInt32")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) ENABLE_MOV_WATCHDOG")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_CAN_DISABLE")
|
||||
field(PINI, "NO")
|
||||
field(SCAN, "I/O Intr")
|
||||
}
|
||||
|
||||
record(longout, "$(P)$(M):CanSetSpeed") {
|
||||
field(DTYP, "asynInt32")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_CAN_SET_SPEED")
|
||||
field(PINI, "YES")
|
||||
field(VAL, "$(MOVWATCHDOG)")
|
||||
field(ASG, "READONLY") # Field is initialized during IOC startup
|
||||
field(VAL, "$(CANSETSPEED=0)")
|
||||
}
|
||||
|
||||
# The high and low limits of the axis are read
|
||||
@ -59,10 +70,10 @@ record(longout, "$(P)$(M):EnableWatchdog") {
|
||||
# low limit.
|
||||
record(ao, "$(P)$(M):LimitsOffset") {
|
||||
field(DTYP, "asynFloat64")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) LIMITS_OFFSET")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_LIMITS_OFFSET")
|
||||
field(PINI, "YES")
|
||||
field(ASG, "READONLY") # Field is initialized during IOC startup
|
||||
field(VAL, "$(LIMITSOFFSET)")
|
||||
field(VAL, "$(LIMITSOFFSET=0)")
|
||||
}
|
||||
|
||||
# ===================================================================
|
||||
@ -71,33 +82,100 @@ record(ao, "$(P)$(M):LimitsOffset") {
|
||||
# This strategy is described here: https://epics.anl.gov/tech-talk/2022/msg00464.php
|
||||
|
||||
# Helper record for the high limit which is filled in by the driver
|
||||
record(ai, "$(P)$(M):MOTOR_HIGH_LIMIT-RBV")
|
||||
record(ai, "$(P)$(M):DHLM_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_HIGH_LIMIT_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PUSH_DHLM_TO_FIELD")
|
||||
field(FLNK, "$(P)$(M):PushDHLM2Field")
|
||||
}
|
||||
|
||||
# Push the value into the field of the main motor record
|
||||
record(ao, "$(P)$(M):PUSH_DHLM_TO_FIELD") {
|
||||
field(DOL, "$(P)$(M):MOTOR_HIGH_LIMIT-RBV CP")
|
||||
record(ao, "$(P)$(M):PushDHLM2Field") {
|
||||
field(DOL, "$(P)$(M):DHLM_RBV CP")
|
||||
field(OUT, "$(P)$(M).DHLM")
|
||||
field(OMSL, "closed_loop") # This configuration keeps the input value $(P)$(M):HLM_ADD_OFFSET and the output field $(P)$(M).DHLM in sync
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
|
||||
# Helper record for the low limit which is filled in by the driver
|
||||
record(ai, "$(P)$(M):MOTOR_LOW_LIMIT-RBV")
|
||||
record(ai, "$(P)$(M):DLLM_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_LOW_LIMIT_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PUSH_DLLM_TO_FIELD")
|
||||
field(FLNK, "$(P)$(M):PushDLLM2Field")
|
||||
}
|
||||
|
||||
# Push the value into the field of the main motor record
|
||||
record(ao, "$(P)$(M):PUSH_DLLM_TO_FIELD") {
|
||||
field(DOL, "$(P)$(M):MOTOR_LOW_LIMIT-RBV CP")
|
||||
record(ao, "$(P)$(M):PushDLLM2Field") {
|
||||
field(DOL, "$(P)$(M):DLLM_RBV CP")
|
||||
field(OUT, "$(P)$(M).DLLM")
|
||||
field(OMSL, "closed_loop") # This configuration keeps the input value $(P)$(M):LLM_ADD_OFFSET and the output field $(P)$(M).DLLM in sync
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
|
||||
record(longout, "$(P)$(M):EnableMovWatchdog") {
|
||||
field(DTYP, "asynInt32")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) MOTOR_ENABLE_MOV_WATCHDOG")
|
||||
field(PINI, "YES")
|
||||
field(VAL, "$(ENABLEMOVWATCHDOG=0)")
|
||||
}
|
||||
|
||||
# ===================================================================
|
||||
# The following PVs set the velocity values from the driver
|
||||
|
||||
# Helper record for the high limit which is filled in by the driver
|
||||
record(ai, "$(P)$(M):VELO_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_VELO_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PushVELO2Field")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(M):PushVELO2Field") {
|
||||
field(DOL, "$(P)$(M):VELO_RBV CP")
|
||||
field(OUT, "$(P)$(M).VELO")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
|
||||
record(ai, "$(P)$(M):VBAS_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_VBAS_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PushVBAS2Field")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(M):PushVBAS2Field") {
|
||||
field(DOL, "$(P)$(M):VBAS_RBV CP")
|
||||
field(OUT, "$(P)$(M).VBAS")
|
||||
field(OMSL, "closed_loop") # This configuration keeps the PV and the field in sync
|
||||
}
|
||||
|
||||
record(ai, "$(P)$(M):VMAX_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_VMAX_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PushVMAX2Field")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(M):PushVMAX2Field") {
|
||||
field(DOL, "$(P)$(M):VMAX_RBV CP")
|
||||
field(OUT, "$(P)$(M).VMAX")
|
||||
field(OMSL, "closed_loop") # This configuration keeps the PV and the field in sync
|
||||
}
|
||||
|
||||
record(ai, "$(P)$(M):ACCL_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_ACCL_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(P)$(M):PushACCL2Field")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(M):PushACCL2Field") {
|
||||
field(DOL, "$(P)$(M):ACCL_RBV CP")
|
||||
field(OUT, "$(P)$(M).ACCL")
|
||||
field(OMSL, "closed_loop") # This configuration keeps the PV and the field in sync
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user