You'll want to read this first: Pulse Picker Presentation 2014-06-26.pptx (UPDATED 2014-06-26 with new "Follower" mode).
For more detailed information you can read the children pages below.
Children Display |
---|
Table of Contents |
---|
Initial XRay aligned positions:
Y position: 0.0000 mm
X position: 0.1512 mm
Test examples
Single shot 10 images
Code Block |
---|
ccdtake(1,10, bShutter=True)
|
Burst mode 3 shots 100 images
Code Block |
---|
ccdtake(3,100, bShutter=True)
|
Alignment Laser used to test the system
Code Block |
---|
In [2]: rl2.movein()
|
Code Block |
---|
In [2]: rl2.moveiout()
|
Results: Tests doesn't work satisfactory. Problems found in Mcode:
New tests with new ioc version (new MCode version)
Features:
TO BE IMPLEMENTED IN THE MCODE ASAP:
==================================================
in xcs-control:
caput XCS:SB2:MMS:09:SET_VE 0
modify reg/d/iocCommon/sioc/ioc-xcs-trigger-ims/startup.cmd
to point to working area,
ssh ioc-xcs-mot1
kill ioc (telnet localhost...)
boot ioc from reg/d/iocCommon/sioc/ioc-xcs-trigger-ims/startup.cmd
===================================================
to fast open/close:
caput XCS:SB2:MMS:09:MODE_OPEN 1 (C2 should be around 655)
caget XCS:SB2:MMS:09:SE_L (to be read 4)
caput XCS:SB2:MMS:09:MODE_CLOSE 1 (C2 should be around 0 or 2x655)
caget XCS:SB2:MMS:09:SE_L (to be read 5)
===================================================
1. START STOP mode3.3
SET_TG 2
SET_MODE 3
2. FAST OPEN/CLOSE PV
3. START POSITION INDEPENDENT:
Code Block |
---|
def _align(self):
caput('%s:%s' % (self.sPpmPv, 'C2'), 1)
val = caget('%s:%s' % (self.sPpmPv, 'C2'))
C2 = int(val)
APR_000 = self.apr_000
APR_180 = self.apr_180
ALG_000 = self.alg_000
ALG_180 = self.alg_180
self._exe_align(C2, APR_000, APR_180, ALG_000, ALG_180)
def _exe_align(self, C2, APR_000, APR_180, ALG_000, ALG_180):
print '_exe_align self.homeDone', self.homeDone
self._dis_pars()
self._pr_log('Blades alignment -----------------')
if not self.homeDone:
self._pr_err('!! Need to home before alignment procedure')
return False
#cmd = '%s:%s' % (self.sPpmPv, 'C1'); val = '%d' % C2
#self._pr_log('caput(\'%s\', %s)' % (cmd, val)) # set C1=C2
caput('%s:%s' % (self.sPpmPv, 'SET_VM'), 25600) # set EE=0 (open loop)
caput('%s:%s' % (self.sPpmPv, 'SET_VI'), 2844) # set C1=0
caput('%s:%s' % (self.sPpmPv, 'SET_A'), 45511) # set C1=0
caput('%s:%s' % (self.sPpmPv, 'SET_D'), 45511) # set C1=0
caput('%s:%s' % (self.sPpmPv, 'SET_C1'), C2) # set C1=C2
caput('%s:%s' % (self.sPpmPv, 'SET_EE'), 1) # set EE=1 (close loop)
#cmd = '%s:%s' % (self.sPpmPv, 'EE'); val = 1
#self._pr_log('caput(\'%s\', %s)' % (cmd, val)) # set EE=1 (close loop)
print 'C2 >= APR_000', C2, APR_000
print 'C2 < APR_180', C2, APR_180
print 'C2 < APR_000', C2, APR_000
print 'C2 >= APR_180', C2, APR_180
# if C2 >= APR_000 and C2 < APR_180:
# # move absolute to ALG_180 position
# #cmd = '%s:%s' % (self.sPpmPv, 'MA'); val = '%d' % ALG_180
# #self._pr_log('caput(\'%s\', %s)' % (cmd, val))
# caput('%s:%s' % (self.sPpmPv, 'MA'), ALG_180)
# elif C2 < APR_000 and C2 >= APR_180:
# # move absolute to ALG_100 position
# #cmd = '%s:%s' % (self.sPpmPv, 'MA'); val = '%d' % ALG_000
# #self._pr_log('caput(\'%s\', %s)' % (cmd, val))
# caput('%s:%s' % (self.sPpmPv, 'MA'), ALG_000)
#
caput('%s:%s' % (self.sPpmPv, 'MA'), ALG_000)
# else:
# self.homeDone = False
# print '!! Need to home before alignment procedure'
# return False
# cmd = '%s:%s' % (self.sPpmPv, 'EE'); val = 0
# self._pr_log('caput(\'%s\', %s)' % (cmd, val)) # set EE=0 (open loop)
# cmd = '%s:%s' % (self.sPpmPv, 'C1'); val = 0
# self._pr_log('caput(\'%s\', %s)' % (cmd, val)) # set C1=0
time.sleep(5)
caput('%s:%s' % (self.sPpmPv, 'SET_EE'), 0) # set EE=0 (open loop)
caput('%s:%s' % (self.sPpmPv, 'SET_C1'), 0) # set C1=0
caput('%s:%s' % (self.sPpmPv, 'SET_C2'), 0) # set C1=0
|
located in:
Code Block |
---|
[working area]... modules/pcds_motion/current/pcds_motionApp/src/ims_bootup_V3.mcode
|
Code Block |
---|
initial condition:
Motor is homing from outside:
C2 = 0 C1= 0
MN = ?
MF = XXXX steps (known) forward
MB = XXXX steps (known) backward
MO = XXXX steps (known) open position
Idle routine:
looking for where to go... (mod 2, mod 3, mod 4, fastopen, fastclose)
checkset subroutine
check my pos:
read C2
MN=MB, C2=MF +/- DELTA (dead band)
RT
MN=MF, C2=MB +/- DELTA (dead band)
RT
(MA MF and MN=MF), C2=MO +/- DELTA (dead band)
RT
if I m in startup+:
set next move to startup- (MB)
return subroutine
if I m in startup-:
set next move to startup+ (MF)
return subroutine
if I m open (MO):
MA to startup+ (MF)
set next move to startup- (MB)
mod 2
call chekset
waiting for trigger
...
mod 3
call chekset
waiting for trigger
...
mod 4
call chekset
waiting for trigger
...
fastopen
MA to open pos
fastclose
if in open pos
MA to startup+
|
Code Block |
---|
' Program Fragment: MODE_1 (Single Shot)
|
Code Block |
---|
' Program Fragment: MODE_2 (Continuous)
|
Code Block |
---|
' Program Fragment: MODE_3 (Burst mode)
|
Code Block |
---|
ssh ioc-xcs-mot1
|
Code Block |
---|
su <authorized_user>
ssh ioc-xcs-mot1
sudo /reg/d/iocCommon/sioc/ioc-xcs-trigger-ims/startup.cmd
telnet localhost 30999
|
Code Block |
---|
/reg/neh/home1/paiser/working/ioc/xcs/xip_pp/current/pyscripts/src/run_pp.sh
|
Code Block |
---|
~/.pp_xcs/pvlist.lst
|
Code Block |
---|
# ---------------------------------------------------------------
# Pulse Selector Description File
# ---------------------------------------------------------------
# Syntax:
# <TYPE>, <PVNAME|IOCNAME|SCRIPT>, <DESC> # some_more_comments
# Where:
# <Type> : "SEQ" -> Sequencer
# "EVR" -> EVR associated to sequencer
# "PPM" -> Pulse Selector
# "SVR" -> Motor and Pulse Selector Server
# "IOC" -> Motor and Pulse Selector software IOC
# "SPP" -> EDM screens for motion
# "SEV" -> EDM screens for evr
# <PVNAME> : PV base name
# <IOCNAME> : Server name associated to Pulse Selector PVs
# <DESC> : User description
# Notes:
# PVNAME or IOCNAME are not case sensitive.
# Line can be commented out by starting with '#' character.
# ---------------------------------------------------------------
SEQ, XPP:R35:IOC:SEQ, XPP DAQ Sequencer # FIXME To check
PLY, IOC:IN20:EV01, XPP DAQ Sequencer play mode # FIXME to check
EVR, XCS:R42:EVR:01, VME EVR located in XCS Rack 42 # OK
IOC, ioc-xcs-trigger-ims, IOC running pulse selector # OK
SPP, ppm_gui.sh, EDM screen startup shell script for PP motor # OK
PPM, XCS:SB2:MMS:09, Pulse Selector Motor # OK
YTR, XCS:SB2:MMS:21, Y translation motor # OK
XTR, XCS:SB2:MMS:08, X translation motor # OK
SEV, evr_gui.sh, EDM screen startup shell script for EVR # OK
SVR, ioc-xcs-mot1, server running IOC for pulse selector # OK
|
PP and Motor GUIs :
Code Block |
---|
/reg/neh/home1/paiser/working/ioc/xcs/xip_pp/current/pyscripts/ppm_gui.sh XCS:SB2:MMS:09 XCS:SB2:MMS:21 XCS:SB2:MMS:08
|
Code Block |
---|
# FIXME Configuration file default location
# TODO Autosave default rampup values
# TODO Fast close and open functions
# TODO Test Sequencer
|
Table of Contents |
---|
Code Block |
---|
ssh ioc-tst-cam5 /reg/neh/home1/paiser/bin/evr.sh EVR=TST:CAM:05:EVR
|
Code Block |
---|
ssh ioc-tst-cam5
|
Code Block |
---|
sudo /reg/d/iocCommon/sioc/ioc-tst-cam5/startup.cmd
|
Code Block |
---|
[paiser@ioc-xrt-xcscam04 ~ 12:18:20] psproc
PID USER-ID SIOC COMMAND HOSTNAME PORT
4851 tstioc caRepeater procServ ioc-xrt-xcscam04 30000
5147 tstioc ioc-tst-cam5 procServ ioc-xrt-xcscam04 30001
5150 tstioc ioc-tst-cam5 procServ ioc-xrt-xcscam04 40000
|
Code Block |
---|
ipmitool -I lanplus -U ADMIN -P <you_should_know> -H ioc-tst-cam5-ipmi power status
ipmitool -I lanplus -U ADMIN -P <you_should_know> -H ioc-tst-cam5-ipmi power reset
|
Where: <you_should_know> is the standard ipmi password that you_should_know...
Python homing script:
/reg/neh/home1/jsludvik/test-python/xip-home.py
XIP main GUI:
/reg/neh/home1/jsludvik/svn/trunk/ioc/xpp/xip_pp/current/motionScreens/xip_gui.sh
XPP motor GUIs:
Code Block |
---|
/reg/g/pcds/package/epics/3.14/modules/pcds_motion/R2.3.4/launch-motor.sh XPP:TST:MMS:01
/reg/g/pcds/package/epics/3.14/modules/pcds_motion/R2.3.4/launch-motor.sh XPP:TST:MMS:02
/reg/g/pcds/package/epics/3.14/modules/pcds_motion/R2.3.4/launch-motor.sh XPP:TST:MMS:03
|
Startup.cmd:
Code Block |
---|
/reg/d/iocCommon/sioc/ioc-xpp-trigger-ims/startup.cmd
|
Mode 1: Single pulse
Mode 2: Continuous trigger
Mode 1 and 2 should be the same program, as the Seq will generate the pulses to the motor, and open/close operation shouldn't make any difference whether it is 1 or more. The motor sees a trigger and moves.
This mode is accessed by <PV>:RUN_MODE2
Mode 3: The motor opens on a pulse, counts N pulses and closes on the Nth pulse. The pre-trigger and close trigger should be factored in by the upper layer software to determine the proper N value to put into the motor. All the motor does is, open on N=1, count, then close on N=N.
This mode is accessed by <PV>:RUN_MODE3
Mode 1 was programmed like just mode 2 with a User "Trigger" enable/disable, which may or may not be useful for us. Sort of like 2 layers of enabling, versus just 1 for mode2
This mode is accessed by <PV>:RUN_MODE1
Reset Modes to start new mode:
<PV>:RESET
1) EPICS Motor Record: HOMF
2) Zero Position
3) Move Relative -76.25 degrees
4) Zero Position
Pulse Selector Test/Checkout Procedure (6/10/2013)
X motor calibration
Y motor calibration
New Interlock:
Add Y motor interlock, position >= 2 mm above 0 position, no X movement allowed
X-Y interlock stopped working today, need to investigate.