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_pwmgens=6 num_stepgens=0 num_encoders=6 sserial_port_0=00000000" 
setp    [HMOT](CARD0).watchdog.timeout_ns 5000000



addf [HMOT](CARD0).read			servo-thread
addf motion-command-handler   	servo-thread
addf motion-controller			servo-thread
addf [HMOT](CARD0).write		servo-thread


# 1. Alle 6 PID-Regler instanziieren
loadrt pid names=pid.j0,pid.j1,pid.j2,pid.j3,pid.j4,pid.j5

# 2. Alle 6 PID-Regler in den Servo-Thread einbinden
addf pid.j0.do-pid-calcs      servo-thread
addf pid.j1.do-pid-calcs      servo-thread
addf pid.j2.do-pid-calcs      servo-thread
addf pid.j3.do-pid-calcs      servo-thread
addf pid.j4.do-pid-calcs      servo-thread
addf pid.j5.do-pid-calcs      servo-thread


# ---BRAKE---
setp [HMOT](CARD0).gpio.007.is_output true
#net brake-off [HMOT](CARD0).gpio.007.out

loadrt brake_control count=1
addf brake-control.0 servo-thread

# Parameter einstellen
setp brake-control.0.hold-delay [TUNE]DELAY_BRAKE
setp brake-control.0.hold-voltage [TUNE]VOLTAGE_PERCENT
setp brake-control.0.pwm-freq [TUNE]PWM_FREQ_BRAKE

# Signal-Verknüpfung
net brake-off brake-control.0.in
net brake-physical-out brake-control.0.out => hm2_7i92.0.gpio.007.out


# Encoder Setup
setp hm2_7i92.0.encoder.00.counter-mode 0
setp hm2_7i92.0.encoder.00.scale [JOINT_0]SCALE_ENC

setp hm2_7i92.0.encoder.01.counter-mode 0
setp hm2_7i92.0.encoder.01.scale [JOINT_1]SCALE_ENC

setp hm2_7i92.0.encoder.02.counter-mode 0
setp hm2_7i92.0.encoder.02.scale [JOINT_2]SCALE_ENC

setp hm2_7i92.0.encoder.03.counter-mode 0
setp hm2_7i92.0.encoder.03.scale [JOINT_3]SCALE_ENC

setp hm2_7i92.0.encoder.04.counter-mode 0
setp hm2_7i92.0.encoder.04.scale [JOINT_4]SCALE_ENC

setp hm2_7i92.0.encoder.05.counter-mode 0
setp hm2_7i92.0.encoder.05.scale [JOINT_5]SCALE_ENC



# =====================================================================
# MESA HARDWARE-PWM PARAMETER SETUP (MODUS 2)
# =====================================================================

# 1. PWM-Trägerfrequenz in Hz (z.B. 20 kHz)
setp hm2_7i92.0.pwmgen.pwm_frequency [TUNE]MAIN_PWM

# 2. PWM-Typ auf 2 festlegen: Up / Down (Vorwärts / Rückwärts)
setp hm2_7i92.0.pwmgen.00.output-type 2
setp hm2_7i92.0.pwmgen.01.output-type 2
setp hm2_7i92.0.pwmgen.02.output-type 2
setp hm2_7i92.0.pwmgen.03.output-type 2
setp hm2_7i92.0.pwmgen.04.output-type 2
setp hm2_7i92.0.pwmgen.05.output-type 2

# 3. Skalierung: Maximale Achsgeschwindigkeit (100% Duty Cycle)
setp hm2_7i92.0.pwmgen.00.scale [JOINT_0]SCALE_PWM
setp hm2_7i92.0.pwmgen.01.scale [JOINT_1]SCALE_PWM
setp hm2_7i92.0.pwmgen.02.scale [JOINT_2]SCALE_PWM
setp hm2_7i92.0.pwmgen.03.scale [JOINT_3]SCALE_PWM
setp hm2_7i92.0.pwmgen.04.scale [JOINT_4]SCALE_PWM
setp hm2_7i92.0.pwmgen.05.scale [JOINT_5]SCALE_PWM

