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

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

1. HAL Overview

Уровень аппаратной абстракции (или со ссылкой на фильм Космическая одиссея 2001 просто "HAL") — это программное обеспечение, позволяющее

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

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

Сама по себе это 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 основан на традиционных методах проектирования систем.

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. Part Selection

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

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

3.2. Interconnection Design

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

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

3.3. Implementation

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

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

3.4. Testing

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

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

3.5. Summary

Этот документ предназначен для людей, которые уже знают, как выполнять подобную интеграцию системы оборудования, но не знают, как подключить оборудование к LinuxCNC. См. раздел Пример удаленного запуска в документации HAL UI Examples.

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

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

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

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

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

4. HAL Concepts

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

Component (Компонент )

When we talked about hardware design, we referred to the individual pieces as parts, building blocks, black boxes, etc. The HAL equivalent is a component or HAL component. This document uses HAL component when there is likely to be confusion with other kinds of components, but normally just uses component. A HAL component is a piece of software with well-defined inputs, outputs, and behavior, that can be installed and interconnected as needed. + + Many HAL Components model the behaviour of a tangible part of a machine, and a pin may indeed be meant to be connected to a physical pin on the device to communicate with it, hence the names. But most often this is not the case. Imagine a retrofit of a manual lathe/mill. What LinuxCNC implements is how the machine presents itself to the outside world, and it is secondary if the implementation how to draw a circle is implemented on the machine already or provided from LinuxCNC. And it is common to add buttons to the imaginary retrofit that signal an action, like an emergency stop. LinuxCNC and the machine become one. And that is through the HAL.

Parameter (Параметр)

Many hardware components have adjustments that are not connected to any other components but still need to be accessed. For example, servo amps often have trim pots to allow for tuning adjustments, and test points where a meter or scope can be attached to view the tuning results. HAL components also can have such items, which are referred to as parameters. There are two types of parameters: Input parameters are equivalent to trim pots - they are values that can be adjusted by the user, and remain fixed once they are set. Output parameters cannot be adjusted by the user - they are equivalent to test points that allow internal signals to be monitored.

Контакт

Hardware components have terminals which are used to interconnect them. The HAL equivalent is a pin or HAL pin. HAL pin is used when needed to avoid confusion. All HAL pins are named, and the pin names are used when interconnecting them. HAL pins are software entities that exist only inside the computer.

Physical_Pin (Физический контакт)

Many I/O devices have real physical pins or terminals that connect to external hardware, for example the pins of a parallel port connector. To avoid confusion, these are referred to as physical pins. These are the things that stick out into the real world.

Note

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

Signal (Сигнал)

In a physical machine, the terminals of real hardware components are interconnected by wires. The HAL equivalent of a wire is a signal or HAL signal. HAL signals connect HAL pins together as required by the machine builder. HAL signals can be disconnected and reconnected at will (even while the machine is running).

Type

When using real hardware, you would not connect a 24 Volt relay output to the +/-10 V analog input of a servo amp. HAL pins have the same restrictions, which are based upon their type. Both pins and signals have types, and signals can only be connected to pins of ffvthe same type. Currently there are 4 types, as follows:

  • 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

Real hardware components tend to act immediately on their inputs. For example, if the input voltage to a servo amp changes, the output also changes automatically. However software components cannot act automatically. Each component has specific code that must be executed to do whatever that component is supposed to do. In some cases, that code simply runs as part of the component. However in most cases, especially in realtime components, the code must run in a specific sequence and at specific intervals. For example, inputs should be read before calculations are performed on the input data, and outputs should not be written until the calculations are done. In these cases, the code is made available to the system in the form of one or more functions. Each function is a block of code that performs a specific action. The system integrator can use threads to schedule a series of functions to be executed in a particular order and at specific time intervals.

Thread (Поток)

A thread is a list of functions that runs at specific intervals as part of a realtime task. When a thread is first created, it has a specific time interval (period), but no functions. Functions can be added to the thread, and will be executed in order every time the thread runs.

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

5. HAL components

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

6. Timing Issues In HAL

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

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

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

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

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

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

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

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

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