# HAL config file for OPTI servo machine # first load all the RT modules that will be needed # kinematics loadrt trivkins # motion controller, get name and thread periods from ini file loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD traj_period_nsec=[EMCMOT]TRAJ_PERIOD key=[EMCMOT]SHMEM_KEY num_joints=[TRAJ]AXES # thread for rpm display loadrt threads name1=slow-thread period1=1000000000 # m5i20 driver loadrt hal_m5i20 loadFpga=0 dacRate=16666 # PID module, for three PID loops loadrt pid num_chan=3 # inverse deadband on PID outputs loadrt idb count=3 # encoder counter for jogwheel and for spindle-load loadrt encoder num_chan=2 # six match8 and two mux2 components for jogwheel logic # one mux2 needed for coolant halui logic loadrt match8 count=6 loadrt mux4 count=1 loadrt mux2 count=2 # toggle for jog pendant buttons loadrt debounce cfg=4 loadrt toggle count=4 loadrt not count=1 loadrt and2 count=2 # toggle2nist for coolant-button and for vfd-button loadrt toggle2nist count=3 addf and2.0 servo-thread addf and2.1 servo-thread addf debounce.0 servo-thread addf not.0 servo-thread addf toggle.0 servo-thread addf toggle.1 servo-thread addf toggle.2 servo-thread addf toggle.3 servo-thread addf toggle2nist.0 servo-thread addf toggle2nist.1 servo-thread addf toggle2nist.2 servo-thread # load stepgen for creating frequency reference loadrt stepgen step_type=2 ctrl_type=v addf stepgen.make-pulses base-thread addf stepgen.update-freq servo-thread newsig enastep bit linksp enastep stepgen.0.enable sets enastep 1 setp stepgen.0.position-scale 4 # we don't want a negative frequency loadrt abs count=1 addf abs.0 servo-thread # load ddt for rpm calc loadrt ddt count=1 loadrt scale count=2 addf ddt.0 slow-thread addf scale.0 slow-thread addf scale.1 servo-thread # 500-line encoder gives 2000 pulses per rev setp m5i20.0.enc-03-scale -2000 # RPM = revolutions per minute net ddt-scale scale.0.gain sets ddt-scale 60 net spindle-pos m5i20.0.enc-03-position net spindle-pos ddt.0.in # spindle position to motion-control for threading net spindle-pos motion.spindle-revs net spindle-index-en motion.spindle-index-enable m5i20.0.enc-03-index-enable net rev-count ddt.0.out net rev-count scale.0.in net rev-scaled scale.0.out # 2000 Hz corresponds to 5400 RPM # so scale Hz values by 1/2.7 net rpm-scale scale.1.gain sets rpm-scale 0.37037037 # net spindle-speed motion.spindle-speed-out scale.1.in net spindle-freq scale.1.out abs.0.in net spindle-freq-abs abs.0.out stepgen.0.velocity-cmd # link VFD frequency reference pulse-train output net pulse-train stepgen.0.phase-A m5i20.0.out-02 # IO to set spindle direction # Out-4 VFD Reverse # Out-5 VFD Forward net spindle-reverse motion.spindle-reverse m5i20.0.out-04 net spindle-forward motion.spindle-forward m5i20.0.out-05 # add emc functions to servo thread addf motion-command-handler servo-thread addf motion-controller servo-thread # read inputs addf m5i20.0.digital-in-read base-thread addf m5i20.0.encoder-read servo-thread # do PID calculations addf pid.0.do-pid-calcs servo-thread addf pid.1.do-pid-calcs servo-thread addf pid.2.do-pid-calcs servo-thread # do IDB calculations addf idb.0 servo-thread addf idb.1 servo-thread addf idb.2 servo-thread # update outputs addf m5i20.0.dac-write servo-thread addf m5i20.0.digital-out-write base-thread addf m5i20.0.misc-update servo-thread # set correct output mode setp m5i20.0.dac-00-interlaced false setp m5i20.0.dac-01-interlaced false setp m5i20.0.dac-02-interlaced false setp m5i20.0.dac-03-interlaced false # connect position feedback to # -PID loop # -motion module # -encoder counter net Xpos-fb m5i20.0.enc-00-position pid.0.feedback axis.0.motor-pos-fb net Ypos-fb m5i20.0.enc-01-position pid.1.feedback axis.1.motor-pos-fb net Zpos-fb m5i20.0.enc-02-position pid.2.feedback axis.2.motor-pos-fb # set position feedback scaling setp m5i20.0.enc-00-scale [AXIS_0]INPUT_SCALE setp m5i20.0.enc-01-scale [AXIS_1]INPUT_SCALE setp m5i20.0.enc-02-scale [AXIS_2]INPUT_SCALE # connect encoder index-enables for homing on index net Xindex-enable m5i20.0.enc-00-index-enable <=> axis.0.index-enable net Yindex-enable m5i20.0.enc-01-index-enable <=> axis.1.index-enable net Zindex-enable m5i20.0.enc-02-index-enable <=> axis.2.index-enable net xhome axis.0.home-sw-in m5i20.0.in-00 net yhome axis.1.home-sw-in m5i20.0.in-01 net zhome axis.2.home-sw-in m5i20.0.in-02 # connect position commands from motion controller to PID input net Xpos-cmd axis.0.motor-pos-cmd pid.0.command net Ypos-cmd axis.1.motor-pos-cmd pid.1.command net Zpos-cmd axis.2.motor-pos-cmd pid.2.command # connect motion controller enables to PID blocks net Xenable axis.0.amp-enable-out pid.0.enable m5i20.0.dac-00-enable net Yenable axis.1.amp-enable-out pid.1.enable m5i20.0.dac-01-enable net Zenable axis.2.amp-enable-out pid.2.enable m5i20.0.dac-02-enable # connect PID loop output to DACs net Xoutput pid.0.output => idb.0.in net Youtput pid.1.output => idb.1.in net Zoutput pid.2.output => idb.2.in # connect IDB output to DACs net Xoutput-idb idb.0.out m5i20.0.dac-00-value net Youtput-idb idb.1.out m5i20.0.dac-01-value net Zoutput-idb idb.2.out m5i20.0.dac-02-value setp idb.0.amount 0.17 setp idb.1.amount 0.17 setp idb.2.amount 0.16 # set PID loop output limits to max duty cycle allowed setp pid.0.maxoutput 9.5 setp pid.1.maxoutput 9.5 setp pid.2.maxoutput 9.5 # set PID loop gains # NOTE: eventually these will be non-zero values as # needed to tune the performance of each axis. The # initial values shown here are extremely conservative # to prevent unexpected behavior. After this file # has been "executed" by halcmd, the gains can be # interactively adjusted using commands like # "halcmd setp pid..Pgain " # Once the axis has been tuned to your satisfaction, # do "halcmd show param | grep pid" to get a listing # of the tuning parameters, and enter those values here. # the values below come from the ini setp pid.0.Pgain [AXIS_0]PGAIN setp pid.0.Igain [AXIS_0]IGAIN setp pid.0.Dgain [AXIS_0]DGAIN setp pid.0.bias [AXIS_0]BIAS setp pid.0.FF0 [AXIS_0]FF0 setp pid.0.FF1 [AXIS_0]FF1 setp pid.0.FF2 [AXIS_0]FF2 # deadband should be just over 1 count setp pid.0.deadband [AXIS_0]DEADBAND setp pid.1.Pgain [AXIS_1]PGAIN setp pid.1.Igain [AXIS_1]IGAIN setp pid.1.Dgain [AXIS_1]DGAIN setp pid.1.bias [AXIS_1]BIAS setp pid.1.FF0 [AXIS_1]FF0 setp pid.1.FF1 [AXIS_1]FF1 setp pid.1.FF2 [AXIS_1]FF2 # deadband should be just over 1 count setp pid.1.deadband [AXIS_1]DEADBAND setp pid.2.Pgain [AXIS_2]PGAIN setp pid.2.Igain [AXIS_2]IGAIN setp pid.2.Dgain [AXIS_2]DGAIN setp pid.2.bias [AXIS_2]BIAS setp pid.2.FF0 [AXIS_2]FF0 setp pid.2.FF1 [AXIS_2]FF1 setp pid.2.FF2 [AXIS_2]FF2 # deadband should be just over 1 count setp pid.2.deadband [AXIS_2]DEADBAND # estop loop # Out-1 E-stop out # In-15 E-stop in net estop-out iocontrol.0.user-enable-out m5i20.0.out-01 net estop-in iocontrol.0.emc-enable-in m5i20.0.in-15-not # create signals for tool loading loopback net tool-prep-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed # LIMIT SWITCHES # connect simulated switch outputs to motion controller # net Xminlim wcomp.0.out => axis.0.neg-lim-sw-in # net Xmaxlim wcomp.1.out => axis.0.pos-lim-sw-in # net Xhome wcomp.2.out => axis.0.home-sw-in # net Yminlim wcomp.3.out => axis.1.neg-lim-sw-in # net Ymaxlim wcomp.4.out => axis.1.pos-lim-sw-in # net Yhome wcomp.5.out => axis.1.home-sw-in # net Zminlim wcomp.6.out => axis.2.neg-lim-sw-in # net Zmaxlim wcomp.7.out => axis.2.pos-lim-sw-in # net Zhome wcomp.8.out => axis.2.home-sw-in # Coolant net coolant iocontrol.0.coolant-flood m5i20.0.out-00 # JOGWHEEL addf encoder.update-counters base-thread addf encoder.capture-position servo-thread addf mux4.0 servo-thread addf match8.0 servo-thread addf match8.1 servo-thread addf match8.2 servo-thread addf match8.3 servo-thread addf match8.4 servo-thread addf match8.5 servo-thread # joghweel has detens, so we want 1x mode setp encoder.0.x4-mode false newsig true bit sets true 1 newsig jogsel0 bit newsig jogsel1 bit newsig jogsel2 bit linksp jogsel0 m5i20.0.in-16 linksp jogsel1 m5i20.0.in-17 linksp jogsel2 m5i20.0.in-18 # this is the code for selecting X-jog linksp true match8.0.in net Xjogen match8.0.out newsig Xsel0 bit newsig Xsel1 bit newsig Xsel2 bit newsig Xsel3 bit newsig Xsel4 bit newsig Xsel5 bit newsig Xsel6 bit newsig Xsel7 bit sets Xsel0 0 sets Xsel1 0 sets Xsel2 0 sets Xsel3 0 sets Xsel4 0 sets Xsel5 0 sets Xsel6 0 sets Xsel7 0 net Xsel0 match8.0.b0 net Xsel1 match8.0.b1 net Xsel2 match8.0.b2 net Xsel3 match8.0.b3 net Xsel4 match8.0.b4 net Xsel5 match8.0.b5 net Xsel6 match8.0.b6 net Xsel7 match8.0.b7 net jogsel0 match8.0.a0 net jogsel1 match8.0.a1 net jogsel2 match8.0.a2 # this is the code for selecting Y-jog linksp true match8.1.in net Yjogen match8.1.out newsig Ysel0 bit newsig Ysel1 bit newsig Ysel2 bit newsig Ysel3 bit newsig Ysel4 bit newsig Ysel5 bit newsig Ysel6 bit newsig Ysel7 bit sets Ysel0 1 sets Ysel1 0 sets Ysel2 0 sets Ysel3 0 sets Ysel4 0 sets Ysel5 0 sets Ysel6 0 sets Ysel7 0 net Ysel0 match8.1.b0 net Ysel1 match8.1.b1 net Ysel2 match8.1.b2 net Ysel3 match8.1.b3 net Ysel4 match8.1.b4 net Ysel5 match8.1.b5 net Ysel6 match8.1.b6 net Ysel7 match8.1.b7 net jogsel0 match8.1.a0 net jogsel1 match8.1.a1 net jogsel2 match8.1.a2 # this is the code for selecting Z-jog net true match8.2.in net Zjogen match8.2.out newsig Zsel0 bit newsig Zsel1 bit newsig Zsel2 bit newsig Zsel3 bit newsig Zsel4 bit newsig Zsel5 bit newsig Zsel6 bit newsig Zsel7 bit sets Zsel0 0 sets Zsel1 1 sets Zsel2 0 sets Zsel3 0 sets Zsel4 0 sets Zsel5 0 sets Zsel6 0 sets Zsel7 0 net Zsel0 match8.2.b0 net Zsel1 match8.2.b1 net Zsel2 match8.2.b2 net Zsel3 match8.2.b3 net Zsel4 match8.2.b4 net Zsel5 match8.2.b5 net Zsel6 match8.2.b6 net Zsel7 match8.2.b7 net jogsel0 match8.2.a0 net jogsel1 match8.2.a1 net jogsel2 match8.2.a2 # this is the code for selecting Feed Override net true match8.3.in net fo_en match8.3.out newsig fosel0 bit newsig fosel1 bit newsig fosel2 bit newsig fosel3 bit newsig fosel4 bit newsig fosel5 bit newsig fosel6 bit newsig fosel7 bit sets fosel0 0 sets fosel1 0 sets fosel2 1 sets fosel3 0 sets fosel4 0 sets fosel5 0 sets fosel6 0 sets fosel7 0 net fosel0 match8.3.b0 net fosel1 match8.3.b1 net fosel2 match8.3.b2 net fosel3 match8.3.b3 net fosel4 match8.3.b4 net fosel5 match8.3.b5 net fosel6 match8.3.b6 net fosel7 match8.3.b7 net jogsel0 match8.3.a0 net jogsel1 match8.3.a1 net jogsel2 match8.3.a2 # this is the code for selecting Spindle Override net true match8.4.in net so_en match8.4.out newsig sosel0 bit newsig sosel1 bit newsig sosel2 bit newsig sosel3 bit newsig sosel4 bit newsig sosel5 bit newsig sosel6 bit newsig sosel7 bit sets sosel0 1 sets sosel1 0 sets sosel2 1 sets sosel3 0 sets sosel4 0 sets sosel5 0 sets sosel6 0 net sosel0 match8.4.b0 net sosel1 match8.4.b1 net sosel2 match8.4.b2 net sosel3 match8.4.b3 net sosel4 match8.4.b4 net sosel5 match8.4.b5 net sosel6 match8.4.b6 net sosel7 match8.4.b7 net jogsel0 match8.4.a0 net jogsel1 match8.4.a1 net jogsel2 match8.4.a2 # this is the code for selecting jogwheel off net true match8.5.in net jog_off match8.5.out newsig offsel0 bit newsig offsel1 bit newsig offsel2 bit newsig offsel3 bit newsig offsel4 bit newsig offsel5 bit newsig offsel6 bit newsig offsel7 bit sets offsel0 1 sets offsel1 1 sets offsel2 0 sets offsel3 0 sets offsel4 0 sets offsel5 0 sets offsel6 0 net offsel0 match8.5.b0 net offsel1 match8.5.b1 net offsel2 match8.5.b2 net offsel3 match8.5.b3 net offsel4 match8.5.b4 net offsel5 match8.5.b5 net offsel6 match8.5.b6 net offsel7 match8.5.b7 net jogsel0 match8.5.a0 net jogsel1 match8.5.a1 net jogsel2 match8.5.a2 # link the jog-select signals to motioncontroller net Xjogen axis.0.jog-enable net Yjogen axis.1.jog-enable net Zjogen axis.2.jog-enable # jogwheel encoder net jogwheel-b encoder.0.phase-B m5i20.0.in-25 net jogwheel-a encoder.0.phase-A m5i20.0.in-26 net jog-counts encoder.0.counts axis.0.jog-counts net jog-counts encoder.0.counts axis.1.jog-counts net jog-counts encoder.0.counts axis.2.jog-counts net jog-counts encoder.0.counts halui.feed-override.counts net jog-counts encoder.0.counts halui.spindle-override.counts # jog increment selection # increment select logic newsig inc1 bit newsig inc1val float sets inc1val 0.001 newsig inc2 bit newsig inc2val float sets inc2val 0.01 newsig inc3 bit newsig inc3val float sets inc3val 0.1 net inc1 m5i20.0.in-19 mux4.0.sel0 net inc2 m5i20.0.in-20 mux4.0.sel1 net inc1val mux4.0.in0 net inc2val mux4.0.in1 net inc3val mux4.0.in2 net joginc mux4.0.out net joginc axis.0.jog-scale net joginc axis.1.jog-scale net joginc axis.2.jog-scale # feed override selection newsig fo_enabled float sets fo_enabled 0.0025 newsig fo_off float sets fo_off 0.0 net fo_en mux2.0.sel net fo_off mux2.0.in0 net fo_enabled mux2.0.in1 net fo_increment mux2.0.out halui.feed-override.scale addf mux2.0 servo-thread # spindle speed override selection newsig so_enabled float sets so_enabled 0.0025 newsig so_off float sets so_off 0.0 net so_en mux2.1.sel net so_off mux2.1.in0 net so_enabled mux2.1.in1 net so_increment mux2.1.out halui.spindle-override.scale addf mux2.1 servo-thread # jog-pendant buttons net yel-button m5i20.0.in-21 net blu-button m5i20.0.in-22 net gre-button m5i20.0.in-23 net red-button m5i20.0.in-24 net blu-button toggle.0.in net blu-toggle toggle.0.out net blu-toggle toggle2nist.0.in net coolant-is-on toggle2nist.0.is-on halui.flood.is-on net coolant-on toggle2nist.0.on halui.flood.on net coolant-off toggle2nist.0.off halui.flood.off net yel-button toggle.1.in net yel-toggle toggle.1.out net yel-toggle toggle2nist.1.in net spindle-is-on toggle2nist.1.is-on halui.spindle.runs-forward net spindle-fw toggle2nist.1.on halui.spindle.forward net spindle-bw toggle2nist.1.off halui.spindle.stop net red-button toggle.2.in net red-toggle toggle.2.out net red-toggle toggle2nist.2.in net program-is-paused halui.program.is-paused net program-is-paused toggle2nist.2.is-on net program-pause toggle2nist.2.on halui.program.pause net program-resume toggle2nist.2.off halui.program.resume net gre-button halui.program.step # VFD load monitoring setp encoder.1.counter-mode true net vfd-load-pulses encoder.1.phase-A m5i20.0.in-09 net s-load encoder.1.velocity