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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

nkp писал(а):
MX_Master писал(а):loadrt trivkins_adjust x_adj_file=/path/to/file1 y_adj_file=/path/to/file2
так в rt работать скорей всего не будет (я про обращения к файлу)...
нужно данные именно в кинематику непосредственно вносить...
Чтение из файла идёт только при загрузке компонента. Эта таблица интерполируется во внутреннее представление и лежит в памяти. Во время работы берём значения из памяти.
Аватара пользователя
merkwurdigliebe
Мастер
Сообщения: 608
Зарегистрирован: 17 дек 2013, 22:14
Репутация: 580
Откуда: București
Контактная информация:

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

Сообщение merkwurdigliebe »

nkp писал(а):так в rt работать скорей всего не будет (я про обращения к файлу)...
если очень сильно надо, то можно... см. filp_open()
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

merkwurdigliebe писал(а):если очень сильно надо, то можно... см. filp_open()
В том-то и дело, что так делать, с одной стороны, нежелательно, а с другой - как-то сделать надо. Можно, стессна, пойти более правильным путём. Добавить ещё один не RT компонент, который прочитает всё из файлов и по мере готовности передаст всё компоненту кинематики. Вощем, муки выбора :hehehe:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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;
    }
}
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

Для передачи данных из файла в зону 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
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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
выше пример как раз их "употребления")
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение 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:
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

Друзья, кто может мне пояснить - чем реально может грозить чтение файла при старте RT компонента? Именно при старте, во время работы никаких операций с диском не будет.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

MX_Master писал(а):чем реально может грозить чтение файла при старте RT компонента?
одень резиновые перчатки,коврик ,заземление ))
так легче попробовать, и сразу станет ясно...
по идее - не должно заработать вообще...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

Нахожусь сейчас вдали от всех рабочих LinuxCNC. Поэтому для теста накатал просто отдельный модуль ядра.

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

Запускал под Ubuntu 18.04 на виртуалке. Модуль читает содержимое указанного файла и пишет его в ядерный буфер сообщений. Всё работает. Как доберусь до первого из ПК с рабочим LinuxCNC, проверю сей код уже в виде RT компонента.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

streamer написал? :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

Это просто пример для проверки работы с файлами из модуля ядра.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

MX_Master писал(а):Это просто пример для проверки работы с файлами из модуля ядра.
А чего проверять-то? Оно работает. Только вот в некоторых случаях можно deadlock словить...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

UAVpilot писал(а):Только вот в некоторых случаях можно deadlock словить...
одновременные чтение и запись файла на уровне ядра?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Не совсем.
Само ядро не пишет и не читает файлы - это делают разные процессы потому, что операции ввода-вывода например через контроллер/драйвер SATA могут приводить к задержкам в ожидании окончания операции, например в случае ошибок при чтении с плохого сектора, что соотв. заставляет процесс-инициатор операции ждать её завершения. Если инициатором будет ядро (модуль), то оно встанет в ожидании конца операции. А т.к. драйвер выполняется в контектсте ядра то и он встанет и не сможет "отреагировать" например на ошибочное завершение операции...
Чтобы подобного не происходило все подобные операции должны выполнятся в независимых потоках/процессах. Поэтому придётся в модуле для чтения файлов либо запускать отдельный поток, либо отдельный процесс. Именно это и делает парочка streamer и halstreamer.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение 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
Советы и рекомендации приветствуются.
Последний раз редактировалось MX_Master 30 авг 2018, 20:46, всего редактировалось 1 раз.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

nkp писал(а):
MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
userspace компонент, вощем-то, может ничего не передавать RT компоненту. Просто заполнит общий кусок памяти в виде структурированной таблицы значений. RT компонент будет брать значения из этой таблицы. Так что в этом варианте тоже есть свои подводные плюсы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

nkp писал(а):а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
Погоди, скоро начнётся написание своего собственного moveoff... ;)
MX_Master писал(а):Так что в этом варианте тоже есть свои подводные плюсы.
Это когда всё вдруг перестанет работать после безобидной команды "apt-get upgrade"? :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3099
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

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

Вернуться в «LinuxCNC»