LinuxCNC Documentation
This page is 93% translated. Untranslated text is shown in English.

LinuxCNC is about interacting with hardware. But few users have the same exact hardware specifications - similar, but not the same. And even for the exact same hardware, there may be different ways to use it, say for different materials or with different mills, which would require adaptations to the control of an already running system. An abstraction was needed to make it easier to configure LinuxCNC for a wide variety of hardware devices. At the highest level, it could simply be a way to allow a number of building blocks to be loaded and interconnected to assemble a complex system.

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

1. HAL Обзор

The Hardware Abstraction Layer (or with a reference to the 2001 Space Odyssey movie just "HAL") is a software to

  • обеспечить инфраструктуру для связи с и между многими программными и аппаратными компонентами системы.

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

Сама по себе это link: Связующее программное обеспечение не содержит информации о ее применении на ЧПУ. Поиск в Интернете, например, нашел астрономическое приложение для управления телескопами с помощью LinuxCNC. Двигатели перемещают телескоп в правильное положение, и он должен знать, как сопоставить двигательную активность с эффектом этого позиционирования в реальном мире. Такая синхронизация положений двигателя с реальными положениями напоминает то, что должны делать станки с ЧПУ или космические корабли.

Любой контролер станка должен знать:

  • о его внутреннем состоянии и о том, как оно соотносится с окружающей средой (координаты станка, состояние переключателей/регуляторов),

  • как исполнительные механизмы должны изменить это состояние,

  • как разрешить обновление внутреннего состояния датчиков (энкодеров, зондов).

Уровень HAL состоит из частей (называемых «компонентами»), которые

  • связаны друг с другом, например, для обновления данных о местоположении или для того, чтобы алгоритм планирования сообщал двигателям о следующем шаге.

  • может знать, как взаимодействовать с оборудованием,

  • может просто обрабатывать входящие данные и предоставлять выходные данные другим компонентам,

  • всегда периодически выполняются либо

    • с очень высокой частотой в несколько микросекунд (мкс) времени выполнения, называемой базовым потоком, например, для

      1. дать шаговому двигателю триггер, чтобы сделать шаг вперед или

      2. считать позицию, представленную энкодером.

    • с более низкой частотой каждую миллисекунду (мс), например, чтобы

      1. скорректировать планирование следующих ходов, чтобы завершить инструкцию G-кода.

    • как компоненты «user-space», которые запускают «основной цикл», так же как и любое другое программное обеспечение, и могут прерываться или задерживаться, когда остальная часть системы занята или перегружена.

В совокупности HAL позволяет

  1. программировать для станка, который программист не знает напрямую, но может полагаться на программный интерфейс с четко определенным воздействием на станок. Этот интерфейс может быть использован для

    • сказать станку, что делать

    • послушать, что станок хочет сказать о своем состоянии.

  2. Вертикальные абстракции: системный интегратор такого станка использует HAL

    • чтобы описать, как выглядит станок и как какой кабель управляет каким двигателем, который приводит в движение определенную ось.

    • Описание станка, интерфейсы программиста и интерфейс пользователя каким-то образом «встречаются» на этом абстрактном уровне.

  3. Горизонтальные абстракции:

    • Не все станки имеют все виды функций

    • фрезеры, токарные станки и роботы имеют много общего

      • особенностей (двигатели, сочленения, …​),

      • алгоритмы планирования своих движений.

HAL не имеет прямого взаимодействия с пользователем. Но было предоставлено несколько интерфейсов, позволяющих манипулировать HAL

  • из командной строки с помощью команды "halcmd".

  • из скриптов Python и

  • из программ C/C++,

но ни один из этих интерфейсов не является "самим HAL".

HAL сам по себе не является программой, он состоит из одного или нескольких списков загруженных программ (компонентов), которые периодически выполняются (в строгой последовательности), и области общей памяти, которую эти компоненты используют для обмена данными. Основной скрипт HAL запускается только один раз при запуске станка, настраивая потоки реального времени и места в общей памяти, загружая компоненты и настраивая каналы передачи данных между ними («сигналы» и «контакты»).

