Soft limits несовместимы с автоматической сменой инструмента?

Mach, популярные и не очень CAD, CAM. Обсуждение и разработка программ для управления станками.
wormball
Новичок
Сообщения: 31
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 1
Контактная информация:

Soft limits несовместимы с автоматической сменой инструмента?

Сообщение wormball »

Здравствуйте!

Приехал новый станок, у него автоматическая смена инструмента, только вот отчего-то не настроены Soft limits. Ну я настроил таковые, запускаю оную смену - а она останавливается ровно тогда, когда должна поехать вниз до датчика и говорит человеческим голосом:

Error on line 403 - Internal error <WaitComplete>

. Когда софт лимитов нет - то всё хорошо.

Вот собственно код смены:
(для просмотра содержимого нажмите на ссылку)

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

'**************** ATC skripta ***************** 

' * Ukljucuje i automatsko umeravanje posle odabira alata
' * Referentni alat je alat 0, neophodno je uvek na pocetku rada selektovati
' * ovaj alat da bi se izvrsilo umeravanje. Pri kasnijem selektovanju drugih
' * alata skripta ce automatski kompenzovati razliku u visini alata

Dim AX (9) As Double
Dim AY (9) As Double
Dim AZ (9) As Double

'*************** Konfiguracija pozicije svih alata *****************
' ( masinske koordinate X,Y,Z )

'***** ALAT 0 *****
 AX(0) =635 
 AY(0) = 85
 AZ(0) = -144
 
'***** ALAT 1 *****
 AX(1) = 635
 AY(1) = 85
 AZ(1) = -144
 
'***** ALAT 2 *****
 AX(2) = 775
 AY(2) = 85
 AZ(2) = -144
 
'***** ALAT 3 *****
 AX(3) = 915
 AY(3) = 85
 AZ(3) = -144
 
'***** ALAT 4 *****
 AX(4) = 1055
 AY(4) = 85
 AZ(4) = -144
 
'***** ALAT 5 *****
 AX(5) = 1195
 AY(5) = 85
 AZ(5) = -144

'***** ALAT 6 *****
 AX(6) = 1335
 AY(6) = 85
 AZ(6) = -144

'***** ALAT 7 *****
 AX(7) = 1475
 AY(7) = 85
 AZ(7) = -144

'***** ALAT 8 *****
 AX(8) = 1615
 AY(8) = 85
 AZ(8) = -144

'***** ALAT 9 *****
 AX(9) = 1755
 AY(9) = 85
 AZ(9) = -144

'***** ALAT 10 *****
 AX(9) = 1895
 AY(9) = 85
 AZ(9) = -144


 
'********* Konfiguracija ostalih parametara za ATC ************

 Yofset = 80	'razdaljina za prilaz alatu po Y

 pauza_spindle = 8000	'pauza posle deaktiviranja spindle
 pauza_cetka = 1000		'pauza posle komande za podizanje/spustanje cetke
 pauza_prihvat = 1000	'pauza posle komande za prihvatanje/otpustanje alata
 
 signal_cetka = OUTPUT10  	'signal za kontrolu cetke
 signal_prihvat = OUTPUT9	'signal za kontrolu prihvata alata
 
 feed_ulaz = 3000	'Feedrate za ulazak u nosac alata
 feed_izlaz = 4000	'Feedrate za izlazak iz nosaca alata
 
 povratak_SafeZ = 1		'0 - za povratak na Z poziciju pre pozivanja skrpite, 1 - za povratak na SafeZ
 
 
 ToolVar = 998	'varijabla u kojoj se cuva redni broj alata radi kasnijeg vracanja
 StartVar = 997 'varijable za prvo startovanje skripte
 FeedrateDRO = 818 ' OEM code for feedrate DRO
 
'*** SafeZ u masinskim koordinatama ***
 safeZ = -30

