Predykcja ruchu

Dyskusje dotyczące działania obsługi programu LinuxCNC
Awatar użytkownika

Autor tematu
tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 7924
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Predykcja ruchu

#1

Post napisał: tuxcnc » 06 lip 2021, 19:41

W uchwycie wrzeciona mam zamontowaną na stałe kamerę. Oczywiście kamera patrzy w inne miejsce niż pozycja narzędzia, bo jest przesunięta względem osi wrzeciona o stały i znany offset. Żeby kamera patrzyła w pozycję narzędzia trzeba wykonać ruch względny o offset kamery w osiach X i Y. Niby proste i działa, mam nawet podprogramy które wykonują to automatycznie.
Problem jest taki, że żeby wykonać taki ruch trzeba być wystarczająco daleko od soft limitów.
Kiedy jestem zbyt blisko krawędzi stołu i spróbuję przełączyć frez na kamerę, albo odwrotnie, to dostaję komunikat że zaplanowany ruch przekracza zakres maszyny i oczywiście wrzeciono pozostaje w miejscu, ale reszta podprogramu się wykonuje, przestawiają się offsety itd.
Czyli fizycznie ruch nie został wykonany, ale Linuxcnc myśli inaczej.
Pomyślałem sobie, że trzeba rozbudować podprogramy o badanie aktualnej pozycji wrzeciona, żeby zablokować ich wykonanie, jeśli na ruch nie ma wystarczającej przestrzeni.
Czyli jeżeli jestem na środku stołu to podprogramy będą się wykonywać, ale jeżeli zbyt blisko krawędzi, to dostanę stosowny komunikat a maszyna pozostanie w stanie jak przed wywołaniem podprogramu.
Tutaj z kolei problem jest taki, że trzeba znać współrzędne maszynowe pozycji wrzeciona, a nie ma zmiennej systemowej, która by je zawierała.
Na szczęście istnieje sprytny patent wykorzystujący kod G30.1
Oczywiście samo wykonanie G30.1 poprzestawia zmienne systemowe, ale da się je wcześniej zapamiętać a potem przywrócić.
Poniżej program testowy.
Założenie jest takie, że G53 X0 Y0 to rzeczywisty róg stołu i dalej w minus pojechać nie da rady. Oczywiście można sobie to dowolnie zmienić.
Podprogram działa w ten sposób, że po wywołaniu wyznacza pozycję we współrzędnych maszynowych i jeżeli ruch relatywny o X-10 Y-10 można wykonać, to go wykonuje, a w przeciwnym razie wyświetla komunikat że nie ma miejsca na wykonanie ruchu i kończy działanie.
Może się komuś przyda...

Kod: Zaznacz cały

o<test> sub
(---  store G30 parameters  ---)
#<g30x> = #5181
#<g30y> = #5182
#<g30z> = #5183
#<g30a> = #5184
#<g30b> = #5185
#<g30c> = #5186
#<g30u> = #5187
#<g30v> = #5188
#<g30w> = #5189
G30.1
#<current_machine_position_x> = #5181
#<current_machine_position_y> = #5182
(--- restore G30 parameters ---)
#5181 = #<g30x>
#5182 = #<g30y>
#5183 = #<g30z>
#5184 = #<g30a>
#5185 = #<g30b>
#5186 = #<g30c>
#5187 = #<g30u>
#5188 = #<g30v> 
#5189 = #<g30w>
o100 if [[#<current_machine_position_x> GT 10] AND [#<current_machine_position_y> GT 10]]
G91 G0 X-10 Y-10
G90
o100 else
(debug,no space for move)
o100 endif
o<test> endsub
M2



Wróć do „LinuxCNC (dawniej EMC2)”