Скрипты для MACH3.

Mach, популярные и не очень CAD, CAM. Обсуждение и разработка программ для управления станками.
konyshevk
Почётный участник
Почётный участник
Сообщения: 740
Зарегистрирован: 19 апр 2014, 22:09
Репутация: 696
Откуда: Челябинск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение konyshevk »

Может найдется спец который подробно раскажет как работает SetDRO
Я начал было грешить на то что мачь "ломаный"
знать-бы точно
Даешь коллективный разум !
Аватара пользователя
putman
Мастер
Сообщения: 925
Зарегистрирован: 21 янв 2013, 09:49
Репутация: 100
Настоящее имя: Алексей
Откуда: г. Долгопрудный
Контактная информация:

Re: Скрипты для MACH3.

Сообщение putman »

У меня лицензия, просто мы не шарим, а знатоки не хотят давать нам рыбу. Хотят что бы мы сами научились её ловить.
Понял ))))))
Команда Call SetDRO(0,0) выполняется не дождавшись пока щуп доедет.
Вставляю перед обнулением:
While IsMoving()
Wend ' дождаться конца движения

Теперь после остановки обнуляем.

Код: Выделить всё

Code "G04 p0.25" ' пауза 0.5 с
Xnew = GetDRO(0) - 0.25
Code "G01 x"&Xnew 
Xnew = (Xnew+0.25)/2
Code "G01 x"&Xnew  

While IsMoving()                                                          <----------------------------
Wend ' дождаться конца движения                              <----------------------------

Call SetDRO(0,0) ' обнулить данные в окне X                 -=( 2 )=-
P.S. Я программирую микроконтроллеры на ассемблере, там реально проще )))
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Скрипты для MACH3.

Сообщение Сергей Саныч »

putman писал(а):Что же Вы сразу не написали если знали.
Это ж общепринятая форма для большинства языков. А ни с мачем, ни с вижуал бейсиком я сроду дела не имел :thinking:
Кстати, в чем там аргумент задается - в градусах или радианах - тоже не знаю.
Чудес не бывает. Бывают фокусы.
konyshevk
Почётный участник
Почётный участник
Сообщения: 740
Зарегистрирован: 19 апр 2014, 22:09
Репутация: 696
Откуда: Челябинск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение konyshevk »

putman писал(а):Команда Call SetDRO(0,0) выполняется не дождавшись пока щуп доедет
А в какой точно момент начинается выполнение этой команды , одновременно с последней G0,G1,G31 ?
Даешь коллективный разум !
Аватара пользователя
putman
Мастер
Сообщения: 925
Зарегистрирован: 21 янв 2013, 09:49
Репутация: 100
Настоящее имя: Алексей
Откуда: г. Долгопрудный
Контактная информация:

Re: Скрипты для MACH3.

Сообщение putman »

konyshevk писал(а):
putman писал(а):Команда Call SetDRO(0,0) выполняется не дождавшись пока щуп доедет
А в какой точно момент начинается выполнение этой команды , одновременно с последней G0,G1,G31 ?
В моём скрипте сразу после - Code "G01 x"&Xnew .
Как только движение пошло, сразу и выполняется.
konyshevk
Почётный участник
Почётный участник
Сообщения: 740
Зарегистрирован: 19 апр 2014, 22:09
Репутация: 696
Откуда: Челябинск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение konyshevk »

Это многое проясняет

А зачем писать Call SetDRO(0,0) ведь просто SetDRO(0,0) одинаково работает : первая цифра- куда , вторая - что записать 0 - обнулить
Последний раз редактировалось konyshevk 12 дек 2014, 22:06, всего редактировалось 1 раз.
Даешь коллективный разум !
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6191
Откуда: Казахстан.
Контактная информация:

Re: Скрипты для MACH3.

Сообщение aftaev »

putman писал(а):While IsMoving()
Wend ' дождаться конца движения
забыл sleep(100) написать ;)

Код: Выделить всё

While (IsMoving())
          sleep (100)          
Wend   
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6191
Откуда: Казахстан.
Контактная информация:

Re: Скрипты для MACH3.

Сообщение aftaev »

