LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

W temacie przedstawiam poradnik jak dodać przycisk pomiaru długości narzędzia do LinuxCNC.

Dyskusje dotyczące działania obsługi programu LinuxCNC

kamar
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 10
Posty: 12489
Rejestracja: 18 wrz 2010, 06:17
Lokalizacja: Kozienice
Kontakt:

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#11

Post napisał: kamar » 20 sty 2020, 05:52

Nie wiem , nie znam się, czujnik długości narzędzia bez automatycznej wymiany to dla mnie bezsens. Ale jeśli już to nie w G53.
Baza maszynowa jest stała, święta i zgodna z fizyczną.


:)


lepi
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 4
Posty: 763
Rejestracja: 09 lip 2012, 20:34
Lokalizacja: Poznań

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#12

Post napisał: lepi » 20 sty 2020, 09:15

Amen

Dodane 24 minuty 22 sekundy:
A ponieważ softlimity odnoszą się do bazy maszynowej to powinny zawsze działać poprawnie.

I jeszcze jedna uwaga, jeśli kładziemy czujnik na materiale to mierzymy bazę materiałową. Oczywiście możemy to sobie potem przeliczyć na co chcemy.
Nie tak dawno poprawiałem po kimś skrypty na "firmowym" ploterze. Zamiast używać tabeli narzędzi (były tylko dwa, mocowane na stałe) i baz materiałowych całość była obsługiwane przez przesunięcia osi. No i nie działało i nie dało się poprawić. Zrobić od nowa owszem.


gniazdo
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 1
Posty: 57
Rejestracja: 24 gru 2008, 22:09
Lokalizacja: Limanowa

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#13

Post napisał: gniazdo » 20 sty 2020, 10:26

ja używam tego i działa według mnie tak jak powinno:

Kod: Zaznacz cały

