Сохранение имени файла и текущей строки УП

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Сохранение имени файла и текущей строки УП

Сообщение MX_Master »

Может плохо искал, но спрошу..

Вопрос такой:
Как лучше всего организовать сохранение имени файла УП и текущей строки во время выполнения УП?

Применение:
Ручной запуск УП с нужной строки после какого-ньть форс мажора. Например, завис ПК, отрубилось питание и т.д. И вот всё снова работает после перезагрузки, надо продолжать, а имя УП и текущая строка неизвестна.

Варианты:
Первое, что пришло на ум - накатать простенький python скрипт, который раз в 5 секунд будет писать в файл какие-то параметры LCNC, взятые из Python Interface. Вопрос только как запустить этот скрипт в начале выполнения УП (или при запуске LCNC)?

Или есть другие варианты?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Сохранение имени файла и текущей строки УП

Сообщение Serg »

Плохо искал, тут это уже несколько раз обсуждалось. :)
Самый простой вариант - userspace HAL компонент, который мониторит соотв. статус/пины и записывает их изменения.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Сохранение имени файла и текущей строки УП

Сообщение MX_Master »

Вощем, в custom.hal добавил строку

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

loadusr program_state.py
сам скрипт сделал исполняемым и положил его в /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)
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Сохранение имени файла и текущей строки УП

Сообщение 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} подставьте свои
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Сохранение имени файла и текущей строки УП

Сообщение 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
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

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