Как реализовать связь пинов HAL с переменными подпрограммы?

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Как реализовать связь пинов HAL с переменными подпрограммы?

Сообщение Ворон226 »

Вот и появилось время для освоения этой простой (для небожителей) темы:

1. Как передать значение переменной из подпрограммы в HAL?
Например, в подпрограмме у нас есть переменная <Step>. Можно ли её значение присвоить параметру в HAL? Допустим подать на вход mux2.0.in1 ? И как?

2. Как присвоить переменной в подпрограмме значение параметра из HAL ?
Например, мы получаем на выходе mux2.0.out некоторое значение, которое нужно присвоить переменной подпрограммы <Speed>. И как?

Пару месяцев назад задал эти вопросы в теме - http://cnc-club.ru/forum/viewtopic.php? ... 62#p124728
и получил ответы:


UAVpilot

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

$ tclsh
% package require Linuxcnc
1.0
% hal getp ini.0.max_limit
1000
% hal setp ini.0.max_limit 500
setting parameter 'ini.0.max_limit' to '500'
Pin 'ini.0.max_limit' set to 500
% hal getp ini.0.max_limit
500
%
Nick

Или через inline python, на подобие:

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

;py,interpreter.this.params['draw_param_g']=g
(только для последних релизов)

О или вообще через прямой доступ к пинам в Gкоде (тоже вроде только в новых релизах):
http://www.linuxcnc.org/docs/devel/html ... al_items_a
To read arbitrary HAL pins, signals and parameters from G-code, use the following named parameter syntax:
#<_hal[hal_name]>
where hal_name may be a pin, parameter or signal name.
Попробую неспеша написать подпрограмму в ngcgui , чтобы она опрашивала кнопку на панели LCNC и, в зависимости от её состояния (нажата-отжата) выполняла действие с различными параметрами (переменными).
А для обратной связи пусть подпрограмма включает и выключает "светодиод" на визуальной панели LCNC.

Приглашаю желающих к разбору.
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Serg »

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

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Nick »

Ворон226 писал(а):1. Как передать значение переменной из подпрограммы в HAL?
Например, в подпрограмме у нас есть переменная <Step>. Можно ли её значение присвоить параметру в HAL? Допустим подать на вход mux2.0.in1 ? И как?

2. Как присвоить переменной в подпрограмме значение параметра из HAL ?
Например, мы получаем на выходе mux2.0.out некоторое значение, которое нужно присвоить переменной подпрограммы <Speed>. И как?
Есть еще третий способ, который будет работать на всех релизах и на чистом Gкоде (это наверное наиболее правильный способ):
(но для новых релизов возможно удобнее будет прямой доступ к пинам hal)
motion.digital-in-NN IN BIT
These pins are used by M66 Pnn wait-for-input mode.
motion.digital-out-NN OUT BIT
These pins are controlled by the M62 through M65 words.
motion.digital-in-NN IN BIT
These pins are used by M66 Pnn wait-for-input mode.
motion.digital-out-NN OUT BIT
These pins are controlled by the M62 through M65 words.
+ соответственно M62-67
UAVpilot писал(а):В принципе можно вместо ngcgui вообще свою прогу засунуть в axis.
Всё хочу пример-заготовку написать, да руки пока не доходят.
Типо как мы features засунули? :)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Serg »

Nick писал(а):Типо как мы features засунули? :)
Ну да. Только features это делает, мягко говоря, через питон, а хочу напрямую использовать Tk. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

Nick писал(а):Есть еще третий способ, который будет работать на всех релизах и на чистом Gкоде (это наверное наиболее правильный способ)
Но это способ передачи пинов типа BIT, а как же с FLOAT?

Вот есть команда М67 и М68 - запись аналогового (FLOAT) числа в digital-out-[00...03] , а прочитать?
И куда прочитанное сохраняется???

(буду проверять вариант 2...)
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

так :
M68 E0 Q11.111
устанавливает пин motion.analog-out-00 в 11.111
net mux2in1 motion.analog-out-00 mux2.0.in1
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

nkp писал(а):так :
M68 E0 Q11.111
устанавливает пин motion.analog-out-00 в 11.111
net mux2in1 motion.analog-out-00 mux2.0.in1
А как значение пина передать в программу? Например, переместиться в координату по Х, значение которой записано в motion.analog...
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

Ворон226 писал(а):А как значение пина передать в программу? Например, переместиться в координату по Х, значение которой записано в motion.analog...
наверно ты ведешь речь о M66 (пины motion.analog-in-00)
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

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

Отбросим "экзотические" варианты на (на сегодня). Имеем следующие способы передачи значений:

1. Из программы в G-кодах в пины HAL:

- команды М62...М65 - устанавливают пин motion.digital-out-[00...03] (а это пины HAL-а) в ноль или единицу сразу или со следующей командой
- команда M68 - устанавливает пин motion.analog-out-[00...03]

