HAL-файлы: порядок выполнения компонентов.

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

HAL-файлы: порядок выполнения компонентов.

Сообщение Сергей Саныч »

Провел небольшое исследование.
Вот с таким вопросом разбирался: в каком порядке и с какими задержками выполняются hal-компоненты, то есть программные модули, изображающие, в частности, логические элементы И, ИЛИ, НЕ и прочие? Понятно, что реальные физические элементы создают задержку - сигнал на выходе появляется через определенное время после подачи входного. С этим можно бороться, это нужно учитывать. В конце концов, это можно использовать.
А как в случае их программной эмуляции в LinuxCNC? Ведь расчет в любом случае происходит последовательно с периодом тактовой частоты (base-thread или servo-thread)! Соответственно, все зависит от последовательности выполнения модулей. И если несколько модулей соединены последовательно, то результирующая задержка (в тактах используемого thread'а) будет либо "нулевая", независимо от количества элементов (если следующий элемент в цепочке будет выполняться после предыдущего), либо равна количеству элементов (если наоборот).
Поставил опыт: простейшая схема: сигнал-генератор, а к нему подключены последовательно несколько элементов-повторителей (в качестве их взяты or2). Элементы тактируются servo-thread для большей наглядности.

Код: Выделить всё

loadrt threads  name1=base-thread period1=30000 fp1=0 name3=servo-thread period3=1000000

loadrt siggen
addf siggen.0.update servo-thread
setp siggen.0.frequency 50

loadrt or2 count=4
addf or2.0 servo-thread
addf or2.1 servo-thread
addf or2.2 servo-thread
addf or2.3 servo-thread

setp or2.0.in0 false
setp or2.1.in0 false
setp or2.2.in0 false
setp or2.3.in0 false

net n0 siggen.0.clock or2.0.in1
net n1 or2.0.out or2.1.in1
net n2 or2.1.out or2.2.in1
net n3 or2.2.out or2.3.in1


start

Здесь компоненты or2 соединены в порядке их инициализации командами addf.
Снимок-HAL Осциллограф1.png (3486 просмотров) <a class='original' href='./download/file.php?id=43149&sid=0f02df5cec782c1fa2683787a9f3f09c&mode=view' target=_blank>Загрузить оригинал (67.49 КБ)</a>
Получается, что в данном случае задержка отсутствует - сигнал на всех выходах изменяется одновременно.

Теперь поменяем порядок инициализации компонентов:

Код: Выделить всё

loadrt threads  name1=base-thread period1=30000 fp1=0 name3=servo-thread period3=1000000

loadrt siggen
addf siggen.0.update servo-thread
setp siggen.0.frequency 50

loadrt or2 count=4
addf or2.3 servo-thread
addf or2.2 servo-thread
addf or2.1 servo-thread
addf or2.0 servo-thread

setp or2.0.in0 false
setp or2.1.in0 false
setp or2.2.in0 false
setp or2.3.in0 false

net n0 siggen.0.clock or2.0.in1
net n1 or2.0.out or2.1.in1
net n2 or2.1.out or2.2.in1
net n3 or2.2.out or2.3.in1


start
Снимок-HAL Осциллограф2.png (3486 просмотров) <a class='original' href='./download/file.php?id=43148&sid=0f02df5cec782c1fa2683787a9f3f09c&mode=view' target=_blank>Загрузить оригинал (67.92 КБ)</a>
Сразу же видим: появились задержки на период тактовой частоты, в данном случае 1 мсек.

К чему это я? К тому, что при синтезе более-менее сложных hal-схем надо эти моменты учитывать.
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: HAL-файлы: порядок выполнения компонентов.

Сообщение nkp »

очень интересная тема!
но так как компоненты программные - то рассматривать их целесообразно начиная с программной реализации...
тогда выводы будут однозначны , а значит применительны на практике...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: HAL-файлы: порядок выполнения компонентов.

Сообщение Nick »

Я так как-то делал тактовый генератор not.out->not.in.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: HAL-файлы: порядок выполнения компонентов.

Сообщение Serg »

Где-то в доках рекомендовалось addf делать в порядке, совпадающем с прохождением сигнала по схеме...
Или это было в коментах в исходниках...
nkp писал(а):но так как компоненты программные - то рассматривать их целесообразно начиная с программной реализации...
тогда выводы будут однозначны , а значит применительны на практике...
Не принципиально. У каждого компонента есть функция, которая выполняется один раз за серво/базовый цикл. В каждой итерации оной сигналы читаются на входах и выставляются на выходах. Её можно рассматривать как атомарную операцию, ибо пока она выполняется ничего другого не происходит.
Желающие могут сами это проверить организовав бесконечный цикл в компоненте... Только сначала сохраните все открытые файлы... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

Вернуться в «LinuxCNC»