Rigid taping problem.

More
09 Mar 2015 07:12 #56559 by jbunch
Rigid taping problem. was created by jbunch
I have been playing with this for a while. When I try to rigid tap on my lathe the carrriage will move the tap into the part and the error with one of two outcomes. It will error with a "Z following error" at the depth of the tap. Or it will move the tap into the part about 1.5 times the depth of the part and then will move to home with uncontrolled motion at an angle. At no time does it try to reverse the spindle. I am not sure what to do. I am running 2.6.5 and gmoccapy I just upgraded a couple of days ago but I have had this problem from the begining.

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

More
09 Mar 2015 19:59 #56564 by ArcEye
Replied by ArcEye on topic Rigid taping problem.
Hi

Really need to know what code you are using and your encoder type and setup to have any chance someone can assist.

I am pretty sure Jon does a lot of rigid tapping, from something he mentioned, so someone should be able to help with enough info

regards

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

More
09 Mar 2015 23:51 - 10 Mar 2015 00:04 #56580 by jbunch
Replied by jbunch on topic Rigid taping problem.
I have included a clip from my hal and ini file. The control is on a lathe.
I am able to drill, turn, and single pont thread. Constant surface speed works.
My encoder is a omron with 500 counts per rev and index.
I have tested the index and after being set it clears at the same point every rev.

Mesa electroncs
1 - 7i33 analog control
2 - 7i37 general IO

HAL Clip:
# Generated by PNCconf at Fri Sep  2 04:29:39 2011
# If you make changes to this file, they will be
# overwritten when you run PNCconf again

loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hostmot2
loadrt hm2_pci config="firmware=hm2/5i20/SVST8_4.BIT num_encoders=5 num_pwmgens=4 num_stepgens=0"
    setp hm2_5i20.0.pwmgen.pwm_frequency 100000
    setp hm2_5i20.0.pwmgen.pdm_frequency 100000
    setp hm2_5i20.0.watchdog.timeout_ns 10000000
loadrt near

# ****************** Jog Pendant ******************
loadrt mux8 count=1
loadrt and2 count=16
loadrt or2 count=6
loadrt not count=2
loadrt mult2 count=1
loadrt xor2 count=2
loadrt toggle count=1
loadrt toggle2nist count=3

addf hm2_5i20.0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
loadrt pid num_chan=3
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 or2.0 servo-thread
addf or2.1 servo-thread
addf or2.2 servo-thread
addf or2.3 servo-thread
addf or2.4 servo-thread       # Transfer at speed bit to yam-postgui.hal
addf or2.5 servo-thread
addf and2.0 servo-thread      # Postgui jog
addf and2.1 servo-thread      # Postgui Jog
addf and2.2 servo-thread      # Postgui
addf and2.3 servo-thread      # Not Used
addf and2.4 servo-thread      # Interlock mode.is-idle and Cycle start button
addf and2.5 servo-thread      # Interlok Mode auto output pin to mode.is-auto
addf and2.6 servo-thread      # program.is-idle lockout
addf and2.7 servo-thread      # program.is-idle lockout
addf and2.8 servo-thread      # program.is-running run program lockout
addf and2.9 servo-thread      # program.is-running program is paused lockout
addf and2.10 servo-thread     # Cycle start Button
addf and2.11 servo-thread     # Program Paused
addf and2.12 servo-thread     # Spindle Near cmd
addf and2.13 servo-thread     # Program pause button
addf and2.14 servo-thread     # Program pause/resume button
addf and2.15 servo-thread     # spindle at Speed lock
addf mux8.0 servo-thread
addf not.0 servo-thread       # Invert mode.is-idle
addf not.1 servo-thread       # Invert program.is-running
addf xor2.0 servo-thread          # Foot Switch
addf xor2.1 servo-thread          # Foot Switch
addf mult2.0 servo-thread         # Spindle RPM
addf toggle.0 servo-thread
addf toggle2nist.0 servo-thread

