Files
2026-08-20 06:17:39 +08:00

113 lines
5.0 KiB
Python
Executable File

#!/usr/bin/python3
'''
M159
Copyright (C) 2023 James Walker
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
'''
import sys
import linuxcnc
from subprocess import run as RUN
# P param. Code for function to be performed
# Q param, Value to be used by the function selected
def abort(msg):
try:
linuxcnc.command().error_msg(msg)
linuxcnc.command().abort()
exit()
except KeyboardInterrupt:
pass
action = int(float(sys.argv[1]))
value = float(sys.argv[2])
if action == -1:
abort("M159 - Missing P parameter")
elif action not in [601, 602, 603, 604, 605, 606, 607, 608, 609]:
abort(f"M159 - Invalid parameter: P{action}")
elif action != 609 and value == -1:
abort(f"M159 P{action} - Missing Q parameter")
# Example setting code snippet for sheetcam or similar.
# m159 p601 q2
# m159 p602 q50
# m159 p603 q2.5
# m159 p604 q1
# m159 p605 q980
# m159 p606 q5
# m159 p607 q245
# m159 p608 q3
# Ensure all the params needed are there. Below params and "comment" taken from plasmac comp.
# pin in unsigned pierce_type = 0 "allows motion to progress during pierce. 0=No movement, 1=Wiggle, 2=Ramp";
# pin in float pierce_motion_delay = 0 "delay starting motion during pierce delay period. This is a % of Pierce Delay. Only used when pierce-with-motion is True";
# pin in float cut_height_delay = 0 "at the end of transition to end-pierce-height how long to pause before transition to cut height";
# pin in float pierce_end_height = 0 "The height at end of piercing (in machine units). Can be different to Cut Height. Default 0 means not used. i.e. no change in height";
# pin in float gouge_speed = 0 "Ramp starting speed for gouge. In machine units/min.";
# pin in float gouge_speed_distance = 0 "Distance gouge will run in machine units. Gouge plus creep distance should not be longer than any lead in";
# pin in float creep_speed = 0 "Ramp creep or intermediate speed. Comes after gouge and is before cut speed. In machine units/min.";
# pin in float creep_speed_distance = 0 "Distance creep will run in machine units. Gouge plus creep distance should not be longer than any lead in";
# Explanation of the function codes passed to P
# 601 = Pierce Type (0=Normal, 1-Wiggle, 2=Ramp)
# 602 = Pierce Motion Delay (Delay in Z motion to Pierce End Height expressed as a % of Pierce Delay)
# 603 = Pierce End Height (Target pierce height at end of Pierce Delay. Normally lower than Pierce Height)
# 604 = Cut Height Delay (At the end of transition to Pierce End Height wait x secs before transition to Cut Height)
# 605 = Gouge Speed (Speed in machine units/min)
# 606 = Gouge Distance (Distance of gouge to travel in machine units)
# 607 = Creep Speed (Speed in machine units. Creep takes effect after gouge has finished)
# 608 = Creep Distance (Distance of creep to travel in machine units)
# 609 = Reset to standard behaviour. Pierce type = 0
# Act on P code found. Set the relevant plasmac pin to the supplied value in Q
try:
if action == 601:
RUN(['halcmd', 'setp', 'plasmac.pierce-type', f'{int(value)}'])
elif action == 602:
RUN(['halcmd', 'setp', 'plasmac.pierce-motion-delay', f'{value}'])
elif action == 603:
RUN(['halcmd', 'setp', 'plasmac.pierce-end-height', f'{value}'])
elif action == 604:
RUN(['halcmd', 'setp', 'plasmac.cut-height-delay', f'{value}'])
elif action == 605:
RUN(['halcmd', 'setp', 'plasmac.gouge-speed', f'{value}'])
elif action == 606:
RUN(['halcmd', 'setp', 'plasmac.gouge-speed-distance', f'{value}'])
elif action == 607:
RUN(['halcmd', 'setp', 'plasmac.creep-speed', f'{value}'])
elif action == 608:
RUN(['halcmd', 'setp', 'plasmac.creep-speed-distance', f'{value}'])
elif action == 609:
RUN(['halcmd', 'setp', 'plasmac.pierce-type', '0'])
RUN(['halcmd', 'setp', 'plasmac.pierce-motion-delay', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.pierce-end-height', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.cut-height-delay', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.gouge-speed', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.gouge-speed-distance', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.creep-speed', '0.0'])
RUN(['halcmd', 'setp', 'plasmac.creep-speed-distance', '0.0'])
except:
abort(f"M159 P{action} Q{value} - Error setting HAL pin")
exit()