В принципе, несколько станков могут использовать общий HAL, чтобы обеспечить их взаимодействие, однако текущая реализация LinuxCNC ограничена одним интерпретатором и одним модулем задач. В настоящее время это почти всегда интерпретатор G-кода и "задача фрезерования" (которая также хорошо работает для токарных станков и адекватно для роботов), но эти модули можно выбрать во время загрузки. Учитывая растущий интерес к управлению несколькими взаимодействующими станками, преодоление этого ограничения, вероятно, станет одним из основных шагов для решения проблемы будущего развития LinuxCNC. Однако это немного сложно, и сообщество все еще формирует свои мысли по этому поводу.

HAL лежит в основе LinuxCNC и используется и/или расширяется всеми частями LinuxCNC, включая ГИП. Интерпретатор G-кода (или альтернативного языка) знает, как интерпретировать G-код, и переводит его в операции станка, запуская сигналы в HAL. Пользователь может запрашивать HAL различными способами, чтобы получить информацию о его состоянии, которая затем также представляет состояние станка. Во время разработки версии 2.9, ГИПы по-прежнему являются исключением из этого правила и могут знать что-то, чего HAL не знает (но должен).

2. Коммуникация

HAL уникален тем, что может коммуницировать очень быстро

  • с другими программами, но в частности

  • с его компонентами, которые обычно выполняются в одном из потоков реального времени.

И при общении та часть LinuxCNC, с которой происходит обмен данными, не нуждается в подготовке к обмену: все эти действия выполняются асинхронно, т. е. ни один компонент не прерывает свое обычное выполнение для получения сигнала, и сигналы могут быть отправлены сразу, т. е. приложение может ждать, пока не поступит конкретное сообщение (например, сигнал разрешения), но ему не нужно готовиться к получению этого сообщения.

Система обмена данными

  • представляет и контролирует все оборудование, подключенное к системе,

  • запускает и останавливает другие коммуникационные программы.

Связь с аппаратным обеспечением самого станка осуществляется соответствующими выделенными компонентами HAL.

Уровень HAL — это общее пространство, в котором все части, составляющие LinuxCNC, обмениваются информацией. В этом пространстве есть контакты, которые идентифицируются по имени, хотя инженер LinuxCNC может предпочесть ассоциацию с контактом электронной схемы. Эти контакты могут нести числовые и логические значения, булевы значения, числа с плавающей запятой, а также целые числа со знаком и без знака. Существует также (относительно новый) тип вывода с именем hal_port, предназначенный для потоков байтов, и платформа для обмена более сложными данными, называемая hal_stream (которая использует частную общую область памяти, а не контакт HAL). Последние два типа используются сравнительно редко.

С помощью HAL вы можете отправить сигнал на этот названный контакт. Каждая часть HAL может прочитать этот контакт, который содержит значение сигнала. То есть до тех пор, пока новый сигнал не отправляется для замены предыдущего значения на контакт с тем же именем. Базовая система обмена сообщениями HAL не зависит от ЧПУ, но HAL поставляется с большим количеством компонентов, которые многое знают о ЧПУ и представляют эту информацию через контакты. Есть контакты, обозначающие

  • статическую информация о станке

  • текущее состояние станка

    • концевиков

    • позиции, подсчитанные шаговыми двигателями или измеренные энкодерами

  • получатели инструкций

    • ручное упрваление положением станка ("медленная подача")

    • положения, которые шаговые двигатели должны занять в следующий раз

По аналогии с электронными кабелями контакты могут быть соединены "проводами", поэтому значение, изменяющееся на одном контакте, служит входом для другого контакта. Компоненты HAL подготавливают такие входные и выходные контакты и, таким образом, автоматически запускаются для работы.

HAL Components

