Страница 2 из 7

Re: Программная коррекция кривизны портала

Добавлено: 27 авг 2018, 20:03
MX_Master
nkp писал(а):
MX_Master писал(а):loadrt trivkins_adjust x_adj_file=/path/to/file1 y_adj_file=/path/to/file2
так в rt работать скорей всего не будет (я про обращения к файлу)...
нужно данные именно в кинематику непосредственно вносить...
Чтение из файла идёт только при загрузке компонента. Эта таблица интерполируется во внутреннее представление и лежит в памяти. Во время работы берём значения из памяти.

Re: Программная коррекция кривизны портала

Добавлено: 27 авг 2018, 21:16
merkwurdigliebe
nkp писал(а):так в rt работать скорей всего не будет (я про обращения к файлу)...
если очень сильно надо, то можно... см. filp_open()

Re: Программная коррекция кривизны портала

Добавлено: 27 авг 2018, 22:53
MX_Master
merkwurdigliebe писал(а):если очень сильно надо, то можно... см. filp_open()
В том-то и дело, что так делать, с одной стороны, нежелательно, а с другой - как-то сделать надо. Можно, стессна, пойти более правильным путём. Добавить ещё один не RT компонент, который прочитает всё из файлов и по мере готовности передаст всё компоненту кинематики. Вощем, муки выбора :hehehe:

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 06:07
nkp
делал компонент ,в котором данные из "!rt" передавались в "rt"

Код: Выделить всё

/* sudo halcompile --install kl.comp */
component kl "syringe confectioner";

pin in  float velxy ;     // motion.current-vel
pin in  float overall ;   // pyvcp.scale

pin out float out ;       // stepgen.3.velocity-cmd
pin in  s32 line ;         // stepgen.3.count 

pin in  s32 line ;         // motion.program-line

pin in  float dtg ;       //  motion.distance-to-go
                         
pin in  s32    instr ;     //streamer.0.pin.0  (s32)
pin in  float indtg ;     //streamer.0.pin.1  (float) 
                             
pin in  s32 type ;         // motion.motion-type  1:Traverse
pin in  bit offon ;        // pyvcp.button

 pin in  s32 cdepth ;       //streamer.0.curr-depth s32 output

pin out s32  override ;     //halui.feed-override.counts   (100 - (6.6667/(requestedvel/100)))*-0.1
   
pin in  float requestedvel ;            //motion.requested-vel

pin in   bit empty ;         //streamer.0.empty 
pin out  bit clock ;         //streamer.0.clock

pin in  float k;         // (k * out) stepgen-velocity index
pin in  float kss;       // (kss * out) stepgen-velocity for start-stop line

param rw float addline;   // start-stop lines length

variable int  type_indicator = 0;
variable double timer;
variable float pathxy = 0;
variable int  i = 0;
variable unsigned  tt = 0;
variable int  q = 0;
variable int  all_string = 0;

variable int   enable_increment = 0;
variable int   repeat = 0;

variable int   oldline = 0;

variable float rvel;
function _;
license "GPL";

;;
#include "rtapi_math.h"