'*** Podesavanja za umeravanje alata ***

 ProbeFeed = 280 ' Feedrate to use for probing
 PlateX =350' In machine coordinates
 PlateY = 165' In machine coordinates
 ProbeZ = -300 ' Max probe depth

 poruka_prekid = "ATC script aborted"

' ******************* Kraj konfiguracije *******************
' **********************************************************

DoSpinStop()	'zaustavi spindle ako vec nije zaustavljeno

if(GetVar(StartVar)=0) Then	'ako je ovo prvo pozivanje skripte

	if(GetOemLED(807)<>0 or GetOemLED(808)<>0 or GetOemLED(809)<>0) Then	'Ref LED X,Y,Z
		ret = MachMsg("Masina nije referencirana, da li zelite nastavak rada?", "U P O Z O R E NJ E!", 4)
		if(ret <> 6 ) Then 'No, kraj rada
			Message poruka_prekid
			Code "M0"	'Program stop
			End
		End If
	End If
	
	if(GetSelectedTool()<>0) Then
		ret = MachMsg("Neophodno je prvo selektovati referentni alat (0) da bi se izvrsilo njegovo umeravanje."& Chr(10) & "Da li zelite nastavak rada?", "U P O Z O R E NJ E!", 4)
		if(ret <> 6 ) Then 'No, kraj rada
			Message poruka_prekid
			Code "M0"	'Program stop
			End
		End If
	End If
End If

Sleep(pauza_spindle)	'sacekaj da se spindle zaustavi 

tool = GetSelectedTool()	'novi selektovani alat

'if(tool<10) then
' TX = AX(tool)
' TY = AY(tool)
' TZ = AZ(tool)
'Else
' TX=TY=TZ=0
'End If

 ' Sacuvaj trenutni feedrate
 CurrentFeed1 = GetOemDRO(FeedrateDRO)

rem *** iskljuci Mach3 korekciju visine alata ***
Code "G49 G90"


rem *** visina alata iz konfiguracije Mach3 ***
'tool_h = GetToolParam(tool,2)
'TZ = TZ + tool_h


rem *** trenutna pozicija pre promene alata ***
x = GetToolChangeStart( 0 )
y = GetToolChangeStart( 1 ) 
z = GetToolChangeStart( 2 )

'Message "cur_pos={" & x & "," & y & "," & Z & ")"

'podigni cetku
ActivateSignal( signal_cetka )
Sleep (pauza_cetka)

'cur_tool = GetCurrentTool()
cur_tool = GetVar(ToolVar)-1	'trenutni alat ako postoji


if(GetVar(StartVar)=0) Then	'ako je ovo prvo pozivanje skripte
	Beep
	ret = MachMsg("Proverite da li je radna glava prazna, odnosno bez montiranog alata!" & Chr(10) & "Da li zelite nastavak rada?", "P A Z NJ A !", 4)
	
	if(ret <> 6 ) Then 'No, kraj rada
		Message poruka_prekid
		Code "M0"	'Program stop
		End	
		
	End If
End if

SetVar(StartVar, 1)




If(cur_tool >= 0) Then

	'***** Vracanje trenutnog alata *****

	'prvo podigni na SafeZ
	Code"G0G53 Z" & safeZ
	call WaitComplete

	' X,Y pozicija starog alata
	Code"G0G53  X" & AX(cur_tool)  &"Y"& AY(cur_tool)+Yofset 
	call WaitComplete
	
	'spusti po Z
	Code"G0G53 Z" & AZ(cur_tool)
	call WaitComplete
	
	'Ulaz po Y osi
	Code"G1G53 Y" & AY(cur_tool) & "F" & feed_ulaz
	call WaitComplete
	
	'Resetuj feedrate na originalnu vrednost
	Code "F" & CurrentFeed1
	call WaitComplete
	
	'Odbravi alat
	ActivateSignal( signal_prihvat )
	Sleep (pauza_prihvat)
	
	'Izadji gore po Z
	Code"G0G53 Z" & safeZ
	call WaitComplete
	
	SetVar(ToolVar,0)	'resetuj varijablu
	
End If