Многие «экспертные» программные части LinuxCNC обычно реализуются как компоненты HAL, концептуально также называемые модулями. Эти компьютеризированные эксперты постоянно читают из HAL о состоянии, к которому должен стремиться станок, и сравнивают это желаемое состояние с состоянием, в котором станок находится в текущий момент. Когда существует разница между тем, что должно быть, и тем, каким является текущее состояние, выполняются некоторые действия, чтобы уменьшить эту разницу, при этом постоянно записывая обновления текущих состояний обратно в пространство данных HAL.

Есть компоненты, специализирующиеся на взаимодействии с шаговыми двигателями, а другие компоненты умеют управлять сервоприводами. На более высоком уровне некоторые компоненты знают, как расположены оси станка в 3D, а другие знают, как плавно перемещаться из одной точки пространства в другую. Токарные станки, фрезерные станки и роботы будут различаться активным компонентом LinuxCNC, т.е. который загружается файлом конфигурации HAL для этого станка. Тем не менее, два станка могут выглядеть очень по-разному, поскольку они созданы для совершенно разных целей, но когда они оба используют серводвигатели, они все равно могут использовать один и тот же серво-компонент HAL.

Происхождение стимула к перемещению

На самом нижнем (ближайшем к аппаратному) уровне, например, для шаговых двигателей, описание состояния этого двигателя весьма понятно интуитивно: это количество шагов в определенном направлении. Разница между желаемым положением и фактическим положением преобразуется в движение. Скорость, ускорение и другие параметры могут быть ограничены внутри самого компонента или могут быть ограничены вышестоящими компонентами. (Например, в большинстве случаев значения положения оси по каждому моменту, отправляемые компонентам генератора шаговых импульсов , уже ограничены и сформированы в соответствии с настроенными ограничениями станка или текущей скоростью подачи.)

Любая строка G-кода интерпретируется и запускает набор процедур, которые, в свою очередь, знают, как взаимодействовать с компонентами, расположенными на среднем уровне, например, для создания круга.

Контакты и Сигналы

HAL занимает особое место в сердцах своих программистов из-за способа представления потока данных между модулями. Когда традиционные программисты думают о переменных, адресах или портах ввода-вывода, HAL относится к "контактам". И эти контакты подключены или им присвоены значения через сигналы. Подобно тому, как инженер-электрик соединяет провода между контактами компонентов фрезера, инженер HAL устанавливает поток данных между контактами экземпляров модуля.

ГИПы LinuxCNC (AXIS, GMOCCAPY, Touchy и т. д.) будут отображать состояния некоторых контактов (например, концевых выключателей), но существуют и другие графические инструменты для устранения неполадок и настройки: Halshow, Halmeter, Halscope и Halreport.

Оставшаяся часть этого введения представляет

  • синтаксис того, как контакты различных компонентов соединяются в файлах конфигурации HAL, и

  • программное обеспечение для проверки значений контактов

    • в любой данный момент,

    • развивающийся с течением времени.

3. HAL System Design

.HAL is based on traditional system design techniques.

HAL is based on the same principles that are used to design hardware circuits and systems, so it is useful to examine those principles first. Any system, including a CNC machine, consists of interconnected components. For the CNC machine, those components might be the main controller, servo amps or stepper drives, motors, encoders, limit switches, pushbutton pendants, perhaps a VFD for the spindle drive, a PLC to run a toolchanger, etc. The machine builder must aselect, mount and wire these pieces together to make a complete system.

HAL Схемная концепция
Figure 1. Концепция HAL – Соединение как электрические цепи.

Рисунок 1 будет записан в коде HAL следующим образом:

net signal-blue    component.0.pin1-in      component.1.pin1-out
net signal-red     component.0.pin3-out     component.1.pin3-in     component.1.pin4-in

3.1. Выбор детали

