LinuxCNC Integrators Manual Глава VI - Основы HAL

Материал из cnc-club
Перейти к: навигация, поиск

LinuxCNC Integrators Manual Глава VI - Основы HAL

Основы HAL

6.1 Команды Hal

Более подробная информация может быть найдена на страницах man по halcmd "man halcmd" в окне терминила. Чтобы увидеть конфигурацию HAL и проверить статус пинов и параметров используйте окно HAL Configuration в меню Machine в AXIS. Чтобы наблюдать статус пинов откройте вкладку Watch и нажминте на пин, который вы хотите просматривать и он добавится в окно Watch.

[attachment=0:2419d50p]EMC2 окно настройки HAL.jpg[/attachment]

Рисунок 6.1: Окно HAL Configuration.


6.1.1 loadrt

Команда "loadrt" загружает компонент HAL реального времени. Функции компонента реального времени должны быть добавлены в поток, чтобы они обновлялись со скоростью потока. Вы не можете загрузить компонент пользовательского пространства в пространство реального времени.

Синтакс и пример:

loadrt <component> <options>

loadrt mux4 count=1


6.1.2 addf

Команда "addf" добавляет компонент реального времени в поток. Вам необходимо добавить функцию из компонента реального времени HAL в поток, чтобы функция обновлялась со скоростью потока. Если вы использовали Stepper Config Wizard чтобы создать ваши файлы конфигурации, у вас будет два потока:


  • base-thread (высокоскоростной поток): этот поток оперирует с элементами, которым нужен быстрый отклик, такими как создание импульсов шагов и запись и чтение параллельного порта.
  • servo-thread (низко скоростной поток): этот поток оперирует элементами, которые могут допускать более медленный отклик, например контроллер перемещений, ClassicLadder, и обработчик команд перемещения.

Синтакс и пример:

addf <component> <thread>

addf mux4 servo-thread


6.1.3 loadusr

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

Флаги могут быть один или несколько из следующего:


  • -W подождать пока компонент станет готов. Предполагается что компонент имеет такое же имя как и первый аргумент команды.
  • -Wn <name> подождать компонент, с именем <name>.
  • -w подождать до выхода программы.
  • -i игнорировать возвращаемое значение программы (вместе с -w)

Синтакс и примеры:

loadusr <component> <options>

loadusr halui

loadusr -Wn spindle gs2_vfd -n spindle

на английском языке это значит "loadusr подождать компонент с именем spindle gs2_vfd имя spindle."

("loadusr wait for name spindle component gs2_vfd name spindle.")

"-n spindle" это часть компонента gs2_vfd, а не команды loadusr.


6.1.4 net

Команда "net" создает связь ("connection") между сигналом и одним или несколькими пинами. Если сигнал не существует, net создает новый сигнал. Это заменяет необходимость использования команды newsig. Индикаторы направления "<= и =>" нужны только для того, чтобы людям было проще проследить за логикой и не используются командой net.

Синтакс и пример:

net <signal-name> <pin-name> <opt-direction> <opt-pin-name>

net both-home-y <= parport.0.pin-11-in

Каждый сигнал может иметь только один источник (пин HAL "Dir out") и столько читателей (пин HAL "Dir in"), сколько вам хочется. В колонке Dir окна HAL Configuration вы можете какие пины являются "in" (ввод), а какие "out" (вывод). Следующий рисунок показывает "направление" сигнала от источника, через сигнал и затем на ввыводы к "читателям".[attachment=0:396jzbvq]EMC2 инструкция HAL направление сигнала.jpg.jpeg[/attachment]

Рис. 6.2: Направление сигнала.

Этот пример показывает сигнал xStep с источником stepgen.0.out и двумя читателями parport.0.pin-02-out, parport.0.pin-08-out. Проще говоря, значение stepgen.0.outпосылается сигналу xStep и это значение затем посылается на parport.0.pin-02-out и parport.0.pin-08-out


         сигнал       источник                 назначение               назначение
 
      net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out


Т.к. сигнал xStep содержит значение stepgen.0.out (источника) вы можете использовать этот же сигнал еще раз, чтобы послать значение другому читателю. Чтобы это сделать просто используйте сигнал с читателями на другой строке.

net xStep <= stepgen.0.out => parport.0.pin-02-out

net xStep => parport.0.pin-08-out

