См. также справочные страницы motion(9).

1. Motion

Эти контакты и параметры создаются модулем реального времени motmod.

Этот модуль предоставляет интерфейс HAL для планировщика движения LinuxCNC.

По сути, motmod принимает список путевых точек и генерирует хорошо смешанный и ограниченный поток положений сочленений для подачи на приводы двигателей.

Дополнительно количество цифровых входов/выходов устанавливается с помощью num_dio. Количество аналоговых входов/выходов устанавливается с помощью num_aio, по умолчанию 4 для каждого. Количество шпинделей задается с помощью num_spindles, по умолчанию 1.

Имена контактов и параметров, начинающиеся с axis.L и joint.N, считываются и обновляются функцией контроллера движения.

Движение загружается командой motmod. Кинематики должны быть загружены перед движением.

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 мкс) — довольно консервативное значение. Наименьшее используемое значение связано с результатом Latency Test, необходимой длиной импульса и скоростью процессора. Выбор слишком малого значения «base_period_nsec» может привести к появлению сообщения «Неожиданная задержка в реальном времени», зависаниям или самопроизвольным перезагрузкам.
  • servo_period_nsec = 1000000 — это период задачи Servo в наносекундах. Это значение будет округлено до целого числа, кратного base_period_nsec. Этот период используется даже в системах на основе шаговых двигателей.

    Это скорость, с которой вычисляются новые положения двигателя, проверяется ошибка рассогласования, обновляются выходные значения ПИД-регулятора и т. д. В большинстве систем нет необходимости изменять это значение. Это частота обновления низкоуровневого планировщика движения.

  • 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 выбирает сочленения 3,4,5

1.2. Pins)

Эти контакты, параметры и функции создаются модулем реального времени 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 - (bit, out) TRUE, когда движение столкнулось с ошибкой, такой как превышение программного предела

  • motion.coord-mode - (bit, out) TRUE, когда движение в координированном режиме, а не в режиме телеоперации

  • motion.current-vel - (float, out) Текущая скорость инструмента в пользовательских единицах в секунду.

  • motion.digital-in-00 - (bit, in) Эти контакты (00, 01, 02, 03 или более, если настроены) управляются M62-65.

  • motion.digital-out-00 - (bit, out) Эти контакты (00, 01, 02, 03 или более, если настроены) управляются M62-65.

  • motion.distance-to-go - (float,out) Расстояние, оставшееся в текущем перемещении.

  • motion.enable - (bit, in) Если этот бит установлен в FALSE, движение останавливается, станок переходит в состояние machine off, и для оператора отображается сообщение. Для нормального движения установите этот бит в значение TRUE.

  • motion.feed-hold - (bit, in) Когда управление остановкой подачи включено с помощью M53 P1, и этот бит в TRUE, скорость подачи устанавливается на 0.

  • motion.feed-inhibit - (bit, in) Когда этот бит имеет значение TRUE, скорость подачи устанавливается на 0. Это будет отложено во время синхронизации шпинделя до конца перемещения.

  • motion.in-position - (bit, out) TRUE, если станок находится в положении.

  • motion.motion-enabled - (bit, out) TRUE, когда в состянии станок включен.

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

    • 0: холостой ход (нет движения)

    • 1: Traverse

    • 2: Linear feed

    • 3: Arc feed

    • 4: Tool change

    • 5: Probing

    • 6: Rotary axis indexing

  • motion.on-soft-limit - (bit, out) TRUE, когда станок находится на программном пределе.

  • motion.probe-input - (bit, in) G38.n использует значение на этом контакте, чтобы определить, когда щуп установил контакт. TRUE для замкнутого контакта щупа (касается), FALSE для разомкнутого контакта щупа.

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

  • motion.requested-vel - (float, out) Текущая запрошенная скорость в пользовательских единицах в секунду. Это значение представляет собой настройку F-слова из файла G-кода, возможно, уменьшенную для соответствия пределам скорости и ускорения станка. Значение на этом контакте не отражает переопределение подачи или какие-либо другие настройки.

  • motion.teleop-mode - (bit, out) TRUE when motion is in teleop mode, as opposed to coordinated mode

  • motion.tooloffset.x … motion.tooloffset.w - (float, out, one per axis) shows the tool offset in effect; it could come from the tool table (G43 active), or it could come from the G-code (G43.1 active)

  • motion.on-soft-limit - (bit, out) TRUE, когда станок находится на программном пределе.

  • motion.probe-input - (bit, in) G38.n uses the value on this pin to determine when the probe has made contact. TRUE for probe contact closed (touching), FALSE for probe contact open.

  • motion.program-line - (s32, out) The current program line while executing. Zero if not running or between lines while single stepping.

  • motion.requested-vel - (float, out) The current requested velocity in user units per second. This value is the F-word setting from the G-code file, possibly reduced to accommodate machine velocity and acceleration limits. The value on this pin does not reflect the feed override or any other adjustments.

  • motion.teleop-mode - (bit, out) TRUE when motion is in teleop mode, as opposed to coordinated mode

  • motion.tooloffset.x … motion.tooloffset.w - (float, out, one per axis) shows the tool offset in effect; it could come from the tool table (G43 active), or it could come from the G-code (G43.1 active)

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

LinuxCNC может осуществлять управление до восьми шпинделей. Модуль движения создаст следующие контакты: N (целое число от 0 до 7) заменяет номер шпинделя.