alias pin    pid.0.Pgain         pid.x.Pgain
alias pin    pid.0.Igain         pid.x.Igain
alias pin    pid.0.Dgain         pid.x.Dgain
alias pin    pid.0.bias          pid.x.bias
alias pin    pid.0.FF0           pid.x.FF0
alias pin    pid.0.FF1           pid.x.FF1
alias pin    pid.0.FF2           pid.x.FF2
alias pin    pid.0.deadband      pid.x.deadband
alias pin    pid.0.maxoutput     pid.x.maxoutput
alias pin    pid.0.enable        pid.x.enable
alias pin    pid.0.command       pid.x.command
alias pin    pid.0.feedback      pid.x.feedback
alias pin    pid.0.output        pid.x.output
alias pin    pid.0.index-enable  pid.x.index-enable

alias pin    pid.1.Pgain         pid.z.Pgain
alias pin    pid.1.Igain         pid.z.Igain
alias pin    pid.1.Dgain         pid.z.Dgain
alias pin    pid.1.bias          pid.z.bias
alias pin    pid.1.FF0           pid.z.FF0
alias pin    pid.1.FF1           pid.z.FF1
alias pin    pid.1.FF2           pid.z.FF2
alias pin    pid.1.deadband      pid.z.deadband
alias pin    pid.1.maxoutput     pid.z.maxoutput
alias pin    pid.1.enable        pid.z.enable
alias pin    pid.1.command       pid.z.command
alias pin    pid.1.feedback      pid.z.feedback
alias pin    pid.1.output        pid.z.output
alias pin    pid.1.index-enable  pid.z.index-enable


addf near.0                   servo-thread
addf hm2_5i20.0.write         servo-thread
addf hm2_5i20.0.pet_watchdog  servo-thread

# external output signals



# external input signals


# --- HOME-X ---
net home-x     <=  hm2_5i20.0.gpio.030.in
# --- HOME-Z ---
net home-z     <=  hm2_5i20.0.gpio.031.in
# --- BOTH-X ---
net both-x     <=  hm2_5i20.0.gpio.028.in
# --- BOTH-Z ---
net both-z     <=  hm2_5i20.0.gpio.029.in
# --- ESTOP-EXT ---
net estop-ext     <=  hm2_5i20.0.gpio.048.in

#*******************
#  AXIS X
#*******************

    setp pid.x.Pgain     [AXIS_0]P
    setp pid.x.Igain     [AXIS_0]I
    setp pid.x.Dgain     [AXIS_0]D
    setp pid.x.bias      [AXIS_0]BIAS
    setp pid.x.FF0       [AXIS_0]FF0
    setp pid.x.FF1       [AXIS_0]FF1
    setp pid.x.FF2       [AXIS_0]FF2
    setp pid.x.deadband  [AXIS_0]DEADBAND
    setp pid.x.maxoutput [AXIS_0]MAX_OUTPUT
net x-index-enable  <=>  pid.x.index-enable


# PWM Generator signals/setup

    setp hm2_5i20.0.pwmgen.00.output-type 1
    setp hm2_5i20.0.pwmgen.00.scale  [AXIS_0]OUTPUT_SCALE
net xenable     => pid.x.enable
net xoutput     pid.x.output           => hm2_5i20.0.pwmgen.00.value
net xpos-cmd    axis.0.motor-pos-cmd   => pid.x.command
net xenable     axis.0.amp-enable-out  => hm2_5i20.0.pwmgen.00.enable

# ---Encoder feedback signals/setup---

    setp hm2_5i20.0.encoder.00.counter-mode 0
    setp hm2_5i20.0.encoder.00.filter 1
    setp hm2_5i20.0.encoder.00.index-invert 0
    setp hm2_5i20.0.encoder.00.index-mask 0
    setp hm2_5i20.0.encoder.00.index-mask-invert 0
    setp hm2_5i20.0.encoder.00.scale  [AXIS_0]INPUT_SCALE
net xpos-fb               <=  hm2_5i20.0.encoder.00.position
net xpos-fb               =>  pid.x.feedback
net xpos-fb               =>  axis.0.motor-pos-fb
net x-index-enable    axis.0.index-enable  <=>  hm2_5i20.0.encoder.00.index-enable

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

