#RMC Rev31 - ATC2
#RMC Rev28.5 - ATC3
#RMC Rev28 - ATC
#RMC Rev27 - orient
#RMC Rev26 - 4th axis disabled and probe & tool setter
#RMC Rev25 - Blast multiclick
#RMC Rev24 - drive alarms, vfd alarm
#RMC Rev23 - Air connected, blast, mist, PDB, manual tool change
#RMC Rev22 - feedhold blink, classic ladder %Q6 to single-block led, fixed spindle reverse (abs)
#RMC Rev21 - PBTest02 revert to horizontal
#RMC PBVTest03 - blast timer
#RMC PBVTest02 - overrides plus software encoder MAJOR CLEANUP
#RMC PBVtest01
#RMC Rev16 - spindle orient
#RMC Rev15 - coolant and mist part 2
#RMC Rev14 - back to classic ladder test
#RMC Rev13 - run/step feedhold
#RMC Revxx - air safety bypass for testing
#RMC Rev12 - classicladder cycle start (fail)
#RMC Rev11 - optional block
#RMC Rev10 - coolant and mist
#RMC Rev09 - spindle fan
#RMC Rev08 - PDB signals
#RMC Rev07 - homing offsets
#RMC Rev06 - drive enable and alarms
#RMC Rev05 - machine on w estop clear
#RMC Rev04 - spindle PID sorted out
#RMC Rev03 - estop fiddling
#RMC Rev02 - added encoders and override resets
#RMC Rev01 - removed classic ladder at end

loadrt [KINS]KINEMATICS
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS num_dio=10 #ATC
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config="num_encoders=1 num_pwmgens=0 num_stepgens=5 sserial_port_0=22xxxx" 
setp    [HMOT](CARD0).watchdog.timeout_ns 5000000
loadrt pid                          names=pid.x,pid.y,pid.z,pid.a,pid.s,pid.o #ORIENT
loadrt abs                          count=2
loadrt lowpass                      names=lowpass.spindle
loadrt scale                        count=3                 #SPINDLE LOAD BLAST
loadrt orient                       count=1                 #ORIENT
loadrt mux2                         count=1                 #ORIENT
loadrt and2                         count=10
loadrt or2                          count=6                 #ORIENT
loadrt not			                count=6
loadrt toggle                       count=7
loadrt toggle2nist                  count=2
loadrt dbounce                      count=4
loadrt encoder                      num_chan=1              #MAXVEL OVERRIDE
loadrt multiclick                   count=1                 #BLAST
loadrt near                         count=1
loadrt oneshot                      count=1
loadrt timedelay                    count=6
loadrt xor2                         count=1                     #ATC
loadrt carousel  pockets=18 encoding=counts num_sense=18 dir=2  #ATC3
loadrt conv_float_s32                                           #ATC
loadrt limit3                       count=1                 #ORIENT
loadrt lincurve                     personality=6           #ORIENT
loadrt classicladder_rt numPhysInputs=15 numPhysOutputs=15 numS32in=10 numS32out=10 numFloatIn=10 numFloatOut=10 numBits=50 numWords=50

addf [HMOT](CARD0).read         servo-thread
addf motion-command-handler     servo-thread
addf motion-controller          servo-thread
addf orient.0           		servo-thread    #ORIENT
addf mux2.0			            servo-thread    #ORIENT
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 pid.o.do-pid-calcs         servo-thread    #ORIENT
addf [HMOT](CARD0).write        servo-thread
addf lowpass.spindle            servo-thread
addf near.0                     servo-thread
addf abs.0                      servo-thread
addf abs.1                      servo-thread    #ORIENT
addf classicladder.0.refresh    servo-thread
addf oneshot.0                  servo-thread    #ESTOP RELAY
addf timedelay.0                servo-thread    #MACHINE ON
addf timedelay.1                servo-thread    #SPINDLE INHIBIT
addf timedelay.2                servo-thread    #PDB CYL
addf timedelay.3                servo-thread    #SPINDLE FAN
addf timedelay.4                servo-thread    #BLAST
addf timedelay.5                servo-thread    #FEEDHOLD LED
addf and2.0                     servo-thread    #AIR PRESSURE
addf and2.1                     servo-thread    #PDB ENABLE
addf and2.2						servo-thread    #vc-p4s.hal
addf and2.3						servo-thread    #BLAST
addf and2.4                     servo-thread    #FEEDHOLD LED
addf and2.5                     servo-thread    #YELOW LED
addf and2.6						servo-thread    #ORIENT
addf and2.7						servo-thread
addf and2.8						servo-thread
addf and2.9						servo-thread
addf or2.0                      servo-thread    #PDB
addf or2.1                      servo-thread    #GREEN LED
addf or2.2                      servo-thread    #RED LED
addf or2.3                      servo-thread    #BLAST
addf or2.4                      servo-thread    #ORIENT
addf or2.5                      servo-thread    #ORIENT
addf not.0						servo-thread    #PDB ENABLE
addf not.1                      servo-thread    #OPTSTOP
addf not.2                      servo-thread    #BLKDEL
addf not.3                      servo-thread    #BLAST
addf not.4                      servo-thread    #FEEDHOLD LED
addf not.5                      servo-thread    #RED LED
addf toggle.0                   servo-thread    #OPTSTOP
addf toggle.1                   servo-thread    #BLKDEL
addf toggle.2                   servo-thread    #postgui MIST
addf toggle.3                   servo-thread    #postgui FLOOD
addf toggle.4                   servo-thread    #BLAST
addf toggle.5                   servo-thread    #SGLBLK
addf toggle.6                   servo-thread
addf toggle2nist.0              servo-thread    #postgui MIST
addf toggle2nist.1              servo-thread    #postgui FLOOD
addf dbounce.0                  servo-thread    #OPTSTOP
addf dbounce.1                  servo-thread    #BLKDEL
addf dbounce.2                  servo-thread    #postgui MIST
addf dbounce.3                  servo-thread    #postgui FLOOD
addf encoder.update-counters    servo-thread
addf encoder.capture-position   servo-thread
addf scale.0                    servo-thread    #SPINDLE LOAD
addf scale.1                    servo-thread    #BLAST
addf scale.2                    servo-thread    #BLAST
addf multiclick.0               servo-thread    #BLAST
addf xor2.0                     servo-thread    #ATC
addf carousel.0                 servo-thread    #ATC
addf conv-float-s32.0           servo-thread    #ATC (G-code analogue outputs are float-type)
addf limit3.0                   servo-thread    #ORIENT
addf lincurve.0                 servo-thread    #ORIENT

