Mapowanie łoża tokarki w Linuxcnc
: 26 kwie 2019, 10:45
Witam,
Walczymy nad tematem mapowanie łoża tokarki które jest powycierane w niektórych miejscach - jako alternatywa do szlifowania.
Mierzymy łoże w pewnych odcinkach Z i odpowiadającą korektę wysokości, następnie liczymy nachylenia co daje nam łamany odcinek opisany zestawem funkcji liniowych.
Następnie offset H jest przeliczany na offset X uwzględniając średnice obrabianego materiału.
Co się udało osiągnąć:
1. Komponent czasu rzeczywistego który na bieżące przelicza korektę X na podstawie mapy oraz aktualnej pozycji Z i X
Plik lathe_bed.comp trzeba skompilowac
2. Podpięcie w HAL
Czego brakuje:
1. W momencie bazowanie do materiału robimy X END (średnica). Program musi w tym czasie tez chwycić na jakiej pozycji Z jesteśmy, żeby wiedział jakie jest aktualne obniżenie łoża i następnie uwzględnił offset wysokości w komponencie czasu rzeczywistego.
W tym celu do pliku "/usr/bin/axis" dorzuciliśmy:
a) funkcje która w momencie ustalania offsetu X powinna:
- pobrać aktualny maszynowy Z - z halui?
- przeliczyć offset wysokości łoża
- zwrócić offset wysokości do HAL do komponentu czasu rzeczywistego
*Wywołanie funkcji następuje z wewnątrz funkcji "def touch_off_system"
Oraz nasz funkcja:
b) Dwa nowe Piny wejście wyjście w pliku "/usr/bin/axis" :
- wejście pobiera aktualna pozycje maszynową Z z halui
- wyjście ma zwrócić korektę wysokości
I TERAZ AKTUALNY PROBLEM:
HAL nie widzi pinów z AXISUI (kod podpięcia powyzej). Jak to ugryźć? Może jest jakiś inny sposób, żeby podać do HAL współrzędne z chwili wcisnięcia END w linuxcnc?
Walczymy nad tematem mapowanie łoża tokarki które jest powycierane w niektórych miejscach - jako alternatywa do szlifowania.
Mierzymy łoże w pewnych odcinkach Z i odpowiadającą korektę wysokości, następnie liczymy nachylenia co daje nam łamany odcinek opisany zestawem funkcji liniowych.
Następnie offset H jest przeliczany na offset X uwzględniając średnice obrabianego materiału.
Co się udało osiągnąć:
1. Komponent czasu rzeczywistego który na bieżące przelicza korektę X na podstawie mapy oraz aktualnej pozycji Z i X
Plik lathe_bed.comp trzeba skompilowac
sudo halcompile --install lathe_bed.comp
Kod: Zaznacz cały
component lathe_bed;
license "GPL"; // GPL v2 or later
pin in float x_rel_in; //relatywne wspolrzedne X
pin in float x_motor_in; //maszynowe polozenie X
pin in float z_in; //maszynowe polozenie Z
pin in touchoff-h-adjust; //AKTUALNIE NIE DZIALA - korekta loza w momencie bazowania do materialu
pin out float x_out;
function _;
;;
#include <math.h>
#include <stdlib.h>
float z_pos_array[5] = {-750, -700, -100, -50, 0};
float h_corr_array[5] = { 0.0, 0.0, 0.0, 0.4, 0.0};
float slope_array[5] = {0.0, 0.0, 0.0, -0.008, 0.008};
float slope = 0.0;
float z_range_high = 0.0;
float h_high = 0.0;
float x_offset = 0.0;
float h_offset = 0.0;
float r;
int size = sizeof(z_pos_array)/sizeof(z_pos_array[0]);
float sqrt_val;
FUNCTION(_){
for(int i=0; i<size; i++){
float z_limit = z_pos_array[i];
if(z_in <= z_limit){
z_range_high = z_limit;
h_high = h_corr_array[i];
slope = slope_array[i];
break;
}
else{
slope = 0;
h_high = 0;
}
}
r = x_rel_in;
//Circle equation : x^2 + h^2 = r^2
//x_offset = r - x
//x_offset = abs(r) - sqrt(pow(r,2) - pow(h_offset, 2));
h_offset = (z_range_high - z_in)*slope + h_high;
h_offset = h_offset - touchoff-h-adjust //AKTUALNIE NIE DZIALA - na biezaco korekta H zoffsetowana ezgledem punktu bazowania do materialu
sqrt_val = sqrt(abs((pow(r,2) - pow(h_offset, 2))*100000.0f)/100000.0f);
x_offset = abs(r*1000.0f)/1000.0f - roundf(sqrt_val*1000.0f)/1000.0f;
x_offset = abs(x_offset * 1000.0f) / 1000.0f;
if(r>0){
x_offset = -x_offset;
}
else{
x_offset = x_offset;
}
x_out = x_motor_in + x_offset;
}
2. Podpięcie w HAL
Kod: Zaznacz cały
loadrt lathe_bed
addf lathe-bed.0 servo-thread
net x-pos-rel <= halui.axis.0.pos-relative
net x-pos-rel => lathe-bed.0.x-rel-in
net x-pos-cmd => lathe-bed.0.x-motor-in
net z-pos-cmd => lathe-bed.0.z-in
#oblicz offset wysokosci przy offsetowaniu X (przycisk "END") - AKTUALNIE NIE DZIAŁA
loadusr axisui -name axisui.0 #???
#net z-pos-cmd => axisui.machine-z-in # - NIE WYKRYWA PINU Z AXISUI
#net korekta_bazowa_wyskosci axisui.touchoff-h-adjust => lathe-bed.0.touchoff-h-adjust
net x-pos-cmd-corr <= lathe-bed.0.x-out
net x-pos-cmd-corr => pid.x.command
Czego brakuje:
1. W momencie bazowanie do materiału robimy X END (średnica). Program musi w tym czasie tez chwycić na jakiej pozycji Z jesteśmy, żeby wiedział jakie jest aktualne obniżenie łoża i następnie uwzględnił offset wysokości w komponencie czasu rzeczywistego.
W tym celu do pliku "/usr/bin/axis" dorzuciliśmy:
a) funkcje która w momencie ustalania offsetu X powinna:
- pobrać aktualny maszynowy Z - z halui?
- przeliczyć offset wysokości łoża
- zwrócić offset wysokości do HAL do komponentu czasu rzeczywistego
*Wywołanie funkcji następuje z wewnątrz funkcji "def touch_off_system"
Kod: Zaznacz cały
def touch_off_system(event=None, new_axis_value = None):
global system
if not manual_ok(): return
if joints_mode(): return
offset_axis = "xyzabcuvw".index(vars.current_axis.get())
if new_axis_value is None:
new_axis_value, system = prompt_touchoff(
title=_("Touch Off (system)"),
text=_("Enter %s coordinate relative to %%s:") % vars.current_axis.get().upper(),
default=0.0,
tool_only=False,
system=vars.touch_off_system.get()
)
else:
system = vars.touch_off_system.get()
if new_axis_value is None: return
vars.touch_off_system.set(system)
ensure_mode(linuxcnc.MODE_MDI)
s.poll()
#WYWOŁANIE FUNKCJI
if offset_axis == "x":
capture_bed_height_offset()
#pominąłem wklejanie dalszej części kodu ....
Kod: Zaznacz cały
def capture_bed_height_offset():
z_in = comp["machine-z-in"] #pobierz z Pinu aktualny Z
z_pos_array = [-750, -700, -100, -50, 0]
h_corr_array = [0.0, 0.0, 0.0, 0.4, 0.0]
slope_array = [0.0, 0.0, 0.0, -0.008, 0.008]
for i in range(0, len(z_pos_array)):
z_limit = z_pos_array[i]
if z_in <= z_limit:
z_range_high = z_limit
h_high = h_corr_array[i]
slope = slope_array[i]
break
h_offset = float((z_range_high - z_in)*slope + h_high)
comp["touchoff-h-adjust"] = h_offset
- wejście pobiera aktualna pozycje maszynową Z z halui
- wyjście ma zwrócić korektę wysokości
Kod: Zaznacz cały
if hal_present == 1 :
comp = hal.component("axisui")
comp.newpin("jog.x", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.y", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.z", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.a", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.b", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.c", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.u", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.v", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.w", hal.HAL_BIT, hal.HAL_OUT)
comp.newpin("jog.increment", hal.HAL_FLOAT, hal.HAL_OUT)
comp.newpin("notifications-clear",hal.HAL_BIT,hal.HAL_IN)
comp.newpin("notifications-clear-info",hal.HAL_BIT,hal.HAL_IN)
comp.newpin("notifications-clear-error",hal.HAL_BIT,hal.HAL_IN)
comp.newpin("resume-inhibit",hal.HAL_BIT,hal.HAL_IN)
# NOWE PINY
comp.newpin("machine-z-in",hal.HAL_FLOAT,hal.HAL_IN)
comp.newpin("touchoff-h-adjust",hal.HAL_FLOAT,hal.HAL_OUT)
HAL nie widzi pinów z AXISUI (kod podpięcia powyzej). Jak to ugryźć? Może jest jakiś inny sposób, żeby podać do HAL współrzędne z chwili wcisnięcia END w linuxcnc?