Timed delay

More
21 Dec 2024 20:12 #317105 by Sternfox
Timed delay was created by Sternfox
Hi good folks :) 

I'm fairly new to linuxcnc, so please go easy on me lol.

I will try to explain what I need. It's not straight forward but im sure one of you geniuses will be able to help me out.

I have a haas mini mill, running linux cnc (probebasic), im 99% finished just the atc pneumatics to do. Now the haas mills have two solenoids to operate the drawbar.

 one opens and closes for 0.5 seconds first to pre charge the cylinder with 20psi. Like a soft push.

the second dose all the hard work and takes over immediately after the first and stays open untill the button is released.

how would this be accomplished?  I have found timedelay, but not sure how to implement it. 

I would also like to be able to control this action with a physical input button. 

I'm on latest linuxcnc using a mesa 7i95T.

Many thanks in advance.

Please Log in or Create an account to join the conversation.

More
21 Dec 2024 20:36 #317106 by PCW
Replied by PCW on topic Timed delay
I would do this with two components: a oneshot component and an and2 gate:

The oneshot would be set for 0.5 seconds and triggered by the drawbar signal.
The active high output of the oneshot would drive the low pressure solenoid
(so its driven for 0.5 seconds on the rising edge of the drawbar signal)

The high pressure solenoid would be driven by the output of the and2 gate
The and2 gate inputs would be the drawbar signal and the active-low output of the
oneshot. The active low oneshot output would disable the and2 output driving
the high pressure solenoid for the first 0.5 seconds when the low pressure solenoid
is activated.

 

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 01:09 #317253 by Sternfox
Replied by Sternfox on topic Timed delay
I did try one-shot but couldn't get it to work. So I then tried timedelay and nearly have it working

# Input and output configuration
net button-press <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3

# Load and configure timedelay
loadrt timedelay count=1
addf timedelay.0 servo-thread

setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay

# Timedelay connections
net button-press => timedelay.0.in # Link button-press signal to timedelay input
net relay-1-control <= timedelay.0.out # Link timedelay output to relay-1-control

# Direct button connection to second relay
net relay-2-control <= button-press # Relay 2 activates directly with button press

Problem I'm having is I'm getting the error pin button-press does not exist. Any ideas?

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 01:24 #317255 by PCW
Replied by PCW on topic Timed delay
The error is because button-press is a signal, not a pin
Looks like you need to delete one signal as you have two
with the same function:


# Input and output configuration
net relay-2-control <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3

# Load and configure timedelay
loadrt timedelay count=1
addf timedelay.0 servo-thread

setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay

# Timedelay connections
net relay-2-control => timedelay.0.in # Link button-press signal to timedelay input
net relay-1-control <= timedelay.0.out # Link timedelay output to relay-1-control

# Direct button connection to second relay
# Cant drive a signal from another signal:  net relay-2-control <= button-press # Relay 2 activates directly with button press

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 16:26 #317287 by Sternfox
Replied by Sternfox on topic Timed delay
Many thanks for your reply. So how would I make one button activate the two outputs with the delay of one second? I want when the input 05 is pressed relay one opens for 1 second. Once the relay closes after the one second, then relay 2 opens and stays open untill I release the button
I'm so lost with this

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 16:49 - 24 Dec 2024 18:41 #317288 by PCW
Replied by PCW on topic Timed delay
This may be closer to what you want:

# Input and output configuration
net button-press <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3

# Load and configure timedelay
loadrt timedelay count=1
addf timedelay.0 servo-thread

loadrt xor2
addf xor2.0  servo-thread

setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay

# Timedelay connections
net button-press => timedelay.0.in xor2.0.in0       # Link button-press to timedelay and logic
net relay-1-control <= timedelay.0.out  xor2.0.in1 # Link timedelay output to relay-1-control and logic
net relay-2-control <= xor2.0.out                           # Link xor out to relay-2-control
 
Last edit: 24 Dec 2024 18:41 by PCW.

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 18:25 #317291 by Sternfox
Replied by Sternfox on topic Timed delay
Thanks for the code, im getting this error on startup ./main.hal:239: Pin 'xor.0.in0' does not exist

here is my hal file

# This file was created with the Mesa Configuration Tool on Nov 26 2024 15:50:59
# If you make changes to this file DO NOT run the configuration tool again!
# This file will be replaced with a new file if you do!

# kinematics
loadrt [KINS](KINEMATICS)