FUNCTION(_) {

    static int arr_line[100];
    static float arr_dtg[100];
    
    //if we interrupt the program(Gcode)
    if ((oldline - line) > 2) {
        q=0;
        enable_increment = 0;
        all_string = 0;
    }
    if (offon) {
        if (type == 1) {  //G0
            type_indicator = 1;
            out = 0;
            all_string = 0;
        } else {  // G1 G2 G3
            if (type_indicator == 1) {
                out = ((velxy/6.66667)*kss + overall);
                //override feed
                override = -6;
                //integrator
                if (velxy >= 0.0) { 
                    pathxy = pathxy + velxy * fperiod;
                } else {
                    pathxy = pathxy - velxy * fperiod;
                }
                if (pathxy >= addline) {
                    pathxy =  0.0; type_indicator = 0; override = 0;
                }
            } else {
                if (all_string) {
                out = (-(velxy/6.66667) * kss + overall);
                override = -6;
                } else {
                    if (line == arr_line[q] && arr_line[q] != 0) {
                        enable_increment = 1;
                        oldline = line;
                        if (dtg <= arr_dtg[q]){
                            out = (-(velxy/6.66667) * kss + overall);
                            //override feed
                            override = -6;
                            all_string = 1;
                        } else {
                            out = ((velxy/16.66667)*k + overall);
                            override = 0;
                        }
                    } else {
                        if (enable_increment) { 
                            if (q==repeat) {
                                q=0;
                            } else {
                                q++;
                            }
                        }
                        enable_increment = 0;
                        out = ((velxy/16.66667)*k + overall);
                        override = 0;
                    }
                }
            }
        }
    } else {
        out = 0;
        //override = 0;
    }
    if (empty == 0) {       //streamer.0.empty 
        if (tt % 2 != 0) { 
            clock = 0;     //streamer.0.clock (streamer.0.clock-mode 2)
            arr_line[i] = instr;  //streamer.0.pin.0
            arr_dtg[i] = indtg;
            i++;
        } else {
            clock = 1;
        }
        tt++;
        if (i) {
        repeat = i-1;
        }
    }
    else {
        i=0;
    }
}

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 06:30
Сергей Саныч
Для передачи данных из файла в зону RT есть готовая парочка функций http://linuxcnc.org/docs/2.7/html/man/m ... mer.9.html
Для обратной передачи - еще одна http://linuxcnc.org/docs/2.7/html/man/m ... ler.9.html

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 06:44
nkp
Сергей Саныч писал(а):Для передачи данных из файла в зону RT есть готовая парочка функций http://linuxcnc.org/docs/2.7/html/man/m ... mer.9.html
Для обратной передачи - еще одна http://linuxcnc.org/docs/2.7/html/man/m ... ler.9.html
выше пример как раз их "употребления")

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 07:49
MX_Master
Спасибо, за советы, ещё вчера изучал стримеры. Но, если сравнивать, вариант с lincurve будет даже проще. Ну а самым простым вариантом будет
loadrt trivkins_adjust x_adj=X200:Y0.06,X300:Y0.08,X400:Y0.1,X500:Y0.15,X600:Y0.13,Y0.1:X700,X800:Y0.08,X900:Y0.06
loadrt trivkins_adjust x_adj=[AXIS_0]ADJUST_TABLE

Код: Выделить всё

[AXIS_0]
ADJUST_TABLE=X200:Y0.06,X300:Y0.08,X400:Y0.1,X500:Y0.15,X600:Y0.13,Y0.1:X700,X800:Y0.08,X900:Y0.06
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 80.0
MAX_ACCELERATION = 200.0
STEPGEN_MAXACCEL = 250.0
SCALE = 135.496
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -0.1
MAX_LIMIT = 1297.0
HOME_OFFSET = -1.000000
HOME_SEARCH_VEL = -20.000000
HOME_LATCH_VEL = -2.000000
HOME_IGNORE_LIMITS = YES
Вощем, ни один из этих вариантов всё равно не является одновременно простым и элегантным решением.

Муки выбора продолжаются :hehehe:

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 10:55
MX_Master
Друзья, кто может мне пояснить - чем реально может грозить чтение файла при старте RT компонента? Именно при старте, во время работы никаких операций с диском не будет.

Re: Программная коррекция кривизны портала

Добавлено: 28 авг 2018, 11:12
nkp
MX_Master писал(а):чем реально может грозить чтение файла при старте RT компонента?
одень резиновые перчатки,коврик ,заземление ))
так легче попробовать, и сразу станет ясно...
по идее - не должно заработать вообще...

Re: Программная коррекция кривизны портала

Добавлено: 29 авг 2018, 07:36
MX_Master
Нахожусь сейчас вдали от всех рабочих LinuxCNC. Поэтому для теста накатал просто отдельный модуль ядра.

https://github.com/MX-Master/k_file_tes ... ile_test.c

Запускал под Ubuntu 18.04 на виртуалке. Модуль читает содержимое указанного файла и пишет его в ядерный буфер сообщений. Всё работает. Как доберусь до первого из ПК с рабочим LinuxCNC, проверю сей код уже в виде RT компонента.

Re: Программная коррекция кривизны портала

Добавлено: 29 авг 2018, 17:39
Serg
streamer написал? :)

Re: Программная коррекция кривизны портала

