Чтение из файла идёт только при загрузке компонента. Эта таблица интерполируется во внутреннее представление и лежит в памяти. Во время работы берём значения из памяти.nkp писал(а):так в rt работать скорей всего не будет (я про обращения к файлу)...MX_Master писал(а):loadrt trivkins_adjust x_adj_file=/path/to/file1 y_adj_file=/path/to/file2
нужно данные именно в кинематику непосредственно вносить...
Программная коррекция кривизны портала
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
- merkwurdigliebe
- Мастер
- Сообщения: 608
- Зарегистрирован: 17 дек 2013, 22:14
- Репутация: 580
- Откуда: București
- Контактная информация:
Re: Программная коррекция кривизны портала
если очень сильно надо, то можно... см. filp_open()nkp писал(а):так в rt работать скорей всего не будет (я про обращения к файлу)...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
В том-то и дело, что так делать, с одной стороны, нежелательно, а с другой - как-то сделать надо. Можно, стессна, пойти более правильным путём. Добавить ещё один не RT компонент, который прочитает всё из файлов и по мере готовности передаст всё компоненту кинематики. Вощем, муки выбораmerkwurdigliebe писал(а):если очень сильно надо, то можно... см. filp_open()
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Программная коррекция кривизны портала
делал компонент ,в котором данные из "!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
Для обратной передачи - еще одна http://linuxcnc.org/docs/2.7/html/man/m ... ler.9.html
Чудес не бывает. Бывают фокусы.
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
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
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Спасибо, за советы, ещё вчера изучал стримеры. Но, если сравнивать, вариант с 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
Муки выбора продолжаются
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Друзья, кто может мне пояснить - чем реально может грозить чтение файла при старте RT компонента? Именно при старте, во время работы никаких операций с диском не будет.
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Программная коррекция кривизны портала
MX_Master писал(а):чем реально может грозить чтение файла при старте RT компонента?
одень резиновые перчатки,коврик ,заземление ))
так легче попробовать, и сразу станет ясно...по идее - не должно заработать вообще...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Нахожусь сейчас вдали от всех рабочих LinuxCNC. Поэтому для теста накатал просто отдельный модуль ядра.
https://github.com/MX-Master/k_file_tes ... ile_test.c
Запускал под Ubuntu 18.04 на виртуалке. Модуль читает содержимое указанного файла и пишет его в ядерный буфер сообщений. Всё работает. Как доберусь до первого из ПК с рабочим LinuxCNC, проверю сей код уже в виде RT компонента.
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: Программная коррекция кривизны портала
streamer написал?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Это просто пример для проверки работы с файлами из модуля ядра.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программная коррекция кривизны портала
А чего проверять-то? Оно работает. Только вот в некоторых случаях можно deadlock словить...MX_Master писал(а):Это просто пример для проверки работы с файлами из модуля ядра.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
одновременные чтение и запись файла на уровне ядра?UAVpilot писал(а):Только вот в некоторых случаях можно deadlock словить...
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программная коррекция кривизны портала
Не совсем.
Само ядро не пишет и не читает файлы - это делают разные процессы потому, что операции ввода-вывода например через контроллер/драйвер SATA могут приводить к задержкам в ожидании окончания операции, например в случае ошибок при чтении с плохого сектора, что соотв. заставляет процесс-инициатор операции ждать её завершения. Если инициатором будет ядро (модуль), то оно встанет в ожидании конца операции. А т.к. драйвер выполняется в контектсте ядра то и он встанет и не сможет "отреагировать" например на ошибочное завершение операции...
Чтобы подобного не происходило все подобные операции должны выполнятся в независимых потоках/процессах. Поэтому придётся в модуле для чтения файлов либо запускать отдельный поток, либо отдельный процесс. Именно это и делает парочка streamer и halstreamer.
Само ядро не пишет и не читает файлы - это делают разные процессы потому, что операции ввода-вывода например через контроллер/драйвер SATA могут приводить к задержкам в ожидании окончания операции, например в случае ошибок при чтении с плохого сектора, что соотв. заставляет процесс-инициатор операции ждать её завершения. Если инициатором будет ядро (модуль), то оно встанет в ожидании конца операции. А т.к. драйвер выполняется в контектсте ядра то и он встанет и не сможет "отреагировать" например на ошибочное завершение операции...
Чтобы подобного не происходило все подобные операции должны выполнятся в независимых потоках/процессах. Поэтому придётся в модуле для чтения файлов либо запускать отдельный поток, либо отдельный процесс. Именно это и делает парочка streamer и halstreamer.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Так, ну вроде, с чтением файлов внутри RT компонентов разобрались. Какой-нибудь из вариантов пойдёт в ход:
Триплеты чисел соответствуют формату X,Y,Z. Запятые (или точки с запятой) разделяют значения внутри триплета. Пробелы (или табуляции) разделяют ряды. Таблица является универсальной, т.к. подразумевает три варианта корректировки - X от Y, Y от X, Z от XY.
Для примера, таблица корректировки из этого сообщения будет выглядеть вот так:
Советы и рекомендации приветствуются.
- можно юзать на свой страх и риск чтение при старте RT компонента кинематики.
- можно юзать уже готовый стример.
- можно написать 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
Для примера, таблица корректировки из этого сообщения будет выглядеть вот так:
Код: Выделить всё
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 раз.
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Программная коррекция кривизны портала
а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
userspace компонент, вощем-то, может ничего не передавать RT компоненту. Просто заполнит общий кусок памяти в виде структурированной таблицы значений. RT компонент будет брать значения из этой таблицы. Так что в этом варианте тоже есть свои подводные плюсы.nkp писал(а):а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?MX_Master писал(а):можно написать user space компонент, который передаст считанные и обработанные данные RT компоненту через выделенный участок общей памяти (shmem).
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программная коррекция кривизны портала
Погоди, скоро начнётся написание своего собственного moveoff...nkp писал(а):а чем третий вариант будет в принципе отличаться от уже существующей пары streamer and halstreamer ?
Это когда всё вдруг перестанет работать после безобидной команды "apt-get upgrade"?MX_Master писал(а):Так что в этом варианте тоже есть свои подводные плюсы.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программная коррекция кривизны портала
Ну что ж, раз знатоки категорически против любых нестандартных вещей, делать ничего нового не будем. Если всё необходимое уже написано до нас, то каждый, кому эта функция нужна, может без труда сделать её самостоятельно.