The machine builder does not need to worry about how each individual part works. He treats them as black boxes. During the design stage, he decides which parts he is going to use - steppers or servos, which brand of servo amp, what kind of limit switches and how many, etc. The integrator’s decisions about which specific components to use is based on what that component does and the specifications supplied by the manufacturer of the device. The size of a motor and the load it must drive will affect the choice of amplifier needed to run it. The choice of amplifier may affect the kinds of feedback needed by the amp and the velocity or position signals that must be sent to the amp from a control.

В мире HAL интегратор должен решить, какие компоненты HAL необходимы. Обычно для каждой интерфейсной карты требуется драйвер. Дополнительные компоненты могут потребоваться для программного генерирования шаговых импульсов, функциональности ПЛК и множества других задач.

3.2. Проектирование межсоединений

The designer of a hardware system not only selects the parts, he also decides how those parts will be interconnected. Each black box has terminals, perhaps only two for a simple switch, or dozens for a servo drive or PLC. They need to be wired together. The motors connect to the servo amps, the limit switches connect to the controller, and so on. As the machine builder works on the design, he creates a large wiring diagram that shows how all the parts should be interconnected.

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

3.3. Реализация

Once the wiring diagram is complete it is time to build the machine. The pieces need to be acquired and mounted, and then they are interconnected according to the wiring diagram. In a physical system, each interconnection is a piece of wire that needs to be cut and connected to the appropriate terminals.

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

3.4. Testing

Very few machines work right the first time. While testing, the builder may use a meter to see whether a limit switch is working or to measure the DC voltage going to a servo motor. He may hook up an oscilloscope to check the tuning of a drive, or to look for electrical noise. He may find a problem that requires the wiring diagram to be changed; perhaps a part needs to be connected differently or replaced with something completely different.

HAL предоставляет программные эквиваленты вольтметра, осциллографа, генератора сигналов и других инструментов, необходимых для тестирования и настройки системы. Те же команды, которые использовались для построения системы, можно использовать для внесения изменений по мере необходимости.

3.5. Краткое содержание

This document is aimed at people who already know how to do this kind of hardware system integration, but who do not know how to connect the hardware to LinuxCNC. See the Remote Start Example section in the HAL UI Examples documentation.

Пример удаленного запуска (схема)
Figure 2. Пример удаленного запуска (схема)

Традиционная аппаратная конструкция, описанная выше, заканчивается на краю основного элемента управления. За пределами элемента управления находится куча относительно простых коробок, соединенных вместе, чтобы делать все необходимое. Внутри управление представляет собой большую загадку: один огромный черный ящик, который, как мы надеемся, работает.

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

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

Идея расширения схемы подключения внутрь контроллера и есть суть HAL. Если вас устраивает идея соединения аппаратных черных ящиков, у вас, вероятно, не возникнет проблем с использованием HAL для соединения программных черных ящиков.

4. HAL Концепции

This section is a glossary that defines key HAL terms but it is a bit different than a traditional glossary because these terms are not arranged in alphabetical order. They are arranged by their relationship or flow in the HAL way of things.

Component (Компонент ):: Когда мы говорили о проектировании аппаратного обеспечения, мы называли отдельные кусочки частями, строительными блоками, черными ящиками и т. д. Эквивалентом HAL является компонент или компонент HAL. В этом документе используется компонент HAL, когда существует вероятность путаницы с другими типами компонентов, но обычно используется просто компонент. Компонент HAL — это часть программного обеспечения с четко определенными входами, выходами и поведением, которую можно установить и подключить по мере необходимости. + + Многие компоненты HAL моделируют поведение осязаемой части станка, и контакт действительно может предназначаться для подключения к физическому контакту на устройстве для связи с ним, отсюда и названия. Но чаще всего это не так. Представьте себе модернизацию ручного токарно-фрезерного станка. LinuxCNC реализует то, как станок представляет себя внешнему миру, и это вторично, если реализация рисования круга уже реализована на машине или предоставлена LinuxCNC. И к воображаемой модернизации часто добавляют кнопки, которые сигнализируют о действии, например, об аварийной остановке. LinuxCNC и станок становятся одним целым. И это происходит через HAL.