konyshevk писал(а):А в какой точно момент начинается выполнение этой команды , одновременно с последней G0,G1,G31 ?
Если нет в коде While (IsMoving()) ....
то фактически одновременно не дожидаясь выполнения Gcode
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
putman
Мастер
Сообщения: 925
Зарегистрирован: 21 янв 2013, 09:49
Репутация: 100
Настоящее имя: Алексей
Откуда: г. Долгопрудный
Контактная информация:

Re: Скрипты для MACH3.

Сообщение putman »

Написал заново программу, без дурацких G91, G92.
Разобрался с тригонометрическими функциями.
Скрипт после работы поворачивает плоскость на угол нужный для правильной обработки детали.
Всем спасибо ! =) :D
Код:

Код: Выделить всё

Code "G31 Y-1000 F100" ' двигаться по -Y на 1м до касания щупом  
While IsMoving() 
Wend ' дождаться конца движения

SetDRO(1,0) ' обнулить данные в окне Y
Code "G04 p0.25" ' пауза 0.5 с
Code "G01 Y0.25" ' отъехать от стенки
Code "G04 p0.25" ' пауза 0.5 с   
Code "G31 Y1000" ' двигаться по +Y на 1м до касания щупом
While IsMoving() 
Wend ' дождаться конца движения      

Code "G04 p0.25" ' пауза 0.5 с
Ynew = GetDRO(1) - 0.25
Code "G01 Y"&Ynew 
Ynew = (Ynew+0.25)/2
Code "G01 Y"&Ynew  
Code "G04 p0.25" ' пауза 0.5 с

While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
SetDRO(1, -9.1) ' Y первого калибровочного отверстия
       
'Установили нуль по Y.

Code "G04 p0.25" 'пауза 0.5 c
Code "G31 X-1000 F100" ' двигаться по -Х на 1м до касания щупом  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения

SetDRO(0,0) ' обнулить данные в окне X
Code "G04 p0.25" ' пауза 0.5 с
Code "G01 x0.25" ' отъехать от стенки
Code "G04 p0.25" ' пауза 0.5 с
Code "G31 X1000" ' двигаться по +-X на 1м до касания щупом
While IsMoving() 
Wend ' дождаться конца движения           

Code "G04 p0.25" ' пауза 0.5 с
Xnew = GetDRO(0) - 0.25
Code "G01 x"&Xnew 
Xnew = (Xnew+0.25)/2
Code "G01 x"&Xnew  

While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
SetDRO(0, 15.02) ' X первого калибровочного отверстия

'Установили предварительный нуль по Х.

Code "G00 Z3"  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
Code "G0 X14.86 Y9.1"  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
Code "G01 Z0 F50"  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения

'---------------------------------------------------------------------------------------------------

Code "G31 Y-1000 F100" ' двигаться по -Y на 1м до касания щупом  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения

Yknul = GetDRO(1)
Code "G04 p0.25" ' пауза 0.5 с
Code "G01 Y" & (Yknul + 0.25)  ' отъехать от стенки
Code "G04 p0.25" ' пауза 0.5 с   

Code "G31 Y1000" ' двигаться по +Y на 1м до касания щупом
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения      

Code "G04 p0.25" ' пауза 0.5 с
Yotnul = GetDRO(1)
Code "G01 Y" & (Yotnul - 0.25)  ' отъехать от стенки
Ynew = Yknul + ( (Yotnul - Yknul) / 2)
Code "G01 Y" & Ynew  
Code "G04 p0.25" ' пауза 0.5 с

While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
'Установили смещение по Y для второго отверстия.

Code "G31 X-1000 F100" ' двигаться по -X на 1м до касания щупом  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения

Xknul = GetDRO(0)
Code "G04 p0.25" ' пауза 0.5 с
Code "G01 X" & (Xknul + 0.25)  ' отъехать от стенки
Code "G04 p0.25" ' пауза 0.5 с   

Code "G31 X1000" ' двигаться по +X на 1м до касания щупом
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения      

Code "G04 p0.25" ' пауза 0.5 с
Xotnul = GetDRO(0)
Code "G01 X" & (Xotnul - 0.25)  ' отъехать от стенки
Xnew = Xknul + ( (Xotnul - Xknul) / 2)
Code "G01 X" & Xnew  
Code "G04 p0.25" ' пауза 0.5 с

While IsMoving() 
sleep (100)
Wend ' дождаться конца движения
Установили смещение по Y для второго отверстия.

Code "G00 Z10"  
While IsMoving() 
sleep (100)
Wend ' дождаться конца движения

