Import LinuxCNC source tree

This commit is contained in:
Wang Dequan
2026-08-20 06:17:39 +08:00
commit 2c814634c3
9429 changed files with 10556013 additions and 0 deletions

View File

@@ -0,0 +1 @@
A configuration for the Universal PWM COntroller board from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. The IO configuration in univpwm_io.hal does not include signal connections for other bridgeportio like signal handling. This version takes advantage of the new UPC feature of velocity estimation to provide smoother motion, especially the functioning of the D term of the PID component.

View File

@@ -0,0 +1,35 @@
loadrt mux4 count=1
loadrt ilowpass
loadrt encoder num_chan=1
setp ilowpass.0.scale 100
setp ilowpass.0.gain 0.01
addf mux4.0 servo-thread
addf ilowpass.0 servo-thread
addf encoder.update-counters servo-thread
addf encoder.capture-position servo-thread
net jog-x ppmc.0.din.06.in => joint.0.jog-enable
net jog-y ppmc.0.din.07.in => joint.1.jog-enable
net jog-z ppmc.0.din.08.in => joint.2.jog-enable
net x10 ppmc.0.din.09.in => mux4.0.sel0
net x100 ppmc.0.din.10.in => mux4.0.sel1
setp mux4.0.in1 .00000025
setp mux4.0.in0 .0000025
setp mux4.0.in2 .000025
setp mux4.0.in3 0
net jogscale mux4.0.out => joint.0.jog-scale
net jogscale => joint.1.jog-scale
net jogscale => joint.2.jog-scale
net mpg-a ppmc.0.din.04.in => encoder.0.phase-A
net mpg-b ppmc.0.din.05.in => encoder.0.phase-B
net mpg-out encoder.0.rawcounts => ilowpass.0.in
net jogcounts ilowpass.0.out => joint.0.jog-counts
net jogcounts => joint.1.jog-counts
net jogcounts => joint.2.jog-counts

View File

@@ -0,0 +1 @@
linksp SpindleRPM pyvcp.SpindleRPM

View File

@@ -0,0 +1,9 @@
<pyvcp>
<label>
<text>"Spindle Speed:"</text>
</label>
<bar>
<halpin>"SpindleRPM"</halpin>
<max_>5000</max_>
</bar>
</pyvcp>

View File