#####HOMING#####

# Beispiel für Achse 0 (Joint 0) und den ersten Encoder-Kanal der 7i92
net x-index-enable joint.0.index-enable <=> hm2_7i92.0.encoder.00.index-enable



####X-Axis Setup####

# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j0.Pgain     [JOINT_0]P
setp pid.j0.Igain     [JOINT_0]I
setp pid.j0.Dgain     [JOINT_0]D
setp pid.j0.FF0       [JOINT_0]FF0
setp pid.j0.FF1       [JOINT_0]FF1
setp pid.j0.FF2	      [JOINT_0]FF2
setp pid.j0.maxoutput [JOINT_0]MAXOUTPUT
setp pid.j0.maxerror  [JOINT_0]MAXERROR
setp pid.j0.deadband  [JOINT_0]DEADBAND
setp pid.j0.bias	  [JOINT_0]BIAS

setp joint.0.amp-fault-in FALSE

# 1a. Achsfreigabe (Enable)
#net x-enable        joint.0.amp-enable-out  => hm2_7i92.0.pwmgen.00.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net x-enable        joint.0.amp-enable-out  => hm2_7i92.0.pwmgen.00.enable pid.j0.enable

# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net x-pos-cmd       joint.0.motor-pos-cmd   => pid.j0.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net x-vel-cmd       joint.0.vel-cmd         => hm2_7i92.0.pwmgen.00.value
# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net x-vel-fb        hm2_7i92.0.encoder.00.velocity => pid.j0.feedback-deriv
net x-pos-fb        hm2_7i92.0.encoder.00.position => pid.j0.feedback joint.0.motor-pos-fb


# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net x-pos-fb        joint.0.motor-pos-cmd   => joint.0.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net x-output        pid.j0.output           => hm2_7i92.0.pwmgen.00.value

####Y-Axis Setup####

#####HOMING#####

# Beispiel für Achse 1 (Joint 1) und den ersten Encoder-Kanal der 7i92
net y-index-enable joint.1.index-enable <=> hm2_7i92.0.encoder.01.index-enable





# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VERDRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j1.Pgain     [JOINT_1]P
setp pid.j1.Igain     [JOINT_1]I
setp pid.j1.Dgain     [JOINT_1]D
setp pid.j1.FF0       [JOINT_1]FF0
setp pid.j1.FF1       [JOINT_1]FF1
setp pid.j1.FF2	      [JOINT_1]FF2
setp pid.j1.maxoutput [JOINT_1]MAXOUTPUT
setp pid.j1.maxerror  [JOINT_1]MAXERROR
setp pid.j1.deadband  [JOINT_1]DEADBAND
setp pid.j1.bias	  [JOINT_1]BIAS

# 1a. Achsfreigabe (Enable)
#net y-enable        joint.1.amp-enable-out  => hm2_7i92.0.pwmgen.01.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net y-enable        joint.1.amp-enable-out  => hm2_7i92.0.pwmgen.01.enable pid.j1.enable
# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net y-pos-cmd       joint.1.motor-pos-cmd   => pid.j1.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net y-vel-cmd       joint.1.vel-cmd         => hm2_7i92.0.pwmgen.01.value

# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net y-vel-fb        hm2_7i92.0.encoder.01.velocity => pid.j1.feedback-deriv
net y-pos-fb        hm2_7i92.0.encoder.01.position => pid.j1.feedback joint.1.motor-pos-fb

# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net y-pos-fb        joint.1.motor-pos-cmd   => joint.1.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net y-output        pid.j1.output           => hm2_7i92.0.pwmgen.01.value

####Z-Axis Setup####

# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VERDRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j2.Pgain     [JOINT_2]P
setp pid.j2.Igain     [JOINT_2]I
setp pid.j2.Dgain     [JOINT_2]D
setp pid.j2.FF0       [JOINT_2]FF0
setp pid.j2.FF1       [JOINT_2]FF1
setp pid.j2.FF2	      [JOINT_2]FF2
setp pid.j2.maxoutput [JOINT_2]MAXOUTPUT
setp pid.j2.maxerror  [JOINT_2]MAXERROR
setp pid.j2.deadband  [JOINT_2]DEADBAND
setp pid.j2.bias	  [JOINT_2]BIAS