Xsm = 14.86 - Xnew 
Del = Xsm / 18.2
Ug = Atn (Del) * 180 / 3.14

Code "G68 X0 Y0 R" & Ug
Code "G00 Z120 X130 Y0" 

responde = MsgBox ("Cмещение = " & Xsm & ", A(tg) = " & Del & ", Угол = " & Ug) 

                                            

konyshevk
Почётный участник
Почётный участник
Сообщения: 740
Зарегистрирован: 19 апр 2014, 22:09
Репутация: 696
Откуда: Челябинск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение konyshevk »

Вот то-же набросал простенький скрипт поворота координат XY по стенки детали .(это для того что-бы деталь с базовой плоскостью по Х не выставлять а координаты повернуть и
запускать программу) При выполнении скрипта привязка не сбивается .
начало
  • Code "G69"'Сброс прошлых поворотов координат
    Code "G91"
    Code "G1x3 f500" 'едим по Х на точку замера
    Code "G31 Y-100 F500" ' двигаться по -Y на 100 мм. до касания щупом
    While IsMoving()
    Wend ' дождаться конца движения
    a = GetDRO(1)' записываем показания Y в a
    Code "G04 p0.2" ' пауза 0.2 с
    Code "G01 Y2 f1000" ' отъехать от стенки
    Code "G0 Y10"
    Code "G90"
    Code "G1 x-3 f500" 'едим по Х в минус на точку замера
    Code "G91"
    Code "G31 Y-100 F500" ' двигаться по -Y на 100 мм. до касания щупом
    While IsMoving()
    Wend ' дождаться конца движения
    b = GetDRO(1)' записываем показания Y в В
    Code "G04 p0.2" ' пауза 0.2 с
    Code "G01 Y2 f1000" ' отъехать от стенки
    Code "G0 Y10"
    Code "G90"
    Code "G0 x0"
    c=(a-b)/6 ' разница катетов, 6- это расстояние между точками замера по Х (6мм)
    e=a-b ' Cмещение по Y
    Del = Int(c*1000 + 0.5)/1000 'уравнять до трех знаков после запятой
    d = Atn (Del)* 180 / 3.1415926535897932384626433832795 ' вычисляем угол через арктангенс
    Ug = Int(d*1000 + 0.5)/1000 'уравнять до трех знаков после запятой угол
    Code "G68 X0 Y0 R" & Ug' поворачиваем плоскость X Y ну угол Ug
    responde = MsgBox ("Cмещение = " & e & ", A(tg) = " & Del & ", Угол = " & Ug)
конец.

Попробуйте мож понравится !
Даешь коллективный разум !
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Скрипты для MACH3.

Сообщение Nick »

