Страница 1 из 1
Сохранение имени файла и текущей строки УП
Добавлено: 30 июн 2017, 13:48
MX_Master
Может плохо искал, но спрошу..
Вопрос такой:
Как лучше всего организовать сохранение имени файла УП и текущей строки во время выполнения УП?
Применение:
Ручной запуск УП с нужной строки после какого-ньть форс мажора. Например, завис ПК, отрубилось питание и т.д. И вот всё снова работает после перезагрузки, надо продолжать, а имя УП и текущая строка неизвестна.
Варианты:
Первое, что пришло на ум - накатать простенький
python скрипт, который раз в 5 секунд будет писать в файл какие-то параметры
LCNC, взятые из
Python Interface. Вопрос только как запустить этот скрипт в начале выполнения УП (или при запуске LCNC)?
Или есть другие варианты?
Re: Сохранение имени файла и текущей строки УП
Добавлено: 30 июн 2017, 15:56
Serg
Плохо искал, тут это уже несколько раз обсуждалось.

Самый простой вариант - userspace HAL компонент, который мониторит соотв. статус/пины и записывает их изменения.
Re: Сохранение имени файла и текущей строки УП
Добавлено: 30 июн 2017, 19:47
MX_Master
Вощем, в
custom.hal добавил строку
сам скрипт сделал исполняемым и положил его в
/usr/local/bin.
Код: Выделить всё
#!/usr/bin/python
from sys import exit
import time
import linuxcnc
s = linuxcnc.stat()
out_filepath = '/home/{USER}/linuxcnc/configs/{CONFIG}/program_state.var'
s_file = '75d16f48z19ss'
s_current_line = 'fj7qd5janck1a'
# main cycle
while 1:
# check program data every 5 seconds
time.sleep(5)
try:
# update lcnc state data
s.poll()
except linuxcnc.error, detail:
# exit if any lcnc error
exit(1)
else:
# if program file or line is changed
if s_file != s.file or s_current_line != s.current_line :
# update program data for the next check
s_file = s.file
s_current_line = s.current_line
# write new data to the output file
f = open(out_filepath, 'w')
f.write('time = ' + time.strftime("%d.%m.%Y, %H:%M:%S", time.localtime()) + '\n')
f.write('file = ' + str(s_file) + '\n')
f.write('line = ' + str(s_current_line) + '\n')
f.flush()
f.close()
exit(0)
Re: Сохранение имени файла и текущей строки УП
Добавлено: 01 июл 2017, 10:23
MX_Master
Воблин, скрипт остаётся в процессах даже после закрытия
LCNC. Пришлось прикрутить некрасивую проверку на наличие процесса
linuxcnc
Код: Выделить всё
# check for the linuxcnc procces state
if 1 > subprocess.Popen(['ps','-C','linuxcnc'], stdout=subprocess.PIPE).communicate()[0].count('linuxcnc'):
# exit if no linuxcnc procces found
exit(1)
теперь, если
linuxcnc нет в процессах, скрипт прекращает свою работу. Всё вместе выглядит теперь вот так
Код: Выделить всё
#!/usr/bin/python
from sys import exit
import subprocess
import time
import linuxcnc
s = linuxcnc.stat()
out_filepath = '/home/{USER}/linuxcnc/configs/{CONFIG}/program_state.var'
s_file = '75d16f48z19ss'
s_current_line = 'fj7qd5janck1a'
# main cycle
while 1:
# check program data every 5 seconds
time.sleep(5)
# check for the linuxcnc process state
if 1 > subprocess.Popen(['ps','-C','linuxcnc'], stdout=subprocess.PIPE).communicate()[0].count('linuxcnc'):
# exit if no linuxcnc process found
exit(1)
try:
# update lcnc state data
s.poll()
except linuxcnc.error, detail:
# exit if any lcnc error
exit(1)
else:
# if program file or line is changed
if s_file != s.file or s_current_line != s.current_line :
# update program data for the next check
s_file = s.file
s_current_line = s.current_line
# write new data to the output file
f = open(out_filepath, 'w')
f.write('time = ' + time.strftime("%d.%m.%Y, %H:%M:%S", time.localtime()) + '\n')
f.write('file = ' + str(s_file) + '\n')
f.write('line = ' + str(s_current_line) + '\n')
f.flush()
f.close()
exit(0)
Если кто-то будет использовать,
{USER} и
{CONFIG} подставьте свои
Re: Сохранение имени файла и текущей строки УП
Добавлено: 01 июл 2017, 16:23
Serg
MX_Master писал(а):теперь, если linuxcnc нет в процессах, скрипт прекращает свою работу. Всё вместе выглядит теперь вот так
Вот так покорректней будет:
Код: Выделить всё
...
try:
print "THCController: Starting Up."
SetDefaults()
UpdatePins()
h.ready()
....
while 1:
....
except:
h["estop-out"] = 1
traceback.print_exc()
print "THCController Shutting down. ( " + repr(state) + ", " + repr(next_state) + ", " + repr(last_state) + ")"
raise SystemExit