# motion controller
loadrt [EMCMOT](EMCMOT) servo_period_nsec=[EMCMOT](SERVO_PERIOD) num_joints=[KINS]JOINTS num_dio=30 num_aio=30

# hostmot2 driver
loadrt hostmot2
loadrt [HM2](DRIVER) board_ip=[HM2](ADDRESS) config="sserial_port_0=00000000"
loadrt oneshot count=1

setp hm2_[MESA](BOARD).0.watchdog.timeout_ns 10000000
loadrt timedelay count=1
loadrt xor2
loadrt pid names=pid.x,pid.y,pid.z,pid.s



# PID Information for Stepper Boards
# Mesa hardware step generators at every servo thread invocation, the step
# generator hardware is given a new velocity. Without feedback from the PID
# controller the hardware position would slowly drift because of clock speed and
# timing differences between LinuxCNC and the step generator hardware.
# The PID controller gets feedback from the actual (fractional) step position and
# corrects for these small differences.

# THREADS
addf hm2_[MESA](BOARD).0.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.s.do-pid-calcs servo-thread
addf hm2_[MESA](BOARD).0.write servo-thread
addf timedelay.0 servo-thread
addf xor2.0 servo-thread



# DPLL TIMER
setp hm2_[MESA](BOARD).0.dpll.01.timer-us -50
setp hm2_[MESA](BOARD).0.stepgen.timer-number 1

# amp enable
#net motion-enable <= motion.motion-enabled => hm2_7i95.0.ssr.00.out-02

# Spindle Air Oil solenoid


# Board: 7i95

# Axis: X Joint: 0 Output: 0
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.x.maxerror [JOINT_0](MAX_ERROR)

# joint-0 enable chain
net joint-0-index-enable <=> pid.x.index-enable
net joint-0-index-enable <=> joint.0.index-enable

net joint-0-enable <= joint.0.amp-enable-out
net joint-0-enable => pid.x.enable

net joint-0-enable => hm2_[MESA](BOARD).0.stepgen.00.enable

# Joint 0 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.00.dirsetup [JOINT_0](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.00.dirhold [JOINT_0](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.00.steplen [JOINT_0](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.00.stepspace [JOINT_0](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.00.position-scale [JOINT_0](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.00.maxvel [JOINT_0](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.00.maxaccel [JOINT_0](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.00.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.00.control-type 1


# position command and feedback
net joint-0-pos-cmd <= joint.0.motor-pos-cmd
net joint-0-pos-cmd => pid.x.command

net joint-0-pos-fb <= hm2_[MESA](BOARD).0.stepgen.00.position-fb
net joint-0-pos-fb => joint.0.motor-pos-fb
net joint-0-pos-fb => pid.x.feedback

# PID Output
net joint.0.output <= pid.x.output
net joint.0.output => hm2_[MESA](BOARD).0.stepgen.00.velocity-cmd

# Axis: Y Joint: 1 Output: 1
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.y.maxerror [JOINT_1](MAX_ERROR)

# joint-1 enable chain
net joint-1-index-enable <=> pid.y.index-enable
net joint-1-index-enable <=> joint.1.index-enable

net joint-1-enable <= joint.1.amp-enable-out
net joint-1-enable => pid.y.enable

net joint-1-enable => hm2_[MESA](BOARD).0.stepgen.01.enable

# Joint 1 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.01.dirsetup [JOINT_1](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.01.dirhold [JOINT_1](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.01.steplen [JOINT_1](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.01.stepspace [JOINT_1](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.01.position-scale [JOINT_1](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.01.maxvel [JOINT_1](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.01.maxaccel [JOINT_1](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.01.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.01.control-type 1


# position command and feedback
net joint-1-pos-cmd <= joint.1.motor-pos-cmd
net joint-1-pos-cmd => pid.y.command

net joint-1-pos-fb <= hm2_[MESA](BOARD).0.stepgen.01.position-fb
net joint-1-pos-fb => joint.1.motor-pos-fb
net joint-1-pos-fb => pid.y.feedback

# PID Output
net joint.1.output <= pid.y.output
net joint.1.output => hm2_[MESA](BOARD).0.stepgen.01.velocity-cmd

# Axis: Z Joint: 2 Output: 2
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.z.maxerror [JOINT_2](MAX_ERROR)

# joint-2 enable chain
net joint-2-index-enable <=> pid.z.index-enable
net joint-2-index-enable <=> joint.2.index-enable

