41) G65, G66, G66.1, G67 Wywołanie Makra

Żeby zrozumieć do czego służą tytułowe kody, musisz najpierw dowiedzieć się czym są zmienne lokalne oraz czym jest program Makro. Poniżej linki do wszystkich powiązanych artykułów.

Program makro to podprogram, ale nie taki zwykły jest on level wyżej . Ale najpierw wymienię cechy wspólne, a dopiero potem różnice i sam będziesz mógł je porównać.

Cechy wspólne

  • Zawsze są zaangażowane przynajmniej dwa programy. Program główny i podprogram/Program Makro.
  • W obydwóch przypadkach program główny wywołuje podprogram/Program Makro
  • Oba mają swoje numery i są za ich pomocą wywoływane
  • Po wywołaniu stają się środowiskiem podrzędnym dla środowiska nadrzędnego, którym jest program główny.
  • Podprogramy tak samo jak programy makro mogą być wywołane nie tylko przez program główny ale również za pomocą innego podprogramu/Programu Mackro.
  • W obu przypadkach, podprogram tak samo jak program Makro zawiera specjalne, powtarzające się dane takie jak np. ścieżka narzędzia lub określony wzór otworów.
  • Oba kończą się kodem M99

No dobra skoro jest tyle podobieństw to jaka jest różnica?

Główną różnicą jest elastyczność.

  • Podprogramy używają stałych danych, których nie da się zmienić.
  • Programując programy Makro używamy elastycznych danych. Robi się to za pomocą zmiennych. Z ich pomocą można bardzo szybko określić wartości przejazdów, ale również bardzo łatwo można je zmieniać

Kolejną różnicą jest sposób wywołania.

  • Podprogramy wywołuje się za pomocą funkcji M98 P…. Gdzie P to numer podprogramu.
  • Programy Makro wywołuje się naszą funkcją tytułową G65 P…. Gdzie P to numer programu Makro.
  • Wywołując podprogramy nie trzeba wpisywać dodatkowych danych
  • Wywołując programy Makro trzeba dopisać dodatkowe dane po numerze programu.
Kanałek Detal 1

Tak wygląda podprogram na nasz kanałek

O100
(KANALEK CZOLOWY FI60, L10)
G0 X59
Z1
G1 Z-6 F0.1
G0 Z1
X53
G1 Z-7.8
G0 Z1
X49
G1 Z-6
G0 Z1
X44
G1 Z0 F0.2
G3 X48 Z-2 R2
G1 Z-6
G2 X52 Z-8 R2
G1 X55
G0 Z1
X64
G1 Z0
G2 X60 Z-2 R2
G1 Z-6
G3 X56 Z-8 R2
G1 X54
G0 Z10
M99

A to jest wywołanie tego podprogramu z poziomu programu głównego

O300
(NOZ DO KANALKOW CZOLOWY 4MM)
T0303 G55
G96 S40 M3
M98 P100            (wywołanie podprogramu O100)
G28 U0 W0
M30

Teraz taki sam kształt określę w programie Makro za pomocą zmiennych