А в маче нет поворота системы координат?
nkp как-то писал похожую утилиту для выставления для LinuxCNC. Там тоже делался замер по двум точкам, а потом:
G10 L2 X... Y... Z... R#<alpha>
( http://linuxcnc.org/docs/html/gcode/gco ... ec:G10-L2_ )
konyshevk
Почётный участник
Почётный участник
Сообщения: 740
Зарегистрирован: 19 апр 2014, 22:09
Репутация: 696
Откуда: Челябинск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение konyshevk »

Nick писал(а):А в маче нет поворота системы координат?
G68 поворачивает ,а скрипт определяет на сколько повернуть. (встроенного в Мач скрипта я не видел)
Даешь коллективный разум !
Аватара пользователя
verser
Мастер
Сообщения: 1875
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1275
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Скрипты для MACH3.

Сообщение verser »

Nick писал(а):А в маче нет поворота системы координат?
nkp как-то писал похожую утилиту для выставления для LinuxCNC. Там тоже делался замер по двум точкам, а потом:
G10 L2 X... Y... Z... R#<alpha>
( http://linuxcnc.org/docs/html/gcode/gco ... ec:G10-L2_ )
Вот бы ссылочку от nkp :)
kos_rus
Новичок
Сообщения: 3
Зарегистрирован: 14 дек 2015, 11:37
Репутация: 0
Контактная информация:

Re: Скрипты для MACH3.

Сообщение kos_rus »

konyshevk писал(а):SetDRO(0,0) одинаково работает : первая цифра- куда , вторая - что записать
Подскажите как с помощью этой команды занести значение из окна Z или другого в окно H коррекции длины инструмента. Не могу понять как нумеруются эти окна.
Аватара пользователя
kurtkobat
Кандидат
Сообщения: 89
Зарегистрирован: 01 мар 2017, 20:52
Репутация: 3
Настоящее имя: Dmitriy
Контактная информация:

Re: Скрипты для MACH3.

Сообщение kurtkobat »

подскажите пожалуйста, в строке Call SetDRO(0,0) первый 0 это координата Х, а что обозначает второй 0?
Иногда в мозгах включается G04 Х500, но это нужда что бы сделать правильно
Аватара пользователя
FLUKE
Мастер
Сообщения: 843
Зарегистрирован: 11 мар 2013, 21:18
Репутация: 187
Настоящее имя: Сергей
Откуда: Смоленск
Контактная информация:

Re: Скрипты для MACH3.

Сообщение FLUKE »

kurtkobat писал(а):подскажите пожалуйста, в строке Call SetDRO(0,0) первый 0 это координата Х, а что обозначает второй 0?
http://www.cnc-club.ru/forum/viewtopic. ... 84#p157884
stiks
Кандидат
Сообщения: 50
Зарегистрирован: 05 сен 2013, 11:35
Репутация: 25
Контактная информация:

Re: Скрипты для MACH3.

Сообщение stiks »

Форумчане, подскажите, пожалуйста. Пытаюсь собрать солянку из нескольких скриптов. Необходима такая последовательность. Движение в позицию датчика vers tsm->опускание до контакта с площадкой->отскок на 2 мм->поиск центра площадки->запись офсетов в поле координат.
Для поиска центра площадки использую скрипт из ProbeWizard, заменив переменные значения на свои фиксированные. Плюс дописал движение в позицию по Х,У.
(для просмотра содержимого нажмите на ссылку)
Sub Main()

' Center X+X-Y-Y+ Outside Probing Script
' Author verser
' vers.by - touch probes, tool setters and precision home switches

Code "G0 G53 z-1"
Code "G0 G53 x299,09 y37.22" 'Z probe pozition
Code "G0 G53 z-60"
sleep 100
While IsMoving()
wend


Dim FRate1, FRate2
Dim DMax, Latch, EdgeLength
Dim XYclearance
Dim AutoZeroFlag
Dim ToolNo
Dim ToolD
Dim ProbeD
Dim Zdepth
Dim XHit, YHit, ZHit
Dim XbHit, YbHit, Diameter

Dim Zpos

Dim XScale, YScale, ZScale

Dim AbsIncFlag

Dim CurrentFeed

'Init vars
FRate1 = 60
FRate2 = 40
DMax = 5
ToolNo = GetCurrentTool()
ToolD = 2
Latch = 1
XYclearance = 5
EdgeLength = 5
Zdepth = 5

If GetOEMLED(1871) Then
AutoZeroFlag=1
Else
AutoZeroFlag=0
End If

AbsIncFlag = GetOEMLED(49) ' Get the current G91 state

'Temporary save all Axis Scale factors
XScale = GetOEMDRO(59)
YScale = GetOEMDRO(60)
ZScale = GetOEMDRO(61)

'Set All Axis' Scale to 1
SetOEMDRO(59,1)
SetOEMDRO(60,1)
SetOEMDRO(61,1)
Sleep(250)


'Check for Errors

If GetOemLED(16)<>0 Then ' Check for Machine Coordinates
Message "Please change to working coordinates"
SetOEMDRO(59,XScale)
SetOEMDRO(60,YScale)
SetOEMDRO(61,ZScale)
Sleep(250)
Exit Sub ' Exit if in Machine Coordinates
End If

If GetOemLED(825)<>0 Then
Message "Probe is active! Check connection and try again"
Call SetOEMDRO(59,XScale)
Call SetOEMDRO(60,YScale)
Call SetOEMDRO(61,ZScale)
Sleep(250)
Exit Sub ' Exit if probe is tripped
End If


CurrentFeed = GetOEMDRO(818) 'FeedRate()

'main working

'Save Z start position
Zpos = GetDRO(2)
'Safe Go to X+ start position
If Not SafeMoveX((-EdgeLength-XYclearance),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
If Not SafeMoveZ((-Zdepth),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
'Probe X+
XHit=ProbeX(1,DMax,Latch,FRate1,FRate2)
If XHit=999999 Then
Exit Sub
End If
'Indicate result
SetUserLabel (4, Format(XHit+ProbeD/2, "####0.000"))
'Safe back to start position
If Not SafeMoveZ((Zdepth),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
'Move to X- start position
If Not SafeMoveX(XHit+ProbeD/2-GetDRO(0)+2*EdgeLength+XYclearance,CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
If Not SafeMoveZ((-Zdepth),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
'Probe X-
XbHit=ProbeX(-1,DMax,Latch,FRate1,FRate2)
If XbHit=999999 Then
Exit Sub
End If
'Indicate result
SetUserLabel (2, Format(XbHit-ProbeD/2, "####0.000"))
SetUserLabel (3, Format((XbHit+XHit)/2, "####0.000"))
SetUserLabel (5, Format(Abs(XbHit-XHit-ProbeD), "####0.000"))
PushMSG("X+ = " & (XHit+ProbeD/2) & ", Xc = " & (XbHit+XHit)/2 & ", X- = " & (XbHit-ProbeD/2) & ", Lx = " & Abs(XbHit-XHit-ProbeD))
'Safe back to start position
If Not SafeMoveZ((Zdepth),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
'Move to Center point
If Not SafeMoveX((XbHit+XHit)/2-GetDRO(0),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If

'Safe Go to Y- start position
If Not SafeMoveY((EdgeLength+XYclearance),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
If Not SafeMoveZ((-Zdepth),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
'Probe Y-
YHit=ProbeY(-1,DMax,Latch,FRate1,FRate2)
If YHit=999999 Then
Exit Sub
End If
'Indicate result
SetUserLabel (6, Format(YHit-ProbeD/2, "####0.000"))
'Safe back to start position
If Not SafeMoveZ((Zdepth),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
'Move to Y+ start position
If Not SafeMoveY(YHit+ProbeD/2-GetDRO(1)-2*EdgeLength-XYclearance,CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
If Not SafeMoveZ((-Zdepth),CurrentFeed) Then
PushMSG("Manually return to the starting position and repeat the search")
Exit Sub
End If
'Probe Y+
YbHit=ProbeY(1,DMax,Latch,FRate1,FRate2)
If YbHit=999999 Then
Exit Sub
End If
'Indicate result
SetUserLabel (8, Format(YbHit+ProbeD/2, "####0.000"))
SetUserLabel (7, Format((YbHit+YHit)/2, "####0.000"))
SetUserLabel (9, Format(Abs(YbHit-YHit+ProbeD), "####0.000"))
Diameter=(Abs(YbHit-YHit+ProbeD)+Abs(XbHit-XHit-ProbeD))/2
SetUserLabel (11, Format(Diameter, "####0.000"))
PushMSG("Y+ = " & (YbHit+ProbeD/2) & ", Yc = " & (YbHit+YHit)/2 & ", Y- = " & YHit-ProbeD/2 & ", Ly = " & Abs(YbHit-YHit+ProbeD) & ", Diam = " & Diameter)
'Safe back to start position
If Not SafeMoveZ((Zdepth),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If
'Move to Center point
If Not SafeMoveY((YbHit+YHit)/2-GetDRO(1),CurrentFeed) Then
PushMSG("Return to the search position is interrupted")
Exit Sub
End If


If AutoZeroFlag = 1 Then
SetOEMDRO(800, GetDRO(0)-(XbHit+XHit)/2)
Sleep(150)
SetOEMDRO(801, GetDRO(1)-(YbHit+YHit)/2)
Sleep(150)
End If

'epilog

SetOEMDRO(59,XScale)
SetOEMDRO(60,YScale)
SetOEMDRO(61,ZScale)
Sleep(250)

Call SetLED49(AbsIncFlag)
SetOEMDRO(818,CurrentFeed) 'SetFeedRate(CurrentFeed)
Sleep(125)

End Sub


'Functions

Function ProbeX(Dir,DMax,Latch,FRate1,FRate2)
Dim Res
Dim Xstart
Dim Ftmp
Dim AbsIncF
ProbeX=999999
Xstart = GetDRO(0)
Ftmp = FeedRate() 'FeedRate()
AbsIncF=GetOEMLED(49)
'Fast Probe X
Code "G91"
Code "F" & FRate1
Sleep(125)
Call WaitProbeReady()
Code "G31 X" & (Dir*DMax)
While IsMoving()
Wend
Res = GetVar(2000)
' PushMSG("Res=" & Res &", Xstart=" & Xstart & ", DMax=" & DMax & ", FRate1=" & FRate1)
If Abs(Res - Xstart - Dir*DMax) < 0.01 Then
PushMSG("Error: G31 X search finished without making contact")
PushMSG("Manually return to the starting position and repeat the search")
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
Exit Function
End If
'Move back
Code "G00 X" & -Dir*Latch
While IsMoving()
Wend
Call WaitProbeReady()
'Latch Probe X
Xstart = GetDRO(0)
Code "F" & FRate2
Sleep(125)
Code "G31 X" & Dir*Latch*2
While IsMoving()
Wend
'Save result
Res = GetVar(2000)
If Abs(Res - Xstart - Dir*Latch*2) < 0.01 Then
PushMSG("Error: G31 X latch finished without making contact")
PushMSG("Manually return to the starting position and repeat the search")
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
Exit Function
End If
Code "G00 X" & -Dir*Latch
While IsMoving()
Wend
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
ProbeX=Res
End Function

Function ProbeY(Dir,DMax,Latch,FRate1,FRate2)
Dim Res
Dim Ystart
Dim Ftmp
Dim AbsIncF
ProbeY=999999
Ystart = GetDRO(1)
Ftmp = FeedRate() 'FeedRate()
AbsIncF=GetOEMLED(49)
'Fast Probe Y
Code "G91"
Code "F" & FRate1
Sleep(125)
Call WaitProbeReady()
Code "G31 Y" & (Dir*DMax)
While IsMoving()
Wend
Res = GetVar(2001)
' PushMSG("Res=" & Res &", Ystart=" & Ystart & ", DMax=" & DMax & ", FRate1=" & FRate1)
If Abs(Res - Ystart - Dir*DMax) < 0.01 Then
PushMSG("Error: G31 Y search finished without making contact")
PushMSG("Manually return to the starting position and repeat the search")
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
Exit Function
End If
'Move back
Code "G00 Y" & -Dir*Latch
While IsMoving()
Wend
Call WaitProbeReady()
'Latch Probe Y
Ystart = GetDRO(1)
Code "F" & FRate2
Sleep(125)
Code "G31 Y" & Dir*Latch*2
While IsMoving()
Wend
'Save result
Res = GetVar(2001)
If Abs(Res - Ystart - Dir*Latch*2) < 0.01 Then
PushMSG("Error: G31 Y latch finished without making contact")
PushMSG("Manually return to the starting position and repeat the search")
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
Exit Function
End If
Code "G00 Y" & -Dir*Latch
While IsMoving()
Wend
Call SetLED49(AbsIncF)
SetOEMDRO(818,Ftmp)
Sleep(125)
ProbeY=Res
End Function

Function SafeMoveX(X1, F1) As Boolean 'return 1 (error) if probe tripped
Dim Xstart
Dim Ftmp
Dim AbsIncF
SafeMoveX=True
Xstart = GetDRO(0)
Ftmp = FeedRate() 'FeedRate()
AbsIncF=GetOEMLED(49)
Code "G91"
Code "F" & F1
Sleep(125)
Call WaitProbeReady()
Code "G31 X" & X1
While IsMoving()
Wend
XHit = GetVar(2000)
Call SetLED49(AbsIncF)
If Abs(XHit - Xstart - X1) > 0.01 Then
SafeMoveX=False
PushMSG("Error! Probe tripped during X movement")
End If
SetOEMDRO(818,Ftmp)
Sleep(125)
End Function

Function SafeMoveY(Y1, F1) As Boolean 'return 1 (error) if probe tripped
Dim Ystart
Dim Ftmp
Dim AbsIncF
SafeMoveY=True
Ystart = GetDRO(1)
Ftmp = FeedRate() 'FeedRate()
AbsIncF=GetOEMLED(49)
Code "G91"
Code "F" & F1
Sleep(125)
Call WaitProbeReady()
Code "G31 Y" & Y1
While IsMoving()
Wend
YHit = GetVar(2001)
Call SetLED49(AbsIncF)
If Abs(YHit - Ystart - Y1) > 0.01 Then
SafeMoveY=False
PushMSG("Error! Probe tripped during Y movement")
End If
SetOEMDRO(818,Ftmp)
Sleep(125)
End Function

Function SafeMoveZ(Z1, F1) As Boolean 'return 1 (error) if probe tripped
Dim Zstart
Dim Ftmp
Dim AbsIncF
SafeMoveZ=True
Zstart = GetDRO(2)
Ftmp = FeedRate() 'FeedRate()
AbsIncF=GetOEMLED(49)
Code "G91"
Code "F" & F1
Sleep(125)
Call WaitProbeReady()
Code "G31 Z" & Z1
While IsMoving()
Sleep(100)
Wend
ZHit = GetVar(2002)
Call SetLED49(AbsIncF)
If Abs(ZHit - Zstart - Z1) > 0.01 Then
SafeMoveZ=False
PushMSG("Error! Probe tripped during Z movement")
End If
SetOEMDRO(818,Ftmp)
Sleep(125)
End Function

Function PushMSG(Str1 As String) As Boolean
SetUserLabel (21,GetUserLabel(20))
SetUserLabel (20,GetUserLabel(19))
SetUserLabel (19,GetUserLabel(18))
SetUserLabel (18,GetUserLabel(17))
SetUserLabel (17,Str1)
Message Str1
PushMSG=True
End Function

Sub WaitProbeReady()
While GetOemLED(825)
Sleep(100)
Wend
End Sub

Sub SetLED49(Flag)
If Flag Then
Code "G91"
Sleep(125)
Else
Code "G90"
Sleep(125)
End If
End Sub
Далее отредактировал скрипт поиска Z от Михаила Юрова, добавив в него второй тач на низкой скорости.
(для просмотра содержимого нажмите на ссылку)
Rem VBScript To probe In the z axis

DoOemButton(1003)

If GetOemLed (825) <> 0 Then 'Check to see if the probe is already grounded or faulty
Code "(Z-Plate is grounded, check connection and try again)" 'this goes in the status bar if aplicable
Else
'Code "G4 P1" 'Pause 1 seconds to give time to position probe plate
Sleep 100
PlateOffset = -40.27 '<--- !!!!!!!!!!!!!! Write here you plate thickness !!!!!!!!!!!!!!
CurrentFeed = GetOemDRO(818) 'Get the current feedrate to return to later
Code "F400" 'slow down feedrate to 4 ipm
Sleep 100

Rem Probe In the z direction
ZNew = GetDro(2) - 150 'probe move to current z - 50 mm
Code "G31Z" &ZNew
While IsMoving() 'wait for probe move to finish
Wend

ZNew = GetVar(2002) 'read the touch point
Code "G0 Z" &ZNew + 2 'move back to hit point incase there was overshoot
While IsMoving ()
Wend

Rem Probe 2 In the z direction
Code "F50"
ZNew = GetDro(2) - 6 'probe move to current z - 6 mm
Code "G31Z" &ZNew
While IsMoving() 'wait for probe move to finish
Wend


If PlateOffset <> 0 Then
Call SetDro (2, PlateOffset) 'set the Z axis DRO to plate thickness
'Code "G4 P1" 'Pause for Dro to update.
Sleep 500
ZNew = PlateOffset + 2 'ZNew = plate thickness + 2 mm
Sleep 100
'ZNew = 2 ' as variant. But ZNew coordinate should be more than a thickness of a plate
Code "G0 Z" &ZNew 'put the Z retract height you want here
Code "(Z axis is now zeroed)" 'puts this message in the status bar
End If

Sleep 100
Code "F" &CurrentFeed 'Returns to prior feed rate
End If
Отдельно эти скрипты работают, но когда вставляю поиск Z перед Dim FRate1, FRate2 - выдает ошибку. Возможно нужно какой-то разделитель между ними?
efanovvp
Новичок
Сообщения: 22
Зарегистрирован: 05 июн 2021, 08:03
Репутация: 1
Настоящее имя: Vladimir
Контактная информация:

Re: Скрипты для MACH3.

Сообщение efanovvp »

Господа, здравствуйте) Помогите пожалуйста написать простой скрипт для mach3: Подняться по z до косания концевика, поехать в точку x1y1 в координатах станка, опускаться с фиксированной скоростью до косания датчика нуля по z, после косания подняться на 10 и опускаться с фиксированной скоростью до косания. Заранее спасибо)
Ответить

Вернуться в «Windows / Mach»