net home-x     =>  axis.0.home-sw-in
net both-x     =>  axis.0.neg-lim-sw-in
net both-x     =>  axis.0.pos-lim-sw-in

#*******************
#  AXIS Z
#*******************

    setp pid.z.Pgain     [AXIS_2]P
    setp pid.z.Igain     [AXIS_2]I
    setp pid.z.Dgain     [AXIS_2]D
    setp pid.z.bias      [AXIS_2]BIAS
    setp pid.z.FF0       [AXIS_2]FF0
    setp pid.z.FF1       [AXIS_2]FF1
    setp pid.z.FF2       [AXIS_2]FF2
    setp pid.z.deadband  [AXIS_2]DEADBAND
    setp pid.z.maxoutput [AXIS_2]MAX_OUTPUT
net z-index-enable  <=>  pid.z.index-enable

# PWM Generator signals/setup

    setp hm2_5i20.0.pwmgen.01.output-type 1
    setp hm2_5i20.0.pwmgen.01.scale  [AXIS_2]OUTPUT_SCALE
net zenable     => pid.z.enable
net zoutput     pid.z.output           => hm2_5i20.0.pwmgen.01.value
net zpos-cmd    axis.2.motor-pos-cmd   => pid.z.command
net zenable     axis.2.amp-enable-out  => hm2_5i20.0.pwmgen.01.enable

# ---Encoder feedback signals/setup---

    setp hm2_5i20.0.encoder.01.counter-mode 0
    setp hm2_5i20.0.encoder.01.filter 1
    setp hm2_5i20.0.encoder.01.index-invert 0
    setp hm2_5i20.0.encoder.01.index-mask 0
    setp hm2_5i20.0.encoder.01.index-mask-invert 0
    setp hm2_5i20.0.encoder.01.scale  [AXIS_2]INPUT_SCALE
net zpos-fb               <=  hm2_5i20.0.encoder.01.position
net zpos-fb               =>  pid.z.feedback
net zpos-fb               =>  axis.2.motor-pos-fb
net z-index-enable    axis.2.index-enable  <=>  hm2_5i20.0.encoder.01.index-enable

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

net home-z     =>  axis.2.home-sw-in
net both-z     =>  axis.2.neg-lim-sw-in
net both-z     =>  axis.2.pos-lim-sw-in

#*******************
#  SPINDLE S
#*******************

loadrt abs count=7
loadrt scale count=2
loadrt sum2 count=1
addf scale.0 servo-thread
addf scale.1 servo-thread    # Scale for To RPM
addf abs.0 servo-thread      # change RPM in yam-postgui.hal
addf abs.1 servo-thread      # Not used
addf abs.2 servo-thread      # spindle speed PID output correction
addf abs.3 servo-thread      # not used
addf abs.4 servo-thread      # Not used
addf abs.5 servo-thread      # Not Used
addf abs.6 servo-thread      # Not Used
addf sum2.0 servo-thread

# Encoder
setp hm2_5i20.0.encoder.02.counter-mode 0
setp hm2_5i20.0.encoder.02.filter 0
setp hm2_5i20.0.encoder.02.index-invert 0
setp hm2_5i20.0.encoder.02.index-mask 0
setp hm2_5i20.0.encoder.02.index-mask-invert 0
setp hm2_5i20.0.encoder.02.scale 2000

net spindle-index-enable motion.spindle-index-enable <=> hm2_5i20.0.encoder.02.index-enable
net spindle-revs motion.spindle-revs <=  hm2_5i20.0.encoder.02.position
net spindle-velocity motion.spindle-speed-in near.0.in1 scale.1.in <= hm2_5i20.0.encoder.02.velocity

# ---setup spindle control signals---

net spindle-enable         <=  motion.spindle-on
net spindle-cw             <=  motion.spindle-forward
net spindle-ccw            <=  motion.spindle-reverse
net spindle-brake          <=  motion.spindle-brake
net spindle-speed-out abs.2.in <=  motion.spindle-speed-out


