Python в LinuxCnC

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Python в LinuxCnC

Сообщение nkp »

Скинь все скрипты. И примерно, что хочешь делать...
Скриптов как таковых готовых нет-одни задумки :)
А задача универсальная (в смысле пригодится еще не раз)- в хал есть данные-например motion.program-line (s32, out)
Мы хотим ипользовать текущее значение в скрипте (в данном случае скрипт обработки G-кода для реверса)
Выводит же как то Halsampler данные в станд вывод.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Т.е. ты хочешь получить значение произвольного пина без использования "net motion.program-line ..."?
Тогда можно использовать getp, это тоже, что и setp только наоборот.
Выполни еще раз:
import hal
print dir(hal)

Вроде в модуле hal был setp.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

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

>>> import hal 
>>> print dir(hal)
['HAL_BIT', 'HAL_FLOAT', 'HAL_IN', 'HAL_IO', 'HAL_OUT', 'HAL_RO', 'HAL_RW', 'HAL_S32', 'HAL_U32', 'MSG_ALL', 'MSG_DBG', 'MSG_ERR', 'MSG_INFO', 'MSG_NONE', 'MSG_WARN', 'Param', 'Pin', '_ItemWrap', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_hal', 'component', 'component_exists', 'component_is_ready', 'connect', 'error', 'get_msg_level', 'is_rt', 'is_sim', 'item', 'kernel_version', 'new_sig', 'pin_has_writer', 'set_msg_level', 'set_p', 'shm']
setp почему то set_p
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Кстати вот небольшой тутор по HAL+Python. Там даже что-то написано по поводу IO пинов, с которыми я так и не разобрался.
http://www.linuxcnc.org/docview/html/hal/halmodule.html

Но по get_p там ничего нет... Кстати, ты не натыкался на другие маны по питону и hal?

Можешь попробовать:
import hal

print hal.get_p("motion.program-line")

Хммм... а в dir оказывается и нет get_p... надо что-то искать...


ЗЫ правильно ли я тебя понял на счет:
Nick писал(а):Т.е. ты хочешь получить значение произвольного пина без использования "net motion.program-line ..."?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):Т.е. ты хочешь получить значение произвольного пина без использования "net motion.program-line ..."?
Да ,задача получить значение любого пина из хал в своем скрипте . (x=значение_motion.program-line)
два вечера перелопачивания чужого кода(хоть как то относящегося к хал) ничего не дали.
Ну должно же быть решение-ведь любой сигнал для программы это всего лишь переменная.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Можно сделать так:
import os
a = os.system("halcmd getp motion.program-line")
print a
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Да - так работает:
(для просмотра содержимого нажмите на ссылку)

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

>>> import os , time
>>> while 1:
...     time.sleep(2) 
...     a = os.system("halcmd getp motion.program-line")
...     print a
... 
30
0
33
0
37
0
38
0
38
0
38
0
(ноль возвращает при каждом выполнении команды)
Но обнаружилось , что при остановке программы(ж-кода) motion.program-line становится равным 0.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

При остановке по стоп или по паузе?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

По стоп (по паузе значение сохраняется)
Сделал через minmax:

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

loadrt conv_s32_float 
addf conv-s32-float.0 servo-thread
net numb motion.program-line conv-s32-float.0.in
loadrt minmax 
addf minmax.0 servo-thread
net numb1 conv-s32-float.0.out   minmax.0.in 

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

a = os.system("halcmd getp minmax.0.max ")
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

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

Re: Python в LinuxCnC

Сообщение nkp »

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

>>> import os
>>> x = os.system("halcmd getp minmax.0.max ")
48
>>> f = open(r'a.txt')
>>> lines = f.readlines()
>>> f.close()
>>> print x
0
>>> lines[x] = "F60 G21 \n" 
>>> while x>1 :
...     f = open(r'b.txt','a')
...     f.write(lines[x])
...     x=x-1
...     f.close()
...
почему то os.system возвращает значение x и сразу становится равной нулю.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Возможно os.system возвращает не значение, а адрес потока...
И тогда второе обращение к нему дает второе значение...
вообще 0 это скорее всего exit status, если exit status = 0, то это значит, что программа выполнилась успешно, если не 0 - то это значит где-то была ошибка.

вот пример, что обычно бывает, если exit не 0
subprocess.check_output("exit 1", shell=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
Вообще, почитал ман по питону рекомендуют не использовать os.system, а вместо нее использовать функции subprocess
попробуй так:
import subprocess
subprocess.check_output(["halcmd", "getp ........"])
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

subprocess.check_output тоже попробовал-ругается.
А вот

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

from subprocess import Popen, PIPE
print Popen('halcmd getp minmax.0.max ', shell=True, stdout=PIPE).stdout.read()
возвращает номер без 0
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

тоже варинат.

А на что subprocess.check_output ругается?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а): А на что subprocess.check_output ругается?

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

AttributeError: 'module' object has no attribute 'check_output
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

a как ты import делал?

Попробуй может просто check_output(["halcmd", "getp ........"])
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

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

>>> dir(subprocess)
['CalledProcessError', 'MAXFD', 'PIPE', 'Popen', 'STDOUT', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_cleanup', '_demo_posix', '_demo_windows', '_eintr_retry_call', 'call', 'check_call', 'errno', 'fcntl', 'gc', 'list2cmdline', 'mswindows', 'os', 'pickle', 'select', 'signal', 'sys', 'traceback', 'types']
>>> 
check_output как бы и нет
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Кажись понял - его нет в Python 2.x
В Python3.1 - работает.

Попробуй вверху скрипта написать
#!/usr/bin/env python3
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):Кажись понял - его нет в Python 2.x
В Python3.1 - работает.
Попробуй вверху скрипта написать
#!/usr/bin/env python3
Для этого python3 должен быть установлен в системе?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Да, а у тебя его разве нет?
попробуй в консоле python3
или посмотри что вообще есть, проще всего python и два раза таб.
Ответить

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