'***** uzimanje novog alata *****

If(tool<10 and tool>=0) Then

	'Odbravi alat (moglo bi da se uradi i malo kasnije)
	ActivateSignal( signal_prihvat )
	Sleep (pauza_prihvat)
		
	'prvo na SafeZ
	Code"G0G53 Z" & safeZ
	call WaitComplete
	
	' X,Y pozicija novog alata
	Code"G0G53 X" & AX(tool) &"Y"& AY(tool)
	call WaitComplete
	
	'spusti po Z
	Code"G0G53 Z" & AZ(tool)
	call WaitComplete
	
	'Zabravi alat
	DeactivateSignal( signal_prihvat )
	Sleep (pauza_prihvat)
	
	'Izadji po Y
	Code"G1G53 Y" & AY(tool)+Yofset & "F" & feed_izlaz
	call WaitComplete
	
	'Resetuj feedrate na originalnu vrednost
	Code "F" & CurrentFeed1
	'Sleep(250)
	call WaitComplete
	
	SetVar(ToolVar, tool+1)	'sacuvaj broj trenutnog alata
	
	SetCurrentTool( tool )

 	call AutoToolHeight	'pozovi automatsko umeravanje alata
	
	'vrati se na poziciju za obradu (pozicija pre poziva skripte)
	Code"G0 X" & x & "Y" & y
	call WaitComplete
	
	If povratak_SafeZ=0 Then
		Code"G0Z" & z
		call WaitComplete
	End If
	
	'spusti cetku
	DeactivateSignal( signal_cetka )
	Sleep (pauza_cetka)
	
Else
	' *** selektovan je nepostojeci alat, sledi kraj rada ***
	
	Code "G52 Z0"	'resetuj Z offset
	
	SetCurrentTool(0)
	
	'vrati se na Home poziciju
	
	'prvo na HomeZ
	Code"G0G53 Z0"
	call WaitComplete
	
	Code"G0G53 X0Y0"
	call WaitComplete
	
	'Zabravi alat
	DeactivateSignal( signal_prihvat )
	Sleep (pauza_prihvat)
	
End If
	

End



'************************************************************************
'********************* Procedura za umeravanje alata ********************

Sub AutoToolHeight

'Constants definition
FeedrateDRO = 818 ' OEM code for feedrate DRO
ProbeLED = 825 ' OEM code for probe input LED
ZTouchVar = 2002 ' Variable that holds Z touch position
TrefVar = 999 ' Variable to store reference tool height


' Do nothing if probe is already grounded
If GetOemLed(ProbeLED) = 0 Then

 Message "Probing..."

 ' Save current feedrate
 CurrentFeed = GetOemDRO(FeedrateDRO)
 
 ' Set absolute coordinate mode
 'Code "G90"
 
' CurrentX = GetABSPosition(0)
' CurrentY = GetABSPosition(1)
' CurrentZ = GetABSPosition(2)
 
 ' Goto safe Z
 'if(GetABSPosition(2)<safeZ) then
  Code"G0G53 Z" & safeZ
 'end if
 call WaitComplete
 
 ' Goto plate X,Y
 Code "G0G53 X" & PlateX & "Y"&PlateY
 call WaitComplete
 
 Sleep(250)
 
 'Compute Z offset
 'Zoff = GetABSPosition(2) - GetDRO(2)
 Zoff = GetOemDRO(49) + GetOemDRO(18)
 
 ' Do the touch move
 Code "G91 G31 Z" & ProbeZ & "F" & ProbeFeed
 call WaitComplete
 
 Sleep(250)
 
 Code "G90"	'Return to abs mode
 ' Reset feedrate to original value
 Code "F" & CurrentFeed
 
 ' Get the Z position where probe input triggered
 ' and convert to machine coordinates
 ZProbePos = GetVar(ZTouchVar) + Zoff
 
 
 ' Retract to safeZ
 Code "G0G53 Z" & safeZ
 call WaitComplete
 
 if (GetAbsPosition(2)=ProbeZ) then
 	Message "Probing failed!"
 	Code "M0" 'Program stop
 	End
 end if
 
 ' Auto tool height
 if tool=0 Then
  Tref = 0
  SetVar(TrefVar, ZProbePos)	'Zapamti poziciju alata 0 kao referentnu
 Else
  Tref = ZProbePos - GetVar(TrefVar)	'Izracunaj kompenzaciju visine
 End If
 
 Code("G52 Z" & Tref)	'Primeni kompenzaciju visine
 
 
 ' Return to original pos
 'Code "G0G53 X" & CurrentX & "Y" & CurrentY
 'call WaitComplete
 
 'Code "G0G53 Z" & CurrentZ
 'call WaitComplete
 
 ' Reset feedrate to original value
 Code "F" & CurrentFeed