net joint-2-enable <= joint.2.amp-enable-out
net joint-2-enable => pid.z.enable

net joint-2-enable => hm2_[MESA](BOARD).0.stepgen.02.enable

# Joint 2 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.02.dirsetup [JOINT_2](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.02.dirhold [JOINT_2](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.02.steplen [JOINT_2](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.02.stepspace [JOINT_2](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.02.position-scale [JOINT_2](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.02.maxvel [JOINT_2](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.02.maxaccel [JOINT_2](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.02.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.02.control-type 1


# position command and feedback
net joint-2-pos-cmd <= joint.2.motor-pos-cmd
net joint-2-pos-cmd => pid.z.command

net joint-2-pos-fb <= hm2_[MESA](BOARD).0.stepgen.02.position-fb
net joint-2-pos-fb => joint.2.motor-pos-fb
net joint-2-pos-fb => pid.z.feedback

# PID Output
net joint.2.output <= pid.z.output
net joint.2.output => hm2_[MESA](BOARD).0.stepgen.02.velocity-cmd

# Manual Tool Change Dialog
loadusr -W hal_manualtoolchange
net tool-change-request => hal_manualtoolchange.change
net tool-change-confirmed <= hal_manualtoolchange.changed
net tool-number => hal_manualtoolchange.number

# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed

# # Load Classicladder without GUI
loadrt classicladder_rt
addf classicladder.0.refresh servo-thread 1

# E-Stop Chain
loadrt estop_latch count=1
addf estop-latch.0 servo-thread

# E-Stop Loop
net estop-loopin iocontrol.0.user-enable-out => estop-latch.0.ok-in
net estop-loopout estop-latch.0.ok-out => iocontrol.0.emc-enable-in

# E-Stop Reset
net estop-reset iocontrol.0.user-request-enable
net estop-reset => estop-latch.0.reset
net remote-estop0 estop-latch.0.fault-in <= hm2_7i95.0.inmux.00.input-01-not

# Input and output configuration
net button-press <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3

setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay

# Timedelay connections
net button-press => timedelay.0.in xor.0.in0 # Link button-press to timedelay and logic
net relay-1-control <= timedelay.0.out xor.0.in1 # Link timedelay output to relay-1-control and logic
net relay-2-control <= xor.0.out # Link xor out to relay-2-control


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

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

# Step Gen signals/setup

setp hm2_[MESA](BOARD).0.stepgen.03.dirsetup [SPINDLE_0]DIRSETUP
setp hm2_[MESA](BOARD).0.stepgen.03.dirhold [SPINDLE_0]DIRHOLD
setp hm2_[MESA](BOARD).0.stepgen.03.steplen [SPINDLE_0]STEPLEN
setp hm2_[MESA](BOARD).0.stepgen.03.stepspace [SPINDLE_0]STEPSPACE
setp hm2_[MESA](BOARD).0.stepgen.03.position-scale [SPINDLE_0]SCALE
setp hm2_[MESA](BOARD).0.stepgen.03.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.03.control-type 1
setp hm2_[MESA](BOARD).0.stepgen.03.maxaccel [SPINDLE_0]STEPGEN_MAX_ACC
setp hm2_[MESA](BOARD).0.stepgen.03.maxvel [SPINDLE_0]STEPGEN_MAX_VEL

net machine-is-on => hm2_[MESA](BOARD).0.stepgen.03.enable
net spindle-vel-cmd-rps => hm2_[MESA](BOARD).0.stepgen.03.velocity-cmd
net spindle-vel-fb-rps <= hm2_[MESA](BOARD).0.stepgen.03.velocity-fb

# ---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
net spindle-manual-cw halui.spindle.0.forward
net spindle-manual-ccw halui.spindle.0.reverse
net spindle-manual-stop halui.spindle.0.stop

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 18:41 #317293 by PCW
Replied by PCW on topic Timed delay
Sorry, all xor. should be xor2.

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 21:32 #317300 by Sternfox
Replied by Sternfox on topic Timed delay
Works perfectly! Thank you so much! Do you have a link to send a tip?

Please Log in or Create an account to join the conversation.

More
24 Dec 2024 22:28 #317307 by PCW
Replied by PCW on topic Timed delay
A good tip would be to help the next guy with a hal / LinuxCNC question.
 
The following user(s) said Thank You: Sternfox

Please Log in or Create an account to join the conversation.

Time to create page: 0.446 seconds
Powered by Kunena Forum