Parameter (Параметр):: Многие аппаратные компоненты имеют настройки, которые не связаны ни с какими другими компонентами, но к которым все же требуется доступ. Например, сервоусилители часто имеют подстроечные потенциометры, позволяющие выполнять настройку, и контрольные точки, к которым можно подключить измеритель или осциллограф для просмотра результатов настройки. Компоненты HAL также могут иметь такие элементы, которые называются параметрами. Существует два типа параметров: Входные параметры эквивалентны регуляторам потенциометра — это значения, которые может регулировать пользователь и они остаются фиксированными после установки. Выходные параметры не могут быть настроены пользователем — они эквивалентны контрольным точкам, позволяющим контролировать внутренние сигналы.

Контакт:: Аппаратные компоненты имеют клеммы, которые используются для их соединения. Эквивалентом HAL является контакт или контакт HAL. Контакт HAL используется, когда необходимо, чтобы избежать путаницы. Все контакты HAL имеют имена, и имена контактов используются при их соединении. Контакты HAL — это программные объекты, существующие только внутри компьютера.

Physical_Pin (Физический контакт):: Многие устройства ввода-вывода имеют реальные физические контакты или клеммы, которые подключаются к внешнему оборудованию, например контакты разъема параллельного порта. Во избежание путаницы их называют физическими контактами. Это вещи, которые смотрят в реальный мир.

Note

Вам может быть интересно, какая связь существует между HAL_pins, Physical_pins и внешними элементами, такими как энкодеры или карта STG: здесь мы имеем дело с интерфейсами типа трансляции/преобразования данных.

Signal (Сигнал):: В физическом станке выводы реальных аппаратных компонентов соединены между собой проводами. Эквивалентом провода HAL является сигнал или сигнал HAL. Сигналы HAL соединяют контакты HAL вместе, как того требует производитель оборудования. Сигналы HAL можно отключать и повторно подключать по желанию (даже во время работы станка).

Type:: При использовании реального оборудования вы не будете подключать релейный выход 24 В к аналоговому входу +/-10 В сервоусилителя. Контакты HAL имеют те же ограничения, которые зависят от их типа. И контакты, и сигналы имеют типы, и сигналы могут быть подключены только к контактам одного и того же типа. На данный момент существует 4 типа:

+ - bit - единичное значение TRUE/FALSE или ON/OFF - float — 64-битное значение с плавающей запятой, разрешением примерно 53 бита и динамическим диапазоном более 1000 бит. - u32 — 32-битное целое число без знака, допустимые значения от 0 до 4,294,967,295 - s32 — 32-битное целое число со знаком, допустимые значения: от -2,147,483,648 до +2,147,483,647 - u64 — 64-битное целое число без знака, допустимые значения от 0 до 18,446,744,073,709,551,615 - s64— 64-битное целое число со знаком, допустимые значения: от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807

Function:: Реальные аппаратные компоненты имеют тенденцию немедленно реагировать на свои входы. Например, если входное напряжение сервоусилителя изменится, выходное напряжение также изменится автоматически. Однако программные компоненты не могут действовать автоматически. Каждый компонент имеет определенный код, который должен быть выполнен, чтобы сделать все, что этот компонент должен делать. В некоторых случаях этот код просто выполняется как часть компонента. Однако в большинстве случаев, особенно в компонентах реального времени, код должен выполняться в определенной последовательности и через определенные промежутки времени. Например, входные данные следует считывать до выполнения вычислений над входными данными, а выходные данные не следует записывать до тех пор, пока вычисления не будут выполнены. В этих случаях код предоставляется системе в виде одной или нескольких функций. Каждая функция представляет собой блок кода, выполняющий определенное действие. Системный интегратор может использовать потоки для планирования ряда функций, которые будут выполняться в определенном порядке и через определенные промежутки времени.