# Change velocity to RPM Output in yam-postgui.hal
setp scale.1.gain 60

# *** Spindle speed control
# PWM Generator signals/setup

setp scale.0.offset 0.0
#setp scale.0.gain 0.0005405
setp scale.0.gain 0.000359702
setp hm2_5i20.0.pwmgen.02.output-type 1
net spindle-enable  => hm2_5i20.0.pwmgen.02.enable
net spindle-enable  => and2.15.in1
net spindle-rpm-cmd scale.0.in <= abs.2.out
net spin-lim-out scale.0.out => hm2_5i20.0.pwmgen.02.value
net spindle-rpm => abs.1.in
net spindle-speed-abs <= abs.1.out

# *** spindle at speed
setp near.0.difference 0.6
net com-spindle-vel near.0.in2 <= motion.spindle-speed-out-rps
net spindle-at-speed motion.spindle-at-speed and2.15.in0 <= near.0.out

# Spindle forward and reverse
net spindle-fwd hm2_5i20.0.gpio.040.out <= halui.spindle.runs-forward
net spindle-bkwd hm2_5i20.0.gpio.042.out <= halui.spindle.runs-backward


#******* Cycle Start feed Hold section ****************
#******** Cycle start and resume

net push_cycle_start and2.4.in1 and2.5.in1 <= hm2_5i20.0.gpio.060.in_not
net auto_mode_is_set and2.4.in0 not.0.in <= halui.mode.is-auto
net invert_auto_mode and2.5.in0 <= not.0.out
net sel_auto_mode halui.mode.auto <= and2.5.out
net interlock_auto_mode and2.6.in0 and2.7.in0 <= and2.4.out
net pgm_is_idle and2.6.in1 <= halui.program.is-idle
net pgm_is_paused and2.7.in1  <= halui.program.is-paused
net pgm_is_running_invert not.1.in <= halui.program.is-running
net pgm_is_running and2.8.in0 and2.9.in0 <= not.1.out
net pgm_idle_interlock and2.8.in1 <= and2.6.out
net pgm_paused_interlock and2.9.in1 <= and2.7.out
net start_run_pgm halui.program.run <= and2.8.out
net Resume_running_pgm halui.program.resume <= and2.9.out

#******** End Cycle Start and resume
#******** pause program/ stop program

net pgm_pause halui.program.pause <= hm2_5i20.0.gpio.059.in_not


INI Clip:
#   nom2       -- no m2 terminator (use %)
 NGCGUI_PREAMBLE   = lathe_std.ngc
 NGCGUI_SUBFILE    = turn-od.ngc
 NGCGUI_SUBFILE    = bore-id.ngc
 NGCGUI_SUBFILE    = face-part.ngc
 NGCGUI_SUBFILE    = face.ngc
 NGCGUI_SUBFILE    = drill.ngc
 NGCGUI_SUBFILE    = thread.ngc
 NGCGUI_SUBFILE    = tap.ngc

EMBED_TAB_NAME = Functions
EMBED_TAB_LOCATION = ntb_preview
#alternate: EMBED_TAB_LOCATION = ntb_user_tabs
#this demo requires a parallel ngcgui dir
#EMBED_TAB_COMMAND = gladevcp -x {XID} pyngcgui_popupkeyboard.ui
EMBED_TAB_COMMAND = gladevcp -x {XID} pyngcgui.ui

#EMBED_TAB_NAME = Gremlinview
#EMBED_TAB_LOCATION = ntb_preview
# alternate: EMBED_TAB_LOCATION = ntb_user_tabs
# this demo requires a parallel ngcgui dir
#EMBED_TAB_COMMAND = gladevcp -x {XID} gremlin_view.ui

# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/

