Перестраиваемый автомат на ngcgui от чайника
Часто бывает необходимо быстро подготавливать файлы простой обработки заготовки. Написание подобной программы в G-кодах в CAM-программах потребует времени сопоставимо со временем самой обработки заготовки. В этом случае, можно воспользоваться таким инструментом как NGCGUI.
Перенастраиваемый автомат по фрезеровке поверхности заготовок
Попробуем разобраться с созданием ngcgui в конфигурации AXIS на примере создания простого перенастраиваемого автомата по фрезеровке поверхности заготовки.
Задача. Построить простой автомат с тремя координатами и перенастраиваемыми оперативно параметрами под управлением LinuxCNC при помощи ngcgui
Предназначение. Быстрая подготовка станка к фрезеровке поверхности (плоскости) у заготовок различных габаритных размеров и различного материала.
Потому нужно в параметры обработки заготовки вводить оперативно: габаритные размеры заготовки; координаты начала обработки; диаметр фрезы (шаг обработки); подачу; обороты шпинделя.
НАЧАЛЬНЫЕ ШАГИ - подготовка конфигурации.
В LinuxCNC версии 2.5 и выше ngcgui уже встроена в AXIS (файлы ngcgui.tcl , ngcgui_app.tcl и ngcgui_ttt.tcl лежат в папке usr/lib/tcltk/linuxcnc).
1. Создаем конфигурацию станка на базе AXIS: 1.1. В INI прописываем:
[DISPLAY] DISPLAY = axis EDITOR = gedit GLADEVCP = mygui.ui POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 1.2 PROGRAM_PREFIX = /home/sun/linuxcnc/nc_files NGCGUI_SUBFILE =/home/sun/linuxcnc/nc_files/stan.ngc USER_COMMAND_FILE = /home/sun/linuxcnc/config/tkapp.py NGCGUI = /usr/lib/tcltk/linuxcnc/ngcgui.tcl TKAPP = /usr/lib/tcltk/linuxcnc/ngcgui_app.tcl
(здесь и далее адрес /home/sun/linuxcnc/nc_files/ указан мой - Вы пропишите свой)
Файл tkapp.py , описывающий панель для нашей подпрограммы положил в папку /home/sun/linuxcnc/config , чтобы этот файл можно было использовать и в других конфигурациях.
[HAL] HALFILE = stanok.hal POSTGUI_HALFILE = postgui.hal HALUI = halui
1.2. Настройки HAL, визуальной панели mygui.ui и файла с пинами визуальной панели postgui.hal стандартны и особенностей не имеют.
2. Запускаем конфигурацию станка и проверяем её работоспособность. Станок пока не может менять своих параметров.
3. В папку /home/sun/linuxcnc/config положим файл tkapp.py (как писалось выше) с таким содержанием:
# tkapp.py: specify inifile entry [DISPLAY]USER_COMMAND_FILE = path_to_tkapp.py
# specify tk applications as inifile entries like:
# [DISPLAY]TKAPP = ngcgui_app.tcl
# note: USER_COMMAND_FILE supersedes ~/.axisrc so source it here, once only try:
first_tkapp
except NameError:
first_tkapp = True
user_rcfile = os.path.expanduser("~/.axisrc")
if first_tkapp and os.path.exists(user_rcfile):
first_tkapp = False
import traceback
try:
execfile(user_rcfile)
except:
tb = traceback.format_exc()
print >>sys.stderr, tb
root_window.tk.call("nf_dialog", ".error", _("Error in ~/.axisrc"),
tb, "error", 0, _("OK"))
class moreTclCommands(nf.TclCommands):
def dynamic_tab(name, text):
tab = widgets.right.insert("end", name, text=text)
tab.configure(borderwidth=1, highlightthickness=0)
return tab
# for emc2.5, _dynamic_tab is in axis.py, so do this instead:
#def dynamic_tab(name, text):
# return _dynamic_tab(name,text) # ccaller: make a frame and pack
def inifindall(section,item):
# support USER_COMMAND_FILE that uses tcl, return tcl list
answer = inifile.findall(section,item)
tlist = ""
for x in answer:
if len(answer) == 1:
tlist = x
else:
tlist = tlist + "{" + x + "} "
return tlist
moreTclCommands(root_window)
tkapp = inifile.findall("DISPLAY","TKAPP") or ""
for app in tkapp:
root_window.tk.call("source",app)
В папку /home/sun/linuxcnc/nc_files положим также файл stan.ngc с таким содержанием (без программы G-кодов):
o<stan> sub
#<Length> = #1 (=1000 длина)
#<Width> = #2 (=500 ширина)
#<Diametr> = #3 (=8 диаметр фрезы)
#<FeedRate> = #4 (=40 подача)
#<Max_RPM> = #5 (=15000 обороты)
#<Depth> = #6 (=-2 глубина)
o<stan> endsub
Добавим в этот файл программу обработки (фрезеровки) поверхности заготовки в G-кодах (с использованием циклов) после описания последней переменной и перед строкой окончания подпрограммы:
1. Устанавливаем высоту фрезы 5мм над поверхностью заготовки (и 5мм, и то, что поверхность заготовки Z=0 - по умолчанию).
2. Выходим в начало обработки (по умолчанию X0 Y0) и включаем шпиндель на заданных оборотах.
3. Опускаемся на глубину фрезеровки заготовки (переменная Depth = -2мм) со скоростью F400 (по умолчанию, но можно и отдельно прописать переменной).
4. Высчитываем шаг фрезеровки (30% от диаметра фрезы).
5. Запускаем цикл фрезеровки поверхности.
6. По окончании поднимаем фрезу и выключаем шпиндель, перемещаемся в начальное положение.
В итоге файл stan.ngc выглядит так:
o<stan> sub
#<Length> = #1 (=1000 длина)
#<Width> = #2 (=500 ширина)
#<Diametr> = #3 (=8 диаметр фрезы)
#<FeedRate> = #4 (=40 подача)
#<Max_RPM> = #5 (=15000 обороты)
#<Depth> = #6 (=-2 глубина)
G0 Z5.0
G0 X0 Y0 S#<Max_RPM> M3
G1 Z#<Depth> F400
#<Step> = [#<Diametr> * 0.3]
#<Current_Length> = 0
o100 repeat [#<Length> / [#<Step> * 2] + 1]
G1 X#<Width> Y#<Current_Length> F#<FeedRate>
#<Current_Length> = [#<Current_Length> + #<Step>]
G0 X#<Width> Y#<Current_Length>
G1 X0 Y#<Current_Length> F#<FeedRate>
#<Current_Length> = [#<Current_Length> + #<Step>]
G0 X0 Y#<Current_Length>
o100 endrepeat
G0 Z5.0 M5
G0 X0 Y0
M9
o<stan> endsub
Перенастраиваемый автомат по сверловке сетки отверстий
1. В INI:
[DISPLAY] DISPLAY = axis EDITOR = gedit GLADEVCP = mygui.ui POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 1.2 PROGRAM_PREFIX = /home/sun/linuxcnc/nc_files NGCGUI_SUBFILE =/home/sun/linuxcnc/nc_files/sverlo.ngc USER_COMMAND_FILE = /home/sun/linuxcnc/config/tkapp.py NGCGUI = /usr/lib/tcltk/linuxcnc/ngcgui.tcl TKAPP = /usr/lib/tcltk/linuxcnc/ngcgui_app.tcl
2. Файл sverlo.ngc в папке /home/sun/linuxcnc/nc_files :
o<sverlo> sub
#<Num_X> = #1 (=3 кол-во отверстий по X)
#<Step_X> = #2 (=10 шаг по X, мм)
#<Num_Y> = #3 (=3 кол-во отверстий по Y)
#<Step_Y> = #4 (=10 шаг по Y, мм)
#<Speed> = #5 (=200 скорость сверловки)
#<Depth> = #6 (=10 глубина сверловки, мм)
#<Step_Z> = #7 (=5 шаг сверловки, мм)
#<Surface> = #8 (=0 высота пов-ти заготовки, мм)
#<Max_RPM> = #9 (=5000 обороты шпинделя)
#<Start_X> = #10 (=0 нач.координата по X, мм)
#<Start_Y> = #11 (=0 нач.координата по Y, мм)
G0 Z5.0
G0 X0 Y0 S#<Max_RPM> M3
#<Current_Y> = #<Start_Y>
o100 repeat [#<Num_Y>]
#<Current_X> = #<Start_X>
o101 repeat [#<Num_X>]
G0 X#<Current_X> Y#<Current_Y>
G83 R#<Surface> Z[-1 * #<Depth>] Q#<Step_Z> F#<Speed>
G0 Z5.0
#<Current_X> = [#<Current_X> + #<Step_X>]
o101 endrepeat
#<Current_Y> = [#<Current_Y> + #<Step_Y>]
o100 endrepeat
G0 Z5.0 M5
G0 X0 Y0
M9
o<sverlo> endsub