2. Из визуальной панели в пины HAL:

- в custom_postgui.hal (описывающей "соединения" элементов визуальной панели с пинами HAL)
Например:

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

net surface_speed_in pyvcp.surface_speed => motion.analog-in-00
3. Передача значения пина HAL в переменную либо непосредственно в команду G-кода посредством motion.digital-in или motion.analog-in:

М66 - опрос значения либо motion.digital-in-[00...03], либо motion.analog-in-[00...03] и запись значения в регистр #5399 либо сразу, либо по событию (ожидание).

Например,
M66 E0 L0
#1 = #5399
G0 Z#1

или
M66 E0 L0
G0 Z#5399

, где L0 - опрос без ожидания;
E0 - опрос motion.analog-in-00

4. Прямая передача значения пина в программу G-кодов (работает в LCNC 2.6+):

непосредственно:
G0 X#<_hal[hal_name]>

, либо через переменную:
#1 = #<_hal[hal_name]>

, где hal_name может быть именем контакта, параметра или сигнала.
Последний раз редактировалось Ворон226 17 сен 2014, 18:52, всего редактировалось 4 раза.
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

Ворон226 писал(а):motion.digital-in-[00...03]
Ворон226 писал(а):motion.analog-in-[00...03]
по умолчанию в емс по четыре укааных пина...
увеличиваем ,пописав в hal :
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES num_aio=16 num_dio=64
(16 и 64 максимально)
=============
Ворон226 писал(а):4. Прямая передача значения пина в программу G-кодов (нужно проверить - работает ли в используемой версии LCNC):
работает в емс 2.6+
если версия ниже - то делаем с помощью M66
по команде
M66 E0 L0 #(L0 - берем значение немедленно , без паузы , E0 - указывает на пин motion.analog-in-00)
пишем значение параметра #5399 в свою переменную #1 :
#1 = #5399
затем используем ее ,например:
G0 Z#1
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

nkp писал(а):делаем с помощью M66
по команде
M66 E0 L0 #(L0 - берем значение немедленно , без паузы , E0 - указывает на пин motion.analog-in-00)
пишем значение параметра #5399 в свою переменную #1 :
#1 = #5399
затем используем ее ,на
Есть неясность - пишем команду
M66 E0 L0 #
или
M66 E0 L0 #1
, где #1 говорит о том, что записываем значение в переменную #1

Как правильно?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

M66 E0 L0
#1 = #5399
G0 Z#1
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Nick »

Или просто
M66 E0 L0
G0 Z#5399
gennadiy
Кандидат
Сообщения: 64
Зарегистрирован: 03 ноя 2013, 22:28
Репутация: 32
Откуда: Брест
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение gennadiy »

М66 и M68 работают без проблем, а вот использовать #<_hal[hal_name]> пока не получается.
M66 E0 L0
#100 = #5399 ;это работает

А если так:
#100 = #<_hal[pyvcp.spinbox.0.param_pin]> ;выдаёт ошибку

Пробовал включить 8 бит в [RS274NGC]:
[RS274NGC]
FEATURES = 8
http://www.linuxcnc.org/docs/devel/html ... features_a
Ошибки нет, но в переменную #100 ничего не записывается.
У меня Linuxcnc 2.6.3
Вложения
Снимок.png
Снимок.png (5.31 КБ) 3885 просмотров
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

gennadiy писал(а):менную #100 ничего не записывается.
емс 2.7 - проверил - работает:
Выделение_069.png (3874 просмотра) <a class='original' href='./download/file.php?id=33334&sid=d92a2751b6b3ea0aa32bada499458563&mode=view' target=_blank>Загрузить оригинал (73.13 КБ)</a>
в ини только дополнительно:
[RS274NGC]
FEATURES = 8
===========
gennadiy
Кандидат
Сообщения: 64
Зарегистрирован: 03 ноя 2013, 22:28
Репутация: 32
Откуда: Брест
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение gennadiy »

А, блин, сам накосячил. Читал данные не так. Всё работает!!!
Нужно было обращаться к имени, указанному в <halpin>"my-spinbox"</halpin>
#100 = #<_hal[pyvcp.my-spinbox]>
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

nkp писал(а):M66 E0 L0
#1 = #5399
G0 Z#1
Nick писал(а):Или просто
M66 E0 L0
G0 Z#5399
Т.о. переменная #5399 по умолчанию содержит значение motion.digital-in-[00...03], либо motion.analog-in-[00...03]???
Или это просто некий буферный элемент?
Что-то не лезет в меня понимание операции. Запомнить и пользовать - нет проблем. Но вот понять как? и почему?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение nkp »