Else
 Code "(Z-Plate is grounded, check connection and try again)"
 Code "M0"	'Program stop
End If 

End Sub

Sub WaitComplete

 ' Wait for operation to complete
 While IsMoving()
  Sleep(100)
 Wend
 
End Sub
Останавливается где-то здесь:

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

 Message "Probing..."

 ' Save current feedrate
 CurrentFeed = GetOemDRO(FeedrateDRO)
 
 ' Set absolute coordinate mode
 'Code "G90"
 
' CurrentX = GetABSPosition(0)
' CurrentY = GetABSPosition(1)
' CurrentZ = GetABSPosition(2)
 
 ' Goto safe Z
 'if(GetABSPosition(2)<safeZ) then
  Code"G0G53 Z" & safeZ
 'end if
 call WaitComplete
 
 ' Goto plate X,Y
 Code "G0G53 X" & PlateX & "Y"&PlateY
 call WaitComplete
 
 Sleep(250)
 
 'Compute Z offset
 'Zoff = GetABSPosition(2) - GetDRO(2)
 Zoff = GetOemDRO(49) + GetOemDRO(18)
 
 ' Do the touch move
 Code "G91 G31 Z" & ProbeZ & "F" & ProbeFeed
 call WaitComplete
 
То бишь Message "Probing..." выдаёт, доезжает до ху датчика и выдаёт ошибку.

Кто виноват и что делать?

Заранее благодарен.
sinkacnc
Мастер
Сообщения: 465
Зарегистрирован: 11 июл 2023, 10:35
Репутация: 36
Настоящее имя: Alexey
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение sinkacnc »

Софт лимиты не дают выполнить команду которая выходит за рамки рабочей зоны, даже если это зондирование. Считаю это кривое решение, но может я чтото не знаю. Нужно уменьшить высоту пробирования (ProbeZ) чтобы оно умещалось в софтлимите
wormball
Новичок
Сообщения: 31
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 1
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение wormball »

sinkacnc писал(а): 12 мар 2025, 09:10 Софт лимиты не дают выполнить команду которая выходит за рамки рабочей зоны, даже если это зондирование.
Спасибо, попробую. Мне казалось, что высота там и так в пределах, а сейчас посмотрел - оно там -300, тогда как лимит -200. Видимо, поэтому она один раз помяла датчик головой, когда не смогла взять инструмент и поехала калиброваться (датчики инструмента там, я так понял, вообще не подключены, хотя в шпинделе присутствуют, оттого смена инструмента превращается в лотерею). Ещё и поправку на инструмент вносит в G52, а не в tool offset. Хоть самому всё переписывай.
sinkacnc писал(а): 12 мар 2025, 09:10 Считаю это кривое решение
Я бы сказал, что кривое решение - это не говорить прямо "движение выходит за софт лимиты", а выдавать какие-то эзотерические изречения наподобие Internal error <WaitComplete> (что может пойти не так в простом ожидании?).
Аватара пользователя
neonas
Мастер
Сообщения: 383
Зарегистрирован: 12 янв 2013, 22:41
Репутация: 72
Откуда: Литва, Вильнюс
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение neonas »

При смене инструмента и замере ДЛИННЫ стандартное решение выезд за софтлимиты.
И решается просто. В макросе надо вначале отключить софтлимит, а в конце макроса опять активировать. Это стандартная практика.
Когда то лет 10 назад делал это на Маче, но сейчас точно не вспомню как. Знаю точно что это делается. Сам Мачем не пользовался уже лет 15.
Поройся в интернете, точно найдешь решение.
Как много тех, с кем можно лечь в постель.
Как мало тех, с кем хочется проснуться...
Аватара пользователя
neonas
Мастер
Сообщения: 383
Зарегистрирован: 12 янв 2013, 22:41
Репутация: 72
Откуда: Литва, Вильнюс
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение neonas »

wormball писал(а): Кто виноват и что делать?
Нашел в архиве у себя
Деактивация -

'Turns Soft Limits Off
If GetOEMLED(23) Then
DoOEMButton(119)
End if


И включение назад

'Turns Soft Limits On
DoOEMButton(119
)

Решение довольно кривое, так как работает через интерфейс. Но тогда клиент был доволен.
Как много тех, с кем можно лечь в постель.
Как мало тех, с кем хочется проснуться...
wormball
Новичок
Сообщения: 31
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 1
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение wormball »

В общем с третьей попытки получилось.
neonas писал(а): При смене инструмента и замере ДЛИННЫ стандартное решение выезд за софтлимиты.
Ну скажем так, там датчик прямо к столу прикручен и довольно высоко выдаётся, так что в настоящем случае это ни к чему. К тому же ежели уехать ниже -200, то в голове что-то хрустит, только я так и не понял, что именно.
Аватара пользователя
neonas
Мастер
Сообщения: 383
Зарегистрирован: 12 янв 2013, 22:41
Репутация: 72
Откуда: Литва, Вильнюс
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение neonas »

wormball писал(а): Ну скажем так, там датчик прямо к столу прикручен и довольно высоко выдаётся, так что в настоящем случае это ни к чему. К тому же ежели уехать ниже -200, то в голове что-то хрустит, только я так и не понял, что именно.
Я думаю, что расположение датчика в рабочей зоне неправильно. В него же со всего размаха въехать можно. Но это, как говорится, как кому нравится.
Как много тех, с кем можно лечь в постель.
Как мало тех, с кем хочется проснуться...
wormball
Новичок
Сообщения: 31
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 1
Контактная информация:

Re: Soft limits несовместимы с автоматической сменой инструмента?

Сообщение wormball »

neonas писал(а): 13 мар 2025, 09:49 Я думаю, что расположение датчика в рабочей зоне неправильно. В него же со всего размаха въехать можно.
Согласен. Более того, ежели из немного неправильной точки дать команду на смену инструмента - то голова проходит по подвешенным инструментам, как по кеглям.

Только есть одно маленькое но. Даже два. Во-первых, станок не мой, а посему у меня нет карт-бланша на его доработку. Я и так уже несколько превысил свои полномочия, например, с теми же софт лимитами. А так-то была бы моя воля - я бы только и делал, что улучшал станок вместо того, чтобы строгать на нём унылую мебель.

А во-вторых, когда я искал макросы на смену инструмента и измерение его длины для мача - мне встречались разве что посты в формате "один анонимус спросил - другой анонимус запостил простыню кода", причём простыни все разные, и ни у одной нет сколько-либо внятного описания. Вот ежели была бы хотя бы какая-то одна реализация, на которую бы ссылались более одного человека (а ещё лучше более двух), да с документацией - то можно было бы ей поверить и рискнуть поставить на чужой станок, хоть и сломав в процессе несколько держателей для инструмента. Но увы, в интернете одни коты в мешке. Вот и авторы станка, видимо, увидели приблизительно это же и тоже решили написать свой велосипед, и получилось это у них, прямо скажем, на любителя. Мне хочется думать, что у меня бы получилось лучше, но проверить это пока что нет возможности.
Ответить

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