setp dbounce.0.delay            5               #OPTSTOP
setp dbounce.1.delay            5               #BLKDEL
setp dbounce.2.delay            5               #postgui MIST
setp dbounce.3.delay            5               #postgui FLOOD
setp [HMOT](CARD0).dpll.01.timer-us -50
setp [HMOT](CARD0).stepgen.timer-number 1


#RMC Rev28.5

setp carousel.0.scale 1000
setp carousel.0.width 0
setp carousel.0.fwd-dc 25
setp carousel.0.rev-dc -25

#pocket request     motion.analog-out-00

#carousel enable    motion.digital-out-00
#extend solenoid    motion.digital-out-01
#retract solenoid   motion.digital-out-02
#drawbar solenoid   motion.digital-out-03

#carousel-ready     motion.digital-in-00
#extend proxy       motion.digital-in-01
#retract proxy      motion.digital-in-02
#drawbar down proxy motion.digital-in-03
#spindle-enable     motion.digital-in-04
#spindle oriented   motion.digital-in-05

net ATC_ENABLE                  <=  motion.digital-out-00
net ATC_ENABLE                  =>  carousel.0.enable
net ATC_ENABLE                  =>  [HMOT](CARD0).stepgen.03.enable
net ATC_READY                   <=  carousel.0.ready
net ATC_READY                   =>  motion.digital-in-00
net ATC_COUNTS                  <=  [HMOT](CARD0).stepgen.03.counts
net ATC_COUNTS                  =>  carousel.0.counts
net ATC_VEL                     <=  carousel.0.motor-vel
net ATC_VEL                     =>  [HMOT](CARD0).stepgen.03.velocity-cmd
net ATC_INDEX                   <=  [HMOT](CARD0).7i76.0.0.input-06-not    #index proximity sensor; 1/per rev
net ATC_INDEX                   =>  carousel.0.sense-0
#net ATC_PULSE                   <=  [HMOT](CARD0).7i76.0.0.input-05-not    #pulse proximity sensor; 1/per pocket
#net ATC_PULSE                   =>  carousel.0.sense-1

net ATC_POS_REQ                 <=  motion.analog-out-00
net ATC_POS_REQ                 =>  conv-float-s32.0.in
net ATC_POS_S32                 <=  conv-float-s32.0.out
net ATC_POS_S32                 =>  carousel.0.pocket-number

net ATC_EXTEND_VALVE            <=  motion.digital-out-01
net ATC_EXTEND_VALVE            =>  [HMOT](CARD0).7i76.0.0.output-03        #rodless cylinder extend solenoid valve
net ATC_RETRACT_VALVE           <=  motion.digital-out-02
net ATC_RETRACT_VALVE           =>  [HMOT](CARD0).7i76.0.0.output-02        #rodless cylinder retract solenoid valve

net ATC_RETRACT_SENS            <=  [HMOT](CARD0).7i76.0.0.input-08         #retracted proximity sensor
net ATC_RETRACT_SENS            =>  motion.digital-in-02
net ATC_EXTEND_SENS             <=  [HMOT](CARD0).7i76.0.0.input-07         #extended proximity sensor
net ATC_EXTEND_SENS             =>  motion.digital-in-01