@@ -0,0 +1,252 @@
# EMC controller parameters for UPC with threading and pendant
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-UPC-Thread-Pendant
# Name of NML file to use, default is emc.nml
#NML_FILE = emc.nml
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0x00000001
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = doc/help.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
#spindle speed VCP
PYVCP = spindle.xml
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = univpwm.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Key for real OS shared memory, e.g., for simulated motion
SHMEM_KEY = 111
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Base task period, in nanoseconds - this is the fastest thread in the machine
BASE_PERIOD = 1000000
# Servo task period, in nanoseconds - will be rounded to an integer multiple
# of BASE_PERIOD
SERVO_PERIOD = 1000000
# Trajectory Planner task period, in nanoseconds - will be rounded to an
# integer multiple of SERVO_PERIOD
TRAJ_PERIOD = 10000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., bridgeporttask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = univpwm_load.hal
HALFILE = univpwm_servo.hal
HALFILE = univpwm_io.hal
HALFILE = univpwm_motion.hal
HALFILE = pendant.hal
POSTGUI_HALFILE = spindle.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z
HOME = 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.15
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 5.0
MAX_LINEAR_ACCELERATION = 5.0
PROBE_INDEX = 0
PROBE_POLARITY = 1
# Axes sections ---------------------------------------------------------------
# Important note about OUTPUT_SCALE and PWM_OUTPUT_SCALE
# For this configuration, OUTPUT_SCALE is not used, because
# EMC always overwrites it on shutdown. So PWM_OUTPUT_SCALE
# was added to hold the scaling. Someday the OUTPUT_SCALE
# issue may be fixed, and PWM_OUTPUT_SCALE will go away.
# Scaling: The PWM_OUTPUT_SCALE should be the speed
# in UNITS/second (inches/sec or mm/sec) that would be
# reached if the PWM duty cycle was 100%. It depends on
# the power supply voltage, motor RPM/Volt factor, and
# gearing/screw pitch. For example:
#
# Power supply voltage 50V
# Motor RPM/V 1000RPM/24V
# Gearing: 2 motor revs per 1 screw rev
# Screw pitch: 0.2" per turn
#
# Max motor speed = 50V * 1000RPM/24V = 2083 RPM
# Max screw speed = 2083RPM * 1(screw)/2(motor) = 1041RPM
# Max table speed = 1041RPM * 0.2"/turn = 208 in/min
# Max table speed = 208 in/min / 60 seconds = 3.47 inches/sec
#
# Since max speed is reached at 100% duty cycle, PWM_OUTPUT_SCALE
# should be 3.47
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = univpwm.tbl
# section for external NML server parameters ----------------------------------
[KINS]
KINEMATICS = trivkins
JOINTS = 3
[AXIS_X]
MIN_LIMIT = -12.0
MAX_LIMIT = 0.1
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 5.0
[JOINT_0]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 5.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = -128000
OUTPUT_SCALE = -1
MIN_LIMIT = -12.0
MAX_LIMIT = 0.1
FERROR = 0.1
MIN_FERROR = 1.0
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.5
HOME_LATCH_VEL = 0.1
HOME_USE_INDEX = YES
HOME_IGNORE_LIMITS = NO
DEADBAND = 2e-05
P = 1000
I = 2.5
D = 1
BIAS = 0
FF0 = 0
FF1 = 0.42
FF2 = 0.0125
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
[JOINT_1]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = -128000
OUTPUT_SCALE = -1
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.002
MIN_FERROR = 1.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 7e-06
P = 3000
I = 2.5
D = 40
BIAS = 0
FF0 = 0
FF1 = 0.6
FF2 = 0.001
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
[JOINT_2]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = 128000
OUTPUT_SCALE = 1
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.002
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000075
P = 1500
I = 10
D = 1.5
BIAS = 0
FF0 = 0
FF1 = 0.3
FF2 = 0.007
# section for main IO controller parameters -----------------------------------
[EMCSERVER]
# Uncomment the following line if you need to run a remote GUI.
# EMCSERVER = emcsvr

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,112 @@
# HAL config file for Pico Systems UPC board with threading
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
newsig Xminlim bit
newsig Xmaxlim bit
newsig Xhome bit
linksp Xminlim <= ppmc.0.din.01.in
linksp Xminlim => joint.0.neg-lim-sw-in
linksp Xmaxlim <= ppmc.0.din.02.in
linksp Xmaxlim => joint.0.pos-lim-sw-in
linksp Xhome <= ppmc.0.din.00.in
linksp Xhome => joint.0.home-sw-in
newsig Yminlim bit
newsig Ymaxlim bit
newsig Yhome bit
#linksp Yminlim <= ppmc.0.din.05.in
#linksp Yminlim => joint.1.neg-lim-sw-in
#linksp Ymaxlim <= ppmc.0.din.06.in
#linksp Ymaxlim => joint.1.pos-lim-sw-in
#linksp Yhome <= ppmc.0.din.04.in
#linksp Yhome => joint.1.home-sw-in
newsig Zminlim bit
newsig Zmaxlim bit
newsig Zhome bit
#linksp Zminlim <= ppmc.0.din.09.in
#linksp Zminlim => joint.2.neg-lim-sw-in
#linksp Zmaxlim <= ppmc.0.din.10.in
#linksp Zmaxlim => joint.2.pos-lim-sw-in
#linksp Zhome <= ppmc.0.din.08.in
#linksp Zhome => joint.2.home-sw-in
newsig Aminlim bit
newsig Amaxlim bit
newsig Ahome bit
linksp Aminlim <= ppmc.0.din.12.in
linksp Aminlim => joint.3.neg-lim-sw-in
linksp Amaxlim <= ppmc.0.din.13.in
linksp Amaxlim => joint.3.pos-lim-sw-in
linksp Ahome <= ppmc.0.din.11.in
linksp Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# do these when index pulsing is figured out
newsig Xindex bit
newsig Yindex bit
newsig Zindex bit
linksp Xindex <= ppmc.0.encoder.00.index-enable
linksp Xindex => joint.0.index-enable
linksp Yindex <= ppmc.0.encoder.01.index-enable
linksp Yindex => joint.1.index-enable
linksp Zindex <= ppmc.0.encoder.02.index-enable
linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and univpwm's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from univpwm from holding FF cleared
newsig ppmcEstop bit
linksp ppmcEstop ppmc.0.din.15.in-not
linksp ppmcEstop and2.0.in0
newsig EstopOkIn bit
linksp EstopOkIn estop-latch.0.fault-in
linksp EstopOkIn and2.0.out
newsig EstopOkOut bit
linksp EstopOkOut <= ppmc.0.dout.07.out
linksp EstopOkOut iocontrol.0.emc-enable-in
linksp EstopOkOut estop-latch.0.ok-out
linksp EstopOkOut and2.0.in1
newsig emc-estop-out bit
linksp emc-estop-out iocontrol.0.user-enable-out
linksp emc-estop-out estop-latch.0.ok-in
newsig emc-estop-reset bit
linksp emc-estop-reset iocontrol.0.user-request-enable
linksp emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
newsig SpindleFwd bit
newsig SpindleRev bit
linksp SpindleFwd <= ppmc.0.dout.00.out
linksp SpindleFwd => spindle.0.forward
linksp SpindleRev <= ppmc.0.dout.01.out
linksp SpindleRev => spindle.0.reverse
# connect spindle speed up/down to I/O controller
newsig SpindleUp bit
newsig SpindleDown bit
#linksp SpindleUp <= ppmc.0.dout.06.out
#linksp SpindleUp => motion.spindle-incr-speed
#linksp SpindleDown <= ppmc.0.dout.05.out
#linksp SpindleDown => motion.spindle-decr-speed
# connect spindle brake to I/O controller
newsig SpindleBrakeOn bit
linksp SpindleBrakeOn <= ppmc.0.dout.02.out
linksp SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
newsig MistOn bit
newsig FloodOn bit
linksp MistOn <= ppmc.0.dout.03.out
linksp MistOn => iocontrol.0.coolant-mist
linksp FloodOn <= ppmc.0.dout.04.out
linksp FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,58 @@
# loads all HAL modules for Universal PWM controller with threading
# this version activates velocity estimation in the PPMC driver
# with the timestamp=xx parameter in the loadrt line
# this will only work with rev 4 UPC firmware and EMC2.4.6 or later
# kinematics
loadrt [KINS]KINEMATICS
# 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]SERVO_PERIOD key=[EMCMOT]SHMEM_KEY
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install Universal PWM Controller driver
# port_addr is the address of the parallel port data register
# timestamp="0x00" turns on the timestamped encoder velocity feature
# on the first PWM controller board
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc port_addr="0x378" timestamp="0x00"
# load realtime portion of scope, just to have it handy
loadrt scope_rt
# make some signals for the scope for tuning.
loadrt ddt count=4
loadrt not count=1
loadrt estop_latch count=1
loadrt and2 count=1
loadrt or2 count=1
loadrt conv_s32_float count=1
loadrt mult2 count=2
loadrt lowpass count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
addf not.0 servo-thread
# then the PID loops
addf pid.0.do-pid-calcs servo-thread
addf pid.1.do-pid-calcs servo-thread
addf pid.2.do-pid-calcs servo-thread
addf pid.3.do-pid-calcs servo-thread
# for spindle
addf or2.0 servo-thread
addf conv-s32-float.0 servo-thread
addf mult2.0 servo-thread
addf mult2.1 servo-thread
addf lowpass.0 servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,99 @@
# HAL config file for Pico Systems UPC board using Velocity Estimation
#
# set the PWM frequency to suit Pico's PWM amps (50KHz)
# users with other amps may need to change this
setp ppmc.0.pwm.00-03.freq 50000
# turn on bootstrapping for the MOSFET drivers
# this also depends on the amplifiers
setp ppmc.0.pwm.00.bootstrap TRUE
setp ppmc.0.pwm.01.bootstrap TRUE
setp ppmc.0.pwm.02.bootstrap TRUE
setp ppmc.0.pwm.03.bootstrap TRUE
# set max duty cycle to 95% for the MOSFET drives
# at 50KHz this corresponds to 1 us
setp ppmc.0.pwm.00.max-dc 0.95
setp ppmc.0.pwm.01.max-dc 0.95
setp ppmc.0.pwm.02.max-dc 0.95
setp ppmc.0.pwm.03.max-dc 0.95
setp ppmc.0.encoder.00.min-speed-estimate 0.001
setp ppmc.0.encoder.01.min-speed-estimate 0.001
setp ppmc.0.encoder.02.min-speed-estimate 0.001
setp ppmc.0.encoder.03.min-speed-estimate 0.001
# Here's the part that connects the encoder velocity to the PID
net Xfbderiv ppmc.0.encoder.00.velocity pid.0.feedback-deriv
net Yfbderiv ppmc.0.encoder.01.velocity pid.1.feedback-deriv
net Zfbderiv ppmc.0.encoder.02.velocity pid.2.feedback-deriv
# connect position feedback signals to encoders
linksp Xpos-fb <= ppmc.0.encoder.00.position
linksp Ypos-fb <= ppmc.0.encoder.01.position
linksp Zpos-fb <= ppmc.0.encoder.02.position
#linksp Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale 6912
# connect PID output signals to PWM generators
linksp Xoutput => ppmc.0.pwm.00.value
linksp Youtput => ppmc.0.pwm.01.value
linksp Zoutput => ppmc.0.pwm.02.value
# connect axis enables to PWM generators
linksp Xenable => ppmc.0.pwm.00.enable
linksp Yenable => ppmc.0.pwm.01.enable
linksp Zenable => ppmc.0.pwm.02.enable
# set output scaling from ini file
setp ppmc.0.pwm.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.pwm.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.pwm.02.scale [JOINT_2]OUTPUT_SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
linkps ddt.0.in Xoutput
linkps ddt.1.in Xpos-fb
newsig spindle-sync bit
newsig spindle-index-en bit
linksp spindle-index-en => ppmc.0.encoder.03.index-enable
# hook up motion controller's sync output
linkps spindle.0.index-enable => spindle-index-en
# report rev count to motion controller
newsig spindle-pos float
linkps ppmc.0.encoder.03.position => spindle-pos
linksp spindle-pos => spindle.0.revs
# set up 4th PWM generator as a spindle speed control
newsig spindle-speed float
newsig spindle-pwm-cmd float
newsig spindle-pwm-filt float
linkps spindle.0.speed-out => spindle-speed
linksp spindle-speed => mult2.1.in0
setp mult2.1.in1 0.0009018
linkps mult2.1.out => spindle-pwm-cmd
linksp spindle-pwm-cmd => lowpass.0.in
linkps lowpass.0.out => spindle-pwm-filt
linksp spindle-pwm-filt => ppmc.0.pwm.03.value
setp lowpass.0.gain 0.005
newsig spindle-enable bit
# SpindleFwd and SpindleRev come from univpwm_io.hal
linksp SpindleFwd => or2.0.in0
linksp SpindleRev => or2.0.in1
linkps or2.0.out => spindle-enable
linksp spindle-enable ppmc.0.pwm.03.enable
# spindle speed display
net spinraw ppmc.0.encoder.03.delta conv-s32-float.0.in
net spinfloat conv-s32-float.0.out mult2.0.in0
setp mult2.0.in1 8.6805555
newsig SpindleRPM float
linkps mult2.0.out => SpindleRPM