Так называемые I/O пины (пины ввода/вывода), такие как пин index-enable, не следуют этому правилу.


6.1.5 setp

Команда "setp" устанавливает значение пина или параметра. Допустимые значения будут зависеть от типа пина или параметра. Если типы данных на совпадают - это ошибка.

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

Синтакс и пример:

setp <pin/parameter-name> <value>

setp parport.0.pin-08-out TRUE


6.1.6 unlinkp

Команда "unlinkp" отсоединяет пин от присоединенного сигнала. Если не одного сигнала не присоединено с пином до запуска этой команды, ничего не происходит.

Синтакс и пример:

unlinkp <pin-name>

unlinkp parport.0.pin-02-out


6.1.7 Устаревшие Команды

6.1.7.1 linksp

Команда "linksp" создает соединение между сигналом и одним пином.

Синтакс и пример:

linksp <signal-name> <pin-name>

linksp X-step parport.0.pin-02-out

The "linksp" command has been superseeded by the "net" command.


6.1.7.2 linkps

Команда "linkps" создает связь между одним пином и одним сигналом. Это тоже самое, что и linksp но аргументы поменяны местами.

Синтакс и пример:

linkps <pin-name> <signal-name>

linkps parport.0.pin-02-out X-Step

Команда "linkps" была заменена командой "net".


6.1.7.3 newsig

Команда "newsig" создает новый сигнал HAL с именем <signame> и типом данных <type>. Тип должен быть одним из "bit", "s32", "u32" или "float". Ошибка если <signame> уже существует.

Синтакс и пример:

newsig <signame> <type>

newsig Xstep bit

Более подробную информацию можно найти в руководстве по HAL на страницах man (man halrun).


6.2 Hal Data

6.2.1 Bit

Значение bit или on, или off.


  • значения bit = true или 1 и false или 0 (True, TRUE, true все варианты допустимы).


6.2.2 Float

"float" это число с плавающей запятой. Другими словами запятая дробной части может перемещаться куда угодно.


  • значения float = значение 32 битного числа с плавающей запятой, с приблизительно 24 битами разрешения и более 200 битами динамического диапазона.

Более подробно о числа с плавающей запятой см. http://en.wikipedia.org/wiki/Floating_point .


6.2.3 s32

Число "s32" это целое число, которое может быть отрицательным или положительным.


  • Значения s32 values = целые числа от -2147483648 до 2147483647


6.2.4 u32

Число "u32" это целое только положительное число.


  • Значения u32 = целые числа от 0 до 4294967295



6.3 Файлы Hal

Если вы использовали Stepper Config Wizard чтобы создать ваши конфигурационные файлы, у вас будет вплоть до 3 файлов HAL в вашей конфигурационной директории.


  • my-mill.hal (Если ваш файл когфигурации называется "my-mill") Этот файл загружается первым и не должен быть изменен, если вы использовали Stepper Config Wizard.
  • custom.hal Этот файл загружается перед запуском GUI. Здесь располагаются ваши собственные команды HAL, которые вы хотите загрузить перед загрузкой GUI.
  • custom_postgui.hal Этот файл загружается после GUI. Здесь располагаются ваши пользовательские команды HAL, которые вы хотите загрузить после загрузки GUI. Все команды HAL которые используют pyVCP виджеты должны быть помещены сюда.


6.4 Компоненты HAL

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


  • .time
  • .tmax

Time это количество циклов процессора которые потребовались, чтобы выполнить функцию.

Tmax это максимальное количество тактов процессора, которое потребовалось для того, чтобы выполнить функцию. Tmax это параметр типа read/write (чтение и запись) поэтому пользователь может выставить его в 0, чтобы избавится от больших значений при инициализации функции во время первого запуска.


6.5 Логические компоненты

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


6.5.1 and2

Компонент "and2" это вентиль "и" ("and") с двумя вводами. Таблица истинности ниже показывает вывод основанный на любой комбинации вводов.


Синтакс

and2 [count=N] or [names=name1[,name2...]]


Функции

and2.n


Пины

and2.N.in0 (bit, in)

and2.N.in1 (bit, in)

and2.N.out (bit, out)


Таблица истинности


| in0 | in1 | out

|False|False|False

|True |False|False

|False|True |False

|True |True |True

6.5.2 not

Компонент "not" ("не") это битовый инвертор.


Синтакс

not [count=n] or [names=name1[,name2...]]