O<tool-change> SUB
( Filename: tool-change.ngc )
( LinuxCNC Manual Tool-Change Subroutines for Milling Machines version 1.1: subroutine 1/2 )
(  BEFORE USING CHANGE "CONFIGURATION PARAMETERS" BELOW FOR YOUR MACHINE! )
(  )
( In the LinuxCNC .ini config file, under the [RS274NGC] section add: )
(    # change/add/use SUBROUTINE_PATH to point to the location where these tool-change subroutines are located: )
(    SUBROUTINE_PATH = /home/linuxcnc/linuxcnc/nc_files )
(    REMAP=M6    modalgroup=6 ngc=tool-change )
(    REMAP=M600  modalgroup=6 ngc=tool-job-begin )
( and under the [EMCIO] section add: )
(    TOOL_CHANGE_AT_G30 = 0 )
( and ensure neither TOOL_CHANGE_POSITION nor TOOL_CHANGE_QUILL_UP is set. )
(  )
( In the LinuxCNC .hal config file, map some input pin to be the probe input, e.g.: )
(    net probe-z parport.0.pin-12-in => motion.probe-input )
(  )
( Usage: M6 in the g-code will invoke a manual tool change with automatic tool height adjustment. )
(        M600 is used at the beginning of the first g-code file of a job so that the next M6 will measure the tool for reference )
(             instead of caluculating a tool length offset. It can also be invoked manually through the MDI before a job starts. )
(  )
( General theory of operation: touches each tool off to the tool height sensor. The first tool is used as the reference, all )
(     subsequent tools adjust the tool offset. The tip of the tool is always placed back at the position it started in before )
(     any of the subroutines are called. It is moved away by raising Z to _TravelZ before moving towards the switch, and when )
(     moving back from the switch again moves at height _TravelZ before going straight back down to the original position. Set )
(     all necessary modes to ensure correct operation no matter what state the program is in when this is called. We eliminate )
(     almost all side effects by saving and restoring the modal state. )
(  )
( Side effects: sets G30, sets motion mode to G1. )

(------------------------------- CONFIGURATION PARAMETERS ----------------------------------------------)
#<_UseInches> =           0     ( set to 1 to use inches here, or 0 to use millimeters; should match units on tool.tbl dimensions )
#<_TravelZ> =          41.0     ( machine Z coordinate for travelling, typically near max Z to avoid ever hitting the work )
#<_TravelFeed> =     1000.0     ( feedrate used for general Z moves when avoiding G0 )
#<_ProbeX> =          145.0     ( machine X coordinate of switch/touch-off plate )
#<_ProbeY> =            0.0     ( machine Y coordinate of switch/touch-off plate )
#<_ProbeFastZ> =        5.0     ( machine Z coord to move to before starting probe, longest tool should not touch switch at this Z )
#<_ProbeMinZ> =       -37.0     ( machine Z coord to stop probe, shortest tool must touch switch at this Z, must be > min Z )
#<_ProbeRetract> =      1.5     ( small distance to retract before approaching switch/touch-off plate second time )
#<_ProbeFastFeed> =   400.0     ( feed rate for moving to _ProbeFastZ )
#<_ProbeFeed1> =       80.0     ( feed rate for touching switch/touch-off plate first time )
#<_ProbeFeed2> =       10.0     ( feed rate for touching switch/touch-off plate second time )
#<_ToolChangeX> =       0.0     ( machine X coordinate to pause at for manual tool changing )
#<_ToolChangeY> =     -50.0     ( machine Y coordinate to pause at for manual tool changing )
#<_MistOnDuringProbe> =   1     ( set to 1 for mist, or 2 for coolant, or 0 for nothing during probing, to clear switch of swarf )
(-------------------------------------------------------------------------------------------------------)

O100 IF [ EXISTS[#<_ToolDidFirst>] EQ 0 ]
        #<_ToolDidFirst> = 0
O100 ENDIF
O105 IF [ #<_ToolDidFirst> EQ 0 ]
   G49                                         ( clear tool length compensation prior to saving state if this is first time )
O105 ENDIF

M6                                             ( do the normal M6 stuff )
M70                                            ( save current modal state )

M9                                             ( turn off coolant, will be restored on return if it was on )
M5                                             ( turn off spindle, cannot be on during the probe )
G[21 - #<_UseInches>]                          ( use inches or millimeters as required here, units will be restored on return )
G30.1                                          ( save current position in #5181-#5183... )
G49                                            ( clear tool length compensation )
G90                                            ( use absolute positioning here )
G94                                            ( use feedrate in units/min )
G40                                            ( turn cutter radius compensation off here )

O200 IF [ #<_ToolDidFirst> EQ 0 ]
  G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>]      ( go to high travel level on Z )
  G53 G0 X[#<_ProbeX>] Y[#<_ProbeY>]           ( to probe switch )
  G53 G1 F[#<_ProbeFastFeed>] Z[#<_ProbeFastZ>]( move tool closer to switch -- we shouldn't hit it )
  G54 G1 F[#<_ProbeFeed1>] G91                 ( use relative positioning )
  O101 IF [ #<_MistOnDuringProbe> EQ 1 OR #<_MistOnDuringProbe> EQ 2 ]
    M[7 + #<_MistOnDuringProbe> - 1]           ( turn on mist/coolant )
  O101 ENDIF
  G38.2 Z[#<_ProbeMinZ> - #<_ProbeFastZ>] F[#<_ProbeFeed1>]    ( trip switch slowly )
  G0 Z[#<_ProbeRetract>]                       ( go up slightly )
  G38.2 Z[#<_ProbeRetract>*-1.25] F[#<_ProbeFeed2>]   ( trip switch very slowly )
  M9                                           ( turn off mist )
  G90                                          ( use absolute positioning )
  #<_ToolZRef> = #5063                         ( save trip point )
  #<_ToolZLast> = #<_ToolZRef>                 ( save last tool Z position )
  G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>]      ( return to safe level )
  G53 G0 X[#5181] Y[#5182]                     ( return to where we were in X Y)
  G53 G1 F[#<_TravelFeed>] Z[#5183]            ( return to where we were in Z )
  M72                                          ( restore modal state )
  #<_ToolDidFirst> = 1                         ( we have been in this section to set reference value already )
O200 ELSE
  G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>]      ( go to high travel level on Z )
  G53 G0 X[#<_ToolChangeX>] Y[#<_ToolChangeY>] ( nice place for changing tool )
  O107 IF [#<_UseInches> EQ 1 ]
    #<ToolDiamIn> = #5410
    #<ToolDiamMM> = [ #<ToolDiamIn> * 25.4 ]
  O107 ELSE
    #<ToolDiamMM> = #5410
    #<ToolDiamIn> = [ #<ToolDiamMM> / 25.4 ]
  O107 ENDIF
  O102 IF [ #<_current_tool> EQ 0 AND #<ToolDiamIn> EQ 0 ]
    (MSG, Change tool then click Resume )
  O102 ELSE
    #<ToolDiamMM> = [ #<ToolDiamIn> * 25.4 ]
    (DEBUG, Change to tool #<_current_tool> with diameter #<ToolDiamMM>mm, #<ToolDiamIn>in then click Resume )
  O102 ENDIF
  M0                                           ( pause execution )
 
  G53 G0 X[#<_ProbeX>] Y[#<_ProbeY>]           ( to high place directly over switch )
  G53 G1 F[#<_ProbeFastFeed>] Z[#<_ProbeFastZ>]( move tool closer to switch -- we shouldn't hit it )
  G54 G1 F[#<_ProbeFeed1>] G91                 ( use relative positioning )
  O103 IF [ #<_MistOnDuringProbe> EQ 1 OR #<_MistOnDuringProbe> EQ 2 ]
    M[7 + #<_MistOnDuringProbe> - 1]           ( turn on mist/coolant )
  O103 ENDIF
  G38.2 Z[#<_ProbeMinZ> - #<_ProbeFastZ>] F[#<_ProbeFeed1>]     ( trip switch slowly )
  G0 Z[#<_ProbeRetract>]                       ( go up slightly )
  G38.2 Z[#<_ProbeRetract>*-1.25] F[#<_ProbeFeed2>]   ( trip switch very slowly )
  M9                                           ( turn off mist )
  G90                                          ( use absolute positioning )
  #<_ToolZ> = #5063                            ( save new tool length )
  G43.1 Z[#<_ToolZ> - #<_ToolZRef>]            ( set new tool length Z offset, we do this now to show operator even though it has to be set again after M72 )
  G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>]      ( return to high travel level )
  G53 G0 X[#5181] Y[#5182]                     ( return to where we were in X Y)
  G53 G1 F[#<_TravelFeed>] Z[#5183 - #<_ToolZLast> + #<_ToolZ>]   ( return to where we were in Z, ajusting for tool length change )
  #<_ToolZLast> = #<_ToolZ>                    ( save last tool length )
  
  M72                                          ( restore modal state )
  G43.1 Z[#<_ToolZ> - #<_ToolZRef>]            ( set new tool length Z offset )
O200 ENDIF

O<tool-change> ENDSUB
M2
kamar pisze:Nie wiem , nie znam się, czujnik długości narzędzia bez automatycznej wymiany to dla mnie bezsens

nie zgodzę się z tym stwierdzeniem, jak masz program na kilka narzędzi to jednak bardzo to ułatwia sprawę i oszczędza trochę czasu.

Awatar użytkownika

Autor tematu
drzasiek90
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 34
Posty: 133
Rejestracja: 25 kwie 2016, 11:58
Lokalizacja: Jodlowa
Kontakt:

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#14

Post napisał: drzasiek90 » 20 sty 2020, 11:18

Poradnik miał na celu zapisanie procedury jak dodać obsługę pomiaru długości narzędzia do LinuxCNC. Co zostanie zapisane w pliku (w tym przypadku) wymiana_narzedzia.ngc zależy od tego jakie mamy potrzeby.
Kod który ja wrzuciłem, to kod znaleziony w sieci. Kod który "działa", ale jak sami zauważyliście (istotnie, mi to umknęło) przesuwa on wszystkie układy współrzędnych (niestety włącznie z G53 którego ruszać się nie powinno). Nie wiem czemu byłem przekonany, że G92 przesuwa tylko układy względne, stąd nie mogłem załapać o co wam chodzi mówiąc o problemie z dużą różnicą w długości narzędzia. Postaram się go przerobić i wrzucić kod który tego nie robi (o ile będę miał możliwość edytowania pierwszego postu).

Co do pomiaru długości narzędzia w maszynie bez automatycznego pomiaru. Dlaczego miałoby to być bez sensu? Miałem maszynę bez pomiaru długości narzędzia i mam maszynę z pomiarem, obydwie posiadają wrzeciona z manualną wymianą narzędzia. Rzadko zdarza się, żeby detal wymagał tylko jednego narzędzia, a odczuwam ogromną różnicę z tą procedurą. Mam przygotowany postprocesor, każda wymiana jest sygnalizowana, otrzymuję informację jakie narzędzie zamontować. Sama wymiana i pomiar trwa kilkadziesiąt sekund i maszyna rusza dalej do pracy.


lepi
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 4
Posty: 763
Rejestracja: 09 lip 2012, 20:34
Lokalizacja: Poznań

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#15

Post napisał: lepi » 20 sty 2020, 12:01

No właśnie przy braku automatycznej wymiany czujnik jest przydatny najczęściej bo po każdej wymianie. Z magazynem używa się tylko przy dokładaniu narzędzi a i to niekoniecznie. Ja mierze na stanowisku pomiarowym poza maszyna.
Jak się mocuje narzędzie ręcznie we wrzecionie to jak inaczej mierzyć?

Awatar użytkownika

senio
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 4
Posty: 810
Rejestracja: 25 maja 2006, 14:39
Lokalizacja: koło.wlkp

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#16

Post napisał: senio » 20 sty 2020, 13:16

lepi pisze:
20 sty 2020, 12:01
Jak się mocuje narzędzie ręcznie we wrzecionie to jak inaczej mierzyć?
Prosta procedurka. Moja płytka PCB z przylutowanym kabelkiem ma 1.62 mm grubości. Można to przerobić na sub , dopisać to w kodzie, wczytać do ngcgui i będzie pod jednym kliknięciem. Można jako *.ngc wczytywać. Edytować tylko pod grubość swojej płytki parametr [#5063+8.38]. W moim przypadku grubość płytki 1.62 + 8.38 ma dać razem = 10 mm, bo na tyle odjeżdża po pomiarze i tak ustawiam offset. Kilka lat używam i działa bezbłędnie.

Kod: Zaznacz cały

%
G21
G91 G38.2 F100 Z-15
G90 G1 F10 Z[#5063+0.05]
G91 G38.2 F10 Z-0.06
G90 G1 F300 Z[#5063+8.38]
(debug,Ruch zakończony. Narzędzie jest 10mm nad materiałem. Offset Z = +10)
%

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3391
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#17

Post napisał: tuxcnc » 20 sty 2020, 14:12

lepi pisze:
20 sty 2020, 12:01
Jak się mocuje narzędzie ręcznie we wrzecionie to jak inaczej mierzyć?
Można wcale nie mierzyć, na co znam dwie metody.
Pierwsza to pierścień zaciśnięty na części chwytowej wiertła/freza.
Druga to zderzak wewnątrz wrzeciona.
W obydwu przypadkach narzędzia nie da się włożyć głębiej, więc wystarczy wepchnąć do oporu, zacisnąć, i można spokojnie korzystać z tabeli narzędzi.


kamar
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 10
Posty: 12489
Rejestracja: 18 wrz 2010, 06:17
Lokalizacja: Kozienice
Kontakt:

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#18

Post napisał: kamar » 20 sty 2020, 14:15

senio pisze:
20 sty 2020, 13:16
Kilka lat używam
A ja nie i nie pozwalam używać :) I jakoś się obywają :)
Robotę trzeba robić a nie celebrować przygotowywanie.
:)

Awatar użytkownika

Autor tematu
drzasiek90
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 34
Posty: 133
Rejestracja: 25 kwie 2016, 11:58
Lokalizacja: Jodlowa
Kontakt:

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#19

Post napisał: drzasiek90 » 20 sty 2020, 14:41

Tak się przejąłem tym bublem w moim kodzie, że skleciłem nową procedurę (bardzo prostą) do wspomagania wymiany i pomiaru długości narzędzia, na podstawie mojego wcześniejszego programu jak i programu wrzuconego przez kolegę gniazdo. Wieczorem sprawdzę na maszynie. Tymczasem wrzucam, może komuś będzie się chciało rzucić okiem i wyłapie błędy.
Tutaj kod, ale edytor tutaj strasznie go rozwala:

Kod: Zaznacz cały

O <wymiana_narzedzia> sub

O100 IF [ EXISTS[#<_FirstTool>] EQ 0 ]											(Jeśli nie istnieje parametr (flaga) <_FirstTool>)
	#<_FirstTool> = 0															(Tworzy flagę <_FirstTool> i przypisuje jej wartość 0)
O100 ENDIF

O105 IF [ #<_FirstTool> EQ 0 ]													(Jeśli flaga <_FirstTool> jest równa 0) 
	G49                                         								(Anuluje kompensację narzędzia)
O105 ENDIF

M70																				(Zapisuje aktualny stan)
G21																				(Jednostką odległości są [mm])
G94                                            									(Jednostką ruchu jest [jednostka/min])
G90																				(Programowanie absolutne)
G53 G0 Z0																		(Podnosi oś Z do bezpiecznej wysokości - w tym przypadku maksymalna wysokość = 0)
G53 G0 X#<_ini[TOOL_CHANGE_POS]X> Y#<_ini[TOOL_CHANGE_POS]Y>					(Przesówa w osi X i Y do zdefiniowanego punktu wymiany narzędzia)
G53 G0 Z#<_ini[TOOL_CHANGE_POS]Z>												(Przesówa w osi Z do zdefiniowanego punktu wymiany narzędzia)
M100 P0																			(Wyświetla komunikat aby zamontować/zmienić narzędzie. Czeka na kliknięcie "Kontynuuj")
G53 G0 Z0																		(Podnosi oś Z do bezpiecznej wysokości - w tym przypadku maksymalna wysokość = 0)																
G53 G0 X#<_ini[TOOLSENSOR]X> Y#<_ini[TOOLSENSOR]Y>								(Przesówa w osi X i Y do zdefiniowanego punktu pomiaru długości narzędzia)
G53 G0 Z#<_ini[TOOLSENSOR]Z>													(Przesówa w osi Z do zdefiniowanego punktu pomiaru długości narzędzia)
M100 P1																			(Wyświetla komunikat aby zamontować czujnik. Czeka na kliknięcie "Kontynuuj")
G91																				(Programowanie przyrostowe)

O200 IF [ #<_FirstTool> EQ 0 ]													(Jesli pomiar pierwszego narzędzia)
	G38.3 Z-#<_ini[TOOLSENSOR]MAX_CHANGE> F50									(Obniża narzędzie do momentu kontaktu)
G38.4 Z10 F1																	(Podnosi narzędzie do utracenia kontaktu)
#<_FirstMeasureZ> = #5063    													(Zapisuje wynik pierwszego pomiaru w osi Z)
#<_FirstTool> = 1 																(Ustawia flage <_FirstTool>)
O200 ELSE																		(Jesli pomiar kolejnego narzedzia)
  	G38.3 Z-#<_ini[TOOLSENSOR]MAX_CHANGE> F50									(Obniża narzędzie do momentu kontaktu)
	G38.4 Z10 F1																(Podnosi narzędzie do utracenia kontaktu)
	#<_ActualMeasureZ> = #5063   												(Zapisuje wynik aktualnego pomiaru w osi Z)
	G43.1 Z[#_ActualMeasureZ> - #<_FirstMeasureZ>]								(Ustawia dynamicznie offset długości aktualnego narzędzia -działa do momentu wystąpienia M72)
O200 ENDIF

G90																				(Programowanie absolutne)
G53 G0 Z#<_ini[TOOLSENSOR]Z>													(Podnosi oś Z do zdefiniowanego punktu czujnika)
M100 P2																			(Wświetla komunikat aby zdemontować/zabezpieczyć czujnik)
G53 G0 Z #<_ini[AFTER_CHANGE_POSITION]z>										(Przesówa oś Z do zdefiniowanego punktu po wymianie narzędzia)
G53 G0 X #<_ini[AFTER_CHANGE_POSITION]x> Y #<_ini[AFTER_CHANGE_POSITION]y>		(Przesówa oś X,Y do zdefiniowanego punktu po wymianie narzędzia)
M72																				(Przywraca zapisany stan)
G43.1 Z[#_ActualMeasureZ> - #<_FirstMeasureZ>]									(Ponownie ustawia dynamicznie offset długości aktualnego narzędzia)

O <wymiana_narzedzia> endsub
m2

Aby lepiej się czytało wrzucam też obrazek.
kod.png

Awatar użytkownika

senio
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 4
Posty: 810
Rejestracja: 25 maja 2006, 14:39
Lokalizacja: koło.wlkp

Re: LinuxCNC - pomiar długości narzędzia - instrukcja jak skonfigurować

#20

Post napisał: senio » 20 sty 2020, 15:24

kamar pisze:
20 sty 2020, 14:15
A ja nie i nie pozwalam używać :) I jakoś się obywają :)
Ja nie potrafię :)

drzasiek90 pisze:
20 sty 2020, 14:41

Tutaj kod, ale edytor tutaj strasznie go rozwala:
https://gedit.softonic.pl/

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „LinuxCNC (dawniej EMC2)”