попытаюсь разъяснить...
представим параметр (в данном случае #5399) - как один регистр , или как переменную...
командуем в программе (g-код) :
M66 E00 L00
емс пишет в наш регистр значение , которое в данный момент присутствует на пине motion.analog-in-00
почему именно на этом пине - потому что мы его сами в команде указали (E00)
теперь значение параметра будет храниться "в регистре" пока мы не поменяем это значение (а поменять его мы можем только опять командой M66)...
командуем в g-коде например:
M66 E02 L00
этим мы "перезаписали" наш "регистр" , и теперь там значение ,которое на пине motion.analog-in-02 ( потому как скомандовали E02)
======
то есть - в момент ,когда отрабатывает в программе строка кода вида M66 Exx L00 в параметр записывается
значение пина motion.analog-in-xx
=========================
Ворон226 писал(а):Т.о. переменная #5399 по умолчанию содержит значение motion.digital-in-[00...03], либо motion.analog-in-[00...03]???
аналогично - переменная #5399 содержит значение того пина , с которого мы "списали" его значение командой M66 ...
а уже сама команда M66 своими аргументами (Pxx- digital или Exx- analog ) указывае -
с какого именно пина взять значение...
++++++++++++++++++++++
посмотри пример ,который я приводил выше:

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

;Turning

O<turning> sub
(axis,hide)

G18 G7

M66 E4 L00
#5 = #5399 (Finish Z )
M66 E3 L00
#1 = #5399 (Finish X)
M66 E0 L0
#2 = #5399 (metres/min surface speed)
M66 E2 L0
#3 = #5399 (Cut / Increment )
M66 E1 L0
#4 = #5399 (Feed / Pitch)
M66 E5 L0
#6 = #5399 (Radius)
M66 E6 L0
#7 = #5399 (angle)

G92 x0 z0  (store position)
g92.2 
#14 = [#5211 * 2] (starting X)
#13 = #5213 (starting Z)
g92.1

G7 ; Lathe Diameter Mode
G18 ; XZ Plane
G21 ; Metric Units
G90 ; Absolute Distance
G91.1 ; but not or arcs
G96 D1500 S#2 ; Constant Surface Speed Mode
g95 F#4 ; Feed-Per-Rev Mode

m3 ;Start Spindle

g4p1 ; Wait to reach speed

;Turning
(axis,show)

/	(debug, Turning finish dia #1 start  dia #14 start length #13 finish length #5)
/	m1
	O100 WHILE [#14 GT [#1+#3]]
        g0 X #14
	#14=[#14-#3]
	G1 X #14
	G1 Z [#5 + #6] X[#14 + [#13 - [#5 + #6]]*TAN[#7]]
        O101 IF [#6 GT 0]
                G2 Z#5 X[#14 + 2 * #6 + [#13 - [#5 + #6]]*TAN[#7]] I[#6]
        O101 ELSE
	        G1 X[#14 + #3 + [#13 - [#5 + #6]]*TAN[#7] + 0.3]
        O101 ENDIF
	G0 Z[#13]
	O100 ENDWHILE
	G0 x#1
	G1 Z [#5 + #6] X[#1 + [#13 - [#5 + #6]]*TAN[#7]]
        O102 IF [#6 GT 0]
                G2 Z#5 X[#1 + 2 * #6 + [#13 - [#5 + #6]]*TAN[#7]] I[#6]
        O102 ELSE
	        G1 X[#1 + #3 + [#13 - [#5 + #6]]*TAN[#7] + 0.3]
        O102 ENDIF
	G0 Z #13
	G0 X #1 ; For touch-off
        M5
O<turning> endsub
M2
он как раз наглядно демонстрирует работу этой команды...
тут мы имеем панель PYVCP , в которой пользователь должен установить некие параметры для обработки...
(такое подобие ngcgui)
вот мы заполнили поля:
Выделение_071.png
Выделение_071.png (7.4 КБ) 3838 просмотров
теперь скоммутировали пины этх текстовых полей с нашими аналоговыми входами motion.analog-in-xx :

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

net surface_speed_in pyvcp.surface_speed => motion.analog-in-00
net feed_per_rev_in pyvcp.feed_per_rev => motion.analog-in-01
net cut_in pyvcp.cut => motion.analog-in-02
net target_x_in pyvcp.target_X => motion.analog-in-03
net target_z_in pyvcp.target_Z => motion.analog-in-04
net radius_in pyvcp.radius => motion.analog-in-05
net angle_in pyvcp.angle => motion.analog-in-06
и теперь запустив наш G-код мы поочередно перезаписываем значение с наших пинов панели
сначала в параметр #5399 ,
и сразу же в свои переменные (#1, #2, и тд.)
по сылке есть все файлы для "попробовать"...
разобрав этот пример - всё станет на свои места...
Последний раз редактировалось nkp 17 сен 2014, 18:55, всего редактировалось 2 раза.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Как реализовать связь пинов HAL с переменными подпрограм

Сообщение Ворон226 »

Вот теперь понятно. Есть специальная ячейка памяти (регистр) для хранения результата операции M66 - #5399.
Спасибо!
Хочешь быть счастливым? Будь им!
Ответить

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