View File

@@ -0,0 +1,90 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
newsig Xpos-fb float
newsig Ypos-fb float
newsig Zpos-fb float
# connect position feedback to PID loop
linksp Xpos-fb => pid.0.feedback
linksp Ypos-fb => pid.1.feedback
linksp Zpos-fb => pid.2.feedback
# connect position feedback to motion module
linksp Xpos-fb => joint.0.motor-pos-fb
linksp Ypos-fb => joint.1.motor-pos-fb
linksp Zpos-fb => joint.2.motor-pos-fb
# create PID to DAC output signals
newsig Xoutput float
newsig Youtput float
newsig Zoutput float
# connect output signals to output of PID loops
linksp Xoutput <= pid.0.output
linksp Youtput <= pid.1.output
linksp Zoutput <= pid.2.output
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
# set PID loop output limits to +/-1.00
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
# create four position command signals
newsig Xpos-cmd float
newsig Ypos-cmd float
newsig Zpos-cmd float
# connect position commands to motion controller
linksp Xpos-cmd <= joint.0.motor-pos-cmd
linksp Ypos-cmd <= joint.1.motor-pos-cmd
linksp Zpos-cmd <= joint.2.motor-pos-cmd
# connect position commands to PID input
linksp Xpos-cmd => pid.0.command
linksp Ypos-cmd => pid.1.command
linksp Zpos-cmd => pid.2.command
# create bit signals to enable/disable the PID loops
newsig Xenable bit
newsig Yenable bit
newsig Zenable bit
# connect the signals to the motion controller
linksp Xenable <= joint.0.amp-enable-out
linksp Yenable <= joint.1.amp-enable-out
linksp Zenable <= joint.2.amp-enable-out
# connect the signals to the PID blocks
linksp Xenable => pid.0.enable
linksp Yenable => pid.1.enable
linksp Zenable => pid.2.enable