Dlaczego warto się zainteresować którąś z nowszych wersji? Główną przyczyną jest rozszerzenie NGCGUI, czyli aplikacja pozwalająca zaprogramować ciąg kolejnych operacji, przy użyciu gotowych procedur, wszystko w trybie graficznym, ale bez konieczności poznawania jakiegoś osobnego języka programowania - wszystko dzieje się w pomysłowo sformatowanym G-code i równie sprytnie wykorzystywanych komentarzach.

Tak to wygląda po zainstalowaniu. Niemal tak samo, jak w wersji 2.4, wzrosła tylko ilość zakładek nad okienkiem z wizualizacją. Kliknijmy którąś:

Ale zacznijmy od początku:
Najprościej zainstalujemy NGCGUI wraz z wersją 2.5. Wystarczy wstawić w sources źródła do wersji 2.5 i zainstalować ją przez apta.
w /etc/apt/sources.list zamienić:
Kod: Zaznacz cały
deb http://www.linuxcnc.org/emc2 lucid base emc2.4
deb-src http://www.linuxcnc.org/emc2 lucid base emc2.4
Kod: Zaznacz cały
deb http://buildbot.linuxcnc.org/ lucid v2.5_branch-rt
deb-src http://buildbot.linuxcnc.org/ lucid v2.5_branch-rt
sudo apt-get update
sudo apt-get upgrade
Żeby zainstalować najnowszą wersję rozwojową 2.6 trzeba doinstalować gita i parę pakietów, wymaganych do kompilacji LinuxCNC. Wchodzimy w terminal i wklejamy, czy wklepujemy następujące polecenie:
Kod: Zaznacz cały
sudo apt-get install --no-install-recommends python-gtkglext1 build-essential devscripts debhelper libpth-dev tcl8.5-dev tk8.5-dev bwidget libxaw7-dev libreadline5-dev python-dev libglu1-mesa-dev libxinerama-dev autoconf python-tk libglib2.0-dev libxft-dev gettext libgtk2.0-dev python-imaging-tk libgnomeprintui2.2-dev libboost-python-dev libtk-img git-core gitk git-gui git-doc git-arch git-cvs git-svn git-email git-daemon-run gitweb libboost1.40-doc libboost-date-time1.40-dev libboost-filesystem1.40-dev libboost-graph1.40-dev libboost-iostreams1.40-dev libboost-math1.40-dev libboost-program-options1.40-dev libboost-regex1.40-dev libboost-serialization1.40-dev libboost-signals1.40-dev libboost-system1.40-dev libboost-test1.40-dev libboost-thread1.40-dev libboost-wave1.40-dev doxygen docbook-xsl default-jdk fop libtk-img-doc libgle3
Kod: Zaznacz cały
git clone git://git.linuxcnc.org/git/linuxcnc.git linuxcnc
Nadal w konsoli przechodzimy do skopiowanego katalogu:
Kod: Zaznacz cały
cd /home/twoja-nazwa-uzytkownika/linuxcnc/src
Kod: Zaznacz cały
./autogen.sh
Kod: Zaznacz cały
./configure --enable-run-in-place --enable-simulator
Wpisujemy na koniec
Kod: Zaznacz cały
make
W nowej wersji podobno --enable-run-in-place już nie jest potrzebne, program samoczynnie kompiluje się do działania w katalogu użytkownika, zaś zainstalowanie go w katalogach systemowych wymaga podania po make kolejnego polecenia make install --prefix /usr
make
sudo make setuid
Before running the software, set the environment:
. (top dir)/scripts/rip-environment
Po zakończeniu kompilacji przechodzimy do podkatalogu scripts i uruchamiamy nasz LinuxCNC w wersji najnowszej.
Kod: Zaznacz cały
cd ..
cd scripts
./linuxcnc

Otwiera się nam znajome okienko starego EMC2, z tajemniczo brzmiącymi nazwami zakładek nad okienkiem wizualizacji. Id, od, taper-od i własne. Co to oznacza? Każda zakładka wykonuje konkretną operację - id to roztaczanie otworu wewnętrznego, od - toczenie walca od zewnątrz, taper-od to w zasadzie toczenie stożka, ale w tej postaci, jaka jest nadaje się co najwyżej do fazowania - toczy stożek na jeden przebieg. Zakładka własny pozwala skonfigurować ad hoc własny ciąg procedur.

