Skip to content

Commit

Permalink
qtplasmac: improve powermax comms error checking
Browse files Browse the repository at this point in the history
g-code filter fix cut recovery bug
g-code filter add more illegal character checks
update example wrenches
  • Loading branch information
phillc54 committed Dec 8, 2021
1 parent 07f8e0a commit ecfda60
Show file tree
Hide file tree
Showing 5 changed files with 297 additions and 303 deletions.
56 changes: 32 additions & 24 deletions nc_files/plasmac/imperial_wrench.ngc
Original file line number Diff line number Diff line change
@@ -1,29 +1,37 @@
;wrench with offsets
;wrench

#<x_offset> = 0
#<y_offset> = 0
#<holes> = 4

G20
G64 P0.004
G64 P0.002
M52 P1
F#<_hal[plasmac.cut-feed-rate]> ; feed rate from cut parameters

g0 x[0.1543+#<x_offset>]y[0.2436+#<y_offset>]
m3$0s1 (select plasma torch)
g1 y[0.5393+#<y_offset>]
g1 x[0.8236+#<x_offset>]
g3 y[1.6220+#<y_offset>] i-0.3221 j0.5413
g1 x[0.1543+#<x_offset>]
g1 y[1.7208+#<y_offset>]
g2 x[0.1929+#<x_offset>] y[1.8081+#<y_offset>] i0.1181 j-0.0000
g2 x[1.6562+#<x_offset>] y[1.6535+#<y_offset>] i0.6627 j-0.7298
g3 x[2.2390+#<x_offset>] y[1.3956+#<y_offset>] i0.5795 j0.5223
g1 x[5.7629+#<x_offset>] y[1.3169+#<y_offset>]
g2 y[0.8444+#<y_offset>] i0.0000 j-0.2362
g1 x[2.2390+#<x_offset>] y[0.7657+#<y_offset>]
g3 x[1.6562+#<x_offset>] y[0.5078+#<y_offset>] i0.0000 j-0.7874
g2 x[0.1929+#<x_offset>] y[0.3532+#<y_offset>] i-0.8000 j0.5692
g2 x[0.1543+#<x_offset>] y[0.4405+#<y_offset>] i0.0650 j0.0809
m5
g0 x0.0000 y0.0000
m2
F#<_hal[plasmac.cut-feed-rate]>

; THE HOLE
G0 X5.8952 Y1.0807
M3 $0 S1 (PLASMA TORCH ON)
G3 X5.8952 Y1.0807 I-0.0787 J0
M5 $0 (TORCH OFF)

; THE WRENCH
G0 X0.1937 Y1.5240
M3$0S1 (PLASMA TORCH ON)
G1 X0.1937 Y1.7208
G2 X0.2323 Y1.8082 I0.1181 J-0.0000
G2 X1.6956 Y1.6535 I0.6627 J-0.7298
G3 X2.2783 Y1.3956 I0.5795 J0.5223
G1 X5.8165 Y1.3169
G2 X5.8165 Y0.8444 I0.0000 J-0.2362
G1 X2.2783 Y0.7657
G3 X1.6955 Y0.5078 I0.0000 J-0.7874
G2 X0.2322 Y0.3532 I-0.800 J0.5692
G2 X0.1937 Y0.4405 I0.0650 J0.0809
G1 X0.1937 Y0.5393
G1 X0.8629 Y0.5393
G3 X0.8629 Y1.6220 I-0.3221 J0.5413
G1 X0.1937 Y1.6220
M5 $0 (TORCH OFF)

G0 X0 Y0
M2
56 changes: 32 additions & 24 deletions nc_files/plasmac/metric_wrench.ngc
Original file line number Diff line number Diff line change
@@ -1,29 +1,37 @@
;wrench with offsets
;wrench

#<x_offset> = 0
#<y_offset> = 0
#<holes> = 4

G21
G64 P0.1
G64 P0.05
M52 P1
F#<_hal[plasmac.cut-feed-rate]> ; feed rate from cut parameters

g0 x[3.920+#<x_offset>]y[6.189+#<y_offset>]
m3$0s1 (select plasma torch)
g1 y[13.700+#<y_offset>]
g1 x[20.920+#<x_offset>]
g3 y[41.200+#<y_offset>] i-8.182 j13.750
g1 x[3.920+#<x_offset>]
g1 y[43.710+#<y_offset>]
g2 x[4.900+#<x_offset>] y[45.928+#<y_offset>] i3.000 j-0.000
g2 x[42.068+#<x_offset>] y[42.000+#<y_offset>] i16.833 j-18.538
g3 x[56.871+#<x_offset>] y[35.450+#<y_offset>] i14.721 j13.267
g1 x[146.739+#<x_offset>] y[33.450+#<y_offset>]
g2 y[21.450+#<y_offset>] i0.000 j-6.000
g1 x[56.871+#<x_offset>] y[19.450+#<y_offset>]
g3 x[42.068+#<x_offset>] y[12.900+#<y_offset>] i0.000 j-20.000
g2 x[4.900+#<x_offset>] y[8.972+#<y_offset>] i-20.320 j14.460
g2 x[3.920+#<x_offset>] y[11.189+#<y_offset>] i1.653 j2.055
m5
g0 x0.000 y0.000
m2
F#<_hal[plasmac.cut-feed-rate]>

; THE HOLE
G0 X149.739 Y27.45
M3 $0 S1 (PLASMA TORCH ON)
G3 X149.739 Y27.45 I-2 J0
M5 $0 (TORCH OFF)

; THE WRENCH
G0 X4.920 Y38.710
M3$0S1 (PLASMA TORCH ON)
G1 X4.920 Y43.710
G2 X5.900 Y45.928 I3 J-0
G2 X43.068 Y42 I16.833 J-18.538
G3 X57.871 Y35.45 I14.721 J13.267
G1 X147.739 Y33.45
G2 X147.739 Y21.45 I0 J-6
G1 X57.871 Y19.45
G3 X43.068 Y12.9 I0 J-20
G2 X5.9 Y8.972 I-20.32 J14.46
G2 X4.92 Y11.189 I1.653 J2.055
G1 X4.92 Y13.7
G1 X21.92 Y13.70
G3 X21.92 Y41.2 I-8.182 J13.75
G1 X4.92 Y41.2
M5 $0 (TORCH OFF)

G0 X0 Y0
M2
176 changes: 79 additions & 97 deletions share/qtvcp/screens/qtplasmac/qtplasmac_handler.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION = '1.220.139'
VERSION = '1.220.140'

'''
qtplasmac_handler.py
Expand All @@ -25,6 +25,7 @@
from shutil import copy as COPY
from shutil import move as MOVE
from subprocess import Popen, PIPE
from subprocess import run as RUN
from subprocess import call as CALL
from subprocess import check_output as CHKOP
from importlib import reload
Expand Down Expand Up @@ -303,9 +304,6 @@ def initialized__(self):
self.set_buttons_state([self.estopOnList], True)
self.check_material_file()
self.load_materials()
self.pmx485_check()
# if self.firstRun is True:
# self.firstRun = False
self.offset_peripherals()
self.set_probe_offset_pins()
self.wcs_rotation('get')
Expand Down Expand Up @@ -344,10 +342,18 @@ def initialized__(self):
self.startupTimer.setSingleShot(True)
self.set_color_styles()
self.autorepeat_keys(False)
# only set hal pins after initialized__ has begun
# set hal pins only after initialized__ has begun
# some locales won't set pins before this phase
self.thcFeedRatePin.set(self.thcFeedRate)
self.startupTimer.start(250)
if self.iniFile.find('QTPLASMAC', 'PM_PORT'):
self.pmx485_startup(self.iniFile.find('QTPLASMAC', 'PM_PORT'))
else:
self.w.gas_pressure.hide()
self.w.gas_pressure_label.hide()
self.w.cut_mode.hide()
self.w.cut_mode_label.hide()
self.w.pmx485_frame.hide()
if self.firstRun is True:
self.firstRun = False

Expand Down Expand Up @@ -4477,105 +4483,72 @@ def statistics_init(self):
#########################################################################################################################
# POWERMAX COMMUNICATIONS FUNCTIONS #
#########################################################################################################################
def pmx485_timeout(self):
self.pmx485CommsTimer.stop()
self.w.pmx485_label.setText(_translate('HandlerClass', 'COMMS ERROR'))
self.pmx485LabelState = None
self.w.pmx_stats_frame.hide()
self.pmx485CommsError = True
self.pmx485Connected = False
self.pmx485RetryTimer.start(3000)

def pmx485_check(self):
if self.iniFile.find('QTPLASMAC', 'PM_PORT'):
self.pmx485Exists = True
self.pmx485CommsError = False
if not hal.component_exists('pmx485'):
head = _translate('HandlerClass', 'COMMS ERROR')
msg0 = _translate('HandlerClass', 'PMX485 component is not loaded,')
msg1 = _translate('HandlerClass', 'Powermax communications are not available')
STATUS.emit('error', linuxcnc.OPERATOR_ERROR, '{}:\n{}\n{}\n'.format(head, msg0, msg1))
return
self.w.pmx485Status = False
self.w.pmx485_enable.stateChanged.connect(lambda w:self.pmx485_enable_changed(self.w.pmx485_enable.isChecked()))
self.pmx485StatusPin.value_changed.connect(lambda w:self.pmx485_status_changed(w))
self.pmx485ModePin.value_changed.connect(self.pmx485_mode_changed)
self.pmx485FaultPin.value_changed.connect(lambda w:self.pmx485_fault_changed(w))
self.pmx485ArcTimePin.value_changed.connect(lambda w:self.pmx485_arc_time_changed(w))
self.w.gas_pressure.valueChanged.connect(self.pmx485_pressure_changed)
self.w.mesh_enable.stateChanged.connect(lambda w:self.pmx485_mesh_enable_changed(self.w.mesh_enable.isChecked()))
self.pins485Comp = ['pmx485.enable', 'pmx485.status', 'pmx485.fault', \
'pmx485.mode_set', 'pmx485.mode', \
'pmx485.current_set', 'pmx485.current', 'pmx485.current_min', 'pmx485.current_max', \
'pmx485.pressure_set', 'pmx485.pressure', 'pmx485.pressure_min', 'pmx485.pressure_max', 'pmx485.arcTime']
pinsSelf = ['pmx485_enable', 'pmx485_status', 'pmx485_fault', \
'cut_mode-f', 'pmx485_mode', \
'cut_amps-f', 'pmx485_current', 'pmx485_current_min', 'pmx485_current_max', \
'gas_pressure-f', 'pmx485_pressure', 'pmx485_pressure_min', 'pmx485_pressure_max', 'pmx485_arc_time']
pinType = [hal.HAL_BIT, hal.HAL_BIT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT]
for pin in self.pins485Comp:
hal.new_sig('plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')), pinType[self.pins485Comp.index(pin)])
hal.connect(pin,'plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')))
hal.connect('qtplasmac.{}'.format(pinsSelf[self.pins485Comp.index(pin)]),'plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')))
self.pressure = self.w.gas_pressure.value()
self.pmx485CommsTimer = QTimer()
self.pmx485CommsTimer.timeout.connect(self.pmx485_timeout)
self.pmx485RetryTimer = QTimer()
self.pmx485RetryTimer.timeout.connect(lambda:self.pmx485_enable_changed(True))
self.meshMode = False
self.oldCutMode = self.w.cut_mode.value()
self.pmx485_mesh_enable_changed(self.w.mesh_enable.isChecked())
self.w.cut_amps.setToolTip(_translate('HandlerClass', 'Powermax cutting current'))
self.w.pmx485_enable.setChecked(True)
else:
if hal.component_exists('pmx485'):
Popen('halcmd unloadusr pmx485', stdout = PIPE, shell = True)
head = _translate('HandlerClass', 'INI FILE ERROR')
msg0 = _translate('HandlerClass', 'Powermax comms not specified in ini file,')
msg1 = _translate('HandlerClass', 'unloading pmx485 component')
STATUS.emit('error', linuxcnc.OPERATOR_ERROR, '{}:\n{}\n{}\n'.format(head, msg0, msg1))
self.w.gas_pressure.hide()
self.w.gas_pressure_label.hide()
self.w.cut_mode.hide()
self.w.cut_mode_label.hide()
self.w.pmx485_frame.hide()
def pmx485_startup(self, port):
self.pmx485CommsError = False
self.w.pmx485Status = False
self.meshMode = False
self.w.pmx485_enable.stateChanged.connect(lambda w:self.pmx485_enable_changed(self.w.pmx485_enable.isChecked()))
self.pmx485StatusPin.value_changed.connect(lambda w:self.pmx485_status_changed(w))
self.pmx485ModePin.value_changed.connect(self.pmx485_mode_changed)
self.pmx485FaultPin.value_changed.connect(lambda w:self.pmx485_fault_changed(w))
self.pmx485ArcTimePin.value_changed.connect(lambda w:self.pmx485_arc_time_changed(w))
self.w.gas_pressure.valueChanged.connect(self.pmx485_pressure_changed)
self.w.mesh_enable.stateChanged.connect(lambda w:self.pmx485_mesh_enable_changed(self.w.mesh_enable.isChecked()))
self.pmx485CommsTimer = QTimer()
self.pmx485CommsTimer.timeout.connect(self.pmx485_timeout)
self.pmx485RetryTimer = QTimer()
self.pmx485RetryTimer.timeout.connect(lambda:self.pmx485_enable_changed(True))
self.oldCutMode = self.w.cut_mode.value()
self.pressure = self.w.gas_pressure.value()
if self.pmx485_load(port):
return
self.pmx485Exists = True
self.pmx485_setup()
self.w.pmx485_enable.setChecked(True)

def pmx485_load(self, port):
head = _translate('HandlerClass', 'COMMS ERROR')
msg0 = _translate('HandlerClass', 'PMX485 component is not able to be loaded,')
msg1 = _translate('HandlerClass', 'Powermax communications are not available')
err = '{}:\n{}\n{}\n'.format(head, msg0, msg1)
count = 0
while not hal.component_exists('pmx485'):
if count >= 3:
STATUS.emit('error', linuxcnc.OPERATOR_ERROR, err)
return 1
RUN(['halcmd', 'loadusr', '-Wn', 'pmx485', 'pmx485', '{}'.format(port)])
count += 1
return 0

def pmx485_setup(self):
self.pins485Comp = ['pmx485.enable', 'pmx485.status', 'pmx485.fault', \
'pmx485.mode_set', 'pmx485.mode', \
'pmx485.current_set', 'pmx485.current', 'pmx485.current_min', 'pmx485.current_max', \
'pmx485.pressure_set', 'pmx485.pressure', 'pmx485.pressure_min', 'pmx485.pressure_max', 'pmx485.arcTime']
pinsSelf = ['pmx485_enable', 'pmx485_status', 'pmx485_fault', \
'cut_mode-f', 'pmx485_mode', \
'cut_amps-f', 'pmx485_current', 'pmx485_current_min', 'pmx485_current_max', \
'gas_pressure-f', 'pmx485_pressure', 'pmx485_pressure_min', 'pmx485_pressure_max', 'pmx485_arc_time']
pinType = [hal.HAL_BIT, hal.HAL_BIT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, \
hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT, hal.HAL_FLOAT]
for pin in self.pins485Comp:
hal.new_sig('plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')), pinType[self.pins485Comp.index(pin)])
hal.connect(pin,'plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')))
hal.connect('qtplasmac.{}'.format(pinsSelf[self.pins485Comp.index(pin)]),'plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')))
self.pmx485_mesh_enable_changed(self.w.mesh_enable.isChecked())
self.w.cut_amps.setToolTip(_translate('HandlerClass', 'Powermax cutting current'))

def pmx485_enable_changed(self, state):
if state:
self.pmx485CommsError = False
self.pmx485RetryTimer.stop()
# if component not loaded then load it and wait 3 secs for it to be loaded
if not hal.component_exists('pmx485'):
head = _translate('HandlerClass', 'COMMS ERROR')
port = self.iniFile.find('QTPLASMAC', 'PM_PORT')
try:
Popen('halcmd loadusr -Wn pmx485 pmx485 {}'.format(port), stdout = PIPE, shell = True)
timeout = time.time() + 3
while 1:
time.sleep(0.1)
if time.time() > timeout:
self.w.pmx485_enable.setChecked(False)
self.w.pmx485_label.setText('')
self.pmx485LabelState = None
self.w.pmx485_label.setToolTip(_translate('HandlerClass', 'Status of PMX485 communications'))
msg0 = _translate('HandlerClass', 'Timeout while reconnecting,')
msg1 = _translate('HandlerClass', 'check cables and connections then re-enable')
STATUS.emit('error', linuxcnc.OPERATOR_ERROR, '{}:\n{}\n{}\n'.format(head, msg0, msg1))
return
if hal.component_exists('pmx485'):
break
except:
msg0 = _translate('HandlerClass', 'PMX485 component is not loaded,')
msg1 = _translate('HandlerClass', 'Powermax communications are not available')
STATUS.emit('error', linuxcnc.OPERATOR_ERROR, '{}:\n{}\n{}\n'.format(head, msg0, msg1))
return
if self.pmx485_load(self.iniFile.find('QTPLASMAC', 'PM_PORT')):
return
# if pins not connected then connect them
if not hal.pin_has_writer('pmx485.enable'):
for pin in self.pins485Comp:
hal.connect(pin,'plasmac:{}'.format(pin.replace('pmx485.', 'pmx485_')))
self.pmx485_setup()
# ensure valid parameters before trying to connect
if self.w.cut_mode.value() == 0 or self.w.cut_amps.value() == 0:
head = _translate('HandlerClass', 'MATERIALS ERROR')
Expand Down Expand Up @@ -4704,6 +4677,15 @@ def pmx485_mesh_enable_changed(self, state):
self.w.cut_mode.setEnabled(True)
self.meshMode = False

def pmx485_timeout(self):
self.pmx485CommsTimer.stop()
self.w.pmx485_label.setText(_translate('HandlerClass', 'COMMS ERROR'))
self.pmx485LabelState = None
self.w.pmx_stats_frame.hide()
self.pmx485CommsError = True
self.pmx485Connected = False
self.pmx485RetryTimer.start(3000)

pmx485FaultName = {
'0110': 'Remote controller mode invalid',
'0111': 'Remote controller current invalid',
Expand Down
8 changes: 8 additions & 0 deletions share/qtvcp/screens/qtplasmac/versions.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ <h2>QtPlasmaC Version History</h2>
<li>fix requested feed rate calulation</li>
</ul>

<br><b><u>v1.220.140 2021 Dec 07</u></b>
<ul style="margin:0;">
<li>improve powermax comms error checking</li>
<li>g-code filter fix cut recovery bug</li>
<li>g-code filter add more illegal character checks</li>
<li>update example wrenches</li>
</ul>

<br><b><u>v1.219.139 2021 Dec 03</u></b>
<ul style="margin:0;">
<li>fix cut recovery with offset probing</li>
Expand Down
Loading

0 comments on commit ecfda60

Please sign in to comment.