net PDB_PROXY-DWN                <=  [HMOT](CARD0).7i76.0.0.input-09     #draw bar cylinder DOWN proximity sensor
net PDB_PROXY-DWN                =>  motion.digital-in-03
net UNCLAMP_TOOL_BUTTON         <=  [HMOT](CARD0).7i76.0.0.input-04         #manual pushbutton
net UNCLAMP_TOOL_BUTTON         =>  xor2.0.in0
net UNCLAMP_TOOL_AUTO           <=  motion.digital-out-03
net UNCLAMP_TOOL_AUTO           =>  xor2.0.in1

net PDB_RELEASE                 <=  xor2.0.out
net PDB_RELEASE                 =>  [HMOT](CARD0).7i76.0.0.output-08        #draw bar cylinder solenoid valve

net spindle-enable              =>  motion.digital-in-04                    #to check spindle is off during toolchange
net spindle-is-oriented         =>  motion.digital-in-05                    #to check spindle is oriented

#net ATC_PREP_NUMBER             <=  iocontrol.0.tool-prep-number
net ATC_PREP_LOOP               <=  iocontrol.0.tool-prepare
net ATC_PREP_LOOP               =>  iocontrol.0.tool-prepared
net ATC_CHANGE_LOOP             <=  iocontrol.0.tool-change
net ATC_CHANGE_LOOP             =>  iocontrol.0.tool-changed
loadusr -W hal_manualtoolchange



## Step Gen signals/setup
setp   [HMOT](CARD0).stepgen.03.dirsetup        10000   #[JOINT_3]DIRSETUP
setp   [HMOT](CARD0).stepgen.03.dirhold         10000   #[JOINT_3]DIRHOLD
setp   [HMOT](CARD0).stepgen.03.steplen         2500    #[JOINT_3]STEPLEN
setp   [HMOT](CARD0).stepgen.03.stepspace       2500    #[JOINT_3]STEPSPACE
setp   [HMOT](CARD0).stepgen.03.position-scale  50.0   #[JOINT_3]STEP_SCALE
setp   [HMOT](CARD0).stepgen.03.step_type       0
setp   [HMOT](CARD0).stepgen.03.control-type    1
setp   [HMOT](CARD0).stepgen.03.maxaccel        500    #[JOINT_3]STEPGEN_MAXACCEL
setp   [HMOT](CARD0).stepgen.03.maxvel          200   #[JOINT_3]STEPGEN_MAXVEL




#PDB
#net PDB_BUTTON                  <=  [HMOT](CARD0).7i76.0.0.input-04
#net PDB_UP_SENS                 <=  [HMOT](CARD0).7i76.0.0.input-09
#net PDB_BUTTON                  =>  or2.0.in0
#net PDB_UP_SENS                 =>  or2.0.in1
#net SPINDLE-INHIBIT             <=  or2.0.out
#setp timedelay.1.on-delay       0
#setp timedelay.1.off-delay      2
#net SPINDLE-INHIBIT             =>  timedelay.1.in
#net SPINDLE-INHIBIT-DWELL       <=  timedelay.1.out
#net SPINDLE-INHIBIT-DWELL       =>  spindle.0.inhibit
#net spindle-enable              =>  not.0.in
#net PDB_ENABLE                  <=  not.0.out
#net PDB_ENABLE                  =>  and2.1.in0
#net PDB_BUTTON                  =>  and2.1.in1
#net PDB_EXTEND_OK               <=  and2.1.out
#setp timedelay.2.on-delay       .5
#setp timedelay.2.off-delay      0
#net PDB_EXTEND_OK               =>  timedelay.2.in
#net PDB_EXTEND_GO               <=  timedelay.2.out
#net PDB_EXTEND_GO               =>  [HMOT](CARD0).7i76.0.0.output-08

#external input signals
net VFD_ANALOG_IN               <=  [HMOT](CARD0).7i76.0.0.input-00
net TOOL_SETTER_OVERTRAVEL      <=  [HMOT](CARD0).7i76.0.0.input-01
net TOOL_SETTER                 <=  [HMOT](CARD0).7i76.0.0.input-02

#RMC Rev26
net PROBE_IN                    <=  [HMOT](CARD0).7i76.0.0.input-03-not
#net PDB_BUTTON                  <=  [HMOT](CARD0).7i76.0.0.input-04

#LIMIT SWITCHES (invert pins for all NC proxys)
net home-a                      <=  [HMOT](CARD0).7i76.0.0.input-10-not
net min-y                       <=  [HMOT](CARD0).7i76.0.0.input-11-not
net max-home-y                  <=  [HMOT](CARD0).7i76.0.0.input-12-not
net min-x                       <=  [HMOT](CARD0).7i76.0.0.input-14-not
net max-home-x                  <=  [HMOT](CARD0).7i76.0.0.input-13-not
net max-home-z                  <=  [HMOT](CARD0).7i76.0.0.input-15-not