Ten zestaw procedur można w łatwy sposób we własnym zakresie rozbudowywać i zmieniać wedle potrzeby. Dopiszmy własną zakładkę - na początek niech będzie to procedura toczenia półkuli, albo półokrągłego elementu od dowolnej średnicy w dowolnym punkcie osi Z - oczywiście do wsadzenia w NGCGUI. Zapisujemy kod do pliku polkula.ngc, plik wsadzamy do /home/twoja-nazwa-uzytkownika/emc2-dev/nc_files/ngcgui_lib/lathe. W /home/twoja-nazwa-uzytkownika/emc2-dev/configs/sim/ngcgui/ngcgui_lathe.ini dodajemy linijkę:
Kod: Zaznacz cały
NGCGUI_SUBFILE = polkula.ngc
Kod: Zaznacz cały
; Author: Z. Maciej "Miki" Bajkowski
(info: Toczenie półkuli lub zaokrąglenia krawędzi wałka. )
o<polkula> sub
#<promien_walca> = #1 (=30 Promień walca)
#<promien_na_plasko> = #2 (=20 Promień części bez zaokrąglenia. 0 - toczymy półkulę)
#<promien_kulki> = #3 (=15 Promień zaokrąglenia)
#<przybranie> = #4 (=3 Przybranie materiału)
#<przesuniecie_z> = #5 (=0 Punkt początku operacji na osi Z)
#<Coolant> = #6 (=8 8 - Chłodziwo włączone, 9 - wyłączone)
#<predkosc> = #7 (=400 Prędkość skrawania)
#<promien> = #<promien_walca>
; Turn the OD
M3 M#<Coolant> ; spindle cw, coolant on/off
#<walec> = 0
#<promien_walca> = [#<promien_walca>-#<promien_na_plasko>]
g18 (g7)
M3 S1000
g0 z[#<przesuniecie_z>+1] x[[#<promien>]+1]
o100 while [#<walec> lt [#<promien_walca>]]
#<walec>=[[#<walec>]+[#<przybranie>]]
x[[#<promien_walca>]-[#<walec>]+[[#<promien_na_plasko>]]]
z[#<przesuniecie_z>]
g3 x[[#<promien>]] z-[[#<walec>]-[#<przesuniecie_z>]] r[#<promien_kulki>] f[#<predkosc>]
g0
x [[#<promien>]+1]
z[#<przesuniecie_z>+1]
o100 endwhile ( koniec toczenia )
o<polkula> endsub


Procedura toczenia stożka na wiele przebiegów:

Kod: Zaznacz cały
; Author: Z. Maciej "Miki" Bajkowski
(info: Stożek zewnętrzny od prawej)
o<stozek> sub
#<MaxRPM> = #1 (= 3000 Obroty wrzeciona RPM)
#<SurfaceUnitsMin> = #2 (= 400 skrawanie mm/min)
#<Przybranie> = #3 (= 2 Przybranie materiału)
#<Z-Start> = #4 (= 0.000 Start na osi Z)
#<kat> = #5 (= 10 Kąt stożka)
#<dlugosc_stozka> = #6 (=30 Długość stożka)
#<srednica_walka> = #7 (=30 Średnica początkowa)
#<Coolant> = #8 (= 8 Chłodziwo=8, Wyłączone=9)
#<zebrane_max> = [tan[#<kat>]*[#<dlugosc_stozka>]]
#<ilosc_przybran> = [[#<zebrane_max>]/[#<przybranie>]]
#<zejscie_dlugosci> = [[#<dlugosc_stozka>]/[#<ilosc_przybran>]]
#2 = #<zejscie_dlugosci>
#1 = 0
s[#<MaxRPM>]
o100 while [#<ilosc_przybran> gt 0]
#1=[[#1]+[#<przybranie>]]
g0 z1
x[[#<srednica_walka>]-[#1]]
z0
g1 f[#<SurfaceUnitsMin>] z-[#<zejscie_dlugosci>] x[#<srednica_walka>]
g0 x[[#<srednica_walka>]+1]
#<ilosc_przybran> = [[#<ilosc_przybran>] - [#<przybranie>]]
#<zejscie_dlugosci> = [[#<zejscie_dlugosci>]+[#2]]
o100 endwhile ( koniec toczenia )
g0 z1
o<stozek> endsub
Kod: Zaznacz cały
#<nasza_zmienna> = #1 (= 10.000 Opis zmiennej do formularza)
Przy wywołaniu tego pliku .ngc (z zakładki, albo przez wybór pliku w procedurze) NGCGUI utworzy formularz, a w nim aktywne pole tekstowe z opisem "Opis zmiennej do formularza" i początkową zawartością 10. Możemy ją w formularzu zmienić - NGCGUI to zapamięta, i po wywołaniu naszej procedury zapamiętaną wartość podstawi pod zmienną #<nasza_zmienna>.
Ok, wiesz już jak tworzyć procedury, ale na tym nie koniec. NGCGUI pozwala utworzyć złożoną z wielu procedur operację, czyli można zaprogramować sobie złożony detal bez tykania w ogóle G-code, przez proste wypełnienie formularza na ekranie.
Załóżmy, że do wykonania jest sworzeń o dwóch średnicach, na jednej z nich zakończony stożkiem, na drugiej półkulą.
Wywołujemy więc zakładkę Walec, wpisujemy parametry do przetoczenia całego materiału na większą średnicę, i klikamy "Utwórz". Pozornie nic się nie zmieniło, ale na dole mamy komunikat "Wprowadż parametry dla cechy 2". Słowem - możemy zaprogramować kolejną operację. Ponieważ potrzebujemy mieć mniejszą średnicę na części materiału, nie zmieniamy głównego pliku procedury. Kasujemy za to zawartość okienka wstęp - tam jest wywoływany plik, ustawiający nam tokarkę - nie musimy go wywoływać za kazdym razem. Ale możemy tam przed kolejną operacją wywołać plik ze specyficznymi ustawieniami. Wpisujemy dane do wytoczenia kolejnego wałka, i znowu klikamy utwórz. Klikamy przycisk Procedura, i wybieramy plik polkula.ngc. Wprowadzamy dane i znowu klikamy utwórz. Znowu przycisk Procedura, wybieramy stozek.ngc, wprowadzamy dane. I tu możemy wybrać również Zakończenie - w moim przypadku to plik end.ngc zawierający jedno polecenie - G28, czyli zjazd do bazy, jako że to ostatnia operacja. Klikamy po raz ostatni utwórz, i Przekaż. Wyświetla nam się cała zaplanowana operacja, możemy ją sobie zapuścić na symulatorze, i jak jest poprawna, wykonać na maszynie.
Niżej procedury do NGCGUI tokarki napisane przez kamara:
Kod: Zaznacz cały
( ------------------------------ )
( C Z O Ł O )
( ------------------------------ )
( Kamar )
( Time-stamp: <05-02-2012 17:31> )
( ------------------------------ )
(info: Czoło )
o<czolo> sub
#<sr_pocz> = #1 (=100 Średnica początkowa)
#<sr_koncowa> = #2 (=0 Średnica końcowa)
#<poczatek> = #3 (=0 Początek)
#<koniec> = #4 (-3 Koniec)
#<dobieranie> = #5 (2 Dobieranie)
#<posuw> = #6 (60 Posuw)
g61
m3 s1
M8
o1 if [#<poczatek> lt #<koniec>]
(msg, Początek musi być większy niż koniec!)
m30
o1 endif
g0 z[#<poczatek> + 1]
g0 x[#<sr_pocz> + 0.5]
#<akt_pozycja> = #<poczatek>
o100 while [#<akt_pozycja> gt #<koniec>]
#<akt_pozycja> = [#<akt_pozycja> - #<dobieranie>]
o102 if [#<akt_pozycja> lt #<koniec>]
#<akt_pozycja> = #<koniec>
o102 endif
g0 z#<akt_pozycja>
g1 x#<sr_koncowa> f#<posuw>
g0 z[#<akt_pozycja> + 0.5]
g0 x[#<sr_pocz> + 0.5]
o100 endwhile
m5
g0 x[#<sr_pocz> + 2]
o<czolo> endsub
Kod: Zaznacz cały
( ------------------------------ )
( S E G E R )
( ------------------------------ )
( Kamar )
( Time-stamp: <2012-02-05 11:22> )
( ------------------------------ )
(info: seger )
o<seger> sub
#<sr_pocz> = #1 (=40 Średnica początkowa)
#<sr_koncowa> = #2 (=37 Średnica końcowa)
#<z_pocz> = #3 (=0 Z początkowe)
#<noz> = #4 (=2 Szerokość noża)
#<kanal> = #5 (=2 szerokość kanałku)
#<posuw> = #6 (=60 Posuw)
#<woda> = #7 (=1 Woda)
g61
m3 s1
o1 if [#<woda> eq 1]
M8
o1 endif
o100 if [#<sr_pocz> gt #<sr_koncowa>]
g0 z#<z_pocz>
x[#<sr_pocz> +1]
g1 x#<sr_koncowa> f#<posuw>
g0 x[#<sr_pocz> +1]
o101 if [#<kanal> gt #<noz>]
g0 z[#<z_pocz>+[#<kanal>-#<noz>]]
g1 x#<sr_koncowa> f#<posuw>
g0 x[#<sr_pocz> +1]
o101 endif
o100 endif
o200 if [#<sr_pocz> lt #<sr_koncowa>]
g0 z1
g0 x[#<sr_pocz> -1]
z#<z_pocz>
g1 x#<sr_koncowa> f#<posuw>
g0 x[#<sr_pocz> - 1]
o102 if [#<kanal> gt #<noz>]
g0 z[#<z_pocz>+[#<kanal>-#<noz>]]
g1 x#<sr_koncowa> f#<posuw>
g0 x[#<sr_pocz> - 1]
o102 endif
g0 z10
o200 endif
o<seger> endsub
Kod: Zaznacz cały
( ------------------------------ )
( S T O Z E K )
( ------------------------------ )
( Kamar )
( Time-stamp: <2012-02-05 11:22> )
( ------------------------------ )
(info: Stożek )
o<stozek> sub
#<sr_pocz> = #1 (=20 Średnica początkowa)
#<sr_koncowa> = #2 (=40 Średnica końcowa)
#<z_pocz> = #3 (=0 Z początkowe)
#<dl_stozka> = #4 (=20 Długość stożka)
#<kat> = #5 (=0 Kąt)
#<dobieranie> = #6 (=2 Dobieranie)
#<posuw> = #7 (=60 Posuw)
#<woda> = #8 (=1 Woda)
g61
m3 s1
o1 if [#<woda> eq 1]
M8
o1 endif
o100 if [#<sr_pocz> lt #<sr_koncowa>]
#<akt_start> = #<sr_koncowa>
o5 while [#<akt_start> gt #<sr_pocz>]
#<akt_start> = [#<akt_start> - #<dobieranie>]
o10 if [#<akt_start> lt #<sr_pocz>]
#<akt_start> = #<sr_pocz>
o10 endif
g0 z#<z_pocz>
g0 x[#<akt_start>]
g1 x[#<sr_koncowa>] z[#<z_pocz> - [[[#<sr_koncowa> - #<akt_start>] * #<dl_stozka>] / [#<sr_koncowa> - #<sr_pocz>]]] f#<posuw>
o5 endwhile
o100 endif
o200 if [#<sr_pocz> gt #<sr_koncowa>]
#<akt_koniec> = #<sr_pocz>
o205 while [#<akt_koniec> gt #<sr_koncowa>]
#<akt_koniec> = [#<akt_koniec> - #<dobieranie>]
o210 if [#<akt_koniec> lt #<sr_koncowa>]
#<akt_koniec> = #<sr_koncowa>
o210 endif
g0 x[#<sr_pocz> + 1]
g0 z[#<z_pocz> - [-1 * [[#<sr_koncowa> - #<akt_koniec>] * #<dl_stozka>] / [#<sr_pocz> - #<sr_koncowa>]]]
g0 x#<sr_pocz>
g1 x[#<akt_koniec>] z[#<z_pocz> - #<dl_stozka>] f#<posuw>
o205 endwhile
o200 endif
o<stozek> endsub
kamar pisze:Procedurka na kieszeń prostokątną.
Kod: Zaznacz cały
( ------------------------------ ) ( KIESZEŃ PROSTOKĄTNA ) ( ------------------------------ ) ( Kamar ) ( Time-stamp: <2012-02-19 14:26> ) ( ------------------------------ ) (info: Frezowanie kieszeni prostokątnej ) o<kieszen> sub #<frez> = #1 (=8 frez) #<x_pocz> = #2 (=20 X początkowy) #<x_kon> = #3 (=10 X końcowy ) #<y_pocz> = #4 (=10 Y początkowy) #<y_kon> = #5 (=190 Y końcowy ) #<glebokosc> = #6 (=-10 głębokość ) #<glebokosc_poczatkowa> = #7 (=0 głębokość poczatkowa ) #<skok> = #8 (=2 skok) #<predkosc_bok> = #9 (=60 prędkość bok) #<predkosc_dol> = #10 (=40 prędkość dół) #<pokrycie> = #11 (=1 zachodzenie w mm ) ( ------------------------------ ) ( ------------------------------ ) #<przyrost>=[#<frez>-#<pokrycie>] #<x_fak>=[#<x_kon>-[#<frez>/2]] g17 g21 g61 /g0 x[#<x_pocz>+[#<frez>/2]] y[#<y_pocz>+[#<frez>/2]] /g0 z2 m3 s1 m8 #<akt_glebokosc> = #<glebokosc_poczatkowa> ( aktualna glebokosc ) #<x_akt>=[#<x_pocz>+[#<frez>/2]] o100 while [#<akt_glebokosc> GT #<glebokosc>] #<akt_glebokosc> = [#<akt_glebokosc> - #<skok>] ( ustalenie glebokosci ) ( jezeli nizej limitu to jade max ) o110 if [#<akt_glebokosc> lT #<glebokosc>] #<akt_glebokosc> = #<glebokosc> o110 endif g0 x#<x_akt> y[#<y_kon>-[#<frez>/2]] g0 z#<akt_glebokosc> G1 Z#<akt_glebokosc> F#<predkosc_dol> ( dobieranie poczatkowe ) y[#<y_pocz>+[#<frez>/2]] f#<predkosc_bok> o120 while [#<x_akt> lt #<x_fak>] #<x_akt>=[#<x_akt>+[#<frez>-#<pokrycie>]] ( jezeli nizej limitu to jade max ) o111 if [#<x_akt> gT #<x_fak>] #<x_akt> = #<x_fak> o111 endif #<dodaj>=[#<x_akt>+#<przyrost>] x#<x_akt> G1 y[#<y_kon>-[#<frez>/2]] f#<predkosc_bok> o112 if [ #<dodaj> gT #<x_fak>] #<dodaj> = #<x_fak> o112 endif x#<dodaj> #<x_akt>=[#<x_akt>+#<przyrost>] y[#<y_pocz>+[#<frez>/2]] f#<predkosc_bok> o120 endwhile g0 z10 #<x_akt>=[#<x_pocz>+[#<frez>/2]] g0 x#<x_akt> y[#<y_kon>-[#<frez>/2]] o100 endwhile g0 z10 #<akt_glebokosc> = #<glebokosc_poczatkowa> ( aktualna glebokosc ) o130 while [#<akt_glebokosc> GT #<glebokosc>] #<akt_glebokosc> = [#<akt_glebokosc> - #<skok>] ( ustalenie glebokosci ) ( jezeli nizej limitu to jade max ) o131 if [#<akt_glebokosc> lT #<glebokosc>] #<akt_glebokosc> = #<glebokosc> o131 endif g0 z[#<akt_glebokosc> +1] G1 Z#<akt_glebokosc> F#<predkosc_dol> ( dobieranie poczatkowe ) g1 y[#<y_pocz>+[#<frez>/2]] x[#<x_kon>-[#<frez>/2]] y[#<y_kon>-[#<frez>/2]] x[#<x_pocz>+[#<frez>/2]] o130 endwhile g0 z10 o<kieszen> endsub

