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

1. Движение

Эти контакты и параметры создаются модулем реального времени 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. Контакты

Эти контакты, параметры и функции создаются модулем реального времени 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) Текущая строка программы во время выполнения. Нуль, если не работает или между строками при одиночных шагах.

  • 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) The number of CPU cycles between invocations of the servo thread. Typically, this number divided by the CPU speed gives the time in seconds, and can be used to determine whether the realtime motion controller is meeting its timing constraints

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

1.4. Функции

Обычно обе эти функции добавляются в сервопоток в указанном порядке.

  • motion-command-handler - Получает и обрабатывает команды движения

  • motion-controller - Запускает контроллер движения LinuxCNC

2. Spindle

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

2.1. Контакты

  • 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 - accepts non-realtime I/O commands via NML, interacts with HAL.

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

4.1. Контакты

  • 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. Контакты

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