# 1a. Achsfreigabe (Enable)
#net z-enable        joint.2.amp-enable-out  => hm2_7i92.0.pwmgen.02.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net z-enable        joint.2.amp-enable-out  => hm2_7i92.0.pwmgen.02.enable pid.j2.enable
# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net z-pos-cmd       joint.2.motor-pos-cmd   => pid.j2.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net z-vel-cmd       joint.2.vel-cmd         => hm2_7i92.0.pwmgen.02.value

# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net z-vel-fb        hm2_7i92.0.encoder.02.velocity => pid.j2.feedback-deriv
net z-pos-fb        hm2_7i92.0.encoder.02.position => pid.j2.feedback joint.2.motor-pos-fb

# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net z-pos-fb        joint.2.motor-pos-cmd   => joint.2.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net z-output        pid.j2.output           => hm2_7i92.0.pwmgen.02.value

#####HOMING#####

# Beispiel für Achse 2 (Joint 2) und den ersten Encoder-Kanal der 7i92
net z-index-enable joint.2.index-enable <=> hm2_7i92.0.encoder.02.index-enable

####A-Axis Setup####

# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VERDRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j3.Pgain     	[JOINT_3]P
setp pid.j3.Igain     	[JOINT_3]I
setp pid.j3.Dgain     	[JOINT_3]D
setp pid.j3.FF0       	[JOINT_3]FF0
setp pid.j3.FF1       	[JOINT_3]FF1
setp pid.j3.FF2	      	[JOINT_3]FF2
setp pid.j3.maxoutput 	[JOINT_3]MAXOUTPUT
setp pid.j3.maxerror  	[JOINT_3]MAXERROR
setp pid.j3.deadband  	[JOINT_3]DEADBAND
setp pid.j3.bias	  	[JOINT_3]BIAS


# 1a. Achsfreigabe (Enable)
#net a-enable        joint.3.amp-enable-out  => hm2_7i92.0.pwmgen.03.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net a-enable        joint.3.amp-enable-out  => hm2_7i92.0.pwmgen.03.enable pid.j3.enable
# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net a-pos-cmd       joint.3.motor-pos-cmd   => pid.j3.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net a-vel-cmd       joint.3.vel-cmd         => hm2_7i92.0.pwmgen.03.value

# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net a-vel-fb        hm2_7i92.0.encoder.03.velocity => pid.j3.feedback-deriv
net a-pos-fb        hm2_7i92.0.encoder.03.position => pid.j3.feedback joint.3.motor-pos-fb

# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net a-pos-fb        joint.3.motor-pos-cmd   => joint.3.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net a-output        pid.j3.output           => hm2_7i92.0.pwmgen.03.value

#####HOMING#####

# Beispiel für Achse 3 (Joint 3) und den ersten Encoder-Kanal der 7i92
net a-index-enable joint.3.index-enable <=> hm2_7i92.0.encoder.03.index-enable

####B-Axis Setup####

# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VERDRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j4.Pgain     	[JOINT_4]P
setp pid.j4.Igain     	[JOINT_4]I
setp pid.j4.Dgain     	[JOINT_4]D
setp pid.j4.FF0       	[JOINT_4]FF0
setp pid.j4.FF1       	[JOINT_4]FF1
setp pid.j4.FF2	      	[JOINT_4]FF2
setp pid.j4.maxoutput 	[JOINT_4]MAXOUTPUT
setp pid.j4.maxerror  	[JOINT_4]MAXERROR
setp pid.j4.deadband  	[JOINT_4]DEADBAND
setp pid.j4.bias	  	[JOINT_4]BIAS


# 1a. Achsfreigabe (Enable)
#net b-enable        joint.4.amp-enable-out  => hm2_7i92.0.pwmgen.04.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net b-enable        joint.4.amp-enable-out  => hm2_7i92.0.pwmgen.04.enable pid.j4.enable
# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net b-pos-cmd       joint.4.motor-pos-cmd   => pid.j4.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net b-vel-cmd       joint.4.vel-cmd         => hm2_7i92.0.pwmgen.04.value

# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net b-vel-fb        hm2_7i92.0.encoder.04.velocity => pid.j4.feedback-deriv
net b-pos-fb        hm2_7i92.0.encoder.04.position => pid.j4.feedback joint.4.motor-pos-fb

# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net b-pos-fb        joint.4.motor-pos-cmd   => joint.4.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net b-output        pid.j4.output           => hm2_7i92.0.pwmgen.04.value

#####HOMING#####

# Beispiel für Achse 4 (Joint 4) und den ersten Encoder-Kanal der 7i92
net b-index-enable joint.4.index-enable <=> hm2_7i92.0.encoder.04.index-enable

####C-Axis Setup####

# =====================================================================
# SIGNALVERKNÜPFUNGEN (OPEN-LOOP VERDRAHTUNG)
# =====================================================================

# PID Parameter (Verknüpft die PID-Pins direkt mit den INI-Variablen)
setp pid.j5.Pgain     	[JOINT_5]P
setp pid.j5.Igain     	[JOINT_5]I
setp pid.j5.Dgain     	[JOINT_5]D
setp pid.j5.FF0       	[JOINT_5]FF0
setp pid.j5.FF1       	[JOINT_5]FF1
setp pid.j5.FF2	      	[JOINT_5]FF2
setp pid.j5.maxoutput 	[JOINT_5]MAXOUTPUT
setp pid.j5.maxerror  	[JOINT_5]MAXERROR
setp pid.j5.deadband  	[JOINT_5]DEADBAND
setp pid.j5.bias	  	[JOINT_5]BIAS


# 1a. Achsfreigabe (Enable)
#net c-enable        joint.5.amp-enable-out  => hm2_7i92.0.pwmgen.05.enable
#PID-Aktivierung koppeln mit Achsfreigabe
net c-enable        joint.5.amp-enable-out  => hm2_7i92.0.pwmgen.05.enable pid.j5.enable
# 1b. Soll-Position von LinuxCNC in den PID-Regler speisen
net c-pos-cmd       joint.5.motor-pos-cmd   => pid.j5.command

# 2. Geschwindigkeitssignal an die Mesa-Karte übergeben
#net c-vel-cmd       joint.5.vel-cmd         => hm2_7i92.0.pwmgen.05.value

# 2. Ist-Position vom Mesa-Encoder in den PID-Regler speisen
net c-vel-fb        hm2_7i92.0.encoder.05.velocity => pid.j5.feedback-deriv
net c-pos-fb        hm2_7i92.0.encoder.05.position => pid.j5.feedback joint.5.motor-pos-fb

# 3. OPEN-LOOP TRICK: Positions-Rückmeldung simulieren
# Da kein Encoder existiert, spiegeln wir den Befehl direkt zurück.
# Ohne diese Zeile wirft LinuxCNC sofort einen "Following Error" (Schleppfehler).
# net c-pos-fb        joint.5.motor-pos-cmd   => joint.5.motor-pos-fb

# 3. PID-Ausgangssignal an den PWM-Generator der Mesa-Karte senden
net c-output        pid.j5.output           => hm2_7i92.0.pwmgen.05.value

#####HOMING#####

# Beispiel für Achse 5 (Joint 5) und den ersten Encoder-Kanal der 7i92
net c-index-enable joint.5.index-enable <=> hm2_7i92.0.encoder.05.index-enable

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

net coolant-mist      <=  iocontrol.0.coolant-mist
net coolant-flood     <=  iocontrol.0.coolant-flood

#  ---probe signal---



net probe-in     =>  motion.probe-input

#  ---motion control signals---

net in-position               <=  motion.in-position
net machine-is-enabled        <=  motion.motion-enabled

#  ---digital in / out signals---

#  ---estop signals---

net estop-out     <=  iocontrol.0.user-enable-out
net estop-out     =>  iocontrol.0.emc-enable-in

#  ---manual tool change signals---

loadusr -W hal_manualtoolchange


