1c776907119158e3b04226bf8843bccbe4463c75
Various motor documents
- /home/zamofing_t/Documents/doc-ext/SwissFEL/ESB-MX-Stage
Parker stage
- encoder is incremental encoder
25mm or 50mm travel stage
Stall Current Continuous 0.8
Peak Current Amps RMS 2.4 (->sqrt(2)*2.4=3.39A_peak)
Resistance Ohms 8.8
Inductance mH 2.4
Max.BuxVoltage V 80
Continous Force 4N -> assume 1kg load -> acceleration=a=F/m=4m/s^2
Weight top stage: 250g=2.5N
Mecapion rot stage
http://www.lsmecapion.com/eng/
http://www.lsmecapion.com/eng/contents/sub01/sub02_03.php
http://www.a2v.fr/program/mdm-dc06d.htm
http://www.parkem.ch/medien/produkte/direktantriebstechnik/pdf/MDM_Rundtisch_katalog.pdf
http://www.goto.si/wp-content/uploads/2016/kat/L7%20Series%20catalog.pdf
http://farasys.ir/wp-content/uploads/2015/Direct%20Drive%20Rotary%20Motors.pdf
http://www.inmoco.co.uk/Upload/product/1037_DD_Series_Motors_79.pdf
- encoder is biss 20 bit
- Rated Current 1.46 Arms
- Max Current 4.38 Arms
- 32 pole (16 einraster per rev)
Testing ServoFrq.
!common(PhaseFreq=20000,PhasePerServo=4) -> 25000points, 20um error leads the trajectory in x
!common(PhaseFreq=20000,PhasePerServo=2) -> 25000points, 6.6um error
!common(PhaseFreq=20000,PhasePerServo=1) -> 25000points, 6.1um error ossilates in y, x is quite good
-> the servo loop has to be optimized!
Testing linear,pvt,spline moves
Tested with shapepath.py: THE BEST TRAJECTORY RESULT IST WITH PVT MOTION
Optimize/Test Parameters with Parker Stage
used ESB_MX/python/move_record.py to record and plot friction
used src/usrServo/usrcode.c to filter the following error of the stage
Check Simulink project at /home/zamofing_t/afs/ESB-MX
subl /home/zamofing_t/afs/ESB-MX/Readme.md
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage()
#1..3$
&1
#1..3j/
load program prg/testPerfGrid.prg
b2r
cd ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/src/usrServo
make #will install the user servo loop
watch P3000 (average following error)
tweak servo parameters ->!motor_servo(mot=3,ctrl='ServoCtrl',Kp=20,Kvfb=220,Ki=0.02,Kvff=240,Kaff=1500,MaxInt=1000)
Same for motor 2 -> watcp P2000
Increase load will need an increase of gains to compensate following error
Motor[2].Servo.Kp=20
Motor[2].Servo.Kvfb=1000
Motor[2].Servo.Ki=0.07
Motor[2].Servo.Kvff=1000
Motor[2].Servo.Kaff=4000
Motor[3].Servo.Kp=20
Motor[3].Servo.Kvfb=220
Motor[3].Servo.Ki=0.02
Motor[3].Servo.Kvff=240
Motor[3].Servo.Kaff=1500
./shapepath.py --yx
average error x 0.313575 um, y 0.461707 um, 0.629583 um
./shapepath.py
average error x 0.371877 um, y 0.317152 um, 0.542073 um
Start motion on external signal
open plc 1
Coord[1].DesTimeBase=0 // freezes timebase at boot
while(1)
{
if(PowerBrick[0].GpioData[0].0.1==1)
{
PowerBrick[0].GpioData[0].16.8=255
Coord[1].DesTimeBase=Sys.ServoPeriod
}
else
{
PowerBrick[0].GpioData[0].16.8=7
Coord[1].DesTimeBase=0
}
}
close
enable plc 1
-> run motion program. press gpio 0 to run at 100%
29.9.17 Testing in MX-LAB
Start the powerbrick. ioc is started automatically
zamofing_t@ganymede:~$ ssh x06mx-cons-1
caget SAR-ESB_MX:MOTOR_AX
cd /net/slsfs-crtl/export/sf/common/config/qt/
startDM -macro 'P=SAR-ESB_MX' ESB_MX_exp
press homing button
-> all axes can be moved.
(on thierrys laptop only)
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python
./shapepath.py
will execute the custom motion. No problems with EPICS
(on other machines)
module is installed in:
ls /net/slsfs-crtl/export/sf/ioc/modules/ESB_MX/zamofing_t/R3.14.12/
PATH=/net/slsfs-crtl/export/sf/controls/bin/:$PATH
source /opt/gfa/python-2.7/2.3.0/bin/activate xblpython > /dev/null 2>&1
cd /net/slsfs-crtl/export/sf/ioc/modules/ESB_MX/zamofing_t/R3.14.12/
./shapepath.py
export EPICS_CA_ADDR_LIST="129.129.109.255" export EPICS_CA_ADDR_LIST="129.129.126.255" caQtDm -macro 'P=SAR-ESB_MX' ESB_MX_exp
HelicalScan
PPMAC=MOTTEST-CPPM-CRM0485
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBInspect1.pbi
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC sim_8_motors.cfg -i
ssh root@$PPMAC
sendgetsends -1
cpx send 1"SampleMessage\n"
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python
./helicalscan.py
fwd/inv kinematic stuff
Coord[1].SegMoveTime=.05, will calculate all 0.05 sec the inverse kinematic.
default Coord[1].SegMoveTime=0, calculates inv kin. only at endpoints
&1p ->this will trigger:forward kinematic
cpx pmatch ->this will trigger:forward kinematic
cpx ;linear rel; X0Y0Z0B0 ->this will trigger: inverse
test_coord_trf() (w is in mdeg) -> Output:
input : cx:0.2 cz:0.3 w:5729.58 fy:0.4
fwd_trf: dx:-1.14768 dz:-19.0991 w:5729.58 fy:0.4
inv_trf: cx:0.2 cz:0.3 w:5729.58 fy:0.4
input : dx:0.2 dz:0.3 w:5729.58 fy:0.4
inv_trf: cx:1.54768 cz:19.6991 w:5729.58 fy:0.4
fwd_trf: dx:0.2 dz:0.3 w:5729.58 fy:0.4
#4j=0.2 //cx
#5j=0.3 //cz
#3j=5729.58 //w
#1j=0.4 //fy
&1p
forward kinematic 0.199997 0.300003 5729.58 0.399994
forward result -1.14769 -19.0991 5729.58 0.399994
cpx ;linear abs; X.2Y.4Z.3B5729.58
inverse kinematic 0.2 0.3 5729.58 0.4
inverse result 1.54579 19.7026 5729.58 0.4
input : cx:10 cz:20 w:171887 fy:40
fwd_trf: dx:28.9419 dz:-5.52304 w:171887 fy:40
inv_trf: cx:10 cz:20 w:171887 fy:40
#4j=10 //cx
#5j=20 //cz
#3j=171887 //w
#1j=40 //fy
&1p
forward kinematic 10 20 171887 40
forward result 28.942 -5.52296 171887 40
input : dx:10 dz:20 w:171887 fy:40
inv_trf: cx:-8.94193 cz:45.523 w:171887 fy:40
fwd_trf: dx:10 dz:20 w:171887 fy:40
cpx ;linear abs; X10 Z20 B171887 Y40
inverse kinematic 10 20 171887 40
inverse result -8.94198 45.523 171887 40
Motors final setup 20.12.17
SAR-CPPM-EXPMX1: biss:y timing:y
1: fy
2: fx
3: ry
4: cx
5: cz
6: interfero y
7: interfero x
labels:
MOT_FY EXPMX1.1 MOT_FX EXPMX1.2 MOT_ROT_Y EXPMX1.3 MOT_CX EXPMX1.4 MOT_CZ EXPMX1.5
ENC_FY EXPMX1.1 ENC_FX EXPMX1.2 ENC_ROT_Y EXPMX1.3 ENC_CX EXPMX1.4 ENC_CZ EXPMX1.5
IFR_FY EXPMX1.6 IFR_FX EXPMX1.7
SAR-CPPM-EXPMX2: biss:n timing:n
1: wedge1
2: wedge2
3: wedge3
4: wedge4
5: backlight
6: cryojet
SAR-CPPM-EXPMX3: biss:n timing:y
1: girder1
2: girder2
3: girder3
4: girder4
5: girder5
PPMAC=MOTTEST-CPPM-CRM0485
ssh root@$PPMAC
cd /ioc/SAR-CPPM-EXPMX1;iocsh startup.script
sendgetsends -1
ssh x06mx-cons-1
export CAQTDM_DISPLAY_PATH=/net/slsfs-crtl/export/sf/common/config/qt/:/net/slsfs-crtl/export/sf/controls/config/qt/
export EPICS_CA_ADDR_LIST="129.129.126.255"
caqtdm -macro "P=SAR-EXPMX" ESB_MX_exp.ui
TODO 5.1.18
Fwd/inv kinematic is not yet fully correct for PVT moves:
Inverse kinematic need to calculate velocities:
Now a simplified approach with no dependencies is implemented:
vqCX=vDX
vqCZ=vDZ
vqW=vW
vqFY=vY
To see the differences compare:
hs.gen_prog(fnPrg='/tmp/prg.cfg',host='MOTTEST-CPPM-CRM0485',mode=1,cntHor=1,cntVert=5,wRng=(120000,120000),pt2pt_time=100)
hs.gen_prog(fnPrg='/tmp/prg.cfg',host='MOTTEST-CPPM-CRM0485',mode=1,cntHor=1,cntVert=5,wRng=(120000,120000),pt2pt_time=100,smt=0)
hs.gen_prog(fnPrg='/tmp/prg.cfg',host='MOTTEST-CPPM-CRM0485',mode=1,cntHor=1,cntVert=5,wRng=(0,360000))
hs.gen_prog(fnPrg='/tmp/prg.cfg',host='MOTTEST-CPPM-CRM0485',mode=1,cntHor=1,cntVert=5,wRng=(0,360000),smt=0)
When using segmented mode (SegMoveTime>0) the velocities are not needed.
With SegMoveTime=0 these velocities are needed and will result in a non optimal trajectory (with the current buggy calculation).
Testing Helicalscan with real motors 8.1.18
PPMAC=SAR-CPPM-EXPMX1
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX1()
enable plc 1
export EPICS_CA_ADDR_LIST=$PPMAC
caQtDM -macro 'P=SAR-EXPMX' ESB_MX_exp
do homing (or call plc 1)
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python
./helicalscan.py
Testing Wedge mover
PPMAC=SAR-CPPM-EXPMX2
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBInspect2.pbi
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX2()
!!! WATCH OUT !!!
if the send buffer overruns, the programs will abort in an unexplainable way:
send 1"inv_res %f %f %f %f\\n",qCX,qCZ,qW,qFY
without reading it with sendgetsends -1
5 CAM mover
/home/zamofing_t/Documents/doc-ext/SwissFEL/Devices/5CAM
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/5CAM_SYSTEM/
git@git.psi.ch:epics_ioc_modules/5CAM_SYSTEM.git
copied the coordTrf.py from /home/zamofing_t/Documents/doc-ext/SwissFEL/Devices/5CAM
to /cfg/MX3_coordTrf.py and modify it
PPMAC=MOTTEST-CPPM-CRM0485
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBInspect3.pbi
PPMAC=MOTTEST-CPPM-CRM0485
ssh root@$PPMAC
sendgetsends -1
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX3()
5 CAM mover commissioning EH60 27.3.18
PPMAC=SAROP11-CPPM-MOT6765
PPMAC=MOTTEST-CPPM-CRM0515
PBInspect --host $PPMAC
gpasciiCommander --host $PPMAC -i
$$$***
!common()
PowerBrick[0].GpioData[0].17=1
16 fail
17 ok
18 fail
19 ok
20 fail
21 fail on box
22 fail on box
23 fail on box
21 fail on box
Testing on motor 2
$$$***
!common()
!encoder_sim(enc=2,tbl=2,mot=2)
!motor(mot=2,dirCur=1000,JogSpeed=1024)
!encoder_ssi(enc=2,tbl=10,mot=10,numBits=18)
PowerBrick[0].GpioData[0].17=1
#2j:102400
PowerBrick[0].GpioData[0].17=0
#2k
#2j:10240000 == 360 deg = 262037.6288 inc = 360000mdeg
//the motor has 512*200*100 usteps per revolution (512 uystep/step, 200 steps/rev 1:100 gear)
//the ssi-encoder has 2**18=262144 steps per revolution
//motor_u_steps/inc_enc_step=39.0625
//the ssi-encoder has 2**18=262144 steps per revolution
//10240000 ustep == 262144 encCnt == 360deg=360000mdeg
//posSf = userUnits/encoder_steps=360000/262144=5625./4096.
//servoSf=motor_u_steps/userUnits 10240000/360000=256./9.
$$$***
!common()
!encoder_ssi(enc=2,numBits=18,posSf=5625./4096.)
!motor(mot=2,dirCur=1000,JogSpeed=40,servoSf=256./9.,HomeOffset=0)
PowerBrick[0].GpioData[0].17=1
#2j:360000
PowerBrick[0].GpioData[0].17=0
#2k
!cm_brake(mot=2,curOn=1000,cs=1,delay=200,gpio=17)
cpx r0=180000;call 20 //motor 2 180deg
cpx r0=0 ;call 20 //motor 2 0 deg
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg/
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX3()
cpx call 15 //current on, open breaks
#1..5j=180000
#1..5j=0
cpx call 16 //close breaks, current off
&1
cpx r0=180000;call 20 //motor 2 180deg
open prog 10
call15
abslinear
X(10) Y(0) U(0) V(0) W(0)
call16
close
b10r
open prog 11
call15
abslinear
jog1=0
jog2=0
jog3=0
jog4=0
jog5=0
call16
close
b11r
open prog 12
call15
abslinear
jog1=180000
jog2=180000
jog3=180000
jog4=180000
jog5=180000
call16
close
b12r
&1p
5 CAM coord trf EH60 27.3.18
PPMAC=MOTTEST-CPPM-CRM0515
ssh root@$PPMAC
sendgetsends -1
open prog 12
call15
abslinear
jog1=180000
jog2=180000
jog3=180000
jog4=180000
jog5=180000
call16
close
b12r
&1p
5 CAM coord trf EH60 27.3.18
PPMAC=MOTTEST-CPPM-CRM0515
ssh root@$PPMAC
sendgetsends -1
$$$***
!common()
!SAR-EXPMX3()
&1p -> execute forward kinematics
cpx call 15
#1..5j=0
cpx abslinear X(0)Y(0)U(0)V(0)W(0) ->executes inverse kinematic
cpx call 16
L6=2000/3000
L7=1000/1.41421356237
L11=L7*sin(L1*1.74532925199e-05)
L12=L7*sin(L2*1.74532925199e-05)
L13=L7*sin(L3*1.74532925199e-05)
L14=L7*sin(L4*1.74532925199e-05)
L15=L7*sin(L5*1.74532925199e-05)
$$$***
!common()
!SAR-EXPMX3()
&1
#1..5j/
#1..5hmz
open prog 1
//homez1..5
call 15
jog1..5=0
call 16
L0 = Sys.Time + 2
while (L0 > Sys.Time){}
call 15
jog1..5=180000
call 16
call 15
abslinear X(1000)Y(0)U(0)V(0)W(0)
dwell 100
abslinear X(0)Y(1000)U(0)V(0)W(0)
dwell 100
abslinear X(0)Y(0)U(0)V(0)W(0)
dwell 100
jog1..5=0
call 16
close
b1r
cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16;
cpx call15;jog1..5=0;call16;
towards IOC 29.3.18
PPMAC=MOTTEST-CPPM-CRM0515
ssh root@$PPMAC
cd /ioc/SAR-CPPM-EXPMX3
iocsh startup.script
dbl
export EPICS_CA_ADDR_LIST="129.129.126.255"
export EPICS_CA_ADDR_LIST=$PPMAC
caQtDM -macro 'P=SAR-EXPMX' ESB_MX_exp
caQtDM -macro 'P=SAR-EXPMX' ESB_MX_5cam
PPMAC=SAR-CPPM-EXPMX2
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBInspect2.pbi
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX3()
caput SAR-EXPMX3:ASYN.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX3:ASYN.AOUT '&1;cpx jog1..5=000;call 16'
caput SAR-EXPMX3:ASYN.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX3:ASYN.AOUT '&1;cpx jog1..5=10000;call 16'
caput SAR-EXPMX3:ASYN.AOUT cpx call 16
caput SAR-EXPMX3:ASYN.AOUT cpx call 15
caput SAR-EXPMX3:ASYN.debug cpx call 16
caput SAR-EXPMX3:ASYN.debug0 cpx call 16
see also:
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_boot_sf/SARES20-CSSU-ESB1/SARES20-CSSU-ESB1_startup.script
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_boot_sf/SARES20-CSSU-ESB1/SARES20-CSSU-ESB1_hexpodPI.subs
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_boot_sf/SARES20-CSSU-ESB1/hpod.template
/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_boot_sf/SARES20-CSSU-ESB1/cfg/hpod.proto
caQtDM -macro "P=SAR-EXPMX:,R=asyn" asynRecord.ui
caQtDM -macro "P=SAR-EXPMX:,R=asyn" asynSerialPortSetup.ui
caQtDM -macro "P=SAR-EXPMX:,R=asyn" asynOctet.ui
caQtDM -macro "P=SAR-EXPMX:,R=debug0" asynOctet.ui
caput SAR-EXPMX:asyn.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX:asyn.AOUT '&1;#1..5j/;cpx call 16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call 15;jog1..5=0; call 16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call 15;jog1..5=10000; call 16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(00)Y(0)U(0)V(0)W(0);call16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(00)Y(0)U(0)V(0)W(0);call16'
caput -S SAR-EXPMX:debug '&1;#1..5j/;cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16'
SAR-EXPMX:MOT_GIR_W.SPMG
Plugin: epics3 : loaded & connected
=====================================
Description: Stop
TimeStamp: Apr 04, 2018 11:57:02.623574449
Type: DBF_ENUM
Count: 1
Value: 0
nbStates: 4
States:
0 Stop
1 Pause
2 Move
3 Go
Check some coord trf 4.4.18
$$$***
!common()
!SAR-EXPMX3() //with !MX3_setup_sim()
using trf:
!MX3_coordTrf(exc=5000,height=2000,width=500000,length=1000000,camSf=1.7453292519943296e-05)
open forward
// define(AA1='L1',AA2='L2',AA3='L3',AA4='L4',AA5='L5')
// define(r='L6',scl='L7')
// define(S1='L11',S2='L12',S3='L13',S4='L14',S5='L15')
// define(X='C6',Y='C7',U='C3',V='C4',W='C5')
L6=2000/500000
L7=5000/1.41421356237
L11=L7*sin(L1*1.74532925199e-05)
L12=L7*sin(L2*1.74532925199e-05)
L13=L7*sin(L3*1.74532925199e-05)
L14=L7*sin(L4*1.74532925199e-05)
L15=L7*sin(L5*1.74532925199e-05)
send 1"fwd_inp(%f) %f %f %f %f %f\n",D0,L1,L2,L3,L4,L5
send 1"fwd_inp(%f) %f %f %f %f %f\n",D0,L11,L12,L13,L14,L15
//C6=D^-1*S
C6=+.5*L11 -.5*L12 +(L6+.5)*L13 +(L6-.5)*L14 +(.5-L6)*1.41421356237*L15
C7=+.5*L11 +.5*L12 +.25*L13 +.25*L14 +.25*1.41421356237*L15
C3= -.5*L13 -.5*L14 +.5*1.41421356237*L15
C4=-.5*L11 +1.*L12 +1.5*L13 -.5*L14 -.5*1.41421356237*L15
C5=-.5*L11 -1.*L12 +.5*L13 +.5*L14 +.5*1.41421356237*L15
send 1"fwd_res %f %f %f %f %f\n",C6,C7,C3,C4,C5
D0=$000000f8; //C3=$8 C4=$10 C5=$20 C6=$40 C7=$80 hex(8+int('10',16)+int('20',16)+int('40',16)+int('80',16)) -> '0xf8'
close
open inverse
// define(AA1='L1',AA2='L2',AA3='L3',AA4='L4',AA5='L5')
// define(r='L6',scl='L7')
// define(S1='L11',S2='L12',S3='L13',S4='L14',S5='L15')
// define(X='C6',Y='C7',U='C3',V='C4',W='C5')
//if(D0>0)
// send 1"Velocity calculation NOT SUPPORTED\n"
send 1"inv_inp(%f) %f %f %f %f %f\n",D0,C6,C7,C3,C4,C5
L6=2000/500000
L11=+.5*C6 +.5*C7 +(0) *C3 -.5*C4 +.5*C5
L12=-.5*C6 +.5*C7 +(0) *C3 +.5*C4 +.5*C5
L13=+.5*C6 +.5*C7 -(.5) *C3 +.5*C4 -.5*C5
L14=-.5*C6 +.5*C7 -(.5) *C3 -.5*C4 -.5*C5
L15= .5*1.41421356237*C7 +.5*1.41421356237*C3 -.5*1.41421356237*C5
L7=1.41421356237/5000
L1=asin(L11*L7)/1.74532925199e-05
L2=asin(L12*L7)/1.74532925199e-05
L3=asin(L13*L7)/1.74532925199e-05
L4=asin(L14*L7)/1.74532925199e-05
L5=asin(L15*L7)/1.74532925199e-05
send 1"inv_res %f %f %f %f %f\n",L1,L2,L3,L4,L5
close
&1;cpx abs linear;jog1=0;jog2=0;jog3=0;jog4=0;jog5=0
&1;cpx abs linear;jog1=10000;jog2=20000;jog3=30000;jog4=40000;jog5=50000
&1;cpx abs linear;X(1365.89)Y(2879.23)U(-105.071)V(502.495)W(2419.1)
&1;cpx abs linear;X(-10.000000)Y(200.000000)U(3.00000)V(4.00000)W(5.00000)
&1;cpx abs linear;X(0.000000)Y(0.000000)U(0.00000)V(0.00000)W(0.00000)
&1;cpx abs linear;X(-10.000000)Y(200.000000)U(3.00000)V(4.00000)W(5.00000)
#1..5p
&1p
pmatch
fwd_inp(0) 0 0 0 0 0
fwd_inp(0) 0 0 0 0 0
fwd_res 0 0 0 0 0
inv_inp(0) 0 0 0 0 0
inv_res 0 0 0 0 0
fwd_inp(0) 10000 20000 30000 40000 50000
fwd_inp(0) 613.939 1209.22 1767.77 2272.6 2708.38
fwd_res 1365.89 2879.23 -105.071 502.495 2419.1
fwd_res 1365.89 2879.23 -105.071 502.495 2419.1
inv_inp(0) 1365.89 2879.23 -105.071 502.495 2419.1
inv_res 60621.7 38843.4 20130.6 -10620.2 4072.1
Checking Homeoffset init bug
//the motor has 512*200*100 usteps per revolution (512 uystep/step, 200 steps/rev 1:100 gear)
//the ssi-encoder has 2**18=262144 steps per revolution
//posSf = userUnits/encoder_steps
//servoSf=motor_u_steps/userUnits
512*200*100/262144
cpx PowerBrick[1].GpioData[0].16.5=$1f;motor[1].idCmd=1000;jog1=-1000;PowerBrick[1].GpioData[0].16.5=$0;motor[1].idCmd=0
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
cpx PowerBrick[1].GpioData[0].16.5=$1f;motor[1].idCmd=1000;jog1=361000;PowerBrick[1].GpioData[0].16.5=$0;motor[1].idCmd=0
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
cpx PowerBrick[1].GpioData[0].16.5=$1f;motor[1].idCmd=1000;jog1=1000;PowerBrick[1].GpioData[0].16.5=$0;motor[1].idCmd=0
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
cpx PowerBrick[1].GpioData[0].16.5=$1f;motor[1].idCmd=1000;jog1=0;PowerBrick[1].GpioData[0].16.5=$0;motor[1].idCmd=0
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
$$$***
!common()
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
#1hmz
$$$***
!common()
!encoder_ssi(enc=1,numBits=18,posSf=1.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf= 39.0625,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
#1hmz
cpx PowerBrick[1].GpioData[0].16.5=$1f;jog1=-1000;PowerBrick[1].GpioData[0].16.5=$0
Motor[1].idCmd=0
EncTable[1].PrevEnc
Motor[1].HomeOffset
Motor[1].HomePos
Motor[1].ActPos
EncTable[1].PrevEnc=-2490368
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
#1hmz
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=-20907.)
#1hmz
Motor[1].HomeOffset=-20907
Motor[1].HomePos=-1100471.57226169435
Motor[1].ActPos=-1100474.61749599339
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.) -> reate wrong values
Motor[1].HomeOffset=0
Motor[1].HomePos=-1439342.11669405433
Motor[1].ActPos=-1100474.61749599339
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=-20907.)
Motor[1].HomeOffset=-20907
Motor[1].HomePos=-372569.750242860231
Motor[1].ActPos=-8.86266251358743773e-17
#1p 372569.7502428602
but should be -8000
#1p=Motor[1].ActPos-Motor[1].HomePos
open plc 0
if (Motor[1].ActPos-Motor[1].HomePos>180000)
Motor[1].HomePos=Motor[1].HomePos+360000
if (Motor[2].ActPos-Motor[2].HomePos>180000)
Motor[2].HomePos=Motor[2].HomePos+360000
if (Motor[3].ActPos-Motor[3].HomePos>180000)
Motor[3].HomePos=Motor[3].HomePos+360000
if (Motor[4].ActPos-Motor[4].HomePos>180000)
Motor[4].HomePos=Motor[4].HomePos+360000
if (Motor[5].ActPos-Motor[5].HomePos>180000)
Motor[5].HomePos=Motor[5].HomePos+360000
disable plc 0
close plc 0
enable plc 0
29.5.18 Calibration ID Lab
PPMAC=MOTTEST-CPPM-CRM0515
ssh root@$PPMAC
cd /ioc/SAR-CPPM-EXPMX3
iocsh startup.script
dbl
export EPICS_CA_ADDR_LIST=$PPMAC
caQtDM -macro 'P=SAR-EXPMX' ESB_MX_exp
caQtDM -macro 'P=SAR-EXPMX' ESB_MX_5cam
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX
PBInspect --host $PPMAC --cfg PBInspect2.pbi
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX3()
caput SAR-EXPMX3:ASYN.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX3:ASYN.AOUT '&1;cpx jog1..5=000;call 16'
caput SAR-EXPMX3:ASYN.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX3:ASYN.AOUT '&1;cpx jog1..5=10000;call 16'
caput SAR-EXPMX3:ASYN.AOUT cpx call 16
caput SAR-EXPMX3:ASYN.AOUT cpx call 15
caput SAR-EXPMX3:ASYN.debug cpx call 16
caput SAR-EXPMX3:ASYN.debug0 cpx call 16
#1..5p
-204709.6252433953 -242008.2092276345 -269883.2702626893 -124867.8588862641 -189315.0329582951
-19000
Motor[1].pLimits=PowerBrick[0].Chan[0].Status.a
Motor[2].pLimits=PowerBrick[0].Chan[1].Status.a
29.5.18 Commissioning ESC
[saresb-cons-01 ~]$ caqtdm -macro 'P=SAR-EXPMX' ESB_MX_exp
SAR-EXPMX:MOT_CX ok
SAR-EXPMX:MOT_CZ ok
SAR-EXPMX:MOT_FX encoder ok, failed phasing... cabeling issue. old cable ok.
SAR-EXPMX:MOT_FY encoder ok, failed phasing... cabeling issue. old cable ok.
SAR-EXPMX:MOT_ROT_Y ok
SAR-EXPMX:MOT_BLGT hotor ok, homing fails -> check if ho,ing switsch is on correct pins?
SAR-EXPMX:MOT_CRYO ok
SAR-EXPMX:MOT_WEDGE1 motor ok, encoder cable issue. old incr. cable works
SAR-EXPMX:MOT_WEDGE2 motor ok, encoder cable issue. old incr. cable works
SAR-EXPMX:MOT_WEDGE3 motor ok, encoder cable issue. old incr. cable works
SAR-EXPMX:MOT_WEDGE4 motor ok, encoder cable issue. old incr. cable works
Backlight: check register Gate3[1].Chan[0].Status when pressing home button...
Wedge mover:
#3,4
#3,4j=-17000 up limit
#3,4j=18000 down limit
#3j=350;#4j=-350 left right
#3j=-2900;#4j=2900 left right
#1j=-13000;#2j=0 up limit
#1j=1000;#2j=14000 down limit
#1j=-6000;#2j=7000 start
#1j=-8500;#2j=9500 left right
#1j=-6000;#2j=7000 also limit ?
do this multiple times until motor 2 is far enough
> #1j-;#2j-
> #1j+;#2j-
then home motor 2
#1j-;#2hm
Measured distances schieblehre:
m1:67.85
m2:67:42
m3:66.73
m4:68.97
Alles bündig bei je 67mm
m3 -330
m4 1900
Wedge Mover Limits:
X -2.13 .. 1.5
Y -1.68 .. 2.28
Individual motor limits:
Y-Min (moving until all limits kick in)
#1..4p
19594 16978 22575.5 21962
Y-Max
#1..4p
-23962.5 -23414 -22669 -22413
right:
#1..4p
-2023 2049 -3362 3379
left
#1..4p
3017 -3170 1415.5 -1693
Y: -1.67
Motor 1,2 tuning
Current loop:
rise time: 0.25ms
overshot 2.74%
damping: 0.753
natural frq:1487Hz
=>system 2ter Ordnung
k*1/(1+T1*s+t2*s^2)
EVR
check git modules:
mrfioc2 -> EVR config
PB_BSREAD -> sample how to configure user Flags
Gate3[1].Chan[0].UserFlag -> is set to 0 when event triggered (mapped to output FronUnivOut4 in the EVR)
EVR output powerBrick register $(USR_FLAG_ID)
FrontUnivOut4 Gate3[1].Chan[0].UserFlag 5
FrontUnivOut5 Gate3[1].Chan[1].UserFlag 6
FrontUnivOut6 Gate3[1].Chan[2].UserFlag 7
Event 254 -> Pulser 0 -> FrontUnivOut4 Gate3[1].Chan[0].UserFlag
Event 40 -> Pulser 1 -> FrontUnivOut4 Gate3[1].Chan[1].UserFlag
Event 22 -> Pulser 2 -> FrontUnivOut4 Gate3[1].Chan[2].UserFlag
caput SAR-CVME-TIFALL5-EVG0:SoftEvt-EvtCode-SP 254
Sample test code for sync:
open prog 2
Gate3[0].GpioData[0].16.1=0
linearabs
//X50Y-0
dwell10
while(Gate3[1].Chan[0].UserFlag==0){}
while(1)
{
if(Gate3[1].Chan[1].UserFlag==0)
{
break
}
}
Gather.Enable=2
Gate3[0].GpioData[0].16.1=1
//pvt40abs
//X50:443.604Y-0:0
dwell1000
Gather.Enable=0
close
b2r
Testing Helical Coord Trf
B0.3504637004371034 X-13.68414496427224 Y-8.029999999998836 Z-1483.096457761122
&1p ->this will trigger:forward kinematic
cpx pmatch ->this will trigger:forward kinematic
cpx ;linear rel; X0Y0Z0B0
cpx ;linear abs; X-13.68 Y-8.03 Z-1483.1 B0.35
->this will trigger: inverse
&1;cpx abs linear;jog1=0;jog2=0;jog3=0;jog4=0;jog5=0
-1:fwd_inp(0) 0.45 -1103.7 0.350464 -7.98
-1:fwd_res -13.5538 -1481 0.350464 -7.98
//motors CX CZ RY FY
// 4 5 3 1
&1;cpx abs linear;jog1=0;jog2=0;jog3=0;jog4=0;jog5=0
def calcParam(self,x=((.468,-.627,-.523),(.357,-1.349,.351)),
y=(.557,-.008),
z=((1.73,.93,2.129),(2.13,.03,1.103))):
&1;cpx abs linear;jog1=557;jog3=0;jog4=-468;jog5=-1730
&1;cpx abs linear;jog1=-8;jog3=240000;jog4=-351;jog5=-1103
caQtDM -macro "NAME=ESB-MX-CAM,CAMNAME=ESB-MX-CAM" /sf/controls/config/qt/Camera/CameraMiniView
#1,3,4,5p
point 1 0,120,240 deg
575.5 0 -241.5 -1401.3
575.5 120000 96.7 -1401.7
575.5 240000 -53.8 -1802.4
point 2 0,120,240 deg
175.5 0 -162.3 -1802.5
175.5 120000 -293.2 -1303.7
175.5 240000 246.4 -1402.25
#1j=575.5; #3j=0 ; #4j=-241.5; #5j=-1401.3
#1j=575.5; #3j=120000; #4j= 96.7; #5j=-1401.7
#1j=575.5; #3j=240000; #4j= -53.8; #5j=-1802.4
#1j=175.5; #3j=0 ; #4j=-162.3; #5j=-1802.5
#1j=175.5; #3j=120000; #4j=-293.2; #5j=-1303.7
#1j=175.5; #3j=240000; #4j= 246.4; #5j=-1402.25
pixel center 1110 1090
#1j=575.5; #3j=0 ; #4j=-241.5; #5j=-1401.3
cpx pmatch
-1:fwd_inp(0) -241.5 -1401.3 0 575.5
-1:fwd_res -88.9829 308.514 0 575.5
cpx ;linear abs; X0 Z0 Y575 B0
cpx ;linear abs; X0 Z0 Y575 B100000
Software esbMX deploy
zamofing_t@ganymede:~$ ll /sf/bernina/config/swissmx/zamofing_t/
/sf/bernina/config/swissmx/
ssh saresb-cons-01
ssh sf-cons-01
source /opt/gfa/python
source activate /sf/bernina/config/swissmx/conda/envs/b440_clone
zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python$
cp -arL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py \
~/Documents/prj/SwissFEL/PBTools/pbtools/ \
/sf/bernina/config/swissmx/zamofing_t/
cp -arL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/PBMotionAnalyzer/*.py \
/sf/bernina/config/swissmx/zamofing_t/PBMotionAnalyzer/
>alternatives but not recommanded
#scp -r ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py ganymede:~/Documents/prj/SwissFEL/PBTools/pbtools/ /sf/bernina/config/swissmx/zamofing_t/
#rsync -abuv --exclude 'records/' ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/PBMotionAnalyzer/ ~/Documents/prj/SwissFEL/PBTools/pbtools/ /sf/bernina/config/swissmx/zamofing_t/
Sync Start
caput SAR-CVME-TIFALL5-EVG0:SoftEvt-EvtCode-SP 254
Try to find encoder count loss
//set incEncFrq to 25MHz, (default was to low: 3.125MHz)
Gate3[0].EncClockDiv=2
Gate3[1].EncClockDiv=2
Helicalscan setup
calcParam(
x=((-34.05489905551743, 208.10204385266277, -606.4416461908648),
(22.139508829306088, 158.83214548238513, -618.6408606756819)),
y=(1700.0, 1252.0231362790232),
z=((-1200.0, -2000.0000000000005, -1900.0000000000005),
(-1200.0, -2000.0000000000005, -1800.0000000000002)))
cpx X0 Z0 B0 Y1700.0
cpx X0 Z0 B120000 Y1700.0
cpx X0 Z0 B240000 Y1700.0
cpx X0 Z0 B0 Y1252.0
cpx X0 Z0 B120000 Y1252.0
cpx X0 Z0 B240000 Y1252.0
send 1"fwd_inp(%f) %f %f %f %f\\n",D0,{qCX},{qCZ},{qW},{qFY}
send 1"fwd_res %f %f %f %f\\n",{DX},{DZ},{W},{Y}
send 1"inv_inp(%f) %f %f %f %f\\n",D0,{DX},{DZ},{W},{Y}
send 1"inv_res %f %f %f %f\\n",{qCX},{qCZ},{qW},{qFY}
Description
Languages
Python
57.2%
C
15.7%
MATLAB
12.5%
TeX
11.3%
Makefile
3.3%