Функции

not.all

not.n


Пины

not.n.in (bit, in)

not.n.out (bit, out)


Таблица истинности

|in|out

|True|False

|False|True

6.5.3 or2

Компонент "or2" это двух вводовый вентиль "или" ("or").


Синтакс

or2[count=n] or [names=name1[,name2...]]


Функции

or2.n


Пины

or2.n.in0 (bit, in)

or2.n.in1 (bit, in)

or2.n.out (bit, out)


Таблица истинности

|in0|in1|out

|True|False|True

|True|True|True

|False|True|True

|False|False|False

6.5.4 xor2

Компонент "xor2" это двух вводовый вентиль "исключающий или" ("xor").


Синтаксис

xor2[count=n] or [names=name1[,name2...]]


Функции

xor2.n


Пины

xor2.n.in0 (bit, in)

xor2.n.in1 (bit, in)

xor2.n.out (bit, out)


Таблица истинности

|in0|in1|out

|True|False|True

|True|True|False

|False|True|True

|False|False|False

6.5.5 Примеры использования логических компонентов HAL

Пример "and2" соединяющего два ввода в один вывод:

loadrt and2 count=1

addf and2.0 servo-thread

net my-sigin1 and2.0.in0 <= parport.0.pin-11-in

net my-sigin2 and2.0.in1 <= parport.0.pin-12-in

net both-on parport.0.pin-14-out <= and2.0.out

В примере выше, одна копия and2 загружается в пространство реального времени и добавляется к потоку серво. Затем пин 11 параллельного порта соединяется с битом in0 вентиля and. Затем, pin 12 подсоединяется к биту in1 вентиля and. И, наконец, мы подсоединяем бит вывода and2 к пину 14 параллельного порта. Таким образом, согласно таблице истинности, для and2 если pin 11 и pin 12 включены, тогда пин 14 будет включен.

6.6 Компоненты преобразования

6.6.1 weighted_sum (взвешенная сумма)

weighted_sum конвертирует группу ьитов в целое число. Преобразование это сумма "весов" битов, которые положительны. Это схоже с кодированием десятичного числа в двоичной системе, но с большим количеством опций. Бит "hold" останавливает обработку входов, так чтобы "сумма" не менялась.

Следующий синтакс используется для загрузки компонента weighted_sum.

loadrt weighted_sum wsum_sizes=size[,size,...]

Создает группы взвешенных сумм, каждая с данным количеством входных битов (размером). Чтобы обновить weighted_sum вам нужно присоединить process_wsums к потоку.

addf process_wsums servo-thread

Это обновляет компонент weighted_sum.

В следующем примере вырезанном из окна HAL Configuration из Axis биты "0" и "2" равны True и нет отступа. Вес пина 0 равен 1 и пина 2 равен 4, поэтому сумма равна 5.[attachment=0:972frpa3]EMC HAL configuration руководство.png[/attachment]


6.7 Halshow

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


6.7.1 Запуск Halshow

Halshow находится в меню AXIS в Machine/Show Hal Configuration.

Halshow находится в меню TkEMC в Scripts/Hal Show.


6.7.2 Hal Tree Area (Дерво HAL)

В левой части дисплея, как показано на изображении 6.4 находится окно дерева, что-то подобное вы можете увидеть в некоторых файловых менеджерах. Справа находится панель с вкладками для "SHOW" (показа) и "WATCH" (наблюдения).

Рис. 6.4: схема Halshow.

[attachment=0:3qbbyr9c]EMC HAL configuration halshow.png[/attachment]

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

Вы также можете сворачивать / разворачивать дерево использую меню Tree View в верхнем левом крае экрана. Там вы наедете: Expand Tree (развернуть дерево), Collapse Tree (свернуть дерево), Expand Pins (развернуть пины), Expand Parameters (развернуть параметры), Expand Signals (развернуть сигналы) и Erase Watch (стереть слежения).

(Заметьте, что Erase Watch сотрет все ранее установленные слежения, вы не можете удалить только одно слежение.)


6.7.3 Hal Show Area

Нажатие на название элемента, например, слово "компоненты", покажет вам (во вкладке "Show") все, что HAL знает о содержимом этого элемента. Рис. 6.4 показывает листинг точно такой же, какой вы увидите если нажмете "Компоненты" во время того, как вы работаете со стандартной m5i20 серво платой. Информационный дисплей точно такой же как в традиционных текстовых инструментах анализа HAL. Преимущество halshow в том, что есть доступ при помощи мыши.