#AIR SAFETY - comment out to bypass air safety
net AIR_PRESSURE_OK             <=  [HMOT](CARD0).7i76.0.0.input-24
net ESTOP_RELAY                 <=	[HMOT](CARD0).7i76.0.0.input-20
net AIR_PRESSURE_OK             =>  and2.0.in0
net ESTOP_RELAY                 =>  and2.0.in1
net estop-clear                 <=  and2.0.out
net ESTOP_RELAY                 =>  iocontrol.0.emc-enable-in
net estop-out			        <=	iocontrol.0.user-enable-out

#MACHINE-ON WITH ESTOP CLEAR
setp oneshot.0.width            2
setp timedelay.0.off-delay      0.1
net ESTOP_RELAY 	            =>	oneshot.0.in
net MACHINE_ON_DELAY            <=  oneshot.0.out
net MACHINE_ON_DELAY            =>  timedelay.0.in
net MACHINE_ON                  <=  timedelay.0.out
net MACHINE_ON                  =>  halui.machine.on

#OVERRIDE - FEED
setp halui.feed-override.direct-value false
setp halui.feed-override.scale  .02
setp halui.feed-override.count-enable true
net fo-count		            <=	[HMOT](CARD0).7i84.0.1.enc0.count
net fo-count                    =>  halui.feed-override.counts
net fo-reset		            <=  [HMOT](CARD0).7i84.0.1.input-07

#OVERRIDE - SPINDLE
setp halui.spindle.0.override.direct-value false
setp halui.spindle.0.override.scale .02
setp halui.spindle.0.override.count-enable true
net so-count		            <=	[HMOT](CARD0).7i84.0.1.enc1.count
net so-count		            =>	halui.spindle.0.override.counts
net so-reset		            <=  [HMOT](CARD0).7i84.0.1.input-08

#OVERRIDE - MAXVEL
setp encoder.0.x4-mode 1
setp halui.max-velocity.direct-value false
setp halui.max-velocity.scale 0.03
setp halui.max-velocity.count-enable true
net mvo-chanA                   <=  [HMOT](CARD0).7i84.0.1.input-04
net mvo-chanA                   =>  encoder.0.phase-A
net mvo-chanB                   <=  [HMOT](CARD0).7i84.0.1.input-05
net mvo-chanB                   =>  encoder.0.phase-B
net mvo-out                     <=  encoder.0.counts
net mvo-out                     =>  halui.max-velocity.counts

#SPINDLE FAN
setp timedelay.3.on-delay       5
setp timedelay.3.off-delay      30
net spindle-enable              =>  timedelay.3.in
net SPINDLE_FAN                 <=  timedelay.3.out
net SPINDLE_FAN                 =>  [HMOT](CARD0).7i76.0.0.output-05

#AIR BLAST
net BLAST_OFF_ANA               <=  [HMOT](CARD0).7i84.0.1.analogin0
net BLAST_OFF_ANA               =>  scale.1.in
net BLAST_OFF_SCALED            <=  scale.1.out
setp scale.1.gain               0.125   #0-24V in / 0-30 seconds ON time
net BLAST_ON_ANA                <=  [HMOT](CARD0).7i84.0.1.analogin1
net BLAST_ON_ANA                =>  scale.2.in
net BLAST_ON_SCALED             <=  scale.2.out
setp scale.2.gain               1.25    #0-24V in / 0-3 seconds OFF time
net BLAST_OFF_SCALED            =>  timedelay.4.off-delay
net BLAST_ON_SCALED             =>  timedelay.4.on-delay
net BTN_BLAST                   <=  [HMOT](CARD0).7i84.0.1.input-30
net BTN_BLAST                   =>  multiclick.0.in
net BTN_BLAST_1CLICK            <=  multiclick.0.single-click-only
net BTN_BLAST_1CLICK            =>  toggle.4.in
net BLAST_TOG                   <=  toggle.4.out
net BLAST_TIMER                 <=  timedelay.4.out
net BLAST_TIMER                 =>  not.3.in
net BLAST_TIME_ON               <=  not.3.out
net BLAST_TIME_ON               =>  and2.3.in0
net BLAST_TOG                   =>  and2.3.in1
net BLAST_ON                    <=  and2.3.out
net BLAST_ON                    =>  timedelay.4.in
net BLAST_TIMER                 =>  or2.3.in0
net BTN_BLAST                   =>  or2.3.in1
net BLAST_OUT                   <=  or2.3.out
net BLAST_OUT                   =>  [HMOT](CARD0).7i84.0.1.output-10
net BLAST_OUT                   =>  [HMOT](CARD0).7i76.0.0.output-04




# SPARE OUTPUTS
net SPARE_RELAY_D05             =>  [HMOT](CARD0).7i76.0.0.output-01
net SPARE_RELAY_A0              =>  [HMOT](CARD0).7i76.0.0.output-06

net LED_SPARE_01                =>  [HMOT](CARD0).7i84.0.1.output-06
net LED_SPARE_02                =>  [HMOT](CARD0).7i84.0.1.output-07

