Dependencies of EPICS PVs on MX record fields, etc. Last updated January 23, 2012 This document describes how EPICS PVs created by the MX-based Channel Access server depend on the underlying MX record fields as well as other dependencies. All records: DESC - "label" NAME - "name" Motor Record: ACCL - "acceleration_time" ACOF - "acceleration_feedforward_gain" ATHM - Created by mxcaMotorMstaPV(). See MSTA description. BACC - "acceleration_time" BDST - "backlash_correction" BVEL - "speed" CARD - Dummy short PV. Initialized to -1. DCOF - "derivative_gain" DHLM - Created by mxcaMotorDialPV( ..., "positive_limit" ) Read: DHLM = "positive_limit" HLM = DHLM * DIR + OFF DIFF - Created by mxcaMotorDiffPV(). Read: DIFF = VAL - RBV DIR - Internal enum PV created by mxcaMotorDirPV(). Write: VAL = OFF + DIR * DVAL HLM = OFF + DIR * DHLM LLM = OFF + DIR * DLLM RBV = OFF + DIR * DRBV DLLM - Created by mxcaMotorDialPV( ..., "negative_limit" ) Read: DLLM = "negative_limit" LLM = DLLM * DIR + OFF DMOV - Created by mxcaMotorMstaPV(). See MSTA description. DRBV - Created by mxcaMotorDialPV( ..., "position" ) Read: DRBV = "position" RBV = DRBV * DIR + OFF DTYP - Internal string PV. Initialized to 'MxMotor'. DVAL - Created by mxcaMotorDvalPV(). Read: Set VAL = DVAL * DIR + OFF Write: 1. Gets the value of DIR. 2. Checks to see if DVAL is outside the range of DHLM and DLLM and sets LVIO accordingly. 3. If SET == 'Use', If (SPMG == 'Go') and (LVIO == 0), DMOV is set to 0. If new_dval >= mx_motor->position, Set TDIR to 1. Else Set TDIR to 0. Endif Force value change for MSTA. Start the move by writing to "destination". Endif Set VAL = DVAL * DIR + OFF. Else if SET == 'Set', If (FOFF == 'Variable'), Set OFF = VAL - DVAL * DIR. Post value change for OFF. Return Endif raw_set_position = (DVAL - OFF) / EGU Write raw_set_position to "set_position". Endif 4. Post value change for DVAL and VAL. EGU - "units" ERES - "scale" FOFF - Internal enum PV: 'Variable', 'Frozen'. Initialized to 'Variable'. HLM - Created by mxcaMotorUserPV( ..., DHLM ) Write: DHLM = DIR * ( HLM - OFF ) HLS - "positive_limit_hit" HOMF - Created by mxcaMotorHomePV( this, 'HOMF', 1 ). Write: If (HOMF == 1), if (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif Force value change for MSTA mx_motor_find_home_position() "home_search" Endif HOMR - Created by mxcaMotorHomePV( this, 'HOMR', -1 ). Write: If (HOMR == 1), if (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif Force value change for MSTA mx_motor_find_home_position() "home_search" Endif ICOF - "integral_gain" JOGF - Created by mxcaMotorJogPV( this, 'JOGF', 1 ) Write: If (JOGF != 0), if (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif mx_motor_constant_velocity_move() "constant_velocity_move" Else if (JOGF == 0), Capture position "position" mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Move to captured position "destination" Endif JOGR - Created by mxcaMotorJogPV( this, 'JOGR', -1 ) Write: If (JOGR != 0), if (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif mx_motor_constant_velocity_move() "constant_velocity_move" Else if (JOGR == 0), Capture position "position" mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Move to captured position "destination" Endif LLM - Created by mxcaMotorUserPV( ..., DLLM ) Write: DLLM = DIR * ( LLM - OFF ) LLS - "negative_limit_hit" LVIO - Internal short PV. Initialized to 0. MISS - Internal short PV. Initialized to 0. MOVN - Created by mxcaMotorMstaPV(). See MSTA description. MRES - "scale" MSTA - Created by mxcaMotorMstaPV(). Read: Set values of ATHM, DMOV, MOVN, and MSTA based on the value reported by motor->status. "status" OFF - Created by mxcaMotorOffPV(). Write: VAL = OFF + DIR * DVAL HLM = OFF + DIR * DHLM LLM = OFF + DIR * DLLM RBV = OFF + DIR * DRBV PCOF - "proportional_gain" RBV - Created by mxcaMotorUserPV( ..., DRBV ) Write: DRBV = DIR * ( RBV - OFF ) RDBD - Dummy short PV. Initialized to 0. REP - Created by mxcaMotorRxpPV(). Read: If ( (new RRBV - old RRBV) > "raw_move_deadband" ), Report position in encoder units. Endif RLV - Created by mxcaMotorRlvPV(). Read: Does nothing. Write: Set VAL = VAL + RLV Set RLV = 0 RMP - Created by mxcaMotorRxpPV(). Read: If ( (new RRBV - old RRBV) > "raw_move_deadband" ), Report position in motor units. Endif RRBV - Created by mxcaMotorRrbvPV(). Read or Write: DRBV = RRBV Post value changed for DRBV RVAL - "raw_destination" SET - Internal enum PV: 'Use', 'Set'. Initialized to 'Use'. SPMG - Created by mxcaMotorSpmgPV(). Write: If (SPMG == 'Stop'), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Else if (SPMG == 'Move'), mx_motor_move_absolute() "destination" STAT - Dummy short PV. Initialized to 0. STOP - "soft_abort" TDIR - Internal short PV. Initialized to 0 TWF - Created by mxcaMotorTweakPV( this, 'TWF', 1 ). Write: If (TWF == 1), If (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif VAL = VAL + TWF Write to VAL Endif TWF = 0 Post value changed for TWF. TWR - Created by mxcaMotorTweakPV( this, 'TWR', -1 ). Write: If (TWR == 1), If (DMOV != 1), mx_motor_soft_abort() "soft_abort" mx_wait_for_motor_stop() "status" Set DVAL = DRBV Endif VAL = VAL + TWR Write to VAL Endif TWR = 0 Post value changed for TWR. TWV - Internal double PV. Initialized to 0.0. Used by TWF and TWR. UEIP - Internal enum PV: 'No', 'Yes'. Initialized to 'No'. VAL - Created by mxcaMotorValPV(). VBAS - "base_speed" VCOF - "velocity_feedforward_gain" VELO - "speed" VERS - Internal float PV. Initialized to 6.3 Scaler Record: CNT - Created by mxcaScalerCntPV(). Read: Process gate record's "busy" field. Write: mx_timer_clear() Any needed from the following: mx_analog_input_clear() mx_digital_input_clear() mx_scaler_clear() mx_timer_clear() If gate channel is 1, either mx_timer_stop() or mx_timer_start() Else either mx_scaler_stop() or mx_scaler_start() Endif DLY - Dummy float PV. Initialized to 0. DTYP - Internal string PV. Initialized to 'MxScaler'. EGU - Internal string PV. Initialized to 'sec'. FREQ - Created by mxcaScalerFreqPV(). Write: T = S1 / FREQ TP = PR1 / FREQ G1 - Created by mxcaScalerGnPV(). Gn - Created by mxcaScalerGnPV(). NM1 - Channel name from MX timer record's "name" field. NMn - Channel name from MX scaler record's "name" field. PR1 - Created by mxcaScalerPr1PV(). Write: TP = PR1 / FREQ PRn - Created by mxcaScalerPrnPV(). PREC - "precision" RATE - Dummy float PV. Initialized to 0. S1 - Created by mxcaScalerS1PV(). Read: Process timer "value" field. Sn - Created by mxcaScalerSnPV(). Read: Process record field: analog input "value" digital input "value" motor "position" relay "relay_status" scaler "value" timer "value" T - Created by mxcaScalerTPV(). Tp - Created by mxcaScalerTpPV(). Write: PR1 = TP * FREQ VERS - Internal float PV. Initialized to 3.2