[attachment=1:1ymbv3f0]EMC2 настройка HAL show menu.png[/attachment]

Рис. 6.5. Меню Show.

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

Component Pins:

    Owner Type Dir Value Name
    06 bit -W TRUE parport.0.pin-10-in
    06 bit -W FALSE parport.0.pin-10-in-not

Имя второго пина содержит имя первого целиком.

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

Окно ввода "Test Hal Command:" принимает любую из перечисленных команду halcmd. Они включают:


  • loadrt, unloadrt (загрузить/выгрузить real-time модуль)
  • loadusr, unloadusr (загрузить/выгрузить компонент пользовательского пространства)
  • addf, delf (добавить/удалить функцию к/из real-time потока)
  • net (создать связь между двумя или более элементами)
  • setp (установить значение параметра (или пина))

Этот маленький редактор будет выполнять команду каждый раз когда вы будете нажимать <enter> или кнопку выполнить (execute). Сообщение об ошибке от halcmd будет появляться ниже поля ввода, если команды сформированы не правильно. Если вы не уверены как настроить правильную команду вам будет необходимо еще раз прочитать документацию на halcmd и на специфические модули, с которыми вы работаете.

Давайте используем редактор, для того чтобы добавить дифференциальный модуль в HAL и присоединить его к положению оси, чтобы мы могли наблюдать скорость изменения положения, т.е., ускорение. Сначала нам нужно загрузить модуль hal под названием blocks, добавить его в поток серво, затем подключить его к пину положения оси. Как только это сделано мы можем наблюдать вывод дифференциала в halscope. Итак, приступим.

loadrt blocks ddt=1

Теперь посмотрим на ноду компонентов, вы должны увидеть blocks где-то там.

Loaded HAL Components:

     ID Type Name
     10 User halcmd29800
     09 User halcmd29374
     08 RT blocks
     06 RT hal_parport
     05 RT scope_rt
     04 RT stepgen
     03 RT motmod
     02 User iocontrol

Конечно же это так. Обратите внимание, что ее идентификационный номер 08. Затем, нам нужно нужно определить какие функции доступны в этом модуле, поэтому мы смотрим в раздел функции:

Exported Functions:

     Owner CodeAddr Arg FP Users Name
     08 E0B97630 E0DC7674 YES 0 ddt.0
     03 E0DEF83C 00000000 YES 1 motion-command-handler
     03 E0DF0BF3 00000000 YES 1 motion-controller
     06 E0B541FE E0DC75B8 NO 1 parport.0.read
     06 E0B54270 E0DC75B8 NO 1 parport.0.write
     06 E0B54309 E0DC75B8 NO 0 parport.read-all
     06 E0B5433A E0DC75B8 NO 0 parport.write-all
     05 E0AD712D 00000000 NO 0 scope.sample
     04 E0B618C1 E0DC7448 YES 1 stepgen.capture-position
     04 E0B612F5 E0DC7448 NO 1 stepgen.make-pulses
     04 E0B614AD E0DC7448 YES 1 stepgen.update-freq

Здесь мы смотрим на параметр Owner (владелец) №08 и видим, что blocks экспортировал функцию под названием ddt.0 в поток серво и он будет выполнять свои математические расчеты каждый раз, когда поток будет обновляться. Еще раз смотрим на команду addf и видим, то она использует три аргумента, такие как эти:

addf <functname> <threadname> [<position>]

Мы уже знаем, что functname=ddt.0, поэтому давайте найдем название потока threadname развернув элемент thread в дереве. Здесь мы видим два потока, servo-thread и base-thread. Положение ddt.0 в потоке не критично. Поэтому мы добавляем функцию ddt.0 к потоку серво.

addf ddt.0 servo-thread

Это только для просмотра, поэтомы мы оставляем position пустым и получаем последнюю позицию в потоке. Рис. 6.6 показывает состояние halcmd после того, как эта команда была выполнена.

[attachment=0:1ymbv3f0]EMC2 настройка HAL addf function.png[/attachment]

Рис 6.6. Команда Addf

Затем нам нужно подсоединить этот блок к чему-нибудь. Но как мы узнаем какие пины доступны? Ответ - посмотреть в разделе пины. В нем мы находим ddt и видим это:

Component Pins:

     Owner Type Dir Value Name
     08 float R- 0.00000e+00 ddt.0.in
     08 float -W 0.00000e+00 ddt.0.out

Это выглядит достаточно простым для понимания, но какой пин или сигнал мы хотим присоединить к нему? Это может быть пин axis, пин stepgen или сигнал. Мы видим следующее, когда посмотрим на axis.0:

Component Pins:

     Owner Type Dir Value Name
     03 float -W 0.00000e+00 axis.0.motor-pos-cmd ==> Xpos-cmd

Выглядит так, что Xpos-cmd должен быть хорошим сигналом для использования. Возвращаемся в редактор, где вводим следующую команду:

linksp Xpos-cmd ddt.0.in

Теперь, если мы посмотрим на сигнал Xpos-cmd используя элемент дерева, мы увидим то, что мы сделали:

Signals:

     Type Value Name
     float 0.00000e+00 Xpos-cmd
     <== axis.0.motor-pos-cmd
     ==> ddt.0.in
     ==> stepgen.0.position-cmd

Мы видим, что сигнал приходит от axis.o.motor-pos-cmd и идет к обоим ddt.0.in и stepgen.0.position-

cmd. Присоединив блок к сигналу мы избежали все трудности с нормальным течением этой команды перемещения.

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


6.7.4 Hal Watch Area

Нажатие на вкладку Watch, открывает пустой контейнер. Вы можете добавлять сигналы и пины в этот контейнер и наблюдать их значения.1 Вы можете добавлять сигналы или пины когда вкладка Watch активна нажимая на название сигнала или пина. Рис. 6.7 показывает этот контейнер с несколькили битовыми сигналами. Эти сигналы включают в себя пины enable-out для первых трех осей и два из трех сигналов estop iocontrol. Отметьте, что TkEMC показывает, что находится в состоянии ESTOP RESET. Пины amp-enable не включаются пока не включен станок.

1 Скорость обновления наблюдений гораздо медленнее, чем у Halmeter и Halscope. Если вам нужно хорошее разрешение по времени сигналов, эти инструменты будут более эффективны.

[attachment=0:7gmped7j]EMC2 настройка HAL watch.png[/attachment]

Watch отображает значения типа бит используя цветные круги, изображающие светодиоды. Они показываются темно-коричневыми когда сигнал или пин равен False, и светло желтыми, когда сигнал равен true. Если вы выберете сигнал или пин, тип которого не "бит", watch будет отображать его как цифровое значение.

Watch позволит вам быстро протестировать ваши датчики или посмотреть влияние изменений, которые вы сделали в EMC использую графический интерфейс. Частота обновления Watch слегка медленновата для того, чтобы увидеть импульсы шагов шаговых двигателей, но вы можете использовать его для этих целей, если вы двигаете ось очень медленно или на маленькие дистанции. Если вы использовали IO_Show в EMC, страница Watch в halshow может быть настроена для наблюдения за параллельным портом очень похоже на то как это делал IO_Show.




Оглавление книги LinuxCNC Integrators Manual

Глава Название
Глава 1 LinuxCNC Integrators Manual Глава I - Важные определения
Глава 2 LinuxCNC Integrators Manual Глава II - Аппаратное обеспечение (Hardware)
Глава 3 LinuxCNC Integrators Manual Глава III - Конфигурационные файлы
Глава 4 Доделать! LinuxCNC Integrators Manual Глава IV - Файл INI
Глава 5 Доделать! LinuxCNC Integrators Manual Глава V - LinuxCNC и HAL
Глава 6 Доделать! LinuxCNC Integrators Manual Глава VI - Основы HAL
Глава 7 Доделать! LinuxCNC Integrators Manual Глава VII - Настройка шаговых двигателей
Глава 8 Доделать! LinuxCNC Integrators Manual Глава VIII - Компонетны HAL
Глава 9 Забыли перевести! LinuxCNC Integrators Manual Глава IX - Параллельный порт
Глава 10 Доделать! LinuxCNC Integrators Manual Глава X - Пользовательский интерфейс HAL (Halui)
Глава 11 Доделать! LinuxCNC Integrators Manual Глава XI - Примеры HAL
Глава 12 Доделать! LinuxCNC Integrators Manual Глава XII - Virtual Control Panel - Виртуальная панель управления