# SPARE INPUTS
net SPARE_B18                   <=  [HMOT](CARD0).7i76.0.0.input-22
net SPARE_B17                   <=  [HMOT](CARD0).7i76.0.0.input-23

#  ---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

#RMC Rev26 - 4th axis disabled and probe & tool setter
#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 jog-speed                   <=  halui.axis.jog-speed
net MDI-mode                    <=  halui.mode.is-mdi
net PROBE_IN                    =>  motion.probe-input
net machine-is-on               <=  halui.machine.is-on
net machine-is-enabled          <=  motion.motion-enabled
net machine-is-enabled          =>  [HMOT](CARD0).7i76.0.0.output-09
net LED_RESET                   <=  halui.estop.is-activated
net LED_RESET                   =>  [HMOT](CARD0).7i84.0.1.output-11

#CLASSIC LADDER (start/stop/single-block)
net auto-mode                   <=  [HMOT](CARD0).7i84.0.1.input-20 #cyclestart
net auto-mode			        =>  classicladder.0.in-00
net feed-hold                   <=  [HMOT](CARD0).7i84.0.1.input-21 #feedhold 
net feed-hold                   =>  classicladder.0.in-07
net program-idle                <=  halui.program.is-idle
net program-idle                =>  classicladder.0.in-02
net single-block                <=  [HMOT](CARD0).7i84.0.1.input-24 #singleblock
net single-block                =>  classicladder.0.in-09
net mode-is-auto                <=  halui.mode.is-auto
net mode-is-auto                =>  classicladder.0.in-04
net btn-stop                    <=  [HMOT](CARD0).7i84.0.1.input-22 #cyclestop
net btn-stop                    =>  classicladder.0.in-05
net auto-mode-select            <=  classicladder.0.out-00
net auto-mode-select            =>  halui.mode.auto
net cycle-start                 <=  classicladder.0.out-01
net cycle-start                 =>  halui.program.run
net feed-resume                 <=  classicladder.0.out-03
net feed-resume                 =>  halui.program.resume
net single-block-select         <=  classicladder.0.out-04
net single-block-select         =>  halui.program.step
net program-stop                <=  classicladder.0.out-05
net program-stop                =>  halui.program.stop
net feed-hold-select            <=  classicladder.0.out-02
net feed-hold-select            =>  halui.program.pause

#CONTROL PANEL PROGRAM STATUS LEDS
net program-idle                =>  [HMOT](CARD0).7i84.0.1.output-02
net PGMRUN                      <=  halui.program.is-running
net PGMRUN                      =>  [HMOT](CARD0).7i84.0.1.output-00
net SGLBLK                      <=  classicladder.0.out-06
net SGLBLK                      =>  [HMOT](CARD0).7i84.0.1.output-04

#FEEDHOLD
net FDHOLD                      <=  halui.program.is-paused
net FDHOLD                      =>  and2.4.in0
net FDHOLD_LED                  <=  timedelay.5.out
net FDHOLD_LED                  =>  not.4.in
net FDHOLD_LED_ON               <=  not.4.out
net FDHOLD_LED_ON               =>  and2.4.in1
net FDHOLD_LED_OFF              <=  and2.4.out
net FDHOLD_LED_OFF              =>  timedelay.5.in
net FDHOLD_LED                  =>  [HMOT](CARD0).7i84.0.1.output-01

#PANEL LEDS
net FDHOLD_LED                  =>  or2.1.in0
net PGMRUN                      =>  or2.1.in1
net LED_GRN                     <=  or2.1.out
net LED_GRN                     =>  [HMOT](CARD0).7i84.0.1.output-12
net FDHOLD_LED                  =>  or2.2.in0
net machine-is-enabled	        =>	not.5.in
net machine-is-disabled         <=  not.5.out
net machine-is-disabled         =>  or2.2.in1
net LED_RED                     <=  or2.2.out
net LED_RED                     =>  [HMOT](CARD0).7i84.0.1.output-15

#OPTIONAL STOP M01
net BTN-OPTSTOP                 <=  [HMOT](CARD0).7i84.0.1.input-23 #optstop
net BTN-OPTSTOP                 =>  dbounce.0.in
net OPTSTOP-DB                  <=  dbounce.0.out
net OPTSTOP-DB                  =>  toggle.0.in
net OPTSTOP-ON                  <=  toggle.0.out
net OPTSTOP-ON                  =>  not.1.in
net OPTSTOP-OFF                 <=  not.1.out
net OPTSTOP-ON                  =>  halui.program.optional-stop.on
net OPTSTOP-OFF                 =>  halui.program.optional-stop.off
net OPTSTOP-ISON                <=  halui.program.optional-stop.is-on
net OPTSTOP-ISON                =>  [HMOT](CARD0).7i84.0.1.output-03