[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python

# Task controller section -----------------------------------------------------
[TASK]
TASK = milltask
CYCLE_TIME = 0.010

# Part program interpreter section --------------------------------------------
[RS274NGC]
#RS274NGC_STARTUP_CODE = G17 G20 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
RS274NGC_STARTUP_CODE = G18 G20 G40 G43 G54 G64P0.005 G80 G90 G94 G97 M5 M9
PARAMETER_FILE = emc.var
SUBROUTINE_PATH = ../../nc_files/ngcgui_files:../../nc_files/subroutines:../../nc_files/ngcgui_lib:../../nc_files/ngcgui_lib/utilitysubs
# USER_M_PATH     = ../../nc_files/ngcgui_lib/mfiles

#  SUBROUTINE_PATH = /home/jimbo/linuxcnc/nc_files/ngcgui_files
USER_M_PATH = ../../../nc_files

# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
SERVO_PERIOD = 1000000

# [HOSTMOT2]
# This is for info only
# DRIVER0=hm2_pci
# BOARD0=5i20
# CONFIG0="firmware=hm2/5i20/SVST8_4.BIT num_encoders=4 num_pwmgens=4 num_stepgens=0"

[HAL]
HALUI = halui
HALFILE = yam-lathe.hal
POSTGUI_HALFILE = yam-postgui.hal
SHUTDOWN = shutdown.hal

[HALUI]

[TRAJ]
AXES = 3
COORDINATES = X Z
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 0.4
MAX_VELOCITY = 7
MAX_LINEAR_VELOCITY = 1.67
POSITION_FILE = position.txt

[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl
TOOLCHANGE_QUILL_UP = 1

#********************
# Axis X
#********************
[AXIS_0]
TYPE = LINEAR
HOME = -.125
FERROR = 0.015
MIN_FERROR = 0.0020
MAX_VELOCITY = 3.5
MAX_ACCELERATION = 3.5
P = 17.3
I = 0.0
D = 0.003
FF0 = 0.000
FF1 = 0.07039
FF2 = 0.000106
BIAS = 0.0
DEADBAND = 0.0
OUTPUT_SCALE = -1.0
OUTPUT_OFFSET = 0.0
MAX_OUTPUT = 10.0
#INPUT_SCALE = 50900
INPUT_SCALE = 12700.0
MIN_LIMIT = -5.625
MAX_LIMIT = .125
HOME_OFFSET = 0.000
HOME_SEARCH_VEL = .500
HOME_LATCH_VEL = .050
HOME_FINAL_VEL = .700
HOME_USE_INDEX = NO
HOME_SEQUENCE = 0

#********************
# Axis Z
#********************
[AXIS_2]
TYPE = LINEAR
HOME = .0625
FERROR = 0.015
MIN_FERROR = 0.002
MAX_VELOCITY = 4
MAX_ACCELERATION = 3.5
P = 24
I = 0.0
D = 0.05
FF0 = 0.0
FF1 = 0.1039
FF2 = 0.00206
BIAS = 0.0
DEADBAND = 0.0
OUTPUT_SCALE = -1.0
OUTPUT_OFFSET = 0.0
MAX_OUTPUT = 10.0
INPUT_SCALE = 12700.0
MIN_LIMIT = -13.1201
MAX_LIMIT = .0599
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = .500
HOME_LATCH_VEL = .050
HOME_FINAL_VEL = 1.000
HOME_USE_INDEX = NO
HOME_SEQUENCE = 1

#********************
# Spindle
#********************
[SPINDLE_1]
P = 00.0
I = 0.0
D = 0.0
FF0 = 0.0
FF1 = 0.0
FF2 = 0.000

Thank you
Jim
Last edit: 10 Mar 2015 00:04 by jbunch.

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

More
10 Mar 2015 00:17 #56590 by ArcEye
Replied by ArcEye on topic Rigid taping problem.
I assume you are using tap.ngc through a ngcgui panel?

What does it contain?

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

More
10 Mar 2015 01:51 - 10 Mar 2015 01:52 #56591 by jbunch
Replied by jbunch on topic Rigid taping problem.
ArcEye,

here is the tap.ngc file:

jimbo@jimbo-lathe:~/linuxcnc/nc_files/ngcgui_files$ more tap.ngc
(info: Rigid Tapping)

o<tap>sub
#<thread-type> = #1 (=0 0=TPI 1=MM)
#<thread> = #2 (TPI/Pitch)
#<Z_Start> = #3 (=0.100 Z Clearance)
#<T_Depth> = #4 (Thread Depth)
#<RPM> = #5 (Spindle RPM)
#<ToolNumber> = #6 (Tool Number)
#<Coolant> = #7 (=8 Coolant 8 On 9 Off)

G7 G18 G20 G40 G80
T#<ToolNumber> M6 G43

o110 if [#<thread-type> EQ 0]
  #<pitch> = [1 / #<thread>]
  G20
o110 else
  #<pitch> = #<thread>
  G21
o110 endif


; Tap the Hole
o120 if [#<thread-type> EQ 0 OR #<thread-type> EQ 1]
  S#<RPM> M3 M#<Coolant>
  G90
  G0 X0.000 Z#<Z_Start>
  G33.1 X0.000 Z#<T_Depth> K#<pitch>
  M5 M9
  G53 G0 X0 Z0
o120 else
  (msg, you dufus you didn't use a proper thread type)
o120 endif

; Restore to normal units
G20
o<tap>endsub

Here is the preamble file:
jimbo@jimbo-lathe:~/linuxcnc/nc_files/ngcgui_files$ more lathe_std.ngc
(not_a_subfile)

g18 (xz plane)
g20 (inches)
g40 (cancel cutter radius compensation)
g49 (cancel tool lengthoffset)
g90 (absolute distance mode)
g94 (units/min feedrate)
g54 (Coordinate system 1 default)

#<tol>  = 0.001
g64 p#<tol> (path control stop)

Thank You
Jim
Last edit: 10 Mar 2015 01:52 by jbunch.

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

More
10 Mar 2015 18:11 #56613 by ArcEye
Replied by ArcEye on topic Rigid taping problem.
Hi

I cannot see anything obviously wrong with the code.

It is not possible to tell from the hal file how the encoder is connected to the 5i20, but assuming it has an A and B pulse plus Z index connected? it should work.

Hopefully someone with a working config tapping on a lathe will chime in

regards

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

More
10 Mar 2015 20:50 #56620 by andypugh
Replied by andypugh on topic Rigid taping problem.

# Spindle forward and reverse
net spindle-fwd hm2_5i20.0.gpio.040.out <= halui.spindle.runs-forward
net spindle-bkwd hm2_5i20.0.gpio.042.out <= halui.spindle.runs-backward


I think the problem might be here. Instead of using the halui pins (which might well be status pins) you probably want to use the motion.spindle-forward and motion.spindle-reverse pins.

Alternatively you can use the is-postive and is-negative pins of the abs function.

Also note that there are 4 different spindle speeds that you can use, absolute and signed, and both rpm and rps versions, depending on which is most convenient. You appear to use at least two of these for different things, which is fine, but it might be neater to link only one to a signal and re-use the signal.

I also see:
alias pin    pid.0.Pgain         pid.x.Pgain
alias pin    pid.0.Igain         pid.x.Igain
alias pin    pid.0.Dgain         pid.x.Dgain
alias pin    pid.0.bias          pid.x.bias
alias pin    pid.0.FF0           pid.x.FF0
alias pin    pid.0.FF1           pid.x.FF1
alias pin    pid.0.FF2           pid.x.FF2
...
Which could be avoided by using
loadrt pid names=pid.x,pid.y,pid.z
The following user(s) said Thank You: ArcEye, jbunch

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

More
10 Mar 2015 20:53 #56621 by jbunch
Replied by jbunch on topic Rigid taping problem.
Archeye,


One last thing. It is a back tool lathe.


Thanks again for looking.
Jim

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

More
10 Mar 2015 22:33 #56630 by jbunch
Replied by jbunch on topic Rigid taping problem.
Andy,

Thank you that has resolved the problem.


Jim

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

Time to create page: 0.106 seconds
Powered by Kunena Forum