Znaleziono 7 wyników

autor: ArturM
06 sty 2011, 22:33
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

markcomp77 pisze:
ArturM pisze:nc_files/flowsnake.ngc
hehe... to krzywa smoka (tutaj nazwana węża), choć nie dokładnie ta sama... ta z emc2 daje regularny symetryczny wzorek, znana mi krzywa smoka miała coś wspólnego z pojęciem - krzywa fraktalna...
No wygooglałem sobie już :)

Tu jest krzywa Gospera (czyli ten flowsnake): http://en.wikipedia.org/wiki/Gosper_curve
A tu jest krzywa smoka: http://en.wikipedia.org/wiki/Dragon_curve

Obie fajne :)
autor: ArturM
06 sty 2011, 13:23
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

pixes2 pisze: Tymczasem napisałem coś takieg :

[ciach program]
Zamorduję! :lol: Spacja Ci się zepsuła? Przecież bez spacji to nic nie widać.

Dopisałem spacje, wywaliłem powtarzający sie fragment do podprogramu i wyszło mi tak:

Kod: Zaznacz cały

o<okrag> sub
	g0 z2
	g0 x#1 y#2
	#5 = 0	
	o100 while [#5 gt -10] 
		#5 = [#5 - 2] 
		g1 z#5 f1000
		g2 x#1 y#2 i#3 j0
	o100 endwhile
	g0 z2
o<okrag> endsub

g90
g21
m3 s1
g4 p4

o<okrag> call [30] [40] [10] 
o<okrag> call [70] [40] [10] 
o<okrag> call [19] [20] [1] 
o<okrag> call [99] [20] [1] 
o<okrag> call [99] [60] [1] 
o<okrag> call [19] [60] [1] 

g0 z2
g0 x10 y10
#1 = 0
o700 while [#1 gt -10] 
#1 = [#1 - 2] 
g1 z#1 f1000
x110
y70
x10
y10
o700 endwhile

g0 z40
g0 x0 y0
m30 
W o<okrag> sub .... o<okrag> endsub jest Twój progam na okrąg - to jest te kilka linijek które się ciągle powtarzały. Rożniły się tylko współrzędnymi - więc zamieniłem współrzędne wpisane na sztywno na zmienne #1 - X, #2 - Y, #3 - średnica. No i automatycznie Twoje #1 czyli aktualną głębokość wyrzuciłem do #5 żeby konfliktu nie było.

Prostokąta nie ruszałem - można go też wywalić do podprogramu - no ale wywoływany byłby tylko raz a pozatym nie chciałem zaciemniać obrazu.

EMC2 nie bawię sie od urodzenia :D pierwsza maszyne zrobilismy w maju 2008, długo robiliśmy na TurboCNC, więc EMC2 pewnie gdzieś od 2009 roku.

[ Dodano: 2011-01-06, 13:37 ]
markcomp77 pisze:aż korci sprawdzić czy da się zrobić rekurencję?
:D nie ma co korcić - nc_files/flowsnake.ngc

Kod: Zaznacz cały

%
(Program to mill a flowsnake) 
(K. Lerman) 

o1000 sub
#<level> = #1
#<startX> = #2
#<startY> = #3
#<endX> = #4
#<endY> = #5

  o1001 if [#<level> EQ 0] 
    g1 f10 x#<endX> y#<endY> 
  o1001 else
    #<p1X> = [[#<startX> * 2 + #<endX>]/3] 
    #<p1Y> = [[#<startY> * 2 + #<endY>]/3] 

    #<p2X> = [[#<startX> + #<endX>]/2 + [#<endY> - #<startY>]/[SQRT[12.0]]] 
    #<p2Y> = [[#<startY> + #<endY>]/2 - [#<endX> - #<startX>]/[SQRT[12.0]]] 

    #<p3X> = [[#<startX> + 2 * #<endX>]/3] 
    #<p3Y> = [[#<startY> + 2 * #<endY>]/3] 

    o1000 call [#<level>-1] [#<startX>] [#<startY>] [#<p1X>] [#<p1Y>] 
    o1000 call [#<level>-1] [#<p1X>] [#<p1Y>] [#<p2X>] [#<p2Y>] 
    o1000 call [#<level>-1] [#<p2X>] [#<p2Y>] [#<p3X>] [#<p3Y>] 
    o1000 call [#<level>-1] [#<p3X>] [#<p3Y>] [#<endX>] [#<endY>] 
  o1001 endif
o1000 endsub

S1M3
g0 z1
g0 x.25 y1.0
g1 f10 z0
#<level> = 5
#<_foobar> = 729
(debug, param 2:#2) 
(debug, level:#<level>) 
(debug, _foobar:#<_foo bar>) 
o1000 call [#<level>] [.25] [1.0] [3.75] [1.0] 
o1000 call [#<level>] [3.75] [1.0] [2.0] [3.95] 
o1000 call [#<level>] [2.0] [3.95] [.25] [1.0] 
g0 z1
M5
%
To program na płatek śniegu - no i jak widać śmiało wołają o1000 call ze środka podprogramu o1000 - nie wiem jak duży stos jest ale generalnie sie da :)

Ale czemu program sie nazywa 'flowsnake' a nie 'snowflake' to ja już nie wiem :)
autor: ArturM
03 sty 2011, 16:44
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

pixes2 pisze: 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?
Poknociłeś :P
Nie wiem co masz w podprogramie - ale ja nic takiego u siebie nie robiłem.

Wrzuć te kółka z mojego pierwszego posta - powinny się ładnie rysować w Axisie wg zmienianych parametrów.
Może w podprogramie masz zmianę G90/G91 albo może masz zmianę układu współrzędnych (G54-G59) i potem nie przywracasz starego układu przed opuszczeniem podprogramu? Ciężko wyrokować.
pixes2 pisze: 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ę.
Śmiało :)
Może się uda trochę 'odczarować' EMC2 - bo to kawał porządnego softu.
autor: ArturM
02 sty 2011, 21:08
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

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).
autor: ArturM
02 sty 2011, 18:51
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

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: ArturM
01 sty 2011, 22:05
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

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: ArturM
01 sty 2011, 20:27
Forum: LinuxCNC (dawniej EMC2)
Temat: Podprogram w EMC2
Odpowiedzi: 27
Odsłony: 8490

Re: Podprogram w EMC2

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.

Wróć do „Podprogram w EMC2”