#BLOCK DELETE
net BTN-BLKDEL                  <=  [HMOT](CARD0).7i84.0.1.input-25 #block-delete
net BTN-BLKDEL                  =>  dbounce.1.in
net BLKDEL-DB                   <=  dbounce.1.out
net BLKDEL-DB                   =>  toggle.1.in
net BLKDEL-ON                   <=  toggle.1.out
net BLKDEL-ON                   =>  not.2.in
net BLKDEL-OFF                  <=  not.2.out
net BLKDEL-ON                   =>  halui.program.block-delete.on
net BLKDEL-OFF                  =>  halui.program.block-delete.off
net BLKDEL-ISON                 <=  halui.program.block-delete.is-on
net BLKDEL-ISON                 =>  [HMOT](CARD0).7i84.0.1.output-05


#*******************
#  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
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp   pid.x.maxerror 0.000500

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

# Step Gen signals/setup

setp   [HMOT](CARD0).stepgen.00.dirsetup        [JOINT_0]DIRSETUP
setp   [HMOT](CARD0).stepgen.00.dirhold         [JOINT_0]DIRHOLD
setp   [HMOT](CARD0).stepgen.00.steplen         [JOINT_0]STEPLEN
setp   [HMOT](CARD0).stepgen.00.stepspace       [JOINT_0]STEPSPACE
setp   [HMOT](CARD0).stepgen.00.position-scale  [JOINT_0]STEP_SCALE
setp   [HMOT](CARD0).stepgen.00.step_type        0
setp   [HMOT](CARD0).stepgen.00.control-type     1
setp   [HMOT](CARD0).stepgen.00.maxaccel         [JOINT_0]STEPGEN_MAXACCEL
setp   [HMOT](CARD0).stepgen.00.maxvel           [JOINT_0]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net x-pos-cmd    <= joint.0.motor-pos-cmd
net x-vel-cmd    <= joint.0.vel-cmd
net x-output     <= [HMOT](CARD0).stepgen.00.velocity-cmd
net x-pos-fb     <= [HMOT](CARD0).stepgen.00.position-fb
net x-pos-fb     => joint.0.motor-pos-fb
net x-enable     <= joint.0.amp-enable-out
net x-enable     => [HMOT](CARD0).stepgen.00.enable
net ALARM_X      <=  [HMOT](CARD0).7i76.0.0.input-31
net ALARM_X      =>  joint.0.amp-fault-in


# ---setup home / limit switch signals---
net max-home-x     =>  joint.0.home-sw-in
net min-x     =>  joint.0.neg-lim-sw-in
net max-home-x     =>  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
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp   pid.y.maxerror 0.000500

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

# Step Gen signals/setup

setp   [HMOT](CARD0).stepgen.01.dirsetup        [JOINT_1]DIRSETUP
setp   [HMOT](CARD0).stepgen.01.dirhold         [JOINT_1]DIRHOLD
setp   [HMOT](CARD0).stepgen.01.steplen         [JOINT_1]STEPLEN
setp   [HMOT](CARD0).stepgen.01.stepspace       [JOINT_1]STEPSPACE
setp   [HMOT](CARD0).stepgen.01.position-scale  [JOINT_1]STEP_SCALE
setp   [HMOT](CARD0).stepgen.01.step_type        0
setp   [HMOT](CARD0).stepgen.01.control-type     1
setp   [HMOT](CARD0).stepgen.01.maxaccel         [JOINT_1]STEPGEN_MAXACCEL
setp   [HMOT](CARD0).stepgen.01.maxvel           [JOINT_1]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net y-pos-cmd    <= joint.1.motor-pos-cmd
net y-vel-cmd    <= joint.1.vel-cmd
net y-output     <= [HMOT](CARD0).stepgen.01.velocity-cmd
net y-pos-fb     <= [HMOT](CARD0).stepgen.01.position-fb
net y-pos-fb     => joint.1.motor-pos-fb
net y-enable     <= joint.1.amp-enable-out
net y-enable     => [HMOT](CARD0).stepgen.01.enable
net ALARM_Y      <=  [HMOT](CARD0).7i76.0.0.input-30
net ALARM_Y      =>  joint.1.amp-fault-in

# ---setup home / limit switch signals---

net max-home-y     =>  joint.1.home-sw-in
net min-y     =>  joint.1.neg-lim-sw-in
net max-home-y     =>  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
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp   pid.z.maxerror 0.000500

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

# Step Gen signals/setup