Добавлено: 29 авг 2018, 19:25
MX_Master
Это просто пример для проверки работы с файлами из модуля ядра.

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 01:12
Serg
MX_Master писал(а):Это просто пример для проверки работы с файлами из модуля ядра.
А чего проверять-то? Оно работает. Только вот в некоторых случаях можно deadlock словить...

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 06:22
MX_Master
UAVpilot писал(а):Только вот в некоторых случаях можно deadlock словить...
одновременные чтение и запись файла на уровне ядра?

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 15:16
Serg
Не совсем.
Само ядро не пишет и не читает файлы - это делают разные процессы потому, что операции ввода-вывода например через контроллер/драйвер SATA могут приводить к задержкам в ожидании окончания операции, например в случае ошибок при чтении с плохого сектора, что соотв. заставляет процесс-инициатор операции ждать её завершения. Если инициатором будет ядро (модуль), то оно встанет в ожидании конца операции. А т.к. драйвер выполняется в контектсте ядра то и он встанет и не сможет "отреагировать" например на ошибочное завершение операции...
Чтобы подобного не происходило все подобные операции должны выполнятся в независимых потоках/процессах. Поэтому придётся в модуле для чтения файлов либо запускать отдельный поток, либо отдельный процесс. Именно это и делает парочка streamer и halstreamer.

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 20:32
MX_Master
Так, ну вроде, с чтением файлов внутри RT компонентов разобрались. Какой-нибудь из вариантов пойдёт в ход:
  1. можно юзать на свой страх и риск чтение при старте RT компонента кинематики.
  2. можно юзать уже готовый стример.
  3. можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
Теперь, что касается файла с данными корректировки осей. Файл будет единым для трёх осей. Формат будет примерно такой:

Код: Выделить всё

       X0      X100    X200    X300    X...    X9999
Y0     0,0,0   0,0,0   0,0,0   0,0,0   ...     0,0,0
Y100   0,0,0   0,0,0   0,0,0   0,0,0   ...     0,0,0
Y200   0,0,0   0,0,0   0,0,0   0,0,0   ...     0,0,0
Y300   0,0,0   0,0,0   0,0,0   0,0,0   ...     0,0,0
Y...   ...     ...     ...     ...     ...     0,0,0
Y9999  0,0,0   0,0,0   0,0,0   0,0,0   0,0,0   0,0,0
Триплеты чисел соответствуют формату X,Y,Z. Запятые (или точки с запятой) разделяют значения внутри триплета. Пробелы (или табуляции) разделяют ряды. Таблица является универсальной, т.к. подразумевает три варианта корректировки - X от Y, Y от X, Z от XY.

Для примера, таблица корректировки из этого сообщения будет выглядеть вот так:

Код: Выделить всё

       X0     X200      X300      X400     X500      X600      X700     X800      X900      X9999
Y0     0,0,0  0,0.06,0  0,0.08,0  0,0.1,0  0,0.15,0  0,0.13,0  0,0.1,0  0,0.08,0  0,0.06,0  0,0,0
Y9999  0,0,0  0,0.06,0  0,0.08,0  0,0.1,0  0,0.15,0  0,0.13,0  0,0.1,0  0,0.08,0  0,0.06,0  0,0,0
Советы и рекомендации приветствуются.

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 20:43
nkp
MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?

Re: Программная коррекция кривизны портала

Добавлено: 30 авг 2018, 20:51
MX_Master
nkp писал(а):
MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
userspace компонент, вощем-то, может ничего не передавать RT компоненту. Просто заполнит общий кусок памяти в виде структурированной таблицы значений. RT компонент будет брать значения из этой таблицы. Так что в этом варианте тоже есть свои подводные плюсы.

Re: Программная коррекция кривизны портала

Добавлено: 31 авг 2018, 02:58
Serg
nkp писал(а):а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
Погоди, скоро начнётся написание своего собственного moveoff... ;)
MX_Master писал(а):Так что в этом варианте тоже есть свои подводные плюсы.
Это когда всё вдруг перестанет работать после безобидной команды "apt-get upgrade"? :)

Re: Программная коррекция кривизны портала

Добавлено: 31 авг 2018, 06:04
MX_Master
Ну что ж, раз знатоки категорически против любых нестандартных вещей, делать ничего нового не будем. Если всё необходимое уже написано до нас, то каждый, кому эта функция нужна, может без труда сделать её самостоятельно.