Див. також сторінки довідки «motion(9)».

1. Рух

Ці виводи та параметри створюються модулем реального часу motmod.

Цей модуль надає інтерфейс HAL для планувальника руху LinuxCNC.

По суті, motmod приймає список точок маршруту та генерує гарний змішаний та обмежений обмеженнями потік позицій суглобів, які подаються на приводи двигунів.

За бажанням, кількість цифрових входів/виходів встановлюється за допомогою num_dio. Кількість аналогових входів/виходів встановлюється за допомогою num_aio, за замовчуванням — 4 кожен. Кількість шпинделів встановлюється за допомогою num_spindles, за замовчуванням — 1.

Назви контактів та параметрів, що починаються з axis.L та joint.N, зчитуються та оновлюються функцією контролера руху.

Рух завантажується командою motmod. Kins слід завантажити перед рухом.

loadrt motmod base_period_nsec=['period'] servo_period_nsec=['period']
              traj_period_nsec=['period'] num_joints=['0-9']
              num_dio=['1-64'] num_aio=['1-16'] unlock_joints_mask=['0xNN']
              num_spindles=['1-8']
  • base_period_nsec = 50000 – період виконання завдання «Base» у наносекундах. Це найшвидший потік у машині.

Note
У сервосистемах, як правило, немає причин, щоб «base_period_nsec» було меншим за «servo_period_nsec». На машинах із програмним генеруванням кроків «base_period_nsec» визначає максимальну кількість кроків за секунду. За відсутності вимог до великої довжини кроку та крокового простору, абсолютна максимальна частота кроків становить один крок на «base_period_nsec». Таким чином, «base_period_nsec», показаний вище, дає абсолютну максимальну частоту кроків 20 000 кроків на секунду. 50 000 нс (50 мкс) є досить консервативним значенням. Найменше значення, яке можна використовувати, пов’язане з результатом тесту затримки, необхідною довжиною кроку та швидкістю процесора. Вибір занадто низького значення «base_period_nsec» може призвести до появи повідомлення «Несподівана затримка в реальному часі», блокування або спонтанного перезавантаження.
  • servo_period_nsec = 1000000 - це період завдання «Серво» в наносекундах. Це значення буде округлено до цілого кратного «base_period_nsec». Цей період використовується навіть у системах на основі крокових двигунів.

    Це швидкість, з якою обчислюються нові положення двигуна, перевіряється похибка, оновлюються вихідні значення PID тощо. Більшість систем не потребують зміни цього значення. Це швидкість оновлення планувальника руху низького рівня.

  • traj_period_nsec = 100000 - це період завдання «Планувальник траєкторії» в наносекундах. Це значення буде округлено до цілого кратного «servo_period_nsec». За винятком машин з незвичайною кінематикою (наприклад, гексаподів), немає причин робити це значення більшим за «servo_period_nsec».

1.1. Опції

Якщо потрібна кількість цифрових входів/виходів більша за значення за замовчуванням 4, ви можете додати до 64 цифрових входів/виходів, використовуючи опцію num_dio під час завантаження motmod.

Якщо потрібна кількість аналогових входів/виходів більша за значення за замовчуванням 4, ви можете додати до 16 аналогових входів/виходів, використовуючи опцію num_aio під час завантаження motmod.

Параметр unlock_joints_mask використовується для створення контактів для з’єднання, яке використовується як блокувальний індексатор (зазвичай поворотний). Біти маски вибирають з’єднання. Молодший біт маски вибирає з’єднання 0. Приклад:

unlock_joints_mask=0x38 selects joints 3,4,5

1.2. Піни

