Add mirror
This commit is contained in:
1 parent
73c5fd71b5
commit
a4f10cdf9f
44 files changed
+2648
-5
No files matched your search
@@ -8,4 +8,4 @@ EXCLUDE_VERSIONS+=3 7.0.5 7.0.6
|
||||
|
||||
SCRIPTS += axis_sm.plc_inc
|
||||
SCRIPTS += axis_kin_slit.plc_inc
|
||||
|
||||
SCRIPTS += axis_kin_mirror.plc_inc
|
||||
@@ -0,0 +1,19 @@
|
||||
#- Real axes: Y1 Y2 Y3 X1 X2
|
||||
var REAL_AXES[5] := {ax${AX_Y1}.enc.actpos, ax${AX_Y2}.enc.actpos, ax${AX_Y3}.enc.actpos, ax${AX_X1}.enc.actpos, ax${AX_X2}.enc.actpos};
|
||||
|
||||
#- Virtual axes: X Y PITCH ROLL YAW
|
||||
var VIRT_AXES[5] := {ax${AX_TRX}.traj.setpos, ax${AX_TRY}.traj.setpos, ax${AX_PITCH}.traj.setpos, ax${AX_ROLL}.traj.setpos, ax${AX_YAW}.traj.setpos};
|
||||
|
||||
#- forward kinematics
|
||||
ax${AX_TRX}.enc.actpos := dot(FWD1, REAL_AXES);
|
||||
ax${AX_TRY}.enc.actpos := dot(FWD2, REAL_AXES);
|
||||
ax${AX_PITCH}.enc.actpos := dot(FWD3, REAL_AXES);
|
||||
ax${AX_ROLL}.enc.actpos := dot(FWD4, REAL_AXES);
|
||||
ax${AX_YAW}.enc.actpos := dot(FWD5, REAL_AXES);
|
||||
|
||||
#- inverse kinematics
|
||||
ax${AX_Y1}.traj.extsetpos := dot(INV1, VIRT_AXES);
|
||||
ax${AX_Y2}.traj.extsetpos := dot(INV2, VIRT_AXES);
|
||||
ax${AX_Y3}.traj.extsetpos := dot(INV3, VIRT_AXES);
|
||||
ax${AX_X1}.traj.extsetpos := dot(INV4, VIRT_AXES);
|
||||
ax${AX_X2}.traj.extsetpos := dot(INV5, VIRT_AXES);
|
||||
+4
-4
@@ -1,15 +1,15 @@
|
||||
|
||||
#- Initial PLC values
|
||||
if(plc${PLC_ID}.firstscan) {
|
||||
if(${SELF}.firstscan) {
|
||||
static.counter:=0;
|
||||
static.VMState:=-2;
|
||||
};
|
||||
|
||||
#- this is needed because initially upon IocInit, motor busy flags are briefly enabled, and the first motorRecord poll at 100ms might cause issues
|
||||
if ( static.counter<105 ) {
|
||||
static.counter+=1;
|
||||
if ( static.counter<0.105 ) {
|
||||
static.counter += ${SELF}.scantime;
|
||||
|
||||
if ( static.counter==105) { static.VMState:=0 };
|
||||
if ( static.counter>=0.105) { static.VMState:=0 };
|
||||
|
||||
#- VMs in Internal mode, ready to listen
|
||||
mc_grp_set_traj_src(${GRP_ID_VA},0);
|
||||
|
||||
@@ -0,0 +1,609 @@
|
||||
# Optics table record
|
||||
# SRI Geometry:
|
||||
# +---------------------+
|
||||
# | M1| - <------- origin
|
||||
# | | |
|
||||
# | M2 | LX
|
||||
# | | |
|
||||
# | M0| -
|
||||
# +---------------------+
|
||||
# |------LZ----------|
|
||||
# Macros:
|
||||
# P : Prefix, e.g. X04SA-OP-
|
||||
# T : Name of table record, e.g. MI1:T
|
||||
# Q : Prefix to all other records, e.g. MI1
|
||||
# M0X : Point 0 X direction motor
|
||||
# M0Y : Point 0 Y direction motor
|
||||
# M1Y : Point 1 Y direction motor
|
||||
# M2X : Point 2 X direction motor
|
||||
# M2Y : Point 2 Y direction motor
|
||||
# M2Z : Point 2 Z direction motor
|
||||
# LX : Table length perpendicular to beam direction
|
||||
# LZ : Table length along the beam direction
|
||||
# SX : X of rotation point
|
||||
# SY : Y of rotation point
|
||||
# SZ : Z of rotation point
|
||||
|
||||
record(ao, "$(P)$(Q):ax_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(Q):ay_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(Q):az_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(Q):x_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(Q):y_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(ao, "$(P)$(Q):z_tweakVal") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(PREC, "3")
|
||||
field(DRVH, "1000")
|
||||
field(HOPR, "1000")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(bo, "$(P)$(Q):doSync") {
|
||||
field(PINI, "YES")
|
||||
field(DTYP, "Soft Channel")
|
||||
field(DOL, "1")
|
||||
field(OUT, "$(P)$(T).SYNC PP MS")
|
||||
}
|
||||
|
||||
record(bo, "$(P)$(Q):stop") {
|
||||
field(DTYP, "Soft Channel")
|
||||
field(OUT, "$(P)$(Q):stop1.A PP MS")
|
||||
}
|
||||
|
||||
record(bo, "$(P)$(Q):update") {
|
||||
field(SCAN, ".2 second")
|
||||
field(DTYP, "Soft Channel")
|
||||
field(SDIS, "$(P)$(Q):done.VAL NPP MS")
|
||||
field(OMSL, "closed_loop")
|
||||
field(DOL, "1")
|
||||
field(OUT, "$(P)$(T).READ PP MS")
|
||||
field(ONAM, "Sync")
|
||||
}
|
||||
|
||||
record(calc, "$(P)$(Q):geomIsGEOCARS") {
|
||||
field(CALC, "a=1")
|
||||
field(INPA, "$(P)$(T).GEOM CP MS")
|
||||
}
|
||||
|
||||
record(calc, "$(P)$(Q):geomIsNEWPORT") {
|
||||
field(CALC, "a=2")
|
||||
field(INPA, "$(P)$(T).GEOM CP MS")
|
||||
}
|
||||
|
||||
record(calc, "$(P)$(Q):geomIsSRI") {
|
||||
field(CALC, "a=0")
|
||||
field(INPA, "$(P)$(T).GEOM CP MS")
|
||||
}
|
||||
|
||||
record(calcout, "$(P)$(Q):dmov") {
|
||||
field(DESC, "Get DMOV and check links")
|
||||
# field(INPA, "$(P)$(M0X).DMOV CP MS")
|
||||
field(INPB, "$(P)$(M0Y).DMOV CP MS")
|
||||
field(INPC, "$(P)$(M1Y).DMOV CP MS")
|
||||
# field(INPD, "$(P)$(M2X).DMOV CP MS")
|
||||
field(INPE, "$(P)$(M2Y).DMOV CP MS")
|
||||
# field(INPF, "$(P)$(M2Z).DMOV CP MS")
|
||||
field(CALC, "0")
|
||||
}
|
||||
|
||||
record(calcout, "$(P)$(Q):done") {
|
||||
field(CALC, "A&(I||!J)&(K||!L)")
|
||||
field(INPA, "$(P)$(Q):done1.VAL CP MS")
|
||||
field(INPI, "$(P)$(Q):dmov.E CP MS")
|
||||
field(INPJ, "$(P)$(Q):dmov.INEV CP MS")
|
||||
field(INPK, "$(P)$(Q):dmov.F CP MS")
|
||||
field(INPL, "$(P)$(Q):dmov.INFV CP MS")
|
||||
field(OUT, "$(P)$(T).READ PP MS")
|
||||
field(OOPT, "Transition To Non-zero")
|
||||
}
|
||||
|
||||
record(calcout, "$(P)$(Q):done1") {
|
||||
field(CALC, "(A||!B)&(C||!D)&(E||!F)&(G||!H)")
|
||||
field(INPA, "$(P)$(Q):dmov.A CP MS")
|
||||
field(INPB, "$(P)$(Q):dmov.INAV CP MS")
|
||||
field(INPC, "$(P)$(Q):dmov.B CP MS")
|
||||
field(INPD, "$(P)$(Q):dmov.INBV CP MS")
|
||||
field(INPE, "$(P)$(Q):dmov.C CP MS")
|
||||
field(INPF, "$(P)$(Q):dmov.INCV CP MS")
|
||||
field(INPG, "$(P)$(Q):dmov.D CP MS")
|
||||
field(INPH, "$(P)$(Q):dmov.INDV CP MS")
|
||||
}
|
||||
|
||||
record(table, "$(P)$(T)") {
|
||||
field(DESC, "Optical Table")
|
||||
field(LX, "$(LX)")
|
||||
field(LZ, "$(LZ)")
|
||||
field(SX, "$(SX)")
|
||||
field(SY, "$(SY)")
|
||||
field(SZ, "$(SZ)")
|
||||
# field(M0XL, "$(P)$(M0X).VAL PP MS")
|
||||
field(M0YL, "$(P)$(M0Y).VAL PP MS")
|
||||
field(M1YL, "$(P)$(M1Y).VAL PP MS")
|
||||
# field(M2XL, "$(P)$(M2X).VAL PP MS")
|
||||
field(M2YL, "$(P)$(M2Y).VAL PP MS")
|
||||
# field(M2ZL, "$(P)$(M2Z).VAL PP MS")
|
||||
# field(R0XI, "$(P)$(M0X).VAL NPP NMS")
|
||||
field(R0YI, "$(P)$(M0Y).VAL NPP NMS")
|
||||
field(R1YI, "$(P)$(M1Y).VAL NPP NMS")
|
||||
# field(R2XI, "$(P)$(M2X).VAL NPP NMS")
|
||||
field(R2YI, "$(P)$(M2Y).VAL NPP NMS")
|
||||
# field(R2ZI, "$(P)$(M2Z).VAL NPP NMS")
|
||||
# field(E0XI, "$(P)$(M0X).RBV NPP NMS")
|
||||
field(E0YI, "$(P)$(M0Y).RBV NPP NMS")
|
||||
field(E1YI, "$(P)$(M1Y).RBV NPP NMS")
|
||||
# field(E2XI, "$(P)$(M2X).RBV NPP NMS")
|
||||
field(E2YI, "$(P)$(M2Y).RBV NPP NMS")
|
||||
# field(E2ZI, "$(P)$(M2Z).RBV NPP NMS")
|
||||
# field(V0XL, "$(P)$(M0X).VELO NPP NMS")
|
||||
field(V0YL, "$(P)$(M0Y).VELO NPP NMS")
|
||||
field(V1YL, "$(P)$(M1Y).VELO NPP NMS")
|
||||
# field(V2XL, "$(P)$(M2X).VELO NPP NMS")
|
||||
field(V2YL, "$(P)$(M2Y).VELO NPP NMS")
|
||||
# field(V2ZL, "$(P)$(M2Z).VELO NPP NMS")
|
||||
# field(V0XI, "$(P)$(M0X).VELO NPP NMS")
|
||||
field(V0YI, "$(P)$(M0Y).VELO NPP NMS")
|
||||
field(V1YI, "$(P)$(M1Y).VELO NPP NMS")
|
||||
# field(V2XI, "$(P)$(M2X).VELO NPP NMS")
|
||||
field(V2YI, "$(P)$(M2Y).VELO NPP NMS")
|
||||
# field(V2ZI, "$(P)$(M2Z).VELO NPP NMS")
|
||||
# field(H0XL, "$(P)$(M0X).HLM NPP NMS")
|
||||
field(H0YL, "$(P)$(M0Y).HLM NPP NMS")
|
||||
field(H1YL, "$(P)$(M1Y).HLM NPP NMS")
|
||||
# field(H2XL, "$(P)$(M2X).HLM NPP NMS")
|
||||
field(H2YL, "$(P)$(M2Y).HLM NPP NMS")
|
||||
# field(H2ZL, "$(P)$(M2Z).HLM NPP NMS")
|
||||
# field(L0XL, "$(P)$(M0X).LLM NPP NMS")
|
||||
field(L0YL, "$(P)$(M0Y).LLM NPP NMS")
|
||||
field(L1YL, "$(P)$(M1Y).LLM NPP NMS")
|
||||
# field(L2XL, "$(P)$(M2X).LLM NPP NMS")
|
||||
field(L2YL, "$(P)$(M2Y).LLM NPP NMS")
|
||||
# field(L2ZL, "$(P)$(M2Z).LLM NPP NMS")
|
||||
field(LEGU, "mm")
|
||||
field(AEGU, "degrees")
|
||||
field(PREC, "4")
|
||||
field(GEOM, "$(GEOM)")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):ax_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):ax_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).AX NPP MS")
|
||||
field(OUTE, "$(P)$(T).AX PP MS")
|
||||
field(OUTF, "$(P)$(Q):ax_tweak.B NPP MS")
|
||||
field(OUTG, "$(P)$(Q):ax_tweak.A NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):ay_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):ay_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).AY NPP MS")
|
||||
field(OUTE, "$(P)$(T).AY PP MS")
|
||||
field(OUTF, "$(P)$(Q):ay_tweak.B NPP MS")
|
||||
field(OUTG, "$(P)$(Q):ay_tweak.A NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
field(SEVR, "NO_ALARM")
|
||||
field(STAT, "NO_ALARM")
|
||||
field(UDF, "0")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):az_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):az_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).AZ NPP MS")
|
||||
field(OUTE, "$(P)$(T).AZ PP MS")
|
||||
field(OUTF, "$(P)$(Q):az_tweak.B NPP MS")
|
||||
field(OUTG, "$(P)$(Q):az_tweak.A NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):stop1") {
|
||||
field(DESC, "Table-stop distribution")
|
||||
field(CLCB, "a")
|
||||
field(CLCC, "a")
|
||||
field(CLCD, "a")
|
||||
field(CLCE, "a")
|
||||
field(CLCF, "a")
|
||||
# field(OUTA, "$(P)$(M0X).STOP PP MS")
|
||||
field(OUTB, "$(P)$(M0Y).STOP PP MS")
|
||||
field(OUTC, "$(P)$(M1Y).STOP PP MS")
|
||||
# field(OUTD, "$(P)$(M2X).STOP PP MS")
|
||||
field(OUTE, "$(P)$(M2Y).STOP PP MS")
|
||||
# field(OUTF, "$(P)$(M2Z).STOP PP MS")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):x_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):x_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).X NPP MS")
|
||||
field(OUTE, "$(P)$(T).X PP MS")
|
||||
field(OUTF, "$(P)$(Q):x_tweak.A NPP MS")
|
||||
field(OUTG, "$(P)$(Q):x_tweak.B NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):y_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):y_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).Y NPP MS")
|
||||
field(OUTE, "$(P)$(T).Y PP MS")
|
||||
field(OUTF, "$(P)$(Q):y_tweak.A NPP MS")
|
||||
field(OUTG, "$(P)$(Q):y_tweak.B NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
}
|
||||
|
||||
record(transform, "$(P)$(Q):z_tweak") {
|
||||
field(CLCE, "a?d+c:b?d-c:d")
|
||||
field(CLCF, "0")
|
||||
field(CLCG, "0")
|
||||
field(INPC, "$(P)$(Q):z_tweakVal.VAL NPP MS")
|
||||
field(INPD, "$(P)$(T).Z NPP MS")
|
||||
field(OUTE, "$(P)$(T).Z PP MS")
|
||||
field(OUTF, "$(P)$(Q):z_tweak.B NPP MS")
|
||||
field(OUTG, "$(P)$(Q):z_tweak.A NPP MS")
|
||||
field(PREC, "3")
|
||||
field(CMTA, "tweak forward (if = 1)")
|
||||
field(CMTB, "tweak reverse (if = 1)")
|
||||
field(CMTC, "tweak step size")
|
||||
field(CMTD, "get old value")
|
||||
field(CMTE, "put new value")
|
||||
field(CMTF, "zero tweak button")
|
||||
field(CMTG, "zero tweak button")
|
||||
}
|
||||
|
||||
record(calc, "$(P)$(Q):geomIsPNC") {
|
||||
field(CALC, "a=2")
|
||||
field(INPA, "$(P)$(T).GEOM CP MS")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp") {
|
||||
field(LNK2, "$(P)$(T).SX")
|
||||
field(LNK3, "$(P)$(T).SY")
|
||||
field(LNK4, "$(P)$(T).SZ PP")
|
||||
field(STR1, "_default_")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(SELM, "All")
|
||||
field(DO4, "$(SZ)")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp0") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "Default")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp1") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 1")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fpSeq") {
|
||||
field(SELM, "Specified")
|
||||
field(DOL1, "$(P)$(Q)fpSelect.ZRST")
|
||||
field(LNK1, "$(P)$(Q)fp0.STR1 PP")
|
||||
field(DOL2, "$(P)$(Q)fpSelect.ONST")
|
||||
field(LNK2, "$(P)$(Q)fp1.STR1 PP")
|
||||
field(DOL3, "$(P)$(Q)fpSelect.TWST")
|
||||
field(LNK3, "$(P)$(Q)fp2.STR1 PP")
|
||||
field(DOL4, "$(P)$(Q)fpSelect.THST")
|
||||
field(LNK4, "$(P)$(Q)fp3.STR1 PP")
|
||||
field(DOL5, "$(P)$(Q)fpSelect.FRST")
|
||||
field(LNK5, "$(P)$(Q)fp4.STR1 PP")
|
||||
field(DOL6, "$(P)$(Q)fpSelect.FVST")
|
||||
field(LNK6, "$(P)$(Q)fp5.STR1 PP")
|
||||
field(DOL7, "$(P)$(Q)fpSelect.SXST")
|
||||
field(LNK7, "$(P)$(Q)fp6.STR1 PP")
|
||||
field(DOL8, "$(P)$(Q)fpSelect.SVST")
|
||||
field(LNK8, "$(P)$(Q)fp7.STR1 PP")
|
||||
field(DOL9, "$(P)$(Q)fpSelect.EIST")
|
||||
field(LNK9, "$(P)$(Q)fp8.STR1 PP")
|
||||
field(DOLA, "$(P)$(Q)fpSelect.NIST")
|
||||
field(LNKA, "$(P)$(Q)fp9.STR1 PP")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp2") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 2")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp3") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 3")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp4") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 4")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp5") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 5")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp6") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 6")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp7") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 7")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp8") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 8")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(sseq, "$(P)$(Q)fp9") {
|
||||
field(LNK1, "$(P)$(Q)fp.STR1")
|
||||
field(LNK2, "$(P)$(Q)fp.DO2")
|
||||
field(STR1, "User 9")
|
||||
field(DO2, "$(SX)")
|
||||
field(DO3, "$(SY)")
|
||||
field(LNK3, "$(P)$(Q)fp.DO3")
|
||||
field(DO4, "$(SZ)")
|
||||
field(SELM, "All")
|
||||
field(LNK4, "$(P)$(Q)fp.DO4 PP")
|
||||
field(PREC, "3")
|
||||
}
|
||||
|
||||
record(mbbo, "$(P)$(Q)fpSelect") {
|
||||
field(DTYP, "Raw Soft Channel")
|
||||
field(OUT, "$(P)$(Q)fpSeq.SELN PP")
|
||||
field(ZRVL, "1")
|
||||
field(ONVL, "2")
|
||||
field(TWVL, "3")
|
||||
field(THVL, "4")
|
||||
field(FRVL, "5")
|
||||
field(FVVL, "6")
|
||||
field(SXVL, "7")
|
||||
field(SVVL, "8")
|
||||
field(EIVL, "9")
|
||||
field(NIVL, "10")
|
||||
field(ZRST, "Default")
|
||||
field(ONST, "User 1")
|
||||
field(TWST, "User 2")
|
||||
field(THST, "User 3")
|
||||
field(FRST, "User 4")
|
||||
field(FVST, "User 5")
|
||||
field(SXST, "User 6")
|
||||
field(SVST, "User 7")
|
||||
field(EIST, "User 8")
|
||||
field(NIST, "User 9")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp0Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.ZRST")
|
||||
field(VAL, "Default")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp1Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.ONST")
|
||||
field(VAL, "User 1")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp2Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.TWST")
|
||||
field(VAL, "User 2")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp3Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.THST")
|
||||
field(VAL, "User 3")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp4Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.FRST")
|
||||
field(VAL, "User 4")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp5Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.FVST")
|
||||
field(VAL, "User 5")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp6Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.SXST")
|
||||
field(VAL, "User 6")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp7Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.SVST")
|
||||
field(VAL, "User 7")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp8Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.EIST")
|
||||
field(VAL, "User 8")
|
||||
}
|
||||
|
||||
record(stringout, "$(P)$(Q)fp9Name") {
|
||||
field(OUT, "$(P)$(Q)fpSelect.NIST")
|
||||
field(VAL, "User 9")
|
||||
}
|
||||
|
||||
record(fanout, "$(P)$(Q)fpInit") {
|
||||
field(FLNK, "$(P)$(Q)fpInit1.PROC PP")
|
||||
field(LNK1, "$(P)$(Q)fp0Name.PROC PP")
|
||||
field(LNK2, "$(P)$(Q)fp1Name.PROC PP")
|
||||
field(LNK3, "$(P)$(Q)fp2Name.PROC PP")
|
||||
field(LNK4, "$(P)$(Q)fp3Name.PROC PP")
|
||||
field(LNK5, "$(P)$(Q)fp4Name.PROC PP")
|
||||
field(LNK6, "$(P)$(Q)fp5Name.PROC PP")
|
||||
field(PINI, "YES")
|
||||
}
|
||||
|
||||
record(fanout, "$(P)$(Q)fpInit1") {
|
||||
field(LNK1, "$(P)$(Q)fp6Name.PROC PP")
|
||||
field(LNK2, "$(P)$(Q)fp7Name.PROC PP")
|
||||
field(LNK3, "$(P)$(Q)fp8Name.PROC PP")
|
||||
field(LNK4, "$(P)$(Q)fp9Name.PROC PP")
|
||||
field(LNK5, "$(P)$(Q)fpSelect.PROC PP")
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
file G_DRV_table.template {
|
||||
pattern
|
||||
{ P Q T LX LZ SX SY SZ GEOM M0X M0Y M1Y M2X M2Y M2Z }
|
||||
{ X10SA-ES1-VFM: t T 250 500 125 0 250 GEOCARS "" TRYR TRYDW "" TRYUW "" }
|
||||
}
|
||||
|
||||
File renamed without changes.
@@ -0,0 +1,29 @@
|
||||
/* Forward kinematics to calculate virtual axes from real axes
|
||||
| Tx | | Y1 |
|
||||
| Yy | | Y2 |
|
||||
| Pitch | = FWD * | Y3 |
|
||||
| Roll | | X1 |
|
||||
| Yaw | | X2 |
|
||||
*/
|
||||
var FWD1[5] := { 0, 0, 0, 1/2, 1/2};
|
||||
var FWD2[5] := { 133/100,- 166/100, 133/100, 0, 0};
|
||||
var FWD3[5] := { 0, 0, 0, -2, 2};
|
||||
var FWD4[5] := { 2, -4, 2, 0, 00};
|
||||
var FWD5[5] := { -2, 0, 2, 0, 0};
|
||||
|
||||
/* Inverse kinematics to calculate real axes from virtal axes
|
||||
| Y1 | | Tx |
|
||||
| Y2 | | Ty |
|
||||
| Y3 | = INV * | Pitch |
|
||||
| X1 | | Roll |
|
||||
| X2 | | Yaw |
|
||||
*/
|
||||
var INV1[5] := { 0, 1, 0, -83/200, -1/4};
|
||||
var INV2[5] := { 0, 1, 0, -133/200, 0};
|
||||
var INV3[5] := { 0, 1, 0, -83/200, 1/4};
|
||||
var INV4[5] := { 1, 0, -1/4, 0, 0};
|
||||
var INV5[5] := { 1, 0, 1/4, 0, 0};
|
||||
|
||||
include "axis_calculation.plc"
|
||||
|
||||
include "axis_statemachine.plc"
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Forward kinematics to calculate virtual axes from real axes
|
||||
| Tx | | Y1 |
|
||||
| Yy | | Y2 |
|
||||
| Pitch | = FWD * | Y3 |
|
||||
| Roll | | X1 |
|
||||
| Yaw | | X2 |
|
||||
*/
|
||||
var FWD1[5] := {27/25, -54/25, 27/25, 1/2, 1/2};
|
||||
var FWD2[5] := { 1/4, 1/2, 1/4, 0, 0};
|
||||
var FWD3[5] := { -2, 0, 2, 0, 0};
|
||||
var FWD4[5] := { 2, -4, 2, 0, 0};
|
||||
var FWD5[5] := { 0, 0, 0, -2, 2};
|
||||
|
||||
/* Inverse kinematics to calculate real axes from virtal axes
|
||||
| Y1 | | Tx |
|
||||
| Y2 | | Ty |
|
||||
| Y3 | = INV * | Pitch |
|
||||
| X1 | | Roll |
|
||||
| X2 | | Yaw |
|
||||
*/
|
||||
var INV1[5] := { 0, 1, -1/4, 1/8, 0};
|
||||
var INV2[5] := { 0, 1, 0, -1/8, 0};
|
||||
var INV3[5] := { 0, 1, 1/4, 1/8, 0};
|
||||
var INV4[5] := { 1, 0, 0, -27/50, -1/4};
|
||||
var INV5[5] := { 1, 0, 0, -27/50, 1/4};
|
||||
|
||||
include "axis_kin_mirror.plc_inc"
|
||||
|
||||
include "axis_sm.plc_inc"
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
axis:
|
||||
id: 10
|
||||
type: virtual
|
||||
group: VFM_VIRT
|
||||
|
||||
epics:
|
||||
name: ROLL
|
||||
precision: 4
|
||||
unit: mrad
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "ROLL"
|
||||
fieldInit: "SPAM=0,RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5
|
||||
decceleration: 0.5
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: false
|
||||
forwardEnable: true
|
||||
backwardEnable: true
|
||||
forward: 10
|
||||
backward: -10
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,56 @@
|
||||
axis:
|
||||
id: 11
|
||||
type: virtual
|
||||
group: VFM_VIRT
|
||||
|
||||
epics:
|
||||
name: YAW
|
||||
precision: 4
|
||||
unit: mrad
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "YAW"
|
||||
fieldInit: "SPAM=0,RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5
|
||||
decceleration: 0.5
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: false
|
||||
forwardEnable: true
|
||||
backwardEnable: true
|
||||
forward: 10
|
||||
backward: -10
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,93 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 1
|
||||
mode: CSV
|
||||
group: VFM_REAL
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYUW
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y1 Upstream at Wall"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -51.8429 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: yes
|
||||
backwardEnable: yes
|
||||
forwardEnable: yes
|
||||
forward: 10.0
|
||||
backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,93 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 2
|
||||
mode: CSV
|
||||
group: VFM_REAL
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYR
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y2 at Ring"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -50.7923 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: yes
|
||||
backwardEnable: yes
|
||||
forwardEnable: yes
|
||||
forward: 10.0
|
||||
backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,93 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 3
|
||||
mode: CSV
|
||||
group: VFM_REAL
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYDW
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y3 Downtream at Wall"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -50.1910 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: yes
|
||||
backwardEnable: yes
|
||||
forwardEnable: yes
|
||||
forward: 10.0
|
||||
backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,93 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 4
|
||||
mode: CSV
|
||||
group: VFM_REAL
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYUR
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y1 Upstream at Ring"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -50.0440 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,86 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 4
|
||||
mode: CSV
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
|
||||
epics:
|
||||
name: TRYUW
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y1 Upstream at Wall"
|
||||
fieldInit: "RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,86 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 5
|
||||
mode: CSV
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
|
||||
epics:
|
||||
name: TRYR
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y2 at Ring"
|
||||
fieldInit: "RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,93 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 5
|
||||
mode: CSV
|
||||
group: VFM_REAL
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYW
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y2 at Wall"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -51.9945 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,92 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 6
|
||||
mode: CSV
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
features:
|
||||
allowSrcChangeWhenEnabled: true
|
||||
|
||||
epics:
|
||||
name: TRYDR
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y3 Downtream at Ring"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: -50.8668 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
plc:
|
||||
enable: true
|
||||
externalCommands: true
|
||||
@@ -0,0 +1,86 @@
|
||||
# https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/axisyaml/
|
||||
#
|
||||
# Configuration is based on FAT report from Toyama
|
||||
#
|
||||
# OrientalMotors PK264D28B geared stepper 1/200/40 --> 0.000125 mm/step
|
||||
# Renishaw RESOLUTE RL32BAT005B30A --> 5 nm/count
|
||||
#
|
||||
|
||||
axis:
|
||||
id: 6
|
||||
mode: CSV
|
||||
#parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0;
|
||||
|
||||
epics:
|
||||
name: TRYDW
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y3 Downtream at Wall"
|
||||
fieldInit: "RTRY=1,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
drive:
|
||||
numerator: 0.25 # Vmax 2000 step/s * 1/200 rev/step * 0.025mm/rev = 0.25 mm/s
|
||||
denominator: 32768 # Always 16-bit MAX_INT for this stepper drive!
|
||||
type: 0 # Type (0=Stepper, 1=Complex)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
reduceTorqueEnable: yes
|
||||
reduceTorque: 2
|
||||
reset: 1
|
||||
warning: 7
|
||||
error:
|
||||
- 3 # Error 0 bit of status word
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(ENC_SLAVE).positionActual$(ENC_CHANNEL)
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 5 # 5 nm
|
||||
denominator: 1000000 #
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders)
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
velocityFilterSize: 5
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.01
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5 # accel. time 0.2 s
|
||||
decceleration: 0.5 # deaccel. time 0.2 s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.11
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01.12
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
#softlimits:
|
||||
# enable: yes
|
||||
# backwardEnable: yes
|
||||
# forwardEnable: yes
|
||||
# forward: 20.0
|
||||
# backward: -10.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,56 @@
|
||||
axis:
|
||||
id: 7
|
||||
type: virtual
|
||||
group: VFM_VIRT
|
||||
|
||||
epics:
|
||||
name: TRX
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "X"
|
||||
fieldInit: "SPAM=0,RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.05
|
||||
acceleration: 0.05
|
||||
decceleration: 0.05
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: false
|
||||
forwardEnable: true
|
||||
backwardEnable: true
|
||||
forward: 12
|
||||
backward: -12
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,48 @@
|
||||
axis:
|
||||
id: 7
|
||||
type: virtual
|
||||
|
||||
epics:
|
||||
name: TRY
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y"
|
||||
fieldInit: "RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.05
|
||||
acceleration: 0.05
|
||||
decceleration: 0.05
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,47 @@
|
||||
axis:
|
||||
id: 8
|
||||
type: virtual
|
||||
|
||||
epics:
|
||||
name: PITCH
|
||||
precision: 4
|
||||
unit: mrad
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "PITCH"
|
||||
fieldInit: "RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5
|
||||
decceleration: 0.5
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,56 @@
|
||||
axis:
|
||||
id: 8
|
||||
type: virtual
|
||||
group: VFM_VIRT
|
||||
|
||||
epics:
|
||||
name: TRY
|
||||
precision: 4
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Y"
|
||||
fieldInit: "SPAM=0,RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.05
|
||||
acceleration: 0.05
|
||||
decceleration: 0.05
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: false
|
||||
forwardEnable: true
|
||||
backwardEnable: true
|
||||
forward: 10
|
||||
backward: -10
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,56 @@
|
||||
axis:
|
||||
id: 9
|
||||
type: virtual
|
||||
group: VFM_VIRT
|
||||
|
||||
epics:
|
||||
name: PITCH
|
||||
precision: 4
|
||||
unit: mrad
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "PITCH"
|
||||
fieldInit: "SPAM=0,RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
numerator: 1
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5
|
||||
decceleration: 0.5
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
softlimits:
|
||||
enable: false
|
||||
forwardEnable: true
|
||||
backwardEnable: true
|
||||
forward: 3
|
||||
backward: -3
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,47 @@
|
||||
axis:
|
||||
id: 9
|
||||
type: virtual
|
||||
|
||||
epics:
|
||||
name: ROLL
|
||||
precision: 4
|
||||
unit: mrad
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "ROLL"
|
||||
fieldInit: "RTRY=0,FOFF=Frozen,TWV=0.1"
|
||||
|
||||
encoder:
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
source: 1 # Source (0=Internal, 1=PLC)
|
||||
bits: 32
|
||||
position: ec0.s0.ONE.0
|
||||
|
||||
trajectory:
|
||||
axis:
|
||||
velocity: 0.1
|
||||
acceleration: 0.5
|
||||
decceleration: 0.5
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec0.s0.ONE.0
|
||||
backward: ec0.s0.ONE.0
|
||||
home: ec0.s0.ONE.0
|
||||
interlock: ec0.s0.ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: yes
|
||||
tolerance: 0.125
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: yes
|
||||
max: 0.25
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,71 @@
|
||||
axis:
|
||||
id: 12
|
||||
mode: CSV
|
||||
|
||||
epics:
|
||||
name: AXIS
|
||||
precision: 3
|
||||
unit: deg
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Detector TR"
|
||||
|
||||
drive:
|
||||
numerator: 2160000 # Vmax 6000 rev/s * 360 deg/rev = 2160000 deg/s
|
||||
denominator: 2147483648 # 32-bit MAX_INT for ECMC_EC_ALIAS_DRV_VELO_SET
|
||||
type: 1 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
# control bit for reset in 'control'
|
||||
reset: 7
|
||||
# status bit for warning in 'status'
|
||||
warning: 7
|
||||
# list of error bits in 'status', or if type==string, complete EC-link
|
||||
# error:
|
||||
# - 3 # Error
|
||||
# - 7 # Warning as Error
|
||||
|
||||
encoder:
|
||||
numerator: 360 # 360 deg/rev
|
||||
denominator: 1048576 # 2**20 count/rev
|
||||
type: 1 # Type: 0=Incremental, 1=Absolute
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders) always least significant part of 'bits'
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
position: ec$(MASTER_ID).s$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder)
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.1
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
type: 1
|
||||
axis:
|
||||
velocity: 90 # 1000 rpm (name plate) => 6000 deg/s
|
||||
acceleration: 900
|
||||
jerk: 900
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: true
|
||||
tolerance: 360
|
||||
time: 100
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.1
|
||||
time: 100
|
||||
velocity:
|
||||
enable: true
|
||||
max: 1800
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,95 @@
|
||||
axis:
|
||||
id: 12
|
||||
mode: CSV
|
||||
|
||||
epics:
|
||||
name: AXIS
|
||||
precision: 3
|
||||
unit: deg
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Detector TR"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=10"
|
||||
|
||||
drive:
|
||||
numerator: 2160000 # Vmax 6000 rev/s * 360 deg/rev = 2160000 deg/s
|
||||
denominator: 2147483648 # 32-bit MAX_INT for ECMC_EC_ALIAS_DRV_VELO_SET
|
||||
type: 1 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
# control bit for reset in 'control'
|
||||
reset: 7
|
||||
# status bit for warning in 'status'
|
||||
warning: 7
|
||||
# list of error bits in 'status', or if type==string, complete EC-link
|
||||
# error:
|
||||
# - 3 # Error
|
||||
# - 7 # Warning as Error
|
||||
|
||||
encoder:
|
||||
numerator: 360 # 360 deg/rev
|
||||
denominator: 1048576 # 2**20 count/rev
|
||||
type: 1 # Type: 0=Incremental, 1=Absolute
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders) always least significant part of 'bits'
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
position: ec$(MASTER_ID).s$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder)
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.1
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
type: 1
|
||||
axis:
|
||||
velocity: 90 # 1000 rpm (name plate) => 6000 deg/s
|
||||
acceleration: 900
|
||||
jerk: 900
|
||||
|
||||
##trajectory:
|
||||
## type: 1
|
||||
## axis:
|
||||
## velocity: 10 # 1000 rpm (name plate) 1000rev / 60s * 2mm/rev = 33.33 mm/s
|
||||
## acceleration: 50
|
||||
## jerk: 50
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: true
|
||||
tolerance: 360
|
||||
time: 100
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.1
|
||||
time: 100
|
||||
velocity:
|
||||
enable: true
|
||||
max: 1800
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
|
||||
##monitoring:
|
||||
## lag:
|
||||
## enable: true
|
||||
## tolerance: 0.01
|
||||
## time: 1000
|
||||
## target:
|
||||
## enable: yes
|
||||
## tolerance: 0.001
|
||||
## time: 100
|
||||
## velocity:
|
||||
## enable: true
|
||||
## max: 20
|
||||
## time:
|
||||
## trajectory: 100
|
||||
## drive: 200
|
||||
@@ -0,0 +1,72 @@
|
||||
axis:
|
||||
id: 12
|
||||
mode: CSV
|
||||
|
||||
epics:
|
||||
name: AXIS
|
||||
precision: 3
|
||||
unit: mm
|
||||
motorRecord:
|
||||
enable: true
|
||||
description: "Detector TR"
|
||||
fieldInit: "SPAM=0,RTRY=1,FOFF=Frozen,TWV=1"
|
||||
|
||||
drive:
|
||||
numerator: # Vmax 6000 rev/s * 2 mm/rev = 12000 mm/s
|
||||
denominator: 2147483648 # 32-bit MAX_INT for ECMC_EC_ALIAS_DRV_VELO_SET
|
||||
type: 1 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives)
|
||||
control: ec$(MASTER_ID).s$(DRV_SLAVE).driveControl01
|
||||
status: ec$(MASTER_ID).s$(DRV_SLAVE).driveStatus01
|
||||
setpoint: ec$(MASTER_ID).s$(DRV_SLAVE).velocitySetpoint01
|
||||
# control bit for reset in 'control'
|
||||
reset: 7
|
||||
# status bit for warning in 'status'
|
||||
warning: 7
|
||||
# list of error bits in 'status', or if type==string, complete EC-link
|
||||
error:
|
||||
- 3 # Error
|
||||
- 7 # Warning as Error
|
||||
|
||||
encoder:
|
||||
numerator: 2 # 2 mm/rev
|
||||
denominator: 1048576 # 2**20 count/rev
|
||||
type: 1 # Type: 0=Incremental, 1=Absolute
|
||||
bits: 32 # Total bit count of encoder raw data
|
||||
absBits: 32 # Absolute bit count (for absolute encoders) always least significant part of 'bits'
|
||||
absOffset: 0 # Encoder offset in eng units (for absolute encoders)
|
||||
position: ec$(MASTER_ID).s$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder)
|
||||
|
||||
controller:
|
||||
Kp: 10.0
|
||||
Ki: 0.1
|
||||
Kd: 0.0
|
||||
|
||||
trajectory:
|
||||
type: 1
|
||||
axis:
|
||||
velocity: 10 # 1000 rpm (name plate) 1000rev / 60s * 2mm/rev = 33.33 mm/s
|
||||
acceleration: 50 # time 0.2s
|
||||
jerk: 50 # time 1s
|
||||
|
||||
input:
|
||||
limit:
|
||||
forward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
backward: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
home: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
interlock: ec$(MASTER_ID).s$(DRV_SLAVE).ONE.0
|
||||
|
||||
monitoring:
|
||||
lag:
|
||||
enable: true
|
||||
tolerance: 0.01
|
||||
time: 1000
|
||||
target:
|
||||
enable: yes
|
||||
tolerance: 0.001
|
||||
time: 100
|
||||
velocity:
|
||||
enable: true
|
||||
max: 15
|
||||
time:
|
||||
trajectory: 100
|
||||
drive: 200
|
||||
@@ -0,0 +1,19 @@
|
||||
#- Real axes: Y1 Y2 Y3 X1 X2
|
||||
var REAL_AXES[5] := {ax${AX_Y1}.enc.actpos, ax${AX_Y2}.enc.actpos, ax${AX_Y3}.enc.actpos, ax${AX_X1}.enc.actpos, ax${AX_X2}.enc.actpos};
|
||||
|
||||
#- Virtual axes: X Y PITCH ROLL YAW
|
||||
var VIRT_AXES[5] := {ax${AX_TRX}.traj.setpos, ax${AX_TRY}.traj.setpos, ax${AX_PITCH}.traj.setpos, ax${AX_ROLL}.traj.setpos, ax${AX_YAW}.traj.setpos};
|
||||
|
||||
#- forward kinematics
|
||||
ax${AX_TRX}.enc.actpos := dot(FWD1, REAL_AXES);
|
||||
ax${AX_TRY}.enc.actpos := dot(FWD2, REAL_AXES);
|
||||
ax${AX_PITCH}.enc.actpos := dot(FWD3, REAL_AXES);
|
||||
ax${AX_ROLL}.enc.actpos := dot(FWD4, REAL_AXES);
|
||||
ax${AX_YAW}.enc.actpos := dot(FWD5, REAL_AXES);
|
||||
|
||||
#- inverse kinematics
|
||||
ax${AX_Y1}.traj.extsetpos := dot(INV1, VIRT_AXES);
|
||||
ax${AX_Y2}.traj.extsetpos := dot(INV2, VIRT_AXES);
|
||||
ax${AX_Y3}.traj.extsetpos := dot(INV3, VIRT_AXES);
|
||||
ax${AX_X1}.traj.extsetpos := dot(INV4, VIRT_AXES);
|
||||
ax${AX_X2}.traj.extsetpos := dot(INV5, VIRT_AXES);
|
||||
@@ -0,0 +1,122 @@
|
||||
#- ECMC real/virtal axes state machine
|
||||
|
||||
#- Initial PLC values
|
||||
if(plc${PLC_ID}.firstscan) {
|
||||
static.counter:=0;
|
||||
static.VMState:=-2;
|
||||
};
|
||||
|
||||
#- this is needed because initially upon IocInit, motor busy flags are briefly enabled, and the first motorRecord poll at 100ms might cause issues
|
||||
if ( static.counter<0.105 ) {
|
||||
static.counter += plc${PLC_ID}.scantime;
|
||||
|
||||
if ( static.counter>=0.105) { static.VMState:=0 };
|
||||
|
||||
#- VMs in Internal mode, ready to listen
|
||||
mc_grp_set_traj_src(${GRP_ID_VA},0);
|
||||
};
|
||||
|
||||
|
||||
# STATES
|
||||
# State -1: at least 1 RM is in motion, RM in charge.
|
||||
# State 0: all RM and VM are off.
|
||||
# State 1: at least 1 VM is in motion, VM in charge.
|
||||
|
||||
|
||||
#- State -1
|
||||
if(static.VMState==-1) {
|
||||
|
||||
#- RM are no longer in motion
|
||||
#- -1 -> 0
|
||||
#- Trigger Condition:
|
||||
#- - all RM are not busy
|
||||
if( mc_grp_get_any_busy(${GRP_ID_RA})==0 ) {
|
||||
|
||||
#- disable real motors
|
||||
mc_grp_set_enable(${GRP_ID_RA},0);
|
||||
|
||||
#- VMs in Internal mode, back to ground state
|
||||
mc_grp_set_traj_src(${GRP_ID_VA},0);
|
||||
|
||||
#- state change
|
||||
println('-1 -> 0');
|
||||
static.VMState:=0;
|
||||
};
|
||||
|
||||
#- If RM Motion is occuring, and user commands VM motion: simply disable the VMs to void the command.
|
||||
if( mc_grp_get_any_enabled(${GRP_ID_VA})==1 and mc_grp_get_any_enable(${GRP_ID_VA})==1 ) {
|
||||
mc_grp_set_enable(${GRP_ID_VA},0);
|
||||
};
|
||||
}
|
||||
|
||||
#- State 0
|
||||
else if(static.VMState==0) {
|
||||
|
||||
#- 0 -> -1
|
||||
#- Trigger Condition:
|
||||
#- - at least 1 RM is running
|
||||
#- - all RM are in internal mode
|
||||
#- - all VM are disabled
|
||||
|
||||
mc_grp_get_any_traj_src_ext(${GRP_ID_RA})==0
|
||||
if( mc_grp_get_any_busy(${GRP_ID_RA})==1 and mc_grp_get_any_traj_src_ext(${GRP_ID_RA})==0 and mc_grp_get_any_enabled(${GRP_ID_VA})==0 ) {
|
||||
#- VMs in PLC mode, so no following errors occur
|
||||
mc_grp_set_traj_src(${GRP_ID_VA},0);
|
||||
|
||||
#- state change
|
||||
println('0 -> -1');
|
||||
static.VMState:=-1;
|
||||
}
|
||||
|
||||
#- 0 -> 1
|
||||
#- Trigger Condition:
|
||||
#- - at least 1 VM is enabled
|
||||
else if( mc_grp_get_any_enabled(${GRP_ID_VA})==1 ) {
|
||||
|
||||
#- Exit Condition: all axes are on
|
||||
if( mc_grp_get_enabled(${GRP_ID_RA})==1 and mc_grp_get_enabled(${GRP_ID_VA})==1 and mc_grp_get_any_busy(${GRP_ID_RA})==0 ) {
|
||||
|
||||
if( mc_grp_get_any_busy(${GRP_ID_VA})==1 ) {
|
||||
mc_grp_set_traj_src(${GRP_ID_RA},1);
|
||||
#- state change
|
||||
println('0 -> 1');
|
||||
static.VMState:=1;
|
||||
};
|
||||
}
|
||||
|
||||
#- Actions: If Exit Conditions not met
|
||||
else {
|
||||
#- enable motors
|
||||
mc_grp_set_enable(${GRP_ID_VA},1);
|
||||
mc_grp_set_enable(${GRP_ID_RA},1);
|
||||
|
||||
#- halt real motors
|
||||
#mc_grp_halt(${GRP_ID_RA});
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
#- State 1
|
||||
else if(static.VMState==1) {
|
||||
|
||||
#- basically a done test
|
||||
#- 1 -> 0
|
||||
if( mc_grp_get_any_busy(${GRP_ID_VA})==0 ) {
|
||||
|
||||
#- disable motors and set source
|
||||
mc_grp_set_enable(${GRP_ID_VA},0);
|
||||
mc_grp_set_enable(${GRP_ID_RA},0);
|
||||
|
||||
mc_grp_set_traj_src(${GRP_ID_RA},0);
|
||||
|
||||
#- once VMs are done, RMs need a bit longer to disable
|
||||
if( mc_grp_get_any_busy(${GRP_ID_RA})==0 ) {
|
||||
#- For some reason, an interlock is raised, but not sure why or what the implications are. It can be cleared this way.
|
||||
mc_grp_reset_error(${GRP_ID_RA});
|
||||
|
||||
#- state change
|
||||
println('1 -> 0');
|
||||
static.VMState:=0;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
# Open loop configuration
|
||||
var:
|
||||
drive: $(DRV_SLAVE)
|
||||
|
||||
encoder:
|
||||
position: ec$(MASTER_ID).s$(DRV_SLAVE).positionActual01
|
||||
type: 1 # Type (0=Incremental, 1=Absolute)
|
||||
numerator: 0.025 # 0.025 mm/rev
|
||||
denominator: 12800 # 200 x 64 microstep/rev
|
||||
bits: 16 # Total bit count of encoder raw data
|
||||
absBits: 16 # Absolute bit count (for absolute encoders)
|
||||
absOffset: 0.0 # Encoder offset in eng units (for absolute encoders)
|
||||
primary: 0
|
||||
|
||||
homing:
|
||||
refToEncIDAtStartup: 1 # At startup then set the start value of this encoder
|
||||
# to actpos of the given encoder id
|
||||
refAtHome: 1 # If homing is executed then set position of this encoder
|
||||
@@ -0,0 +1,78 @@
|
||||
# EtherCAT slaves on xtest-sioc-ecat02
|
||||
# 0 0:0 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus)
|
||||
# 1 0:1 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins
|
||||
# 2 0:2 PREOP + EL1034 4Ch. Dig. Input 24V, potential-free, 10?s
|
||||
# 3 0:3 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s
|
||||
# 4 0:4 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s
|
||||
# 5 0:5 PREOP + EL5042 2K. BiSS-C Encoder
|
||||
# 6 0:6 PREOP + EL5042 2K. BiSS-C Encoder
|
||||
# 7 0:7 PREOP + EL5042 2K. BiSS-C Encoder
|
||||
# 8 0:8 PREOP + EL5042 2K. BiSS-C Encoder
|
||||
# 9 0:9 PREOP + EL5101-0010 1K. Inc. Encoder 5V (20 Mio. Inkremente/s)
|
||||
# 10 0:10 PREOP + EL3314 4K. Ana. Eingang Thermoelement (TC)
|
||||
# 11 0:11 PREOP + EL3202-0010 2K. Ana. Eingang PT100 (RTD), hochgenau
|
||||
# 12 0:12 PREOP + EL9410 E-Bus Power Supplier (Diagnostics)
|
||||
# 13 0:13 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins
|
||||
# 14 0:14 PREOP + EL2819 16Ch. Dig. Output 24V, 0,5A, Diagnostic
|
||||
# 15 0:15 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 16 0:16 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 17 0:17 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 18 0:18 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 19 0:19 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 20 0:20 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 21 0:21 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
# 22 0:22 PREOP + EL7041-0052 1Ch. Stepper motor output stage (50V, 5A)
|
||||
|
||||
file "${ecmccomp_DIR}/HWTemplate.cmd" {
|
||||
pattern { SLAVE_ID HW_DESC COMP COMP_CH COMP_MACROS}
|
||||
|
||||
{ 0 EK1100 -1 -1 -1}
|
||||
{ 1 EL9227-5500 -1 -1 -1}
|
||||
{ 2 EL1034 -1 -1 -1}
|
||||
{ 3 EL1034 -1 -1 -1}
|
||||
{ 4 EL1034 -1 -1 -1}
|
||||
|
||||
# Encoders
|
||||
{ 5 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""}
|
||||
{ 5 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""}
|
||||
|
||||
{ 6 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""}
|
||||
{ 6 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""}
|
||||
|
||||
{ 7 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""}
|
||||
{ 7 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""}
|
||||
|
||||
{ 8 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""}
|
||||
{ 8 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""}
|
||||
|
||||
{10 EL3314 -1 -1 -1}
|
||||
{11 EL3202-0010 -1 -1 -1}
|
||||
{12 EL9410 -1 -1 -1}
|
||||
{13 EL9227-5500 -1 -1 -1}
|
||||
{14 EL2819 -1 -1 -1}
|
||||
# KB Mirror V
|
||||
# TRX
|
||||
# {15 EL7041-0052 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# {16 EL7041-0052 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# TRY
|
||||
{15 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
{16 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
{17 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
# Bender
|
||||
# {20 EL7041-0052 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# {21 EL7041-0052 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
|
||||
# KB Mirror H
|
||||
# TRX
|
||||
# {12 EL7041 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# {12 EL7041 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# TRY
|
||||
{18 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
{19 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
{20 EL7041-0052 Motor-OrientalMotor-PKP264D28B 1 "INV_DIR=1"}
|
||||
{21 EL7221-9014_ALL_INPUTS Motor-Beckhoff-AM8131-XFX1 1 ""}
|
||||
{22 EL9576 -1 1 ""}
|
||||
# Bender
|
||||
# {21 EL7041 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
# {22 EL7041 Motor-Phytron-VSS57.200.1 1 ""}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
|
||||
#- forward kinematics
|
||||
ax${AX_TRY}.enc.actpos := (ax${AX_Y1}.enc.actpos + ax${AX_Y2}.enc.actpos) / 2;
|
||||
|
||||
#- inverse kinematics
|
||||
ax${AX_Y1}.traj.setpos := ax${AX_TRY}.traj.setpos;
|
||||
ax${AX_Y2}.traj.setpos := ax${AX_TRY}.traj.setpos;
|
||||
|
||||
#- Initial PLC values
|
||||
if (plc${PLC_ID}.firstscan) {
|
||||
static.counter := 0;
|
||||
static.VMState := -2;
|
||||
};
|
||||
|
||||
#- this is needed because initially upon IocInit, motor busy flags are briefly enabled, and the first motorRecord poll at 100ms might cause issues
|
||||
if (static.counter < 105) {
|
||||
static.counter += 1;
|
||||
|
||||
if ( static.counter==105) {
|
||||
static.VMState := 0;
|
||||
};
|
||||
|
||||
#- VMs in Internal mode, ready to listen
|
||||
mc_grp_set_traj_src(${GRP_VIRT_ID}, 0);
|
||||
};
|
||||
|
||||
# STATES
|
||||
# State -1: at least 1 RM is in motion, RM in charge.
|
||||
# State 0: all RM and VM are off.
|
||||
# State 1: at least 1 VM is in motion, VM in charge.
|
||||
|
||||
#- State -1
|
||||
if (static.VMState == -1) {
|
||||
|
||||
#- RM are no longer in motion
|
||||
#- -1 -> 0
|
||||
#- Trigger Condition:
|
||||
#- - all RM are not busy
|
||||
if (mc_grp_get_any_busy(${GRP_REAL_ID}) == 0) {
|
||||
|
||||
#- disable real motors
|
||||
mc_grp_set_enable(${GRP_REAL_ID}, 0);
|
||||
|
||||
#- VMs in Internal mode, back to ground state
|
||||
mc_grp_set_traj_src(${GRP_VIRT_ID}, 0);
|
||||
|
||||
ax${AX_TRY}.traj.setpos := ax${AX_TRY}.enc.actpos
|
||||
ax${AX_PITCH}.traj.setpos := ax${AX_PITCH}.enc.actpos
|
||||
ax${AX_ROLL}.traj.setpos := ax${AX_ROLL}.enc.actpos
|
||||
|
||||
#- state change
|
||||
println('-1 -> 0');
|
||||
static.VMState := 0;
|
||||
};
|
||||
|
||||
#- If RM Motion is occuring, and user commands VM motion: simply disable the VMs to void the command.
|
||||
if (mc_grp_get_any_enabled(${GRP_VIRT_ID}) == 1 and mc_grp_get_any_enable(${GRP_VIRT_ID}) == 1) {
|
||||
mc_grp_set_enable(${GRP_VIRT_ID}, 0);
|
||||
};
|
||||
}
|
||||
|
||||
#- State 0
|
||||
else if (static.VMState == 0) {
|
||||
|
||||
#- 0 -> -1
|
||||
#- Trigger Condition:
|
||||
#- - at least 1 RM is running
|
||||
#- - all RM are in internal mode
|
||||
#- - all VM are disabled
|
||||
if (mc_grp_get_any_busy(${GRP_REAL_ID}) == 1 and ax${AX_Y1}.traj.source == 0 and ax${AX_Y2}.traj.source == 0 and ax${AX_Y3}.traj.source == 0 and mc_grp_get_any_enabled(${GRP_VIRT_ID}) == 0) {
|
||||
|
||||
#- VMs in PLC mode, so no following errors occur
|
||||
mc_grp_set_traj_src(${GRP_VIRT_ID}, 0);
|
||||
|
||||
#- state change
|
||||
println('0 -> -1');
|
||||
static.VMState := -1;
|
||||
}
|
||||
|
||||
#- 0 -> 1
|
||||
#- Trigger Condition:
|
||||
#- - at least 1 VM is enabled
|
||||
else if (mc_grp_get_any_enabled(${GRP_VIRT_ID}) == 1) {
|
||||
|
||||
#- Exit Condition: all axes are on
|
||||
if (mc_grp_get_enabled(${GRP_REAL_ID}) == 1 and mc_grp_get_enabled(${GRP_VIRT_ID}) == 1 and mc_grp_get_any_busy(${GRP_REAL_ID}) == 0) {
|
||||
|
||||
if (mc_grp_get_any_busy(${GRP_VIRT_ID}) == 1) {
|
||||
|
||||
mc_grp_set_traj_src(${GRP_REAL_ID}, 1);
|
||||
|
||||
#- state change
|
||||
println('0 -> 1');
|
||||
static.VMState := 1;
|
||||
};
|
||||
}
|
||||
|
||||
#- Actions: If Exit Conditions not met
|
||||
else {
|
||||
#- enable motors
|
||||
mc_grp_set_enable(${GRP_VIRT_ID}, 1);
|
||||
mc_grp_set_enable(${GRP_REAL_ID}, 1);
|
||||
|
||||
#- halt real motors
|
||||
mc_grp_halt(${GRP_REAL_ID});
|
||||
|
||||
println('state 0: eanble all');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#- State 1
|
||||
else if (static.VMState == 1) {
|
||||
|
||||
#- basically a done test
|
||||
#- 1 -> 0
|
||||
if (mc_grp_get_any_busy(${GRP_VIRT_ID}) == 0) {
|
||||
|
||||
#- disable motors and set source to internal
|
||||
mc_grp_set_enable(${GRP_VIRT_ID}, 0);
|
||||
mc_grp_set_enable(${GRP_REAL_ID}, 0);
|
||||
|
||||
#if (mc_grp_get_any_enabled(${GRP_REAL_ID}) == 0) {
|
||||
|
||||
mc_grp_set_traj_src(${GRP_REAL_ID}, 0);
|
||||
#}
|
||||
|
||||
#- once VMs are done, RMs need a bit longer to disable
|
||||
if (mc_grp_get_any_busy(${GRP_REAL_ID}) == 0) {
|
||||
|
||||
#- For some reason, an interlock is raised, but not sure why or what the implications are. It can be cleared this way.
|
||||
#mc_grp_reset_error(${GRP_REAL_ID});
|
||||
|
||||
#- state change
|
||||
println('1 -> 0');
|
||||
static.VMState := 0;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
# The following lines were generated by "ioc install"
|
||||
# Generated at: 2024-09-10 09:38:28.856785
|
||||
|
||||
epicsEnvSet IOC X10SA-CPCL-ES1
|
||||
epicsEnvSet ENGINEER wang_x1
|
||||
< /ioc/startup/startup.script_linux
|
||||
|
||||
# ---- ioc/system specific startup script(s)
|
||||
< startup.script_X10SA-CPCL-ES1
|
||||
|
||||
iocInit
|
||||
@@ -0,0 +1,87 @@
|
||||
|
||||
epicsEnvSet("MASTER_ID", "0")
|
||||
|
||||
require ecmccfg v9.5.5_RC1,"ENG_MODE=1,ECMC_VER=v9.5.5_RC1"
|
||||
require ecmccomp
|
||||
require ecmc_master_slave sandst_a
|
||||
|
||||
#- #################################################################
|
||||
# only print error messages
|
||||
asynSetTraceMask(${ECMC_ASYN_PORT}, -1, 0x01)
|
||||
|
||||
|
||||
##############################################################################
|
||||
# - apply hardware configuration
|
||||
${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subst"
|
||||
|
||||
# Set all slave 9 outputs to feed switches
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput01,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput02,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput03,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput04,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput05,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput06,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput07,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput08,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput09,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput10,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput11,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput12,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput13,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput14,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput15,1)"
|
||||
ecmcConfigOrDie "Cfg.WriteEcEntryIDString(14,binaryOutput16,1)"
|
||||
|
||||
##############################################################################
|
||||
# - load motor configuration
|
||||
epicsEnvSet("DEV", "X10SA-ES1-VFM")
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax1_TRYUW.yaml, DRV_SLAVE=015, ENC_SLAVE=005, ENC_CHANNEL=01"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=015"
|
||||
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax2_TRYR.yaml, DRV_SLAVE=016, ENC_SLAVE=005, ENC_CHANNEL=02"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=016"
|
||||
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax3_TRYDW.yaml, DRV_SLAVE=017, ENC_SLAVE=008, ENC_CHANNEL=01"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=017"
|
||||
|
||||
epicsEnvSet("DEV", "X10SA-ES1-HFM")
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax4_TRYUR.yaml, DRV_SLAVE=018, ENC_SLAVE=008, ENC_CHANNEL=02"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=018"
|
||||
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax5_TRYW.yaml, DRV_SLAVE=019, ENC_SLAVE=007, ENC_CHANNEL=01"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=019"
|
||||
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax6_TRYDR.yaml, DRV_SLAVE=020, ENC_SLAVE=007, ENC_CHANNEL=02"
|
||||
$(SCRIPTEXEC) ${ECMC_CONFIG_ROOT}loadYamlEnc.cmd, "FILE=cfg/enc_openloop_Y.yaml, DRV_SLAVE=020"
|
||||
|
||||
# virtual axes
|
||||
epicsEnvSet("DEV", "X10SA-ES1-VFM")
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax7_TRX.yaml"
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax8_TRY.yaml"
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax9_PITCH.yaml"
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax10_ROLL.yaml"
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax11_YAW.yaml"
|
||||
|
||||
# load the VFM virtual axes PLC
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCFile.cmd, "FILE=cfg/VFM.plc,PLC_ID=1,INC=.:${ecmc_master_slave_DIR},PLC_MACROS='PLC_ID=1,AX_Y1=1,AX_Y2=2,AX_Y3=3,AX_X1=4,AX_X2=5,AX_TRX=7,AX_TRY=8,AX_PITCH=9,AX_ROLL=10,AX_YAW=11,GRP_ID_RA=${GRP_VFM_REAL_ID=0},GRP_ID_VA=${GRP_VFM_VIRT_ID=0}'"
|
||||
|
||||
#- #############################################################################
|
||||
#- Temporary test
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=cfg/ax_Servo_angle.yaml, DRV_SLAVE=021"
|
||||
|
||||
#- #################################################################
|
||||
#- apply the configuration
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyConfig.cmd
|
||||
|
||||
|
||||
#- #################################################################
|
||||
#- go active
|
||||
${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}setAppMode.cmd
|
||||
|
||||
require "calc"
|
||||
require "opticaltable","wang_x1"
|
||||
# The following lines were generated by "ioc install"
|
||||
# Generated at: 2024-09-10 09:38:28.853780
|
||||
|
||||
cd "/ioc/X10SA-CPCL-ES1"
|
||||
dbLoadTemplate("X10SA-CPCL-ES1_mirrors.subs")
|
||||
@@ -0,0 +1 @@
|
||||
7.0.7
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Reference in new issue
Block a user