Strona 1 z 1

Mapowanie łoża tokarki w Linuxcnc

: 26 kwie 2019, 10:45
autor: szary11
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
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 ....
Oraz nasz funkcja:

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
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

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)
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?

Re: Mapowanie łoża tokarki w Linuxcnc

: 26 kwie 2019, 15:04
autor: kamar
Tak bym nieśmiało zapytał o co walczycie ? O dychy czy setki ? Jaka szansa , że obniżenie łoża w danym miejscu przekłada się na toczoną średnicę w opisywalny sposób ?

Re: Mapowanie łoża tokarki w Linuxcnc

: 26 kwie 2019, 15:16
autor: szary11
Walka jest o dychy - na 1 metrze mamy 0.3 mm różnicy poziomów. Wersje bez uwzględniania średnicy materiału jest dosyć łatwa, niestety średnica ma tu spore znaczenie.
Obrazek
Utknęliśmy na etapie jak sprawić żeby HAL widział piny z axisui. ?

Re: Mapowanie łoża tokarki w Linuxcnc

: 26 kwie 2019, 15:26
autor: kamar
Szkic ładny ale na płaskim łożu :) Na pryźmie już chyba tak łatwo nie przeliczy. A na niesymetrycznej dubelt. Z halem nie pomogę.

Re: Mapowanie łoża tokarki w Linuxcnc

: 26 kwie 2019, 15:29
autor: adam Fx
szary11 pisze:Co się udało osiągnąć:

WOW konkretna robota tylko pogratulować :)

Re: Mapowanie łoża tokarki w Linuxcnc

: 27 kwie 2019, 18:43
autor: nkp2169
Nie trzeba tego pisać:
loadusr axisui -name axisui.0 #???
=============================
To jest pisanie w postgui_file.hal
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
-----------------
http://linuxcnc.org/docs/2.7/html/confi ... al_section

Re: Mapowanie łoża tokarki w Linuxcnc

: 30 kwie 2019, 10:03
autor: szary11
nkp2169 pisze:
27 kwie 2019, 18:43
Nie trzeba tego pisać:
loadusr axisui -name axisui.0 #???
=============================
To jest pisanie w postgui_file.hal
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
-----------------
http://linuxcnc.org/docs/2.7/html/confi ... al_section
Chwilowo trzeba zostawić ten temat, ale dzięki, sprawdzimy, może pomoże.

Re: Mapowanie łoża tokarki w Linuxcnc

: 30 kwie 2019, 22:32
autor: gniazdo
loadrt lathe_bed
addf lathe-bed.0 servo-thread

Co do poprawności kodu to nie sprawdzałem, ale w przypisaniu componenu do przerywania to masz literowke. nie wiem czy to ma znaczenie ale ja zawsze w wywołaniu funkcji jednak dodaje ilość lub nazwy funkcji, bo kiedyś coś mi się tam wywalało bez tego ale już nie pamiętam co to było.