Thread (Поток):: поток — это список функций, которые выполняются через определенные промежутки времени как часть задачи реального времени. Когда поток создается впервые, он имеет определенный временной интервал (период), но не имеет функций. Функции можно добавлять в поток, и они будут выполняться по порядку при каждом запуске потока.

В качестве примера предположим, что у нас есть компонент parport с именем hal_parport. Этот компонент определяет один или несколько контактов HAL для каждого физического контакта. Контакты описаны в разделе документации этого компонента: их имена, как каждый контакт связан с физическим выводом, инвертированы ли они, можно ли изменить полярность и т. д. Но это само по себе не передает данные с контактов HAL на физические выводы. Для этого требуется код, и именно здесь на сцену выходят функции. Компоненту parport необходимы как минимум две функции: одна для чтения физических входных контактов и обновления контактов HAL, другая для получения данных с контактов HAL и записи их на физические выходные контакты. Обе эти функции являются частью драйвера parport.

5. HAL компоненты

Each HAL component is a piece of software with well-defined inputs, outputs, and behavior, that can be installed and interconnected as needed. The section HAL Components List lists all available components and a brief description of what each does.

6. Проблемы с синхронизацией в HAL

Unlike the physical wiring models between black boxes that we have said that HAL is based upon, simply connecting two pins with a HAL-signal falls far short of the action of the physical case.

Настоящая релейная логика состоит из реле, соединенных вместе, и когда контакт размыкается или замыкается, ток течет (или прекращается) немедленно. Другие катушки могут изменить состояние и т. д., и все это просто происходит. Но в языке релейных схем ПЛК это не работает. Обычно за один проход по цепям каждая цепь оценивается в том порядке, в котором она появляется, и только один раз за проход. Прекрасным примером является цепь с одним НЗ контактом, включенным последовательно с катушкой. Контакт и катушка принадлежат одному реле.

Если бы это было обычное реле, то как только на катушку подается напряжение, контакты начинают размыкаться и обесточивать ее. Это означает, что контакты снова замыкаются и т. д. и т. п. Реле начинает издавать звуковой сигнал.

В ПЛК, если катушка выключена и контакт замкнут, когда ПЛК начинает оценивать цепь, то по завершении этого прохода катушка включается. Тот факт, что включение катушки размыкает контакт, питающий ее, игнорируется до следующего прохода. На следующем проходе ПЛК видит, что контакт разомкнут, и обесточивает катушку. Таким образом, реле по-прежнему быстро переключается между включением и выключением, но со скоростью, определяемой тем, как часто ПЛК оценивает цепь.

В HAL функция — это код, который оценивает цепь(и). Фактически, версия ClassicLadder реального времени с поддержкой HAL экспортирует функцию, которая делает именно это. Между тем, поток — это то, что запускает функцию через определенные промежутки времени. Точно так же, как вы можете выбрать, чтобы ПЛК оценивал все свои цепочки каждые 10 мс или каждую секунду, вы можете определять потоки HAL с разными периодами.

Что отличает один поток от другого, так это не то, что поток делает — это определяется тем, какие функции к нему подключены. Настоящее различие заключается лишь в том, как часто запускается поток.

В LinuxCNC у вас может быть поток 50 мкс и поток 1 мс. Они будут созданы на основе BASE_PERIOD и SERVO_PERIOD, фактическое время зависит от значений в вашем INI-файле.

Следующий шаг — решить, что должен делать каждый поток. Некоторые из этих решений одинаковы (почти) в любой системе LinuxCNC. Например, обработчик команды движения всегда добавляется в сервопоток.

Другие соединения будут выполнены интегратором. Они могут включать в себя подключение функций чтения и записи ЦАП драйвера STG к сервопотоку или подключение функции StepGen к базовому потоку вместе с функциями parport для записи импульсов шага в порт.