setp   [HMOT](CARD0).stepgen.02.dirsetup        [JOINT_2]DIRSETUP
setp   [HMOT](CARD0).stepgen.02.dirhold         [JOINT_2]DIRHOLD
setp   [HMOT](CARD0).stepgen.02.steplen         [JOINT_2]STEPLEN
setp   [HMOT](CARD0).stepgen.02.stepspace       [JOINT_2]STEPSPACE
setp   [HMOT](CARD0).stepgen.02.position-scale  [JOINT_2]STEP_SCALE
setp   [HMOT](CARD0).stepgen.02.step_type        0
setp   [HMOT](CARD0).stepgen.02.control-type     1
setp   [HMOT](CARD0).stepgen.02.maxaccel         [JOINT_2]STEPGEN_MAXACCEL
setp   [HMOT](CARD0).stepgen.02.maxvel           [JOINT_2]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net z-pos-cmd    <= joint.2.motor-pos-cmd
net z-vel-cmd    <= joint.2.vel-cmd
net z-output     <= [HMOT](CARD0).stepgen.02.velocity-cmd
net z-pos-fb     <= [HMOT](CARD0).stepgen.02.position-fb
net z-pos-fb     => joint.2.motor-pos-fb
net z-enable     <= joint.2.amp-enable-out
net z-enable     => [HMOT](CARD0).stepgen.02.enable
net ALARM_Z      <=  [HMOT](CARD0).7i76.0.0.input-29
net ALARM_Z      =>  joint.2.amp-fault-in

# ---setup home / limit switch signals---

net max-home-z     =>  joint.2.home-sw-in
net z-neg-limit     =>  joint.2.neg-lim-sw-in
net max-home-z     =>  joint.2.pos-lim-sw-in


#RMC Rev26 - 4th axis disabled and probe & tool setter
#*******************
#  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
## This setting is to limit bogus stepgen
## velocity corrections caused by position
## feedback sample time jitter.
#setp   pid.a.maxerror 0.000500

#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

## Step Gen signals/setup

#setp   [HMOT](CARD0).stepgen.03.dirsetup        [JOINT_3]DIRSETUP
#setp   [HMOT](CARD0).stepgen.03.dirhold         [JOINT_3]DIRHOLD
#setp   [HMOT](CARD0).stepgen.03.steplen         [JOINT_3]STEPLEN
#setp   [HMOT](CARD0).stepgen.03.stepspace       [JOINT_3]STEPSPACE
#setp   [HMOT](CARD0).stepgen.03.position-scale  [JOINT_3]STEP_SCALE
#setp   [HMOT](CARD0).stepgen.03.step_type        0
#setp   [HMOT](CARD0).stepgen.03.control-type     1
#setp   [HMOT](CARD0).stepgen.03.maxaccel         [JOINT_3]STEPGEN_MAXACCEL
#setp   [HMOT](CARD0).stepgen.03.maxvel           [JOINT_3]STEPGEN_MAXVEL

# ---closedloop stepper signals---

#net a-pos-cmd    <= joint.3.motor-pos-cmd
#net a-vel-cmd    <= joint.3.vel-cmd
#net a-output     <= [HMOT](CARD0).stepgen.03.velocity-cmd
#net a-pos-fb     <= [HMOT](CARD0).stepgen.03.position-fb
#net a-pos-fb     => joint.3.motor-pos-fb
#net a-enable     <= joint.3.amp-enable-out
#net a-enable     => [HMOT](CARD0).stepgen.03.enable
#net ALARM_A      <= [HMOT](CARD0).7i76.0.0.input-28
#net ALARM_A      => joint.3.amp-fault-in

## ---setup home / limit switch signals---

#net home-a     =>  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

#*******************
#  ORIENT
#*******************
#   M19 trigger orient.0.enable; pid.o enable; spinena; select analogout
net  spindle-orient                     <=  spindle.0.orient    #orient command
net  spindle-orient                     =>  or2.5.in0		    #to orient enable
net  spindle-orient                     =>  and2.6.in0		    #to spindle is oriented
#net  orient-lock                        <=  spindle.0.locked    
net  orient-lock                        =>  or2.5.in1		    #to orient ennable
net  orient-enable                      <=  or2.5.out
net  orient-enable                      =>  orient.0.enable
net  orient-enable	                    =>  pid.o.enable
net  orient-enable	                    =>  or2.4.in1		    #to spindle enable
net  orient-enable	                    =>  mux2.0.sel

#   M19 orient angle R in to orient component
net  orient-angle	                    <=  spindle.0.orient-angle
net  orient-angle                       =>  orient.0.angle

#   M19 orient mode P in to orient component default 0
net  orient-mode                        <=  spindle.0.orient-mode
net  orient-mode                        =>  orient.0.mode

#   Encoder position into orient component and orient pid
net  spindle-revs                	    =>  orient.0.position
net  spindle-revs	                    =>  pid.o.feedback

#   Orient component position into orient pid
net  orient-command                     <=  orient.0.command
net  orient-command                     =>  pid.o.command

#   Orient pid output to spindle analog
net  spindle-orient-output	            <=  pid.o.output
net  spindle-orient-output              =>  mux2.0.in1

#   Orient limit3 test
#net  orient-limit                   <=  pid.o.output
#net  orient-limit                   =>  limit3.0.in
#net  orient-limit-out               <=  limit3.0.out
#net  orient-limit-out               =>  mux2.0.in1

#setp limit3.0.min    0
#setp limit3.0.max    1
#setp limit3.0.maxv   1
#setp limit3.0.maxa   1

