Podprogram w EMC2

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

Autor tematu
pixes2
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 10
Posty: 580
Rejestracja: 07 sty 2009, 18:38
Lokalizacja: Zgierz

Podprogram w EMC2

#1

Post napisał: pixes2 » 01 sty 2011, 19:22

Czy jest możliwe w emc2 wykonywanie programu z wywołaniem podprogramów ?
Chodzi mi o wycinanie kształtu z wielokrotnym pogłębianiem. Można to oczywiście napisać, ale w innym dziale wyczytałem, że można wykorzystać podprogram+ilość powtórzeń lub zmienne :?: . Niestety nic z tego nie udało mi się zastosować praktycznie.
Może ktoś mógłby napisać prosty programik do wycięcia choćby kwadracika w kilku przejściach z zagłębieniem co 1mm.
Dałoby to pogląd, jak powinien być skonstruowany taki program.
Metodą prób i błędów zejdzie mi się z takimi drobiazgami chyba do emerytury :sad: .
Z góry dzięki za pomoc.

Pozdrawiam.
Tomek. :???:



Tagi:

Awatar użytkownika

ArturM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 7
Posty: 160
Rejestracja: 12 kwie 2008, 07:53
Lokalizacja: Kozienice
Kontakt:

Re: Podprogram w EMC2

#2

Post napisał: ArturM » 01 sty 2011, 20:27

Podprogramy to jedno, a wielokrotne pogłębianie to drugie :) przynajmniej u mnie :)

np. pogłębiany kwadrat:

Kod: Zaznacz cały

#<glebokosc> = -20
#<skok> = 2
#<bok_kwadratu> = 20
#<predkosc_dol> = 20
#<predkosc_bok> = 40

g0 z10
g0 x0 y0 
m3 s1

g0 z0.5

