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