#Generated by PNCconf at Fri Nov 14 16:28:14 2025 # Using LinuxCNC version: Master (2.9) # If you make changes to this file, they will be # overwritten when you run PNCconf again loadrt [KINS]KINEMATICS loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS loadrt hostmot2 loadrt hm2_eth board_ip="10.10.10.10" config="num_encoders=6 num_pwmgens=6 num_stepgens=0 sserial_port_0=00010100" setp [HMOT](CARD0).pwmgen.pwm_frequency 20000 setp [HMOT](CARD0).pwmgen.pdm_frequency 6000000 setp [HMOT](CARD0).watchdog.timeout_ns 5000000 loadrt pid names=pid.x,pid.y,pid.z,pid.a,pid.s loadrt abs names=abs.spindle loadrt lowpass names=lowpass.spindle loadrt scale names=scale.spindle loadrt mux16 names=jogincr,foincr,soincr loadrt and2 count=3 addf [HMOT](CARD0).read servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf pid.x.do-pid-calcs servo-thread addf pid.y.do-pid-calcs servo-thread addf pid.z.do-pid-calcs servo-thread addf pid.a.do-pid-calcs servo-thread addf pid.s.do-pid-calcs servo-thread addf jogincr servo-thread addf foincr servo-thread addf soincr servo-thread addf scale.spindle servo-thread addf abs.spindle servo-thread addf lowpass.spindle servo-thread addf [HMOT](CARD0).write servo-thread # external output signals # Source of truth: Master Outputs Table (updated) # 7i84 instance: hm2_7i97.0.7i84.0.1 # O1 CNC_START net cnc_start => hm2_7i97.0.7i84.0.1.output-00 # O2 CNC_READY net cnc_ready => hm2_7i97.0.7i84.0.1.output-01 # O3 MAIN_DRIVE_ENABLE # see below as this output is now handled by gate #net main_drive_enable => hm2_7i97.0.7i84.0.1.output-02 # O4 TOOL_UNCLAMP net tool_unclamp => hm2_7i97.0.7i84.0.1.output-03 # O5 A4_UNCLAMP net a4_unclamp => hm2_7i97.0.7i84.0.1.output-04 # O7 A4_DRIVE_ENABLE net a4_drive_enable => hm2_7i97.0.7i84.0.1.output-05 # O9 SPEED_SEL_0 net speed_sel_0 => hm2_7i97.0.7i84.0.1.output-08 # O10 SPEED_SEL_1 net speed_sel_1 => hm2_7i97.0.7i84.0.1.output-09 # O11 GEAR_BYPASS net gear_bypass => hm2_7i97.0.7i84.0.1.output-10 # O14 SAFETY_ENABLE Drive MAHO safety outputs from LinuxCNC enable chain net emc_enable => hm2_7i97.0.7i84.0.1.output-11 # O17 SAFETY_RELAY Drive MAHO safety outputs from LinuxCNC enable chain net emc_enable => hm2_7i97.0.7i84.0.1.output-12 # O20 COOLANT_ON (driven by iocontrol coolant-flood net below) #net coolant_on => hm2_7i97.0.7i84.0.1.output-13 # O23 LUBE_ON net lube_on => hm2_7i97.0.7i84.0.1.output-14 # O25 PROBE_RELEASE net probe_release => hm2_7i97.0.7i84.0.1.output-15 # O27 TABLE_UNCLAMP is marked NOT USED in the Master Outputs Table (no mapping here). # external input signals # Source of truth: Master Inputs Table (updated) # 7i84 instance: hm2_7i97.0.7i84.0.1 # I1 Diagnosis ON net diagnosis_on <= hm2_7i97.0.7i84.0.1.input-00 # I2 MC memory open net mc_memory_open <= hm2_7i97.0.7i84.0.1.input-01 # I3 No spindle/feed stop (critical) net no_spindle_feed_stop <= hm2_7i97.0.7i84.0.1.input-02-not # I4 Machine ON (3K2 aux) - NOTE: on your machine this goes true after "machine start / hydraulics" net machine_on <= hm2_7i97.0.7i84.0.1.input-03 # I5 Address M feedback net address_m_feedback <= hm2_7i97.0.7i84.0.1.input-04 # I6 CNC start input (pushbutton) net cnc_start_input <= hm2_7i97.0.7i84.0.1.input-05 # I7 Lubrication machine running net lubrication_machine <= hm2_7i97.0.7i84.0.1.input-06 # I8 Float switch lubrication (tank level) net float_switch_lubrication <= hm2_7i97.0.7i84.0.1.input-07 # I9 Speed select bit 0 (11S1) net speed_select_bit0 <= hm2_7i97.0.7i84.0.1.input-08 # I10 Speed select bit 1 (11S2) net speed_select_bit1 <= hm2_7i97.0.7i84.0.1.input-09 # I11 Clamp released net clamp_released <= hm2_7i97.0.7i84.0.1.input-10 # I12 Reserved # hm2_7i97.0.7i84.0.1.input-11 is reserved (no net) # I13 Cabin doors closed net cabin_doors_closed <= hm2_7i97.0.7i84.0.1.input-12 # I14 Speed in range net speed_in_range <= hm2_7i97.0.7i84.0.1.input-16 # I15 Foot switch net foot_switch <= hm2_7i97.0.7i84.0.1.input-17 # I16 Measuring probe ready net measuring_probe_ready <= hm2_7i97.0.7i84.0.1.input-18 # I17 Release of feed net release_of_feed <= hm2_7i97.0.7i84.0.1.input-19 # I18-21 Load bits 1-4 net load_bit1 <= hm2_7i97.0.7i84.0.1.input-20 net load_bit2 <= hm2_7i97.0.7i84.0.1.input-21 net load_bit3 <= hm2_7i97.0.7i84.0.1.input-22 net load_bit4 <= hm2_7i97.0.7i84.0.1.input-23 # I22 Main drive ready net main_drive_ready <= hm2_7i97.0.7i84.0.1.input-24 # I23 Error signal net error_signal <= hm2_7i97.0.7i84.0.1.input-25 # I24 CNC memory closed net cnc_memory_closed <= hm2_7i97.0.7i84.0.1.input-26 # I25 Spare input net spare_input <= hm2_7i97.0.7i84.0.1.input-27 # I40 Speed too low net speed_too_low <= hm2_7i97.0.7i84.0.1.input-30 # I41 Probe interlock net probe_interlock <= hm2_7i97.0.7i84.0.1.input-31 #******************* # AXIS X JOINT 0 #******************* setp pid.x.Pgain [JOINT_0]P setp pid.x.Igain [JOINT_0]I setp pid.x.Dgain [JOINT_0]D setp pid.x.bias [JOINT_0]BIAS setp pid.x.FF0 [JOINT_0]FF0 setp pid.x.FF1 [JOINT_0]FF1 setp pid.x.FF2 [JOINT_0]FF2 setp pid.x.deadband [JOINT_0]DEADBAND setp pid.x.maxoutput [JOINT_0]MAX_OUTPUT setp pid.x.error-previous-target true net x-index-enable => pid.x.index-enable net x-enable => pid.x.enable net x-pos-cmd => pid.x.command net x-pos-fb => pid.x.feedback net x-output <= pid.x.output # ---PWM Generator signals/setup--- setp [HMOT](CARD0).pwmgen.00.output-type 1 setp [HMOT](CARD0).pwmgen.00.scale [JOINT_0]OUTPUT_SCALE net x-output => [HMOT](CARD0).pwmgen.00.value net x-pos-cmd joint.0.motor-pos-cmd net x-enable joint.0.amp-enable-out => [HMOT](CARD0).pwmgen.00.enable # ---Encoder feedback signals/setup--- setp [HMOT](CARD0).encoder.00.counter-mode 0 setp [HMOT](CARD0).encoder.00.filter 1 setp [HMOT](CARD0).encoder.00.index-invert 0 setp [HMOT](CARD0).encoder.00.index-mask 0 setp [HMOT](CARD0).encoder.00.index-mask-invert 0 setp [HMOT](CARD0).encoder.00.scale [JOINT_0]ENCODER_SCALE net x-pos-fb <= [HMOT](CARD0).encoder.00.position net x-vel-fb <= [HMOT](CARD0).encoder.00.velocity net x-pos-fb => joint.0.motor-pos-fb net x-index-enable joint.0.index-enable <=> [HMOT](CARD0).encoder.00.index-enable net x-pos-rawcounts <= [HMOT](CARD0).encoder.00.rawcounts # ---setup home / limit switch signals--- net x-home-sw => joint.0.home-sw-in net x-neg-limit => joint.0.neg-lim-sw-in net x-pos-limit => joint.0.pos-lim-sw-in #******************* # AXIS Y JOINT 1 #******************* setp pid.y.Pgain [JOINT_1]P setp pid.y.Igain [JOINT_1]I setp pid.y.Dgain [JOINT_1]D setp pid.y.bias [JOINT_1]BIAS setp pid.y.FF0 [JOINT_1]FF0 setp pid.y.FF1 [JOINT_1]FF1 setp pid.y.FF2 [JOINT_1]FF2 setp pid.y.deadband [JOINT_1]DEADBAND setp pid.y.maxoutput [JOINT_1]MAX_OUTPUT setp pid.y.error-previous-target true net y-index-enable => pid.y.index-enable net y-enable => pid.y.enable net y-pos-cmd => pid.y.command net y-pos-fb => pid.y.feedback net y-output <= pid.y.output # ---PWM Generator signals/setup--- setp [HMOT](CARD0).pwmgen.01.output-type 1 setp [HMOT](CARD0).pwmgen.01.scale [JOINT_1]OUTPUT_SCALE net y-output => [HMOT](CARD0).pwmgen.01.value net y-pos-cmd joint.1.motor-pos-cmd net y-enable joint.1.amp-enable-out => [HMOT](CARD0).pwmgen.01.enable # ---Encoder feedback signals/setup--- setp [HMOT](CARD0).encoder.01.counter-mode 0 setp [HMOT](CARD0).encoder.01.filter 1 setp [HMOT](CARD0).encoder.01.index-invert 0 setp [HMOT](CARD0).encoder.01.index-mask 0 setp [HMOT](CARD0).encoder.01.index-mask-invert 0 setp [HMOT](CARD0).encoder.01.scale [JOINT_1]ENCODER_SCALE net y-pos-fb <= [HMOT](CARD0).encoder.01.position net y-vel-fb <= [HMOT](CARD0).encoder.01.velocity net y-pos-fb => joint.1.motor-pos-fb net y-index-enable joint.1.index-enable <=> [HMOT](CARD0).encoder.01.index-enable net y-pos-rawcounts <= [HMOT](CARD0).encoder.01.rawcounts # ---setup home / limit switch signals--- net y-home-sw => joint.1.home-sw-in net y-neg-limit => joint.1.neg-lim-sw-in net y-pos-limit => joint.1.pos-lim-sw-in #******************* # AXIS Z JOINT 2 #******************* setp pid.z.Pgain [JOINT_2]P setp pid.z.Igain [JOINT_2]I setp pid.z.Dgain [JOINT_2]D setp pid.z.bias [JOINT_2]BIAS setp pid.z.FF0 [JOINT_2]FF0 setp pid.z.FF1 [JOINT_2]FF1 setp pid.z.FF2 [JOINT_2]FF2 setp pid.z.deadband [JOINT_2]DEADBAND setp pid.z.maxoutput [JOINT_2]MAX_OUTPUT setp pid.z.error-previous-target true net z-index-enable => pid.z.index-enable net z-enable => pid.z.enable net z-pos-cmd => pid.z.command net z-pos-fb => pid.z.feedback net z-output <= pid.z.output # ---PWM Generator signals/setup--- setp [HMOT](CARD0).pwmgen.02.output-type 1 setp [HMOT](CARD0).pwmgen.02.scale [JOINT_2]OUTPUT_SCALE net z-output => [HMOT](CARD0).pwmgen.02.value net z-pos-cmd joint.2.motor-pos-cmd net z-enable joint.2.amp-enable-out => [HMOT](CARD0).pwmgen.02.enable # ---Encoder feedback signals/setup--- setp [HMOT](CARD0).encoder.02.counter-mode 0 setp [HMOT](CARD0).encoder.02.filter 1 setp [HMOT](CARD0).encoder.02.index-invert 0 setp [HMOT](CARD0).encoder.02.index-mask 0 setp [HMOT](CARD0).encoder.02.index-mask-invert 0 setp [HMOT](CARD0).encoder.02.scale [JOINT_2]ENCODER_SCALE net z-pos-fb <= [HMOT](CARD0).encoder.02.position net z-vel-fb <= [HMOT](CARD0).encoder.02.velocity net z-pos-fb => joint.2.motor-pos-fb net z-index-enable joint.2.index-enable <=> [HMOT](CARD0).encoder.02.index-enable net z-pos-rawcounts <= [HMOT](CARD0).encoder.02.rawcounts # ---setup home / limit switch signals--- net z-home-sw => joint.2.home-sw-in net z-neg-limit => joint.2.neg-lim-sw-in net z-pos-limit => joint.2.pos-lim-sw-in #******************* # AXIS A JOINT 3 #******************* setp pid.a.Pgain [JOINT_3]P setp pid.a.Igain [JOINT_3]I setp pid.a.Dgain [JOINT_3]D setp pid.a.bias [JOINT_3]BIAS setp pid.a.FF0 [JOINT_3]FF0 setp pid.a.FF1 [JOINT_3]FF1 setp pid.a.FF2 [JOINT_3]FF2 setp pid.a.deadband [JOINT_3]DEADBAND setp pid.a.maxoutput [JOINT_3]MAX_OUTPUT setp pid.a.error-previous-target true net a-index-enable => pid.a.index-enable net a-enable => pid.a.enable net a-pos-cmd => pid.a.command net a-pos-fb => pid.a.feedback net a-output <= pid.a.output # ---PWM Generator signals/setup--- setp [HMOT](CARD0).pwmgen.03.output-type 1 setp [HMOT](CARD0).pwmgen.03.scale [JOINT_3]OUTPUT_SCALE net a-output => [HMOT](CARD0).pwmgen.03.value net a-pos-cmd joint.3.motor-pos-cmd net a-enable joint.3.amp-enable-out => [HMOT](CARD0).pwmgen.03.enable # ---Encoder feedback signals/setup--- setp [HMOT](CARD0).encoder.03.counter-mode 0 setp [HMOT](CARD0).encoder.03.filter 1 setp [HMOT](CARD0).encoder.03.index-invert 0 setp [HMOT](CARD0).encoder.03.index-mask 0 setp [HMOT](CARD0).encoder.03.index-mask-invert 0 setp [HMOT](CARD0).encoder.03.scale [JOINT_3]ENCODER_SCALE net a-pos-fb <= [HMOT](CARD0).encoder.03.position net a-vel-fb <= [HMOT](CARD0).encoder.03.velocity net a-pos-fb => joint.3.motor-pos-fb net a-index-enable joint.3.index-enable <=> [HMOT](CARD0).encoder.03.index-enable net a-pos-rawcounts <= [HMOT](CARD0).encoder.03.rawcounts # ---setup home / limit switch signals--- net a-home-sw => joint.3.home-sw-in net a-neg-limit => joint.3.neg-lim-sw-in net a-pos-limit => joint.3.pos-lim-sw-in #******************* # SPINDLE #******************* setp pid.s.Pgain [SPINDLE_0]P setp pid.s.Igain [SPINDLE_0]I setp pid.s.Dgain [SPINDLE_0]D setp pid.s.bias [SPINDLE_0]BIAS setp pid.s.FF0 [SPINDLE_0]FF0 setp pid.s.FF1 [SPINDLE_0]FF1 setp pid.s.FF2 [SPINDLE_0]FF2 setp pid.s.deadband [SPINDLE_0]DEADBAND setp pid.s.maxoutput [SPINDLE_0]MAX_OUTPUT setp pid.s.error-previous-target true net spindle-index-enable => pid.s.index-enable net spindle-enable => pid.s.enable net spindle-vel-cmd-rpm => pid.s.command net spindle-vel-fb-rpm => pid.s.feedback net spindle-output <= pid.s.output # ---PWM Generator signals/setup--- setp [HMOT](CARD0).pwmgen.05.output-type 1 setp [HMOT](CARD0).pwmgen.05.scale [SPINDLE_0]OUTPUT_SCALE net spindle-output => [HMOT](CARD0).pwmgen.05.value net spindle-enable => [HMOT](CARD0).pwmgen.05.enable # ---Encoder feedback signals/setup--- setp [HMOT](CARD0).encoder.05.counter-mode 0 setp [HMOT](CARD0).encoder.05.filter 1 setp [HMOT](CARD0).encoder.05.index-invert 0 setp [HMOT](CARD0).encoder.05.index-mask 0 setp [HMOT](CARD0).encoder.05.index-mask-invert 0 setp [HMOT](CARD0).encoder.05.scale [SPINDLE_0]ENCODER_SCALE net spindle-revs <= [HMOT](CARD0).encoder.05.position net spindle-vel-fb-rps <= [HMOT](CARD0).encoder.05.velocity net spindle-vel-fb-rpm <= [HMOT](CARD0).encoder.05.velocity-rpm net spindle-index-enable <=> [HMOT](CARD0).encoder.05.index-enable # ---setup spindle control signals--- net spindle-vel-cmd-rps <= spindle.0.speed-out-rps net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs net spindle-vel-cmd-rpm <= spindle.0.speed-out net spindle-vel-cmd-rpm-abs <= spindle.0.speed-out-abs net spindle-enable <= spindle.0.on net spindle-cw <= spindle.0.forward net spindle-ccw <= spindle.0.reverse net spindle-brake <= spindle.0.brake net spindle-revs => spindle.0.revs net spindle-at-speed => spindle.0.at-speed net spindle-vel-fb-rps => spindle.0.speed-in net spindle-index-enable <=> spindle.0.index-enable # ---Setup spindle at speed signals--- sets spindle-at-speed true # Use ACTUAL spindle velocity from spindle encoder # spindle-velocity bounces around so we filter it with lowpass # spindle-velocity is signed so we use absolute component to remove sign # ACTUAL velocity is in RPS not RPM so we scale it. setp scale.spindle.gain 60 setp lowpass.spindle.gain 1.000000 net spindle-vel-fb-rps => scale.spindle.in net spindle-fb-rpm scale.spindle.out => abs.spindle.in net spindle-fb-rpm-abs abs.spindle.out => lowpass.spindle.in net spindle-fb-rpm-abs-filtered lowpass.spindle.out #****************************** # connect miscellaneous signals #****************************** # ---HALUI signals--- net axis-select-x halui.axis.x.select net jog-x-pos halui.axis.x.plus net jog-x-neg halui.axis.x.minus net jog-x-analog halui.axis.x.analog net x-is-homed halui.joint.0.is-homed net axis-select-y halui.axis.y.select net jog-y-pos halui.axis.y.plus net jog-y-neg halui.axis.y.minus net jog-y-analog halui.axis.y.analog net y-is-homed halui.joint.1.is-homed net axis-select-z halui.axis.z.select net jog-z-pos halui.axis.z.plus net jog-z-neg halui.axis.z.minus net jog-z-analog halui.axis.z.analog net z-is-homed halui.joint.2.is-homed net axis-select-a halui.axis.a.select net jog-a-pos halui.axis.a.plus net jog-a-neg halui.axis.a.minus net jog-a-analog halui.axis.a.analog net a-is-homed halui.joint.3.is-homed net jog-selected-pos halui.axis.selected.plus net jog-selected-neg halui.axis.selected.minus net spindle-manual-cw halui.spindle.0.forward net spindle-manual-ccw halui.spindle.0.reverse net spindle-manual-stop halui.spindle.0.stop net machine-is-on halui.machine.is-on net jog-speed halui.axis.jog-speed net MDI-mode halui.mode.is-mdi # ---coolant signals--- # LinuxCNC flood coolant -> MAHO output O20 (7i84 output-13) net coolant-flood iocontrol.0.coolant-flood => hm2_7i97.0.7i84.0.1.output-13 # ---probe signal--- net probe-in => motion.probe-input # ---jog button signals--- sets jog-speed 1.000000 # connect selectable mpg jog increments net jog-incr-a => jogincr.sel0 net jog-incr-b => jogincr.sel1 net jog-incr-c => jogincr.sel2 net jog-incr-d => jogincr.sel3 net selected-jog-incr <= jogincr.out-f setp jogincr.debounce-time 0.200000 setp jogincr.use-graycode False setp jogincr.suppress-no-input False setp jogincr.in00 0.000000 setp jogincr.in01 0.000100 setp jogincr.in02 0.000500 setp jogincr.in03 0.001000 setp jogincr.in04 0.005000 setp jogincr.in05 0.010000 setp jogincr.in06 0.050000 setp jogincr.in07 0.100000 setp jogincr.in08 0.125000 setp jogincr.in09 0.125000 setp jogincr.in10 0.125000 setp jogincr.in11 0.125000 setp jogincr.in12 0.125000 setp jogincr.in13 0.125000 setp jogincr.in14 0.125000 setp jogincr.in15 0.125000 # connect feed override increments - MPG setp halui.feed-override.direct-value false setp halui.feed-override.scale .01 net fo-enable => halui.feed-override.count-enable net axis-selected-count => halui.feed-override.counts # connect spindle override increments - MPG setp halui.spindle.0.override.direct-value false setp halui.spindle.0.override.scale .01 net so-enable => halui.spindle.0.override.count-enable net axis-selected-count => halui.spindle.0.override.counts # ---motion control signals--- net in-position <= motion.in-position # ========================================================= # MACHINE ENABLE / E-STOP CHAIN # --------------------------------------------------------- # Goal: LinuxCNC leaves ESTOP only when ALL are true: # 1) Operator requests ON (F2) -> iocontrol.0.user-enable-out # 2) Physical machine is energized (Machine ON feedback) -> machine_on (7i84 input-03) # 3) Spindle/feed safety chain OK -> no_spindle_feed_stop (7i84 input-02-not) # # Notes: # - Your input-02 is active-low on the 7i84, so the IO mapping above already nets: # net no_spindle_feed_stop <= hm2_...input-02-not # - We therefore use *no_spindle_feed_stop* directly here (TRUE = OK). # ========================================================= # and2 is already loaded near the top: loadrt and2 count=3 # Use: # and2.0 = stage1 (F2 AND machine_on) # and2.2 = final (stage1 AND safety chain OK) # and2.1 = main drive enable gate (optional, below) addf and2.0 servo-thread addf and2.2 servo-thread # Stage 1: GUI F2 AND physical machine-on feedback net user_enable iocontrol.0.user-enable-out => and2.0.in0 net machine_on => and2.0.in1 # Stage 2: add spindle/feed chain OK net stage1_enable and2.0.out => and2.2.in0 net no_spindle_feed_stop => and2.2.in1 # Feed the resulting enable into LinuxCNC net emc_enable and2.2.out => iocontrol.0.emc-enable-in net emc_enable => motion.enable # ========================================================= # MAIN DRIVE ENABLE (Stage 1 commissioning) # --------------------------------------------------------- # O3 MAIN_DRIVE_ENABLE -> hm2_7i97.0.7i84.0.1.output-02 # Gate: LinuxCNC enabled (emc_enable) # ========================================================= addf and2.1 servo-thread # Gate inputs net emc_enable => and2.1.in0 net machine_on => and2.1.in1 # Gated output drives the real relay output net main_drive_enable and2.1.out => hm2_7i97.0.7i84.0.1.output-02 # ---manual tool change signals--- net tool-change-request <= iocontrol.0.tool-change net tool-change-confirmed => iocontrol.0.tool-changed net tool-number <= iocontrol.0.tool-prep-number