Pytam całkiem poważnie - jak to się robi ?
Drobne błędy popełnił ale stworzył suba dość poprawnie i kupę roboty zaoszczędził.
Dodane 50 minuty 55 sekundy:
Już wiem

Pytam całkiem poważnie - jak to się robi ?

Kod: Zaznacz cały
( ------------------------------ )
( R O W K I F R E Z O W A N E )
( ------------------------------ )
( Wersja poprawiona )
( Time-stamp: <2025-08-06 12:00> )
(info: Frezowanie rowków równoległych)
O<rowki> SUB
; Parametry wejściowe z opisami
#<dl_mater> = #1 (= długość materiału [mm])
#<odl_rowki> = #2 (= odległość między rowkami [mm])
#<sr_freza> = #3 (= średnica frezu [mm])
#<glebokosc> = #4 (= głębokość rowka [mm])
#<wyjazd> = #5 (= wyjazd poza materiał [mm])
#<obroty> = #6 (= prędkość obrotowa wrzeciona [RPM])
#<mgla> = #7 (= mgła olejowa [1=ON, 0=OFF])
#<marg_pocz> = #8 (= margines początkowy [mm])
#<marg_kon> = #9 (= margines końcowy [mm])
#<start_x> = #10 (= pozycja startowa X [mm])
#<start_y> = #11 (= pozycja startowa Y [mm])
#<powrot> = #12 (= powrót do XY po zakończeniu [1=TAK, 0=NIE])
#<kier_frezowania> = #13 (= kierunek frezowania [0=lewa→prawa, 1=prawa→lewa])
#<start_z> = #14 (= wysokość startowa Z [mm])
#<tryb_rampy> = #15 (= tryb rampy [0=brak, 1=rampa X, 2=rampa Y])
#<posuw> = #16 (= posuw [mm/min])
#<dl_y> = #17 (= długość frezowania w osi Y [mm])
#<warstwy> = #18 (= liczba warstw frezowania w osi Z)
; Walidacja parametrów wejściowych
O100 IF [#<dl_mater> LE 0]
(MSG, Błąd: Długość materiału musi być większa od 0!)
M2
O100 ENDIF
O101 IF [#<odl_rowki> LE 0]
(MSG, Błąd: Odległość między rowkami musi być większa od 0!)
M2
O101 ENDIF
O102 IF [#<sr_freza> LE 0]
(MSG, Błąd: Średnica frezu musi być większa od 0!)
M2
O102 ENDIF
O103 IF [#<glebokosc> LE 0]
(MSG, Błąd: Głębokość rowka musi być większa od 0!)
M2
O103 ENDIF
O104 IF [#<warstwy> LE 0]
(MSG, Błąd: Liczba warstw musi być większa od 0!)
M2
O104 ENDIF
O105 IF [[#<marg_pocz> + #<marg_kon>] GE #<dl_mater>]
(MSG, Błąd: Suma marginesów przekracza długość materiału!)
M2
O105 ENDIF
O106 IF [#<posuw> LE 0]
(MSG, Błąd: Posuw musi być większy od 0!)
M2
O106 ENDIF
O107 IF [#<obroty> LE 0]
(MSG, Błąd: Obroty muszą być większe od 0!)
M2
O107 ENDIF
; Ustawienie płaszczyzny XY
G17
; Włączenie wrzeciona
M3 S[#<obroty>]
; Włączenie mgły olejowej jeśli wybrane
O108 IF [#<mgla> EQ 1]
M7
(MSG, Włączono mgłę olejową)
O108 ENDIF
; Czas na rozbieg wrzeciona
G4 P2
; Pozycjonowanie początkowe
G0 X#<start_x> Y#<start_y> Z#<start_z>
; Obliczenia podstawowe
#<dl_robocza> = [#<dl_mater> - #<marg_pocz> - #<marg_kon>]
#<liczba_rowkow> = [FIX[#<dl_robocza> / #<odl_rowki>] + 1]
#<skok_z> = [#<glebokosc> / #<warstwy>]
(MSG, Długość robocza: #<dl_robocza> mm)
(MSG, Liczba rowków: #<liczba_rowkow>)
(MSG, Skok na warstwę: #<skok_z> mm)
; Ustalenie pozycji początkowej rowków
O110 IF [#<kier_frezowania> EQ 0]
#<pocz_rowek> = [#<start_x> + #<marg_pocz>]
(MSG, Kierunek: lewa → prawa)
O110 ELSE
#<pocz_rowek> = [#<start_x> + #<dl_mater> - #<marg_kon>]
(MSG, Kierunek: prawa → lewa)
O110 ENDIF
; Główna pętla frezowania rowków
#<i> = 0
O200 WHILE [#<i> LT #<liczba_rowkow>]
; Obliczenie pozycji X dla aktualnego rowka
O300 IF [#<kier_frezowania> EQ 0]
#<x_rowek> = [#<pocz_rowek> + [#<odl_rowki> * #<i>]]
O300 ELSE
#<x_rowek> = [#<pocz_rowek> - [#<odl_rowki> * #<i>]]
O300 ENDIF
; Sprawdzenie czy rowek mieści się w materiale
O301 IF [#<kier_frezowania> EQ 0]
O302 IF [#<x_rowek> GT [#<start_x> + #<dl_mater> - #<marg_kon>]]
(MSG, Rowek #<i> poza materiałem - pomijam)
#<i> = [#<i> + 1]
O200 CONTINUE
O302 ENDIF
O301 ELSE
O303 IF [#<x_rowek> LT [#<start_x> + #<marg_pocz>]]
(MSG, Rowek #<i> poza materiałem - pomijam)
#<i> = [#<i> + 1]
O200 CONTINUE
O303 ENDIF
O301 ENDIF
(MSG, Frezowanie rowka #<i> w pozycji X: #<x_rowek>)
; Pozycjonowanie nad rowkiem
G0 X#<x_rowek> Y#<start_y> Z#<start_z>
; Pętla warstw dla aktualnego rowka
#<j> = 1
O410 WHILE [#<j> LE #<warstwy>]
#<z_poziom> = [#<start_z> - [#<skok_z> * #<j>]]
; Zabezpieczenie przed przekroczeniem głębokości
O420 IF [#<z_poziom> LT [#<start_z> - #<glebokosc>]]
#<z_poziom> = [#<start_z> - #<glebokosc>]
O420 ENDIF
; Wjazd do materiału z rampą lub pionowo
O430 IF [#<tryb_rampy> EQ 0]
; Wjazd pionowy
G1 Z[#<z_poziom>] F[#<posuw> / 2]
O430 ELSEIF [#<tryb_rampy> EQ 1]
; Rampa w osi X
G1 X[#<x_rowek> - [#<sr_freza> / 2]] Z[#<z_poziom>] F[#<posuw>]
G1 X[#<x_rowek>]
O430 ELSEIF [#<tryb_rampy> EQ 2]
; Rampa w osi Y
G1 Y[#<start_y> - [#<sr_freza> / 2]] Z[#<z_poziom>] F[#<posuw>]
G1 Y[#<start_y>]
O430 ENDIF
; Frezowanie rowka w aktualnej warstwie
G1 Y[#<start_y> + #<dl_y>] F[#<posuw>]
; Powrót do początku rowka
G1 Y#<start_y>
#<j> = [#<j> + 1]
O410 ENDWHILE
; Wyjazd z rowka na bezpieczną wysokość
G0 Z#<start_z>
#<i> = [#<i> + 1]
O200 ENDWHILE
; Dodatkowy wyjazd dla ostatniego rowka jeśli określono
O500 IF [#<wyjazd> GT 0]
O510 IF [#<kier_frezowania> EQ 0]
#<x_wyjazd> = [#<start_x> + #<dl_mater> + #<wyjazd>]
O510 ELSE
#<x_wyjazd> = [#<start_x> - #<wyjazd>]
O510 ENDIF
G0 X[#<x_wyjazd>] Y#<start_y>
G1 Z[#<start_z> - #<glebokosc>] F[#<posuw> / 2]
G1 Y[#<start_y> + #<dl_y>] F[#<posuw>]
G0 Z#<start_z>
O500 ENDIF
; Powrót do pozycji startowej jeśli wybrano
O600 IF [#<powrot> EQ 1]
G0 X#<start_x> Y#<start_y> Z#<start_z>
(MSG, Powrót do pozycji startowej)
O600 ENDIF
; Wyłączenie chłodzenia i wrzeciona
M9 ; Wyłączenie chłodzenia
M5 ; Zatrzymanie wrzeciona
(MSG, Frezowanie rowków zakończone)
O<rowki> ENDSUB
M2 
DZIAŁAJĄCY ???



Kod: Zaznacz cały
( ------------------------------ )
( R O W K I F R E Z O W A N E )
( ------------------------------ )
( Wersja poprawiona )
( Time-stamp: <2025-08-06 12:00> )
(info: Frezowanie rowków równoległych)
O<rowki> SUB
; Parametry wejściowe z opisami
#<dl_mater> = #1 (= długość materiału [mm])
#<odl_rowki> = #2 (= odległość między rowkami [mm])
#<sr_freza> = #3 (= średnica frezu [mm])
#<glebokosc> = #4 (= głębokość rowka [mm])
#<wyjazd> = #5 (= wyjazd poza materiał [mm])
#<obroty> = #6 (= prędkość obrotowa wrzeciona [RPM])
#<mgla> = #7 (= mgła olejowa [1=ON, 0=OFF])
#<marg_pocz> = #8 (= margines początkowy [mm])
#<marg_kon> = #9 (= margines końcowy [mm])
#<start_x> = #10 (= pozycja startowa X [mm])
#<start_y> = #11 (= pozycja startowa Y [mm])
#<powrot> = #12 (= powrót do XY po zakończeniu [1=TAK, 0=NIE])
#<kier_frezowania> = #13 (= kierunek frezowania [0=lewa→prawa, 1=prawa→lewa])
#<start_z> = #14 (= wysokość startowa Z [mm])
#<tryb_rampy> = #15 (= tryb rampy [0=brak, 1=rampa X, 2=rampa Y])
#<posuw> = #16 (= posuw [mm/min])
#<dl_y> = #17 (= długość frezowania w osi Y [mm])
#<warstwy> = #18 (= liczba warstw frezowania w osi Z)
; Walidacja parametrów wejściowych
O100 IF [#<dl_mater> LE 0]
(MSG, Błąd: Długość materiału musi być większa od 0!)
M2
O100 ENDIF
O101 IF [#<odl_rowki> LE 0]
(MSG, Błąd: Odległość między rowkami musi być większa od 0!)
M2
O101 ENDIF
O102 IF [#<sr_freza> LE 0]
(MSG, Błąd: Średnica frezu musi być większa od 0!)
M2
O102 ENDIF
O103 IF [#<glebokosc> LE 0]
(MSG, Błąd: Głębokość rowka musi być większa od 0!)
M2
O103 ENDIF
O104 IF [#<warstwy> LE 0]
(MSG, Błąd: Liczba warstw musi być większa od 0!)
M2
O104 ENDIF
O105 IF [[#<marg_pocz> + #<marg_kon>] GE #<dl_mater>]
(MSG, Błąd: Suma marginesów przekracza długość materiału!)
M2
O105 ENDIF
O106 IF [#<posuw> LE 0]
(MSG, Błąd: Posuw musi być większy od 0!)
M2
O106 ENDIF
O107 IF [#<obroty> LE 0]
(MSG, Błąd: Obroty muszą być większe od 0!)
M2
O107 ENDIF
; Ustawienie płaszczyzny XY
G17
; Włączenie wrzeciona
M3 S[#<obroty>]
; Włączenie mgły olejowej jeśli wybrane
O108 IF [#<mgla> EQ 1]
M7
O108 ENDIF
; Czas na rozbieg wrzeciona
G4 P2
; Pozycjonowanie początkowe
G0 X#<start_x> Y#<start_y> Z#<start_z>
; Obliczenia podstawowe
#<dl_robocza> = [#<dl_mater> - #<marg_pocz> - #<marg_kon>]
#<liczba_rowkow> = [FIX[#<dl_robocza> / #<odl_rowki>] + 1]
#<skok_z> = [#<glebokosc> / #<warstwy>]
; Ustalenie pozycji początkowej rowków
O110 IF [#<kier_frezowania> EQ 0]
#<pocz_rowek> = [#<start_x> + #<marg_pocz>]
O110 ELSE
#<pocz_rowek> = [#<start_x> + #<dl_mater> - #<marg_kon>]
O110 ENDIF
; Główna pętla frezowania rowków
#<i> = 0
O200 WHILE [#<i> LT #<liczba_rowkow>]
; Obliczenie pozycji X dla aktualnego rowka
O300 IF [#<kier_frezowania> EQ 0]
#<x_rowek> = [#<pocz_rowek> + [#<odl_rowki> * #<i>]]
O300 ELSE
#<x_rowek> = [#<pocz_rowek> - [#<odl_rowki> * #<i>]]
O300 ENDIF
; Sprawdzenie czy rowek mieści się w materiale
O301 IF [#<kier_frezowania> EQ 0]
O302 IF [#<x_rowek> GT [#<start_x> + #<dl_mater> - #<marg_kon>]]
#<i> = [#<i> + 1]
O200 CONTINUE
O302 ENDIF
O301 ELSE
O303 IF [#<x_rowek> LT [#<start_x> + #<marg_pocz>]]
#<i> = [#<i> + 1]
O200 CONTINUE
O303 ENDIF
O301 ENDIF
; Pozycjonowanie nad rowkiem
G0 X#<x_rowek> Y#<start_y> Z#<start_z>
; Pętla warstw dla aktualnego rowka
#<j> = 1
O410 WHILE [#<j> LE #<warstwy>]
#<z_poziom> = [#<start_z> - [#<skok_z> * #<j>]]
; Zabezpieczenie przed przekroczeniem głębokości
O420 IF [#<z_poziom> LT [#<start_z> - #<glebokosc>]]
#<z_poziom> = [#<start_z> - #<glebokosc>]
O420 ENDIF
; Wjazd do materiału z rampą lub pionowo
O430 IF [#<tryb_rampy> EQ 0]
; Wjazd pionowy
G1 Z[#<z_poziom>] F[#<posuw> / 2]
O430 ELSEIF [#<tryb_rampy> EQ 1]
; Rampa w osi X
G1 X[#<x_rowek> - [#<sr_freza> / 2]] Z[#<z_poziom>] F[#<posuw>]
G1 X[#<x_rowek>]
O430 ELSEIF [#<tryb_rampy> EQ 2]
; Rampa w osi Y
G1 Y[#<start_y> - [#<sr_freza> / 2]] Z[#<z_poziom>] F[#<posuw>]
G1 Y[#<start_y>]
O430 ENDIF
; Frezowanie rowka w aktualnej warstwie
G1 Y[#<start_y> + #<dl_y>] F[#<posuw>]
; Powrót do początku rowka
G1 Y#<start_y>
#<j> = [#<j> + 1]
O410 ENDWHILE
; Wyjazd z rowka na bezpieczną wysokość
G0 Z#<start_z>
#<i> = [#<i> + 1]
O200 ENDWHILE
; Dodatkowy wyjazd dla ostatniego rowka jeśli określono
O500 IF [#<wyjazd> GT 0]
O510 IF [#<kier_frezowania> EQ 0]
#<x_wyjazd> = [#<start_x> + #<dl_mater> + #<wyjazd>]
O510 ELSE
#<x_wyjazd> = [#<start_x> - #<wyjazd>]
O510 ENDIF
G0 X[#<x_wyjazd>] Y#<start_y>
G1 Z[#<start_z> - #<glebokosc>] F[#<posuw> / 2]
G1 Y[#<start_y> + #<dl_y>] F[#<posuw>]
G0 Z#<start_z>
O500 ENDIF
; Powrót do pozycji startowej jeśli wybrano
O600 IF [#<powrot> EQ 1]
G0 X#<start_x> Y#<start_y> Z#<start_z>
O600 ENDIF
; Wyłączenie chłodzenia i wrzeciona
M9 ; Wyłączenie chłodzenia
M5 ; Zatrzymanie wrzeciona
O<rowki> ENDSUB
M2
Z głową wszystko w porządku?
Kod: Zaznacz cały
G1 X[#<x_rowek> - [#<sr_freza> / 2]] Z[#<z_poziom>] F[#<posuw>]
Ale rampa jest potrzebna, problem polegał tylko na tym, żeby nie robić jej w X, skoro rowki są frezowane w Y...

A tuxcnc potrafi

Bredzisz jak potłuczony.kamar pisze: ↑07 sie 2025, 20:33A tuxcnc potrafiI fakt, że były trzy opcje do wyboru nie ma na to wpływu. No bo jak sobie wyobrazić wejście po x poza materiałem jak mało miejsca. A śrubowe rampy sobie wyobrażasz ? A zygzakiem ? Pokory trochę , za mało wiesz i umiesz. A spartaczone ustawienia symulatora w stosunku do maszynki maszyny spowodowały wejście w rampę od dołu materiału.

To już i tak postęp, bo jeszcze nie dawno uważałeś, że AI jest zupełnie do niczego.
Ale o to nie było i nie ma żadnego sporu.