1. Двойной проход

В этом разделе описывается возможность использования нескольких команд загрузки для нескольких экземпляров одного и того же компонента в разных позициях файла или среди разных файлов. Внутренне для этого требуется дважды прочитать файл HAL, отсюда и название TWOPASS. Поддерживаемая начиная с версии LinuxCNC 2.5 обработка TWOPASS файлов конфигурации LinuxCNC помогает обеспечить их модульность и удобочитаемость. Напомним, что файлы конфигурации LinuxCNC указываются в INI-файле LinuxCNC как [HAL]HALFILE=filename.

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

Пример, в результате которого создаются компоненты реального времени с именами по умолчанию and2.0, and2.1, and2.2.
loadrt and2 count=3

Конфигурации станут более читабельными, если вы укажете с помощью опции names= те компоненты, где она поддерживается, например:

Пример команды загрузки, в результате которой были явно названы компоненты aa, ab, ac.
loadrt and2 names=aa,ab,ac

Отслеживание компонентов и их имен может стать проблемой при обслуживании, поскольку при добавлении (или удалении) компонента необходимо найти и обновить единственную директиву loadrt, применимую к этому компоненту.

Обработка TWOPASS включается путем включения параметра INI-файла в раздел [HAL], где "anystring" может быть любой строкой, отличной от нуля.
[HAL]

TWOPASS = anystring

При включенном TWOPASS вы можете использовать несколько спецификаций, например:

loadrt and2 names=aa
...
loadrt and2 names=ab,ac
...
loadrt and2 names=ad

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

Опцию TWOPASS можно указать с опциями для добавления вывода для отладки (verbose) и для предотвращения удаления временных файлов (nodelete). Опции разделяются запятыми.

Пример
[HAL]
TWOPASS = on,verbose,nodelete

При обработке TWOPASS сначала считываются все [HAL]HALFILES и накапливаются многочисленные появления директив loadrt для каждого модуля. Компоненты, не работающие в реальном времени (loadusr), загружаются по порядку, но на начальном этапе никакие другие команды LinuxCNC не выполняются.

Note
Компоненты, не работающие в режиме реального времени, должны использовать параметр ожидания (-W), чтобы гарантировать готовность компонента до выполнения других команд.

После первого прохода модули реального времени загружаются (loadrt) автоматически

  • с числом, равным общему числу, при использовании опции count= или

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

Затем выполняется второй проход для выполнения всех остальных инструкций LinuxCNC, указанных в HALFILES. Команды addf, которые связывают функции компонента с выполнением потока, выполняются в порядке появления других команд во время этого второго прохода.

Хотя вы можете использовать опции count= или names=, они являются взаимоисключающими — для данного модуля можно указать только один тип.

Обработка TWOPASS наиболее эффективна при использовании опции names=. Эта опция позволяет вам предоставлять уникальные имена, которые являются мнемоническими или иным образом связаны с конфигурацией. Например, если вы используете производный компонент для оценки скоростей и ускорений по каждой координате (x,y,z), использование метода count= даст загадочные имена компонентов, такие как ddt.0, ddt.1, ddt.2. , и т. д.

В качестве альтернативы можно использовать опцию names=, например:

loadrt ddt names=xvel,yvel,zvel
...
loadrt ddt names=xaccel,yaccel,zaccel

в результате получаются компоненты с разумными названиями xvel, yvel, zvel, xaccel, yaccel, zaccel.

Многие компоненты, поставляемые с дистрибутивом, созданы с помощью утилиты halcompile и поддерживают опцию names=. К ним относятся общие логические компоненты, которые являются связующим звеном многих конфигураций LinuxCNC.

Созданные пользователем компоненты, которые используют утилиту halcompile, также автоматически поддерживают опцию names=. Помимо композиций, созданных с помощью утилиты halcompile, многие другие композиции поддерживают опцию name=. Компиляции, поддерживающие опцию name=, включают: at_pid, encoder, encoder_ratio, pid, siggen и sim_encoder.

Двухэтапная обработка происходит до загрузки графического интерфейса. При использовании [HAL]POSTGUI_HALFILE удобно поместить все объявления loadrt [HAL]POSTGUI_HALFILE для необходимых компонентов в предварительно загруженный файл HAL.

Пример раздела HAL при использовании POSTGUI_HALFILE
[HAL]

TWOPASS = on
HALFILE = core_sim.hal
HALFILE = sim_spindle_encoder.hal
HALFILE = axis_manualtoolchange.hal
HALFILE = simulated_home.hal
HALFILE = load_for_postgui.hal <- loadrt lines for components in postgui.hal

POSTGUI_HALFILE = postgui.hal
HALUI = halui

2. Post GUI

Некоторые ГИПы поддерживают файлы HAL, которые обрабатываются после запуска графического интерфейса для подключения контактов LinuxCNC, созданных ГИП. При использовании файла HAL postgui с обработкой TWOPASS включите все элементы loadrt для компонентов, добавленных файлами HAL postgui, в отдельный файл HAL, который обрабатывается перед графическим интерфейсом. Команды addf также могут быть включены в файл.

Пример
[HAL]
TWOPASS = on
HALFILE = file_1.hal
...
HALFILE = file_n.hal
HALFILE = file_with_all_loads_for_postgui.hal
...
POSTGUI_HALFILE = the_postgui_file.hal

3. Исключение файлов .hal

Обработка TWOPASS преобразует файлы .hal в эквивалентные файлы .tcl и использует haltcl для поиска команд loadrt и addf с целью накопления и консолидации их использования. Ожидаются параметры loadrt, соответствующие простым параметрам names= (или count=), принимаемым генератором компонентов HAL (halcompile). Более сложные элементы параметров, включенные в специализированные компоненты LinuxCNC, могут обрабатываться неправильно.

Файл .hal можно исключить из обработки TWOPASS, включив строку магического комментария в любом месте файла .hal. Строка магического комментария должна начинаться со строки: #NOTWOPASS. Файлы, указанные с этим магическим комментарием, используется в качестве источника halcmd с использованием опций -k (продолжать работу в случае сбоя) и -v (подробный вариант).

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

Обычно порядок loadrt компонентов реального времени не является критическим, но порядок loadrt для специальных компонентов можно обеспечить, поместив такие директивы loadrt в файл исключений.

Note
Хотя порядок директив loadrt обычно не имеет решающего значения, порядок директив addf часто очень важен для правильной работы компонентов сервоконтура.
Пример файла исключений HAL
$ cat twopass_excluded.hal
# The following magic comment causes this file to
# be excluded from twopass processing:
# NOTWOPASS

# debugging component with complex options:
loadrt mycomponent parm1="abc def" parm2=ghi
show pin mycomponent

# ordering special components
loadrt component_1
loadrt component_2
Note
Регистр и пробелы в магическом комментарии игнорируются. Загрузка компонентов, использующих параметры names= или count= (обычно создаваемые с помощью halcompile), не должна использоваться в файлах исключений, так как это лишит преимуществ обработки TWOPASS. Команды LinuxCNC, создающие сигналы (net), и команды, устанавливающие порядок выполнения (addf), не следует помещать в файлы исключений. Это особенно актуально для команд addf, поскольку их порядок может иметь важное значение.

4. Examples

Примеры использования TWOPASS для симулятора включены в каталоги:

configs/sim/axis/twopass/
configs/sim/axis/simtcl/