2.1. Pins)

  • spindle.N.at-speed - (bit, in) Движение будет приостановлено до тех пор, пока этот контакт не станет TRUE, при следующих условиях:

    • перед первым ходом подачи после каждого запуска шпинделя или изменения скорости;

    • перед началом каждой цепочки синхронизированных со шпинделем ходов;

    • и если в режиме CSS, то при каждом быстром переходе на подачу. Этот ввод можно использовать, чтобы убедиться, что шпиндель набрал нужную скорость перед началом резки или что шпиндель токарного станка в режиме CSS замедлился после прохода снятия от большого к малому перед началом следующего прохода на большем диаметре. Многие VFD имеют выход at speed. В противном случае этот сигнал легко сгенерировать с помощью компонента HAL near, сравнивая запрашиваемую и фактическую скорость шпинделя.

  • spindle.N.brake - (bit, out) TRUE, когда следует задействовать тормоз шпинделя.

  • spindle.N.forward - (bit, out) TRUE, когда шпиндель должен вращаться вперед.

  • spindle.N.index-enable - (bit, I/O) Для правильной работы синхронизированных перемещений шпинделя этот контакт должен быть подключен к контакту index-enable энкодера шпинделя.

  • spindle.N.inhibit - (bit, in) Когда этот бит равен TRUE, скорость шпинделя установлена на 0.

  • spindle.N.on - (bit, out) TRUE, когда шпиндель должен вращаться.

  • spindle.N.reverse - (bit, out) 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. Значение параметра M19 R word плюс значение параметра [RS274NGC]ORIENT_OFFSET INI.

  • spindle.N.orient-mode - (s32,out) Желаемый режим вращения шпинделя М19. По умолчанию 0.

  • spindle.N.orient - (out,bit) Указывает на начало цикла ориентации шпинделя. Устанавливается М19. Очищается любым из M3, M4 или M5. Если spindle-orient-fault не равна нулю при spindle-orient true, команда M19 завершается сбоем с сообщением об ошибке.

  • spindle.N.is-oriented - (in, bit) Контакт подтверждения для spindle-orient. Завершает цикл ориентации. Если spindle-orient было true, когда стал активным spindle-is-oriented, контакт spindle-orient сбрасывается и устанавливается в активный уровень контакт spindle-locked. Также устанавливается контакт spindle-brake.

  • spindle.N.orient-fault - (s32, in) Ввод кода неисправности для цикла ориентации. Любое значение, отличное от нуля, приведет к прерыванию цикла ориентации.

  • spindle.N.lock - (bit, out) Контакт ориентация шпинделя выполнена. Очищается любым из M3, M4 или M5.

Использование контакта HAL для ориентации шпинделя M19

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

  • режим вращения (по умолчанию)

  • поиск нужного режима ориентации

  • режим завершения ориентации.

Когда выполняется M19, шпиндель переключается на поиск желаемой ориентации, и подключается контакт HAL spindle.__N__.orient. Желаемая целевая позиция задается контактами spindle.__N__.orient-angle и spindle.__N__.orient-fwd и управляется параметрами M19 R и P.

Ожидается, что логика поддержки HAL будет реагировать на spindle.__N__.orient, перемещая шпиндель в желаемое положение. Когда это будет завершено, ожидается, что логика HAL подтвердит это, установив активным вывод spindle.__N__.is-ориентированный.

Затем Motion подтверждает это, делая неактивным контакт spindle.__N__.orient и делая активным контакт spindle.__N__.locked, чтобы показать режим orientation complete. Он также делает активным контакт spindle.__N__.brake. Шпиндель теперь находится в режиме orientation complete.

Если, пока spindle.__N__.orient является true, а 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. [В станках с trivial kinematics между сочленениями и осями существует соответствие один-к-одному.] Они считываются и обновляются функцией motion-controller.

Подробную информацию о контактах и параметрах см. на странице руководства по движению «motion(9)».

4. iocontrol

iocontrol - принимает команды ввода-вывода не в реальном времени через NML, взаимодействует с HAL.

Контакты HAL iocontrol включаются и выключаются не в режиме реального времени. Если у вас строгие требования к синхронизации или вам просто нужно больше операций ввода-вывода, рассмотрите возможность использования вместо этого синхронизированного ввода-вывода в реальном времени, предоставляемого motion.

4.1. Pins )

  • iocontrol.0.coolant-flood (bit, out) TRUE когда запрашивается охлаждающая жидкость.

  • iocontrol.0.coolant-mist (bit, out) TRUE когда запрашивается охлаждающая жидкость в виде тумана.

  • iocontrol.0.emc-enable-in (bit, in) Должно быть установлено значение FALSE, когда существует внешнее условие аварийного останова.

  • iocontrol.0.tool-change (bit, out) TRUE когда требуется смена инструмента.

  • iocontrol.0.tool-changed (bit, in) Должен быть установлен в TRUE, когда смена инструмента завершена.

  • iocontrol.0.tool-number (s32, out) Текущий номер инструмента.

  • iocontrol.0.tool-prep-number (s32, out) Номер следующего инструмента из Т-слова RS274NGC.

  • iocontrol.0.tool-prepare (bit, out) TRUE, когда запрашивается подготовка инструмента.

  • iocontrol.0.tool-prepared (bit, in) Должен быть установлен в TRUE, когда подготовка инструмента завершена.

  • iocontrol.0.user-enable-out (bit, out) FALSE , когда существует внутреннее условие аварийного останова.

  • iocontrol.0.user-request-enable (bit, out) TRUE, когда пользователь запросил очистку аварийного останова.

5. настройки INI

Ряд настроек INI доступен как входные контакты HAL.

5.1. Pins )

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
Выборка контактов traj_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