Mapowanie łoża tokarki w Linuxcnc

Mapowanie krzywego łoża i korekta w dosunięciu noża w czasie rzeczywistym

Dyskusje dotyczące działania obsługi programu LinuxCNC

Autor tematu
szary11
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 377
Rejestracja: 16 lut 2011, 22:44
Lokalizacja: Tarnogród

Mapowanie łoża tokarki w Linuxcnc

#1

Post napisał: szary11 » 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
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?




kamar
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 16186
Rejestracja: 18 wrz 2010, 06:17
Lokalizacja: Kozienice
Kontakt:

Re: Mapowanie łoża tokarki w Linuxcnc

#2

Post napisał: kamar » 26 kwie 2019, 15:04

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 ?


Autor tematu
szary11
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 377
Rejestracja: 16 lut 2011, 22:44
Lokalizacja: Tarnogród

Re: Mapowanie łoża tokarki w Linuxcnc

#3

Post napisał: szary11 » 26 kwie 2019, 15:16

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


kamar
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 16186
Rejestracja: 18 wrz 2010, 06:17
Lokalizacja: Kozienice
Kontakt:

Re: Mapowanie łoża tokarki w Linuxcnc

#4

Post napisał: kamar » 26 kwie 2019, 15:26

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

Awatar użytkownika

adam Fx
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 5562
Rejestracja: 04 lip 2004, 16:03
Lokalizacja: Gliwice

Re: Mapowanie łoża tokarki w Linuxcnc

#5

Post napisał: adam Fx » 26 kwie 2019, 15:29

szary11 pisze:Co się udało osiągnąć:

WOW konkretna robota tylko pogratulować :)
sorki za wszystkie błędy ... (dyslektyk) :?
Zobacz moje filmy http://www.youtube.com/user/pokachontass/videos


nkp2169
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 1
Posty: 8
Rejestracja: 06 mar 2013, 22:04
Lokalizacja: Zaporozhie

Re: Mapowanie łoża tokarki w Linuxcnc

#6

Post napisał: nkp2169 » 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


Autor tematu
szary11
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 377
Rejestracja: 16 lut 2011, 22:44
Lokalizacja: Tarnogród

Re: Mapowanie łoża tokarki w Linuxcnc

#7

Post napisał: szary11 » 30 kwie 2019, 10:03

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.


gniazdo
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 1
Posty: 61
Rejestracja: 24 gru 2008, 22:09
Lokalizacja: Limanowa

Re: Mapowanie łoża tokarki w Linuxcnc

#8

Post napisał: gniazdo » 30 kwie 2019, 22:32

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.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „LinuxCNC (dawniej EMC2)”