Ці виводи, параметри та функції створюються модулем реального часу motmod.

  • motion.adaptive-feed - (float, in) Коли адаптивна подача ввімкнена за допомогою M52 P1 , задана швидкість множиться на це значення. Цей ефект є мультиплікативним із значенням перевищення рівня подачі NML та motion.feed-hold. Починаючи з версії 2.9 LinuxCNC, можна використовувати від’ємне значення адаптивної подачі для виконання траєкторії G-коду у зворотному напрямку.

  • motion.analog-in-00 - (float, in) Ці виводи (00, 01, 02, 03 або більше, якщо налаштовано) керуються M66.

  • motion.analog-out-00 - (float, out) Ці виводи (00, 01, 02, 03 або більше, якщо налаштовано) керуються M67 або M68.

  • motion.coord-error - (біт, вихід) TRUE, коли рух зіткнувся з помилкою, такою як перевищення програмного ліміту

  • motion.coord-mode - (біт, вихід) TRUE, коли рух знаходиться в «координованому режимі», на відміну від «телеоптичного режиму»

  • motion.current-vel - (float, out) Поточна швидкість інструменту в одиницях користувача за секунду.

  • motion.digital-in-00 - (біт, вхід) Ці виводи (00, 01, 02, 03 або більше, якщо налаштовано) керуються M62-65.

  • motion.digital-out-00 - (біт, вихід) Ці контакти (00, 01, 02, 03 або більше, якщо налаштовано) керуються M62-65.

  • motion.distance-to-go - (float,out) Відстань, що залишилася в поточному русі.

  • «motion.enable» — (біт, вхід) Якщо цей біт встановлений у значення FALSE, рух зупиняється, машина переходить у стан «машина вимкнена» і оператору відображається відповідне повідомлення. Для нормального руху встановіть цей біт у значення TRUE.

  • motion.feed-hold - (біт, вхід) Коли керування зупинкою подачі ввімкнено за допомогою M53 P1, і цей біт має значення TRUE, швидкість подачі встановлюється на 0.

  • motion.feed-inhibit - (біт, вхід) Коли цей біт має значення TRUE (ІСТИНА), швидкість подачі встановлюється на 0. Це буде затримуватися під час синхронізованих переміщень шпинделя до кінця переміщення.

  • motion.in-position - (біт, вихід) TRUE, якщо машина знаходиться в положенні.

  • motion.motion-enabled - (біт, вихід) TRUE у стані машина ввімкнена.

  • motion.motion-type - (s32, out) Ці значення взяті з src/emc/nml_intf/motion_types.h

    • 0: Холостий (без руху)

    • 1: Траверс

    • 2: Лінійна подача

    • 3: Подача дуги

    • 4: Зміна інструменту

    • 5: Зондування

    • 6: Індексування обертової осі

  • motion.on-soft-limit - (біт, вихід) TRUE, коли машина знаходиться на м’якому граничному значенні.

  • motion.probe-input - (біт, вхід) G38.n використовує значення на цьому виводі для визначення моменту контакту зонда. TRUE (ІСТИНА) для замкнутого (торкання) контакту зонда, FALSE (ХИБНІСТЬ) для розімкнутого контакту зонда.

  • motion.program-line - (s32, out) Поточний рядок програми під час виконання. Нуль, якщо програма не виконується, або між рядками під час покрокового виконання.

  • «motion.requested-vel» — (float, out) Поточна запитувана швидкість в одиницях користувача за секунду. Це значення є налаштуванням F-слова з файлу G-коду, яке може бути зменшене з урахуванням обмежень швидкості та прискорення машини. Значення на цьому виводі не відображає перевищення подачі або будь-які інші коригування.

  • motion.teleop-mode - (біт, вихід) TRUE, коли рух відбувається в «режимі телеоп», на відміну від «координованого режиму»

  • motion.tooloffset.x … motion.tooloffset.w - (float, out, один на вісь) показує фактичне зміщення інструменту; воно може походити з таблиці інструментів (G43 активний) або з G-коду (G43.1 активний)

  • motion.on-soft-limit - (біт, вихід) TRUE, коли машина знаходиться на м’якому граничному значенні.

  • motion.probe-input - (біт, вхід) G38.n використовує значення на цьому виводі для визначення моменту контакту зонда. TRUE (ІСТИНА) для замкнутого (торкання) контакту зонда, FALSE (ХИБНІСТЬ) для розімкнутого контакту зонда.

  • motion.program-line - (s32, out) Поточний рядок програми під час виконання. Нуль, якщо програма не виконується, або між рядками під час покрокового виконання.

  • «motion.requested-vel» — (float, out) Поточна запитувана швидкість в одиницях користувача за секунду. Це значення є налаштуванням F-слова з файлу G-коду, яке може бути зменшене з урахуванням обмежень швидкості та прискорення машини. Значення на цьому виводі не відображає перевищення подачі або будь-які інші коригування.

  • motion.teleop-mode - (біт, вихід) TRUE, коли рух відбувається в «режимі телеоп», на відміну від «координованого режиму»

  • motion.tooloffset.x … motion.tooloffset.w - (float, out, один на вісь) показує фактичне зміщення інструменту; воно може походити з таблиці інструментів (G43 активний) або з G-коду (G43.1 активний)

1.3. Параметри