#   Orient component return that orient is complete
net  orient-complete                    <=  orient.0.is-oriented
net  orient-complete                    =>  and2.6.in1
net  spindle-is-oriented                <=  and2.6.out
net  spindle-is-oriented                =>  spindle.0.is-oriented

setp pid.o.Pgain                        2000   #[TUNE]P
setp pid.o.Igain                        0   #[TUNE]I
setp pid.o.Dgain                        160   #[TUNE]D
setp pid.o.bias                         0   #[TUNE]BIAS
setp pid.o.FF0                          0   #[TUNE]FF0
setp pid.o.FF1                          0   #[TUNE]FF1
setp pid.o.FF2                          0   #[TUNE]FF2
setp pid.o.deadband                     0.002   #[TUNE]DEADBAND     0.0015
setp pid.o.maxoutput                    210   #[TUNE]MAX_OUTPUT
setp pid.o.error-previous-target        true
setp orient.0.tolerance                 1.0

setp lincurve.0.x-val-00 -0.02          #-0.01388
setp lincurve.0.y-val-00 1500           #1300
setp lincurve.0.x-val-01 -0.008         #-0.00555       #-0.004
setp lincurve.0.y-val-01 10000          #15000          #18000
setp lincurve.0.x-val-02 -0.001         #-0.00277       #-0.001
setp lincurve.0.y-val-02 0
setp lincurve.0.x-val-03 0.001          #0.00277        #0.001
setp lincurve.0.y-val-03 0
setp lincurve.0.x-val-04 0.008          #0.00555        #0.004
setp lincurve.0.y-val-04 10000          #15000          #18000
setp lincurve.0.x-val-05 0.02           #0.01388
setp lincurve.0.y-val-05 1500           #1300

net orient-lincurve-in                  <=  pid.o.error
net orient-lincurve-in                  =>  lincurve.0.in
net orient-lincurve-out                 <=  lincurve.0.out
net orient-lincurve-out                 =>  pid.o.Pgain



#*******************
#  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
setp pid.s.maxerrorI                    10

net  spindle-index-enable               <=  pid.s.index-enable
net  spindle-vel-enable                 =>  pid.s.enable
net  spindle-vel-cmd-rpm                =>  pid.s.command
net  spindle-vel-fb-rpm                 =>  pid.s.feedback
net  spindle-vel-output                 <=  pid.s.output

# ---digital potentionmeter output signals/setup---
setp [HMOT](CARD0).7i76.0.0.spinout-minlim    [SPINDLE_0]OUTPUT_MIN_LIMIT
setp [HMOT](CARD0).7i76.0.0.spinout-maxlim    [SPINDLE_0]OUTPUT_MAX_LIMIT
setp [HMOT](CARD0).7i76.0.0.spinout-scalemax  [SPINDLE_0]OUTPUT_SCALE

# spindle output is based on mux2 and sel bit
net  spindle-vel-output                 =>  mux2.0.in0
net  spindle-output          		    <=  mux2.0.out
net  spindle-output                     =>  abs.1.in
net  spindle-output-abs                 <=  abs.1.out
net  spindle-output-abs                 =>  [HMOT](CARD0).7i76.0.0.spinout
net  spindle-output-dir                 <=  abs.1.is-negative
net  spindle-output-dir                 =>  [HMOT](CARD0).7i76.0.0.spindir

# spindle enable from or2; either spindle-vel-enable or orient-enable
net  spindle-vel-enable		            =>  or2.4.in0
net  spindle-enable		                <=  or2.4.out
net  spindle-enable                     =>  [HMOT](CARD0).7i76.0.0.spinena

# ---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              [SPINDLE_0]ENCODER_SCALE

net  spindle-revs                       <=   [HMOT](CARD0).encoder.00.position
net  spindle-vel-fb-rps                 <=   [HMOT](CARD0).encoder.00.velocity
net  spindle-vel-fb-rpm                 <=   [HMOT](CARD0).encoder.00.velocity-rpm
net  spindle-index-enable               <=>  [HMOT](CARD0).encoder.00.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-vel-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
net  ALARM_VFD                          <=  [HMOT](CARD0).7i76.0.0.input-27
net  ALARM_VFD                          =>  spindle.0.amp-fault-in

# ---Setup spindle at speed signals---
net  spindle-vel-cmd-rps                =>  near.0.in1
net  spindle-vel-fb-rps                 =>  near.0.in2
net  spindle-at-speed                   <=  near.0.out
setp near.0.scale                       1.000000
setp near.0.difference                  1.666667

#RMC added for spindle PID feedback
setp lowpass.spindle.gain               1.000000
net spindle-vel-fb-rpm                  =>  abs.0.in
net spindle-vel-fb-rpm-abs              <=  abs.0.out
net spindle-vel-fb-rpm-abs              =>  lowpass.spindle.in
net spindle-fb-rpm-abs-filtered         <=  lowpass.spindle.out

#MANUAL TOOLCHANGE
#net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
#net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
#net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
#net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared