Приехал новый станок, у него автоматическая смена инструмента, только вот отчего-то не настроены 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
 Кто виноват и что делать?
Заранее благодарен.