O9000
(KANALEK CZOLOWY  L10)
G0 X=[59+#24]
Z1
G1 Z=[-6-#26] F=[#9]
G0 Z1
X=[53+#24]
G1 Z[-7.8-#26]
G0 Z1
X=[49+#24]
G1 Z[-6-#26]
G0 Z1
X=[44+#24]
G1 Z0 F=[[#9*2]
G3 X=[48+#24] Z-2 R2
G1 Z=[-6-#26]
G2 X=[52+#24] Z=[-8-#26] R2
G1 X=[55+#24]
G0 Z1
X=[64+#24]
G1 Z0
G2 X=[60+#24] Z-2 R2
G1 Z=[-6-#26]
G3 X=[56+#24] Z=[-8-#26] R2
G1 X=[54+#24]
G0 Z10
M99

Tak się wywołuje program Makro z poziomu programu głównego

O300
(NOZ DO KANALKOW CZOLOWY 4MM)
T0303 G55
G96 S40 M3
G65 P9000 L1 X0 Z0 F0,1            (wywołanie makra O9000)
G28 U0 W0
M30

Dzięki naszemu programowi Makro możemy wykonać taki kanałek jak na rysunku. Mało tego, możemy wykonać taki kanałek na dowolnej średnicy, mający dowolną głębokość. Niezły bajer co nie?

Jak to działa?

Załóżmy, że zamiast głębokości 8mm kanałek będzie miał 13mm, a średnica to 160mm zamiast 60mm.

Nie trzeba pisać całego programu od nowa. Przecież kształt jest ten sam. Wystarczy zmienić 2 parametry w programie głównym.

O300
(NOZ DO KANALKOW CZOLOWY 4MM)
T0303 G55
G96 S40 M3
G65 P9000 L1 X100 Z5 F0,1            (wywołanie makra O9000)
G28 U0 W0
M30

I tym prostym sposobem w 2 sekundy zrobiliśmy program na nowy element.

Ja podaje przykłady z tokarki, ale z powodzeniem możesz to stosować na frezarce przy obróbce dowolnych kanałków stempli, czy otworów itd.

Skąd wiadomo która litera odpowiada której zmiennej? Specjalnie w tym celu wklejam tu tabelkę z przyporządkowanymi literami.

Lista 1

Argument dla Listy 1Zmienna lokalna
A#1
B#2
C#3
D#7
E#8
F#9
H#11
I#4
J#5
K#6
M#13
Q#17
R#18
S#19
T#20
U#21
V#22
W#23
X#24
Y#25
Z#26

Lista 2

Argument dla Listy 2Zmienna lokalna
A#1
B#2
C#3
I1#4
J1#5
K1#6
I2#7
J2#8
K2#9
I3#10
J3#11
K3#12
I4#13
J4#14
K4#15
I5#16
J5#17
K5#18
I6#19
J6#20
K6#21
I7#22
J7#23
K7#24
I8#25
J8#26
K8#27
I9#28
J9#29
K9#30
I10#31
J10#32
K10#33

Jak widzisz wrzuciłem dwie listy. Większość maszyn pracuje na liście nr1. Ale oczywiście nie jest to regułą.

Chyba trochę naświetliłem sprawę co nie? A może dalej masz więcej pytań niż odpowiedzi?

G65 P... L... ARGUMENTY

Gdzie

  • G65 – Wywołanie programu Makro
  • P – Numer programu Makro
  • L – Liczba powtórzeń programu Makro
  • Argumenty – Zmienne lokalne wysłane do Makra

Przykład

G65 P9000 L2 A300 B200 F50 S200

W tym przykładzie

  • wywołałem program nr 9000 (P9000
  • będzie on powtórzony 2 razy (L2)
  • Przypisałem wartość 300 do zmiennej lokalnej A (#1) i wysłałem do programu 9000
  • Przypisałem wartość 200 do zmiennej lokalnej B (#2) i wysłałem do programu 9000
  • Przypisałem wartość 50 do zmiennej lokalnej F (#9) i wysłałem do programu 9000
  • Przypisałem wartość 200 do zmiennej lokalnej S (#19) i wysłałem do programu 9000

Teraz pewnie się zastanawiasz po co jest funkcja G66 i G67.

Nie jest łatwo wyjaśnić G66 w 1 zdaniu.

Ponownie posłużę się przykładem. W ten sposób myślę, że najlepiej wchodzi do głowy.

Przykład:

Zakładam że otwory są już wykonane. Pozostało wykonanie gwintów. Nie wykonam ich za pomocą standardowej funkcji gwintowania G84. Zastosuję technikę stosowaną przy drobnych gwintach w miękkich materiałach. Czyli wolniejszy posuw na wejściu i szybszy na wyjściu. Dzięki temu unika się zacięć podczas operacji.

Tak wygląda mój program makro

O8000
(GWINTOWANIE 4 OTWORY)
G0 G90 Z2 S#19 M3
G1 Z-[ABS[#26]] F[#9*0,8] M5
S#19 M4
G1Z2 F[#9*1,2]
M5
M99

Na pierwszy strzał idzie G65

T01 M6 G54
G0 X10 Y10           Najazd nad 1 otwór
G43 H07 G0 Z10
G65 P8000 Z10 F425 S850   Otwór 1
G0 X20 Y20               Najazd na otwór nr 2
G65 P8000 Z10 F425 S850   Otwór 2
G0 X40 Y40               Najazd na otwór nr 3
G65 P8000 Z10 F425 S850   Otwór 3
G0 X60 Y60               Najazd na otwór na 4
G65 P8000 Z10 F425 S850   Otwór 4
Z50                  Koniec gwintowania
M1
 

A teraz to samo tylko z wykorzystaniem G66

T01 M6 G54
G0 X10 Y10           Najazd nad 1 otwór
G43 H07 G0 Z10
G66 P8000 Z10 F425 S850   Otwór 1
G0 X20 Y20               Najazd i wykonanie otworu nr 2
G0 X40 Y40               Najazd i wykonanie otworu nr 3
G0 X60 Y60               Najazd i wykonanie otworu nr 4
G67                      Odwołanie funkcji G66
G0 Z50                   Koniec gwintowania
M1

Wygląda podobnie ale jest jedna zasadnicza różnica: G65 jest funkcją niemodalną . G66 Jest funkcją modalną.

Każdy blok w którym jest zapisany ruch osi po G66 będzie wywoływał program makro do momentu wpisania G67.

G67– Odwołanie funkcji G66

Dlatego G65 raczej stosuje się przy pojedynczych elementach, a G66 przy szeregu. W moim przykładzie był to ciąg gwintów.

Na dokładkę mam jeszcze jedną funkcję G66.1 (niedostępna w niektórych maszynach).

Działa ona podobnie jak G66 z tą różnicą, że makro jest wywoływane po dowolnej komendzie, w każdym następnym bloku po G66.1 do momentu odwołania za pomocą G67.

No dobra tyle na dzisiaj mam nadzieję przedstawiłem wszystko w sposób łatwy do przyswojenia. Jeśli chcesz się podzielić spostrzeżeniami, zapraszam do komentowania. No i oczywiście nie zapomnij zapisać się do newslettera.

Pozdrawiam PrzemoCNC

40) Zmienne lokalne

Witam ponownie. Dalej jesteśmy w temacie programowania za pomocą zmiennych,a to jest kolejny artykuł poświęcony tej tematyce. Poniżej znajdują się linki do wszystkich.

Dzisiaj porozmawiamy o zmiennych lokalnych.

Zastanawiam się do czego je porównać, żebyś zrozumiał ich działanie.

Kalkulator.

Pamięć kalkulatora to takie zmienne lokalne. Coś jak pamięć podręczna. Licząc na kalkulatorze wpisujemy cyfry (zmienne lokalne) wykonujemy na nich działania (programy Macro). Gdy skończymy nasze obliczenia wciskamy przycisk CE, lub C i nasze obliczenia oraz pamięć są wyzerowane. Identycznie jest ze zmiennymi lokalnymi Po ich użyciu nie są już potrzebne i zostają wyzerowane. Jest kilka sposobów na wyzerowanie zmiennych lokalnych:

  • Naciśnięcie przycisku Reset
  • Naciśnięcie przycisku awaryjnego (czerwony grzyb)
  • Wczytanie kodu M30
  • Wczytanie kodu M99
  • Ręczne wyzerowanie zmiennej
#1=200       Przypisanie wartości 200 dla parametru #1
------
G1 Z#1       Wykonanie ruchu przy pomocy zmiennej 
------
#1=#0        Wyzerowanie zmiennej #1

Jako, że zmienna #0 ma zawsze wartość zerową, zrównanie go z naszym parametrem zeruje wartości zapisane w tabeli przy #1.

Zmienne lokalne przenoszą dane wpisane przez programistę do szkieletu Macro. Czym on jest? Zobaczysz w przykładach. Zmienne są bezpośrednio przypisane do danego Macra i nie mogą być pomiędzy nimi transferowane. W programach Macro każda zmienna lokalna ma przypisaną konkretną literę z alfabetu angielskiego.

Dwie listy argumentów

Lista 1 – Składa się tylko z 21 zmiennych , którym przypisano litery. To ta lista jest używana przez większość maszyn i zapewniam Cię, że ta ilość jest w zupełności wystarczająca.

Argument dla Listy 1Zmienna lokalna
A#1
B#2
C#3
D#7
E#8
F#9
H#11
I#4
J#5
K#6
M#13
Q#17
R#18
S#19
T#20
U#21
V#22
W#23
X#24
Y#25
Z#26

Tak wiem nie są odpowiednio przyporządkowane. Dlaczego tak jest? Nie mam pojęcia.

Dwie tajemnice

1 Co z pozostałymi zmiennymi? Przecież zostało jeszcze 12 miejsc którym nie została przyporządkowana żadna litera.

#10, #12, #14, #15, #16, #27, #28, #29, #30, #31, #32 i #33.

Nadal możesz ich zdefiniować, ale już wewnątrz podprogramu.

2 Dlaczego użyto tylko 21 liter alfabetu, a nie 26?

G L N O P To ich brakuje prawda? Odpowiedź jest oczywista.

  • G Jest funkcją przygotowawczą i jest już użyta w bloku przy komendzie G65
  • L Określa ilość powtórzeń w bloku przy komendzie G65
  • N Numer bloku przy komendzie G65
  • O Jest przeznaczone wyłącznie dla numerowania programów
  • P W bloku przy komendzie G65 określa numer wezwanego podprogramu

Lista 2 – Niezbyt dużo maszyn używa tej listy. Ktoś wpadł na pomysł że 21 znaków to za mało i zrobił listę z 33 znakami.

Argument dla Listy 2Zmienna lokalna
A#1
B#2
C#3
I1#4
J1#5
K1#6
I2#7
J2#8
K2#9
I3#10
J3#11
K3#12
I4#13
J4#14
K4#15
I5#16
J5#17
K5#18
I6#19
J6#20
K6#21
I7#22
J7#23
K7#24
I8#25
J8#26
K8#27
I9#28
J9#29
K9#30
I10#31
J10#32
K10#33

No dobra tabele już znasz. Teraz pasowałoby wyjaśnić Ci jak się nimi posługiwać.

Aby to zrozumieć musisz wiedzieć jak działają funkcje G65, G66, G66.1, G67 . Klikając w jedną z nich zostaniesz przeniesiony na osobną stronę tam szczegółowo wyjaśniam jak one działają. Dzisiaj trochę powtórzę. No nie wszystko, tylko bardziej ogólnie.

W praktyce wygląda to tak, że za pomocą funkcji G65 zmienne lokalne zostają przeniesione z programu głównego do podprogramu tam są podstawiane w odpowiednio przygotowany szkielet programu.

Przykład 1:

Zapis Macra przy użyciu Listy 1. Mam do nagwintowania 2 otwory w odstępach takich jak na rysunku, na głębokość 10mm. Chcę zastosować takie parametry:

  • Obroty 850obr/min
  • Posuw na nominalny 425mm/min (850obr/min x skok 0,5mm)
  • Posuw na wjeździe 80% posuwu nominalnego
  • Posuw na wyjeździe 120% posuwu nominalnego
  • Głębokość gwintu 10mm
Rysunek otworów

Głównym celem makra jest wykonanie gwintu z mniejszym posuwem i wyjście z niego z większym. Ten sposób gwintowania używa się przy gwintowaniu drobnozwojowym w miękkich materiałach, w celu uniknięcia zacięć.

To jest nasz szkielet Macro, o którym wspominałem wcześniej. Albo inaczej, to jest podprogram

O8000
(GWINTOWANIE 2 OTWORY)
G0 G90 Z2 S#19 M3
G1 Z-[ABS[#26]] F[#9*0,8] M5
S#19 M4
G1Z2 F[#9*1,2]
M5
M99

Tak będzie wyglądała część programu odpowiedzialna za transfer naszych zmiennych do Macro za pomocą G65

T01 M6 G54
G0 X10 Y10           Najazd nad 1 otwór
G43 H07 G0 Z10
G65 P8000 Z10 F425 S850   Otwor 1
G91 X20 Y20               Najazd na otwór nr 2
G65 P8000 Z10 F425 S850   Otwor 2
G90 Z50                  Koniec gwintowania
M1

Chyba w miarę jasno pokazane jest na przykładzie 2 otworów jak działa transmisja zmiennych lokalnych do makra.

W programie wpisałem Z10, F425, S850. Te wartości zostały wczytane odpowiednio pod numery #26, #9, #19, i wysłane do naszego Macra.

Pewnie chciałbyś wiedzieć jak wczytywać Listę 2.

Przykład 2:

G65 A10 C20 I30 J40 K50 I60 I70 K80

Posługując się tabelą zobaczysz, że do odpowiednich zmiennych zostały przypisane wartości.

  • #1=10
  • #3=20
  • #4=30
  • #5=40
  • #6=50
  • #7=60
  • #10=70
  • #9=80

Wygląda jak pomieszanie z poplątaniem zwłaszcza dla początkujących. Ale jeśli przyjrzymy się tabeli po krótkiej chwili widzimy zależność. Do I1 została przyporządkowana pierwsza I z bloku, do drugiej , druga itd.

Czy można używać zmiennych lokalnych w głównym programie?

Oczywiście że można. Co prawda są one przewidziane dla programów Macro, ale zasady są po to żeby ich łamać 🙂 .

Najprostrzym przykładem wykorzystania zmiennych w głównym programie jest wiercenie takich samych otworów w materiałach różnej twardości. Często się zdarza, że materiały od różnych dostawców, a nawet od tego samego tylko, że z innej serii będą się różniły twardością.

Program na podstawowy materiał będzie wyglądał tak:

N10 T01 (WIERTLO 5MM)
N20 M06
N30G90 G00 G54 X100.0 Y100  (NAJAZD NA POZYCJE 1 OTWORU)
N35S1000 M03 
N40 G43 Z10 H01 M08
N50 G99 G83 R2.5 Z-80 Q10 F180 (WIERCENIE OTWORU 1)
N60 X200 (WIERCENIE OTWORU 2)
N70 Y200 (WIERCENIE OTWORU 3)
N80 G80 G00 Z10 M09
N90 G28 Z10 M05
N110 M30

Następne będą się różnic tylko trzema rzeczami

  • Q- głębokość wiercenia do momentu wycofania
  • S- obroty
  • F-posuw

Nasuwa się pytanie: czy trzeba pisać osobny program dla każdego materiału z osobna?

Nie

Wystarczy, że sparametryzuje kluczowe dla mnie dane .

Uniwersalny program będzie wyglądał w ten sposób

N10 T01 (WIERTLO 5MM)

N11 #1=1500  (OBROTY 1500 MIEKKI 1000 TWARDY)
N12 #2=240   (POSUW 240 MIEKKI 150 TWARDY)
N13 #3=15    (ODWIOROWANIE 15 MIEKKI 10 TWARDY)

N20 M06
N30 G90 G00 G54 X100.0 Y100  (NAJAZD NA POZYCJE 1 OTWORU)
N35 S#1 M03 
N40 G43 Z10 H01 M08
N50 G99 G83 R2.5 Z-80 Q#3 F#2 (WIERCENIE OTWORU 1)
N60 X200 (WIERCENIE OTWORU 2)
N70 Y200 (WIERCENIE OTWORU 3)
N80 G80 G00 Z10 M09
N90 G28 Z10 M05
N110 M30

Łatwe, prawda? Tak jak mówiłem, zmienne dają Ci niewyobrażalną przewagę.

Zagnieżdżanie się zmiennych lokalnych w podprogramach

O podprogramach pisałem już w tym artykule. Dlatego nie będę się rozpisywał czym one są. Tutaj wyjaśnię jak parametry zagnieżdżają się w podprogramach.

Teraz jak to po po chłopsku wyjaśnić co to jest zagnieżdżanie? Załóżmy, że masz główny program. Ten program wywołuje podprogram za pomocą funkcji G65. W podprogramie mamy kolejne wywołanie podprogramu za pomocą tej samej funkcji itd. aż do czterech poziomów w dół. Przy każdym wywołaniu konkretne zmienne zostają przypisane do konkretnych podprogramów. Rzadko się spotyka żeby programować głębiej niż 2 poziomy.

Mapa zagnieżdżania Makr

Powyższa mapa pokazuje jak zmienne najpierw zagnieżdżają się w programie głównym, a potem 4 razy w podprogramach. Za każdym razem zmienne zagnieżdżają się w kolejnych poziomach, ale jednocześnie nie są kasowane z poprzednich. Dopiero Funkcja M99 kasuje zmienne lokalne z danego podprogramu, a na końcu funkcja M30 kasuje zmienne z głównego programu. Zmienne lokalne nie mogą być przekazywane z jednego podprogramu do drugiego. Dlatego nazywają się one lokalne. Ale jeśli pojawi się taka potrzeba, Fanuc ma dla nas rozwiązanie. Są nim zmienne wspólne. Ale o nich w następnym wpisie, bo ten i tak już wystarczająco się wydłużył.

Pozdrawiam i zapraszam do komentowania.