Багато з цих параметрів служать допоміжними засобами налагодження та можуть бути змінені або видалені в будь-який час.

  • motion-command-handler.time - (s32, RO)

  • motion-command-handler.tmax - (s32, RW)

  • motion-controller.time - (s32, RO)

  • motion-controller.tmax - (s32, RW)

  • motion.debug-bit-0 - (bit, RO) Використовується для налагодження.

  • motion.debug-bit-1 - (bit, RO) Це використовується для налагодження.

  • motion.debug-float-0 - (float, RO) Це використовується для налагодження.

  • motion.debug-float-1 - (float, RO) Це використовується для налагодження.

  • motion.debug-float-2 - (float, RO) Це використовується для налагодження.

  • motion.debug-float-3 - (float, RO) Це використовується для налагодження.

  • motion.debug-s32-0 - (s32, RO) Це використовується для налагодження.

  • motion.debug-s32-1 - (s32, RO) Це використовується для налагодження.

  • motion.servo.last-period - (u32, RO) Кількість циклів ЦП між викликами серво-потоку. Зазвичай це число, поділене на швидкість ЦП, дає час у секундах і може бути використане для визначення, чи відповідає контролер руху в реальному часі своїм обмеженням за часом

  • motion.servo.last-period-ns - (float, RO)

1.4. Функції

Зазвичай ці функції додаються до серво-потоку в показаному порядку.

  • motion-command-handler – Отримує та обробляє команди руху

  • motion-controller – Запускає контролер руху LinuxCNC

2. Шпиндель

LinuxCNC може керувати до восьми шпинделів. Рух генеруватиме такі контакти: N (ціле число від 0 до 7) замінює номер шпинделя.

2.1. Піни

* spindle.N.at-speed - (біт, вхід) Рух буде призупинено, доки цей вивід не стане TRUE, за таких умов: перед першим рухом подачі після кожного запуску шпинделя або зміни швидкості; перед початком кожного ланцюга синхронізованих шпинделем рухів; ** а в режимі CSS — при кожному швидкому переході до подачі. Цей вхідний сигнал можна використовувати для забезпечення необхідної швидкості шпинделя перед початком різання або для уповільнення шпинделя токарного верстата в режимі CSS після великого до малого проходу перед початком наступного проходу на великому діаметрі. Багато VFD мають вихід «at speed» (на швидкості). В іншому випадку цей сигнал легко генерувати за допомогою компонента «HAL near», порівнюючи запитувану і фактичну швидкість шпинделя. * spindle.N.brake - (біт, вихід) TRUE, коли слід застосувати гальмо шпинделя. * spindle.N.forward - (біт, вихід) TRUE, коли шпиндель має обертатися вперед. * spindle.N.index-enable - (біт, введення/виведення) Для правильної роботи синхронізованих переміщень шпинделя цей контакт має бути підключений до контакту індексування енкодера шпинделя. * spindle.N.inhibit - (біт, вхід) Коли цей біт має значення TRUE (ІСТИНА), швидкість шпинделя встановлюється на 0. * spindle.N.on - (біт, вихід) TRUE, коли шпиндель має обертатися. * spindle.N.reverse - (біт, вихід) TRUE, коли шпиндель має обертатися назад * spindle.N.revs - (float, in) Для коректної роботи синхронізованих рухів шпинделя цей сигнал повинен бути підключений до контакту положення енкодера шпинделя. Положення енкодера шпинделя повинно бути масштабоване таким чином, щоб оберти шпинделя збільшувалися на 1,0 за кожний оберт шпинделя за годинниковою стрілкою (M3). * spindle.N.speed-in - (float, in) Зворотний зв’язок фактичної швидкості шпинделя в обертах за секунду. Використовується для руху з подачею на оберт (G95). Якщо драйвер енкодера шпинделя не має виходу швидкості, ви можете створити відповідний, надіславши положення шпинделя через компонент «ddt». Якщо у вас немає енкодера шпинделя, ви можете зациклити «spindle.N.speed-out-rps». * spindle.N.speed-out - (float, out) Задана швидкість шпинделя в обертах за хвилину. Додатна для руху шпинделя вперед (M3), від’ємна для руху шпинделя назад (M4). * spindle.N.speed-out-abs - (float, out) Задана швидкість шпинделя в обертах за хвилину. Це завжди буде додатним числом. * spindle.N.speed-out-rps - (float, out) Задана швидкість шпинделя в обертах за секунду. Додатна для руху шпинделя вперед (M3), від’ємна для руху шпинделя назад (M4). * spindle.N.speed-out-rps-abs - (float, out) Задана швидкість шпинделя в обертах за секунду. Це завжди буде додатним числом. * spindle.N.orient-angle - (float,out) Бажана орієнтація шпинделя для M19. Значення параметра R-слова M19 плюс значення параметра INI [RS274NGC]ORIENT_OFFSET. * spindle.N.orient-mode - (s32,out) Бажаний режим обертання шпинделя M19. За замовчуванням 0. * spindle.N.orient - (вихід, біт) Вказує на початок циклу орієнтації шпинделя. Встановлюється командою M19. Скидається будь-якою з команд M3, M4 або M5. Якщо під час орієнтації шпинделя значення spindle-orient-fault не дорівнює нулю, команда M19 завершується з помилкою. * spindle.N.is-oriented - (вхід, біт) Контакт підтвердження для орієнтації шпинделя. Завершує цикл орієнтації. Якщо орієнтація шпинделя була справжньою, коли було підтверджено, що шпиндель орієнтований, контакт орієнтації шпинделя очищується, а контакт блокування шпинделя підтверджується. Також підтверджується контакт гальма шпинделя. * spindle.N.orient-fault - (s32, in) Вхідний код помилки для циклу орієнтації. Будь-яке значення, відмінне від нуля, призведе до переривання циклу орієнтації. * spindle.N.lock - (bit, out) Штифт повної орієнтації шпинделя. Очищається будь-яким з M3, M4 або M5.

Використання штифта HAL для шпинделя M19 Orient

Концептуально шпиндель знаходиться в одному з наступних режимів:

  • режим обертання (за замовчуванням)

  • пошук потрібного режиму орієнтації

  • режим повної орієнтації.

Коли виконується M19, шпиндель переходить у режим «пошуку бажаного орієнтування», і активується контакт HAL spindle.__N__.orient. Бажане цільове положення визначається контактами spindle.__N__.orient-angle і spindle.__N__.orient-fwd і керується параметрами M19 R і P.

Логіка підтримки HAL повинна реагувати на spindle.__N__.orient, переміщуючи шпиндель у бажане положення. Після завершення цього процесу логіка HAL повинна підтвердити це, активувавши контакт spindle.__N__.is-oriented.

Motion підтверджує це, скасовуючи сигнал на виводі spindle.__N__.orient і подаючи сигнал на виводі spindle.__N__.locked, щоб вказати режим «орієнтація завершена». Він також подає сигнал на виводі spindle.__N__.brake. Тепер шпиндель перебуває в режимі «орієнтація завершена».

Якщо під час виконання spindle.__N__.orient є істинним, а spindle.__N__.is-oriented ще не підтверджено, контакт spindle.__N__.orient-fault має значення, відмінне від нуля, команда M19 переривається, відображається повідомлення з кодом помилки, а черга рухів очищається. Шпиндель повертається в режим обертання.

Крім того, будь-яка з команд M3, M4 або M5 скасовує режим «пошук бажаної орієнтації» або «орієнтація завершена». Це позначається скасуванням активності обох контактів spindle-orient та spindle-locked.

Вивід «spindle-orient-mode» відображає слово M19 P і має інтерпретуватися наступним чином:

  • 0: обертати за годинниковою стрілкою або проти годинникової стрілки для найменшого кутового переміщення

  • 1: завжди обертати за годинниковою стрілкою

  • 2: завжди обертати проти годинникової стрілки

Його можна використовувати з компонентом HAL orient, який забезпечує значення команди PID на основі положення енкодера шпинделя, кут орієнтації шпинделя та режим орієнтації шпинделя.

3. Осі та шарнірні штифти та параметри

Ці контакти та параметри створюються модулем «motmod» у режимі реального часу. [У машинах з «тривіальною кінематикою» існує однозначна відповідність між шарнірами та осями.] Вони зчитуються та оновлюються функцією «motion-controller».

Дивіться сторінку довідки з руху motion(9) для отримання детальної інформації про виводи та параметри.

4. iControl

iocontrol — приймає команди вводу/виводу не в реальному часі через NML, взаємодіє з HAL.

Контакти HAL iocontrol вмикаються та вимикаються в режимі, що не є режимом реального часу. Якщо ви маєте суворі вимоги до синхронізації або просто потребуєте більше входів/виходів, розгляньте можливість використання синхронізованих входів/виходів у режимі реального часу, що надаються motion.