#<akt_glebokosc> = 0
o100 while [#<akt_glebokosc> gt #<glebokosc>] 
	#<akt_glebokosc> = [#<akt_glebokosc> - #<skok>] 
	o110 if [#<akt_glebokosc> lt #<glebokosc>] 
		#<akt_glebokosc> = #<glebokosc> 
	o110 endif

	g1 z#<akt_glebokosc> f#<predkosc_dol> 
	g1 x#<bok_kwadratu> f#<predkosc_bok> 
	g1 y#<bok_kwadratu> 
	g1 x0
	g1 y0
o100 endwhile

m30

a tu masz np. pogłębiane koło w podprogramie:

Kod: Zaznacz cały


o<okrag> sub

#<promien> = [#3 / 2] 
g0 z10
g0 x[#1 - #<promien>] y#2
m3 s1
g0 z0.5

#<akt_glebokosc> = 0
o100 while [#<akt_glebokosc> gt #4] 
	#<akt_glebokosc> = [#<akt_glebokosc> - #5] 
	o110 if [#<akt_glebokosc> lt #4] 
		#<akt_glebokosc> = #4
	o110 endif

	g1 z#<akt_glebokosc> f20

	(wycinam koło z 4 ćwiartek) 
	g2 x#1 y[#2 + #<promien>] r#<promien> f40
	g2 x[#1 + #<promien>] y#2 r#<promien> 
	g2 x#1 y[#2 - #<promien>] r#<promien> 
	g2 x[#1 - #<promien>] y#2 r#<promien> 
o100 endwhile

g0 z10
m5
o<okrag> endsub


(parametry: X Y średnica głębokość skok) 
o<okrag> call [0] [0] [20] [-10] [2] 
o<okrag> call [50] [50] [30] [-5] [2] 

m30
To oczywiście głupotki wklepane z palca - żeby to w produkcje puścić to trzeba jeszcze uzależnienie od wielkości narzędzia zrobić - no ale to nic skomplikowanego a tylko by zaciemniało obraz.
Jeżeli coś jest niejasne to pytaj.


Autor tematu
pixes2
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 10
Posty: 580
Rejestracja: 07 sty 2009, 18:38
Lokalizacja: Zgierz

#3

Post napisał: pixes2 » 01 sty 2011, 21:39

Dzięki za odpowiedż. Rozumiem, że Twoje przykłady dotyczą zastosowania zmiennej?
Sądziłem, że zmienna w tym przykładzie będzie dotyczyć tylko osi Z i cały zapis nie będzie taki rozbudowany. Muszę się spokojnie temu przyjżeć i przeanalizować, jakby to miało działać. Póki co nie jarzę o co biega w tych zmiennych. Może masz pomysł, jak to łopatologicznie opisać ?

Tymczasem pozwoliłem sobie na mały cytat z tematu kolegi Gaspar :

F1000
G1 X0 Y0
M98 P100 Q200
G0 Z1
M30

Ten sposób wydaje się dardzo prosty, ale w emc nie działa. Problem jest w trzeciej linii kodu-nieznane polecenie M. Czyli problemem jest wywołanie podprogramu(p100), a gdyby to już się powiodło, to gdzie wpisać sam podprogram? Inna sprawa, że nie wiem co oznacza M98 :oops: -nigdzie nie znalazłem polskiego opisu wszystkich komend.

Pozdrawiam.
Tomek.

Awatar użytkownika

ArturM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 7
Posty: 160
Rejestracja: 12 kwie 2008, 07:53
Lokalizacja: Kozienice
Kontakt:

#4

Post napisał: ArturM » 01 sty 2011, 22:05

pixes2 pisze:Dzięki za odpowiedż. Rozumiem, że Twoje przykłady dotyczą zastosowania zmiennej?
Nie, użyłem zmiennych bo zawsze używam - wygodniej jest i to zdecydowanie zwiększa 'reużywalność' kodu :)
pixes2 pisze: Sądziłem, że zmienna w tym przykładzie będzie dotyczyć tylko osi Z i cały zapis nie będzie taki rozbudowany. Muszę się spokojnie temu przyjżeć i przeanalizować, jakby to miało działać. Póki co nie jarzę o co biega w tych zmiennych. Może masz pomysł, jak to łopatologicznie opisać ?
Zaraz spróbuję.
pixes2 pisze: Tymczasem pozwoliłem sobie na mały cytat z tematu kolegi Gaspar :

F1000
G1 X0 Y0
M98 P100 Q200
G0 Z1
M30

Ten sposób wydaje się dardzo prosty, ale w emc nie działa. Problem jest w trzeciej linii kodu-nieznane polecenie M. Czyli problemem jest wywołanie podprogramu(p100), a gdyby to już się powiodło, to gdzie wpisać sam podprogram? Inna sprawa, że nie wiem co oznacza M98 :oops: -nigdzie nie znalazłem polskiego opisu wszystkich komend.
M98 to właśnie wywołanie podprogramu - ale w tym kodzie co podałeś brakuje własciwego porprogramu - po M30 powinnien być blok 'O'

Ale tak to brzydko i nieczytelnie jest :P

No to jeszcze raz i po kolei:

Chcesz zrobić zagłębienie.
Czyli chcesz wywołać kawałek programu kilka razy z jednym zmiennym parametrem.
Dla mnie to się równa pętli.
W podprogram raczej bym wrzucał większe kawalki kodu - np. tak jak pokazałem - kompletne (już z pętlą), sparametryzowane wycinanie okręgu.

No ale miało byc prosto. Czyli tak:

Kod: Zaznacz cały

#1 = 0  (ustalam sobie głębokość początkową) 
o100 while [#1 gt -10]   (wykonuję pętlę dopóki #1 jest większy niż -10) 
  (tu piszę cialo pętli - czyli wszystko co ma sie wykonać) 
  #1 = [#1 - 1] (zmniejszam wartość mojej zmiennej) 
  g1 z#1 (zjeżdżam na głębokość mojej zmiennej) 

 (no i cośtam sobie wycinam:) 
  g1 x10 
  g1 y10
  g1 x0
  g1 y0

o100 endwhile
Czyli bez gledzenia to wygląda tak:

Kod: Zaznacz cały

#1 = 0
o100 while [#1 gt -10] 
  #1 = [#1 - 1] 
  g1 z#1

  (tu kod wycinania) 

o100 endwhile
W tym przykładzie masz wbitą 'na sztywno' glębokość (-10), i dobieranie (1).

Jaśniej? Zmienne i pętle z grubsza rozumiesz czy też spróbować jakoś opisać?


Autor tematu
pixes2
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 10
Posty: 580
Rejestracja: 07 sty 2009, 18:38
Lokalizacja: Zgierz

#5

Post napisał: pixes2 » 02 sty 2011, 17:45

Czyli bez gledzenia to wygląda tak:

Kod:

#1 = 0
o100 while [#1 gt -10]
#1 = [#1 - 1]
g1 z#1

(tu kod wycinania)

o100 endwhile

Dzięki za odpowiedż.
Teraz jest o wiele jaśniej :wink: . Zaraz lecę to przetrenować.
ArturM pisze: M98 to właśnie wywołanie podprogramu - ale w tym kodzie co podałeś brakuje własciwego porprogramu - po M30 powinnien być blok 'O'
Po M30 dopisałem podprogram, ale emc nie rozpoznaje polecenia M98. Wczytanie całego programu zaowocowało tym, że w oknie na dole jest kod, ale w podglądzie nic nie widać (jest widok rysunku testowego). Maszyna mimo wszystko zaczyna realizować program, dojeżdża do trzeciej linii kodu i wywala komunikat "nieznany kod M". Może w emc podprogram wywołuje się inaczej, może nie obsługuje wszystkich komend? Zastanawia mnie to, że w zakładce MDI jest wyświetlona lista aktywnych kodów i nie ma na niej M98. Chyba, że nie ma to znaczenia.
ArturM pisze: Jaśniej? Zmienne i pętle z grubsza rozumiesz czy też spróbować jakoś opisać?
Z grubsza....rozumiem, ale z pewnością byłoby to jaśniejsze, gdybyś coś o tym napisał. Może się okazać, że tylko mi się wydaje z tym "z grubsza".
Jeszcze raz serdeczne dzięki i pozdrawiam.

Tomek. :wink:

Awatar użytkownika

ArturM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 7
Posty: 160
Rejestracja: 12 kwie 2008, 07:53
Lokalizacja: Kozienice
Kontakt:

#6

Post napisał: ArturM » 02 sty 2011, 18:51

pixes2 pisze:
Po M30 dopisałem podprogram, ale emc nie rozpoznaje polecenia M98. Wczytanie całego programu zaowocowało tym, że w oknie na dole jest kod, ale w podglądzie nic nie widać (jest widok rysunku testowego). Maszyna mimo wszystko zaczyna realizować program, dojeżdża do trzeciej linii kodu i wywala komunikat "nieznany kod M". Może w emc podprogram wywołuje się inaczej, może nie obsługuje wszystkich komend? Zastanawia mnie to, że w zakładce MDI jest wyświetlona lista aktywnych kodów i nie ma na niej M98. Chyba, że nie ma to znaczenia.
emc2 nie obsługuje M98, podprogram się wywołuje tak jak podałem w przykładzie z kołem, czyli:

Kod: Zaznacz cały

(podprogram) 
o100 sub
  g1 x10 f20
o100 endsub

(i wywołanie) 
o100 call
od wersji 2.3 podprogram może się 'normalnie' nazywać - więc można robić zapis typu:

Kod: Zaznacz cały

o<okrag> sub
(jakis tam kod) 
o<okrag> endsub

o<kwadrat> sub
(jakiś inny kod) 
o<kwadrat> endsub

(i potem można to wywoływac tak) 
o<kwadrat> call
o<okrag> call



Kolejny "stopień wtajemniczenia" to podprogramy z podawaniem argumentu.
Jeżeli wywołanie zrobimy tak:

Kod: Zaznacz cały

o100 call [1] [2] [3]
to wtedy w podprogramie te argumenty mamy dostępne jako zmienne #1, #2, #3 itd.


No i tu dochodzimy pewnie do tych 'podprogramów na zagłębienie'. Bo programy do generowania gcodu z reguły generują taką sieczkę:

Kod: Zaznacz cały

(----------------------) 
G1 Z-2. F30
M98 P3
G1 Z-4. F30
M98 P3
G1 Z-6. F30
M98 P3
G1 Z-8. F30
M98 P3
G1 Z-10. F30
M98 P3
G1 Z-12. F30
M98 P3
G1 Z-14. F30
M98 P3
G1 Z-16. F30
M98 P3
G1 Z-18. F30
M98 P3
G1 Z-20. F30
M98 P3
G1 Z-22. F30
M98 P3
G1 Z-24. F30
M98 P3
G0 Z2.

(..... ciach inne smieci ...) 

O3
G2 X9.25 Y16. I-0.25 J0. F50
M99
no i jeżeli chcesz to zapisac do emc2 to trzeba jakoś tak:

Kod: Zaznacz cały

o100 sub
  G2 X9.25 Y16. I-0.25 J0. F50
o100 endsub

G1 Z-2. F30
o100 call
G1 Z-4. F30
o100 call
G1 Z-6. F30
o100 call
G1 Z-8. F30
o100 call
G1 Z-10. F30
o100 call
G1 Z-12. F30
o100 call
G1 Z-14. F30
o100 call
G1 Z-16. F30
o100 call
G1 Z-18. F30
o100 call
G1 Z-20. F30
o100 call
G1 Z-22. F30
o100 call
G1 Z-24. F30
o100 call
G0 Z2.
Dla mnie taki zapis jest totalnie bez sensu - bo jak zmienić skok? Jak zwiekszyć glębokość? Mam generowac od nowa? Mam dopisać/przeedytowac 20 linijek dla takiej głupotki? Tak to se można na Machu robić :twisted: a nie na porządnych programach :)

W 'porządnych programach' to się zapisuje tak:

Kod: Zaznacz cały

o100 sub
  G2 X9.25 Y16. I-0.25 J0. F50
o100 endsub

#1 = 0
o200 while [#1 gt -24] 
  #1 = [#1 - 2] 
  g1 z#1 f30
  o100 call
o200 endwhile
Czyli:
podprogram został jak jest a zagłębianie robimy w pętli.
Pętlę tworzą linie:

Kod: Zaznacz cały

oxxx while [warunek] 

oxxx endwhile
Pętla wykonuje wszystko co jest zawarte pomiędzy 'while' a 'endwhile' dopóki warunek jest spełniony. Jeżeli warunek przestanie być spełniony to pętla przestaje się wykonywać.

Warunek to z reguły zapis w stylu '#1 gt -20' czy '#2 lt 20'
gt to 'greater than' (większe niż)
lt to 'less than' (mniejsze niż)

#numerek to zmienna - czyli takie 'pudełeczko' w którym możesz przechować jakąś wartość - to pudełeczko nazywa się zawsze tak samo (np. #1, #<skok>, itp), a to co jest 'w środku' może się zmieniać.

Czyli mamy taki zapis:

Kod: Zaznacz cały

#1 = 0
o200 while [#1 gt -24] 
  #1 = [#1 - 2] 
  g1 z#1
  o100 call
o200 endwhile
Co znaczy:
- nadaj zmiennej #1 wartość 0
- dopóki wartość zmiennej #1 jest wieksza niż -24 wykonuj:
--- nadaj zmiennej #1 wartość #1 - 2 (czyli zmniejsz wartość #1 o 2)
--- zjedź Zetem na wysokość równą wartości zmiennej #1
--- wywołaj podprogram o100
- zamknięcie pętli (czyli 'powtarzaj')

Jak widzisz można tu łatwo sobie regulowac głębokość - wystarczy zmienić -24 na inna wartość. I tak samo skok - zamiast - 2 dajemy - 1 i już mamy zagłębianie o 1 a nie o 2.

Jeżeli program będzie wykorzystywany więcej niż raz to warto parametry wywalic na początek i nadac im znaczące nazwy, czyli np. tak:

Kod: Zaznacz cały


#<glebokosc> = -24
#<skok> = 2


o100 sub
  G2 X9.25 Y16. I-0.25 J0. F50
o100 endsub

#1 = 0
o200 while [#1 gt #<glebokosc>] 
  #1 = [#1 - #<skok>] 
  g1 z#1 f30
  o100 call
o200 endwhile

wtedy zmieniasz tylko 2 pierwsze linijki - no i jeżeli program jest bardziej skomplikowany to łatwiej się w tym połapać po pół roku :)


Autor tematu
pixes2
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 10
Posty: 580
Rejestracja: 07 sty 2009, 18:38
Lokalizacja: Zgierz

#7

Post napisał: pixes2 » 02 sty 2011, 20:26

Ale się kolega napracował :shock: . Serdeczne dzięki za to. Punkciki oczywiście dodałem. Może kiedyś będę miał okazję, w podobnie wyczerpujący sposób, pomóc Tobie. Teraz pozostaje tylko sobie to przyswoić.
Mam jeszcze tylko jedno pytanie odnośnie konstrukcji programu.
Czy podprogram (kilka podprogramów) można wielokrotnie wywoływać w czasie programu?
Pozdrawiam.
Tomek. :wink:

Awatar użytkownika

ArturM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 7
Posty: 160
Rejestracja: 12 kwie 2008, 07:53
Lokalizacja: Kozienice
Kontakt:

#8

Post napisał: ArturM » 02 sty 2011, 21:08

pixes2 pisze:Ale się kolega napracował :shock: . Serdeczne dzięki za to.
No mam nadzieję, że inni tez skorzystają.
pixes2 pisze: Czy podprogram (kilka podprogramów) można wielokrotnie wywoływać w czasie programu?
Tak, oczywiście, tu się zaczyna zabawa dopiero :)

Obejrzyj sobie program na okrąg który podałem na poczatku (albo wczytaj to do emc2 to od razu zobaczysz o co chodzi).

Tam jest tak, że jak masz ten podprogram zdefiniowany na początku to potem np. 3 różne kółka w różnych miejscach robisz tak:

Kod: Zaznacz cały

(parametry: X Y średnica głębokość skok) 
o<okrag> call [0] [0] [20] [-10] [2] 
o<okrag> call [50] [50] [30] [-5] [1] 
o<okrag> call [100] [0] [12] [-50] [4] 
Czyli do tego samego podprogramu przekazujesz X, Y, średnicę, głębokość i skok zagłębienia - więc wycięcie 30 różnych kółek to tylko 30 razy wywołanie tego samego podprogramu z różnymi parametrami.

Żeby było weselej to podprogramy można umieszczać w oddzielnych plikach - więc możesz mieć 'bibliotekę' takich podprogramów wywoływanych od razu z dysku :)

A żeby było jeszcze weselej to możesz zrobic tak jak ja teraz robię powoli u siebie - robisz np. program frezarka.py - program w Pythonie, który wyświetla swoje okno z przyciskami - wybierzasz tam operację (np. kanałek, sześciokąt, otwory po okręgu, itp, itd).
Po kliknięciu na operacji dostajesz okno z polami parametrów do wpisania - podajesz w tabelce parametry (te wszystkie średnice, dlugości, średnice freza, włączenie wody itp, itd) klikasz na 'OK' i ten program w Pythonie Ci generuje gcode w rodzaju tych co tu wklejałem ale już z wpisanymi parametrami. Okienko znika, zostajesz z oknem Axisa a w nim masz gotowy kod do uruchomienia.
Skończysz operację, to Ctrl-R, wybierasz kolejna operację, podajesz parametry itd :)

A jest zylion rzeczy które w emc2 są, a których ni w ząb jeszcze nie próbowałem (PyVCP, classic ladder, zaawansowana zabawa z halem).

Awatar użytkownika

syntetyczny
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 2692
Rejestracja: 08 gru 2009, 22:33
Lokalizacja: Elbląg
Kontakt:

#9

Post napisał: syntetyczny » 02 sty 2011, 23:19

ArturM, jesteś wielki
Kto pyta, nie błądzi. Eppur si muove
Kreatura CNC
Modernizacja plotera megaplot


Autor tematu
pixes2
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 10
Posty: 580
Rejestracja: 07 sty 2009, 18:38
Lokalizacja: Zgierz

#10

Post napisał: pixes2 » 03 sty 2011, 14:13

Dzięki za odpowiedż.
syntetyczny pisze:ArturM, jesteś wielki
Oj tak...
ArturM pisze:No mam nadzieję, że inni tez skorzystają.
Temat kilka razy był wyświetlany, więc z pewnością kilka osób skorzystało.
Kawał wiedzy, podany w prosty i przejżysty sposób- pewnie wielu użytkowników emc2 się dokształciło.
Byłbym niepocieszony, gdyby się okazało, że tylko ja mam takie zaległości :???: .


Wczoraj (a może już dzisiaj?) próbowałem prostych wycinanek z wielokrotnym użyciem tego samego podprogramu. Wyszło mi, że w podprogramie muszę użyć wymiarowania G91, bo inaczej wychodziły jakieś cuda. To normalne, czy coś poknociłem?

Teraz muszę ogarnąć to, co napisałeś w ostatnim swoim poście. Pewnie pojawią się kolejne niejasności i ponownie trzeba będzie zawracać Ci głowę. Ale zobaczymy...
Jeszcze raz dzięki i pozdrawiam.
Tomek. :grin:

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „LinuxCNC (dawniej EMC2)”