4.1. Піни

* iocontrol.0.coolant-flood (біт, вихід) TRUE, коли запитується затоплення охолоджувальної рідини. * iocontrol.0.coolant-mist (біт, вихід) TRUE, коли запитується охолоджувальний туман. * iocontrol.0.emc-enable-in (біт, in) Повинно бути встановлено значення FALSE (ХИБНІСТЬ), якщо існує зовнішня умова аварійної зупинки. * iocontrol.0.tool-change (біт, вихід) TRUE, коли запитується зміна інструменту. * iocontrol.0.tool-changed (біт, вхід) Повинно бути встановлене на TRUE після завершення зміни інструменту. * iocontrol.0.tool-number (s32, out) Поточний номер інструменту. * iocontrol.0.tool-prep-number (s32, out) Номер наступного інструменту з T-слова RS274NGC. * iocontrol.0.tool-prepare (біт, вихід) TRUE, коли запитується підготовка інструменту. * iocontrol.0.tool-prepared (біт, вхід) Має бути встановлене на TRUE після завершення підготовки інструменту. * iocontrol.0.user-enable-out (біт, вихід) ХИБНІСТЬ, коли існує внутрішня умова аварійної зупинки. * iocontrol.0.user-request-enable (біт, вихід) TRUE, коли користувач запросив скасування аварійної зупинки.

5. Налаштування INI

Ряд налаштувань INI доступні як вхідні контакти HAL.

5.1. Піни

N позначає номер суглоба, L позначає літеру осі.

  • ini.N.ferror - (float, in) [JOINT_N]FERROR

  • ini.N.min_ferror - (float, in) [JOINT_N]MIN_FERROR

  • ini.N.backlash - (float, in) [JOINT_N]BACKLASH

  • ini.N.min_limit - (float, in) [JOINT_N]MIN_LIMIT

  • ini.N.max_limit - (float, in) [JOINT_N]MAX_LIMIT

  • ini.N.max_velocity - (float, in) [JOINT_N]MAX_VELOCITY

  • ini.N.max_acceleration - (float, in) [JOINT_N]MAX_ACCELERATION

  • ini.N.home - (float, in) [JOINT_N]HOME

  • ini.N.home_offset - (float, in) [JOINT_N]HOME_OFFSET

  • ini.N.home_offset - (s32, in) [JOINT_N]HOME_SEQUENCE

  • ini.L.min_limit - (float, in) [AXIS_L]MIN_LIMIT

  • ini.L.max_limit - (float, in) [AXIS_L]MAX_LIMIT

  • ini.L.max_velocity - (float, in) [AXIS_L]MAX_VELOCITY

  • ini.L.max_acceleration - (float, in) [AXIS_L]MAX_ACCELERATION

Note
Контакти min_limit і max_limit для кожної осі працюють безперервно після повернення в початкове положення. Контакти ferror і min_ferror для кожної осі працюють, коли машина увімкнена і не знаходиться в положенні. Контакти max_velocity і max_acceleration для кожної осі зчитуються, коли машина увімкнена і motion_state вільний (повернення в початкове положення або ручне переміщення), але не зчитуються, коли виконується програма (автоматичний режим) або в режимі MDI. Отже, зміна значень контактів під час виконання програми не матиме ефекту, доки програма не буде зупинена і motion_state знову не стане вільним.
  • ini.traj_arc_blend_enable - (bit, in) [TRAJ]ARC_BLEND_ENABLE

  • ini.traj_arc_blend_fallback_enable - (bit, in) [TRAJ]ARC_BLEND_FALLBACK_ENABLE

  • ini.traj_arc_blend_gap_cycles - (float, in) [TRAJ]ARC_BLEND_GAP_CYCLES

  • ini.traj_arc_blend_optimization_depth - (float, in) [TRAJ]ARC_BLEND_OPTIMIZATION_DEPTH

  • ini.traj_arc_blend_ramp_freq - (float, in) [TRAJ]ARC_BLEND_RAMP_FREQ

Note
Значення виводів traje_arc_blend вибірково перевіряються безперервно, але зміна значень виводів під час роботи програми може не мати негайного ефекту через чергу команд.
  • ini.traj_default_acceleration - (float, in) [TRAJ]DEFAULT_ACCELERATION

  • ini.traj_default_velocity - (float, in) [TRAJ]DEFAULT_VELOCITY

  • ini.traj_max_acceleration - (float, in) [TRAJ]MAX_ACCELERATION