продолжение работы после отключения питания компьютера

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

Re: продолжение работы после отключения питания компьютера

Сообщение Serg »

fredy79 писал(а):я про доработки, если уж делать то все должно быть на высшем уровне
а кто собрался делать?.. :)
fredy79 писал(а):За FMS3000 платить нет желания
А за доработку?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
peg
Новичок
Сообщения: 25
Зарегистрирован: 01 ноя 2016, 14:21
Репутация: 3
Настоящее имя: Евгений
Откуда: г. Армавир Краснодарского края
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение peg »

Видимо, задача, поставленная в названии темы, не так проста, как это утверждает UAVpilot...
fredy79
Опытный
Сообщения: 100
Зарегистрирован: 03 июн 2014, 20:22
Репутация: 3
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение fredy79 »

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

Re: продолжение работы после отключения питания компьютера

Сообщение Serg »

peg писал(а):Видимо, задача, поставленная в названии темы, не так проста, как это утверждает UAVpilot...
Тут уже озвучено как минимум два варианта решения...
fredy79 писал(а):вопрос кто может этим заняться?
А вот это самый трудный вопрос. :)

P.S. Лично мне это пока не интересно и не нужно, да и время на это я не готов выделить. Деньги значения не имеют. Изображение
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

если брать за ТЗ пост 71,то сразу возникают вопросы:
как оно работает в системе ,пример из которой приводится - допустим время обработки по программе 12 часов,
сколько FMS3000 "вхолостую" добегает скажем до середины??

ведь реально это нереально :)

===============
другое дело ,если просто парсить код на предмет поиска нужных нам данных...
так это даже в самых "длинных" программах займет максимум десятки секунд...
и перекоммутация тогда в хал не требуется(хотя я когда то пытался это сделать для симуляции обработки на стойке)
Гагарин
Опытный
Сообщения: 142
Зарегистрирован: 18 июн 2015, 17:25
Репутация: 13
Настоящее имя: Юрий
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение Гагарин »

Компонет с режимом симуляции мутить с мгновенными ускорениями и максимальными скоростями. И делать переход между режимом симуляции и рабочим режимом при достожении нужных строк. Примерно складывается картина. Вполне реально сделать, ноооо...кому оно надо, тот пусть и делает) Не вижу никакого рационального смысла. А подводных камней , наверняка, полно
Аватара пользователя
peg
Новичок
Сообщения: 25
Зарегистрирован: 01 ноя 2016, 14:21
Репутация: 3
Настоящее имя: Евгений
Откуда: г. Армавир Краснодарского края
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение peg »

UAVpilot писал(а):Тут уже озвучено как минимум два варианта решения...
Ни одного варианта я тут не увидел.
Надо делать, как в посте №71. Читать программу до заданного кадра и исполнять ее фиктивно,
вычисляя координаты, запоминая технологические команды, подачи, модальные команды, номер
инструмента, идет ли обработка контура (эквидистанта), величину корректоров (размеры для эквидистанты). Возможно, интерпретатор G-кодов это все уже умеет?
А запустить программу с заданного кадра есть возможность?

Те, кто не видит смысла, могут не беспокоиться. Ясно, что проблема актуальна и ее решение
сильно облегчит работу.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7480
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение MX_Master »

peg писал(а):Читать программу до заданного кадра и исполнять ее фиктивно
УП же реально выполнялась до отключения питания. Все эти параметры УП можно периодически сохранять в файл по ходу выполнения. Включая путь к УП, номер строки, позицию и т.п. По завершению УП этот файл нужно удалить. А если такой файл остался в живых и найден при запуске LCNC, это означает, что УП была прервана. Восстановление всех параметров из этого файла для продолжения работы - не составит большого труда. Этим всем может заниматься буквально 1 скрипт на питоне. Я делал себе похожую (но проще) сохранялку с целью ручного запуска УП после форс-мажоров. Большего мне не надо, т.к. питание боль мень стабильное.

Если кто-то хочет готовых решений из коробки, идите в магазин и платите за коробку. А LinuxCNC - это бесплатный конструктор для самостоятельной сборки. И мне кажется, если кто-то "закажет" разработку этого функционала под LCNC, то в открытый доступ он результат не выложит. Могу ошибаться, но.. жаба, деньги. А те, кто может это сделать бесплатно - не имеют к этой задаче ни интереса, ни какой-либо необходимости. Иными словами, мы можем только посоветовать куда копать.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

попробую что то практически))
самое начало
вот скрипт питона,он выводит окошко,в котором можно ввести номер строки,с которой хотим продолжить прерв. программу
его кладем в папку со всеми программами(жкодом)
(расширение .txt поменять на .py)
restart.txt
(1.81 КБ) 1017 скачиваний
===================================
загружаем в емс тестовый ж код(суперпростой пока ):
test_restart.ngc
(605.8 КБ) 1168 скачиваний
============================
потом через меню "Открыть" (так же как открываем в емс любой другой файл) открываем наш restart.py
и вводим(пока опять же руками)) номер строки (22222 например)
Выделение_062.jpg (2642 просмотра) <a class='original' href='./download/file.php?id=125167&sid=6b454a50c32f3a217d54e67dfbfd8651&mode=view' target=_blank>Загрузить оригинал (211.72 КБ)</a>
----------------------------------------------------------
наш скриптик загружает наш код не весь,а только начиная со строки 22222
Выделение_061.jpg (2642 просмотра) <a class='original' href='./download/file.php?id=125168&sid=6b454a50c32f3a217d54e67dfbfd8651&mode=view' target=_blank>Загрузить оригинал (309.33 КБ)</a>
====================
понятно ,что это примитивно ,но
это концепция,о которой я написал выше...
далее можно расширять скрипт различными данными ,которые он будет брать ,читая исходный файл жкода
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

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

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

номер строки канеш будем брать из файла,в котором он(номер) будет сохраняться после аварии емс
это всё уже есть,просто тестить в таком режиме большие файлы неудобно,ибо обработка здесь затяжная и долго ждать тот же
кадр 22222 :)
так что пока руками
----------
то есть - по дефолту - продолжение со строки ,на которой "оборвалась" обработка,
но с возможностью ввести номер любого другого кадра
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

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

#!/usr/bin/env python
# --*-- coding:utf-8 --*--

import pygtk
pygtk.require('2.0')
import gtk
import re
import os,sys
import linuxcnc

class WRestart:
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False
        
    def go(self):
        s = linuxcnc.stat()
        s.poll()
        filename = s.file
        f = open(filename, "r")
        lines = f.readlines()
        number_line = int(self.entry.get_text())
        string='' 
        w=0
        while not re.search("M2\s*",lines[w], re.I):
            w+=1
            if (w <= number_line):
                try:
                    tool =  int(re.search("T\s*([0-9.]+)",lines[w], re.I).group(1))
                except:
                    pass
                try:
                    speed = int(re.search("S\s*([0-9.]+)",lines[w], re.I).group(1))
                except:
                    pass
                try:
                    feed =  int(re.search("F\s*([0-9.]+)",lines[w], re.I).group(1))
                except:
                    pass                                        
            if (w >= number_line):
                string+=lines[w]
        string +='M2\n'
        print 'M6 T',tool
        print 'F',feed
        print 'M3 S',speed
        sys.stdout.write(string) 
        gtk.main_quit()
             
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("restart")
        self.window.connect("delete_event", self.delete_event)
        self.window.set_border_width(20)

        self.vbox = gtk.VBox(True, 2)
        self.window.add(self.vbox)
        
        #self.entry = gtk.Label()
        #self.entry.set_text("№ line")
        #self.vbox.pack_start(self.entry, True, True, 2)
        #self.entry.show()        

        self.entry = gtk.Entry()
        self.entry.set_max_length(10)
        self.entry.set_text("№ line")
        self.vbox.pack_start(self.entry, True, True, 2)
        self.entry.show()
        
                       
        self.button = gtk.Button("Open")
        self.button.connect("clicked", lambda x: self.go())
        self.vbox.pack_start(self.button, True, True, 2)
        self.button.show()
        self.vbox.show()
        
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.show()
        
def main():    
    gtk.main()
    return 0       
if __name__ == "__main__":
    WRestart()
    main()
смотрит номер инстр., подачу и обороты шп. перед указанным кадром
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение Serg »

peg писал(а):Надо делать, как в посте №71.
Завтра начало? ;)
peg писал(а):А запустить программу с заданного кадра есть возможность?
Есть как и на любых станках. Только, как и на любых станках, предварительно надо сделать множество подготовительных действий, например привести инструмент в такую точку, с которой обработка начнётся без сюрпризов. И тут никакая автоматика не поможет, ибо никакая автоматика не разумеет полностью форму детали/заготовки/крепежа.
MX_Master писал(а):Я делал себе похожую (но проще) сохранялку с целью ручного запуска УП после форс-мажоров.
Проблема в том, что в этой теме желают автоматического продолжения после восстановления питания. :)
nkp писал(а):наш скриптик загружает наш код не весь,а только начиная со строки 22222
А откуда и по какой траектории поедет инструмент в эту точку?.. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

так я и предлагаю обсуждать именно такие вопросы, а не подкалывать друг друга:-)
-----------
кмк - скрипт может получить все возможные данные(координату предстоящей строки например),
предложить варианты врезания(чекбоксы в окошке),
а принимать окончательное решение будет оператор разумеется.
fredy79
Опытный
Сообщения: 100
Зарегистрирован: 03 июн 2014, 20:22
Репутация: 3
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение fredy79 »

UAVpilot писал(а):А откуда и по какой траектории поедет инструмент в эту точку?
я полагаю что ось Z должна находиться в крайнем верхнем положении а оси X и Y двигаться из точки 0.0 в точку Х.Х , где Х координаты положения осей в предпоследнем исполненном кадре, далее когда оси Х и У придут в эти координаты ось Z должна опуститься до своей координаты. Опускание должно происходить таким образом, ось опускается на большой скорости до значения например Z+5, далее опускается с медленной скоростью, чтоб исключить резкого врезания в материал. Наверное как то так.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение Serg »

fredy79 писал(а):я полагаю что ось Z должна находиться в крайнем верхнем положении а оси X и Y двигаться из точки 0.0 в точку Х.Х , где Х координаты положения осей в предпоследнем исполненном кадре, далее когда оси Х и У придут в эти координаты ось Z должна опуститься до своей координаты.
А что будет, если на пути движения из точки 0.0 в точку Х.Х окажется какой-либо крепёж, высотой более, чем максимальная высота подъёма инструмента?..
nkp писал(а):так я и предлагаю обсуждать именно такие вопросы, а не подкалывать друг друга:-)
Так обсуждение только в этой теме уже на третий круг заходит... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
fredy79
Опытный
Сообщения: 100
Зарегистрирован: 03 июн 2014, 20:22
Репутация: 3
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение fredy79 »

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

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

загрузка крайнего жкода
в самописном gui проще это было сделать))
тут нюансы есть тоже ,но для начала:
в axis.py дополняем функцию загрузки жкода(функция open_file_guts) следующим кодом:

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

        if (os.path.basename(f) != 'file_yesterday.ngc'):#nkp
            path_fyesterday = os.path.join(os.path.dirname(f), 'file_yesterday.ngc')
            fy  = open(path_fyesterday, "w")
            ffy = open(f, "r")
            ls  = ffy.readlines()            
            string_fy = ''
            for ysf in ls:
                string_fy += ysf 
            fy.write(string_fy)
            fy.close()
            ffy.close()
вся функция будет выглядеть примерно так:

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

def open_file_guts(f, filtered=False, addrecent=True):
    if addrecent:
        add_recent_file(f)
    if not filtered:
        global loaded_file
        loaded_file = f
        program_filter = get_filter(f)
        if program_filter:
            tempfile = os.path.join(tempdir, os.path.basename(f))
            exitcode, stderr = filter_program(program_filter, f, tempfile)
            if exitcode:
                root_window.tk.call("nf_dialog", (".error", "-ext", stderr),
                        _("Filter failed"),
                        _("The program %(program)r exited with code %(code)d.  "
                        "Any error messages it produced are shown below:")
                            % {'program': program_filter, 'code': exitcode},
                        "error",0,_("OK"))
                return
            return open_file_guts(tempfile, True, False)

    set_first_line(0)
    t0 = time.time()

    canon = None
    o.deselect(None) # remove highlight line from last program
    try:
        # be sure to switch modes to cause an interp synch, which
        # writes out the var file.  there was a reset here, and that
        # causes a var file write, but nukes important settings like
        # TLO.
        
        if (os.path.basename(f) != 'file_yesterday.ngc'):#nkp
            path_fyesterday = os.path.join(os.path.dirname(f), 'file_yesterday.ngc')
            fy  = open(path_fyesterday, "w")
            ffy = open(f, "r")
            ls  = ffy.readlines()            
            string_fy = ''
            for ysf in ls:
                string_fy += ysf 
            fy.write(string_fy)
            fy.close()
            ffy.close()       
        
        
        
        ensure_mode(linuxcnc.MODE_MDI)
        c.wait_complete()
        ensure_mode(linuxcnc.MODE_AUTO)
        c.wait_complete()
        c.program_open(f)
        lines = open(f).readlines()
        progress = Progress(2, len(lines))
        t.configure(state="normal")
        t.tk.call("delete_all", t)
        code = []
        i = 0
        for i, l in enumerate(lines):
            l = l.expandtabs().replace("\r", "")
            #t.insert("end", "%6d: " % (i+1), "lineno", l)
            code.extend(["%6d: " % (i+1), "lineno", l, ""])
            if i % 1000 == 0:
                t.insert("end", *code)
                del code[:]
                progress.update(i)
        if code:
            t.insert("end", *code)
        progress.nextphase(len(lines))
        f = os.path.abspath(f)
        o.canon = canon = AxisCanon(o, widgets.text, i, progress, arcdivision)
        root_window.bind_class(".info.progress", "<Escape>", cancel_open)

        parameter = inifile.find("RS274NGC", "PARAMETER_FILE")
        temp_parameter = os.path.join(tempdir, os.path.basename(parameter))
        if os.path.exists(parameter):
            shutil.copy(parameter, temp_parameter)
        canon.parameter_file = temp_parameter

        initcode = inifile.find("EMC", "RS274NGC_STARTUP_CODE") or ""
        if initcode == "":
            initcode = inifile.find("RS274NGC", "RS274NGC_STARTUP_CODE") or ""
        if not interpname:
		unitcode = "G%d" % (20 + (s.linear_units == 1))
        else:
		unitcode = ''
        try:
            result, seq = o.load_preview(f, canon, unitcode, initcode, interpname)
        except KeyboardInterrupt:
            result, seq = 0, 0
        # According to the documentation, MIN_ERROR is the largest value that is
        # not an error.  Crazy though that sounds...
        if result > gcode.MIN_ERROR:
            error_str = _(gcode.strerror(result))
            root_window.tk.call("nf_dialog", ".error",
                    _("G-Code error in %s") % os.path.basename(f),
                    _("Near line %(seq)d of %(f)s:\n%(error_str)s") % {'seq': seq, 'f': f, 'error_str': error_str},
                    "error",0,_("OK"))

        t.configure(state="disabled")
        o.lp.set_depth(from_internal_linear_unit(o.get_foam_z()),
                       from_internal_linear_unit(o.get_foam_w()))

    except Exception, e:
        notifications.add("error", str(e))
    finally:
        # Before unbusying, I update again, so that any keystroke events
        # that reached the program while it was busy are sent to the
        # label, not to another window in the application.  If this
        # update call is removed, the events are only handled after that
        # widget is destroyed and focus has passed to some other widget,
        # which will handle the keystrokes instead, leading to the
        # R-while-loading bug.
        #print "load_time", time.time() - t0
        root_window.update()
        root_window.tk.call("destroy", ".info.progress")
        root_window.tk.call("grab", "release", ".info.progress")
        if canon:
            canon.progress = DummyProgress()
        try:
            progress.done()
        except UnboundLocalError:
            pass
        o.tkRedraw()
        root_window.tk.call("set_mode_from_tab")
в INI файл пишем путь к нашему файлу file_yesterday.ngc:
у меня к примеру так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc

правильно будет в меню Axis добавить возможность выбирать-не_выбирать эту опцию (потом прикрутим))

все файлы должны лежать в папке ,которая указана в ини:
PROGRAM_PREFIX =
"запись" происходит на стадии загрузки жкода,поэтому при аварии у нас ничего не теряется...
Последний раз редактировалось nkp 22 ноя 2017, 12:52, всего редактировалось 1 раз.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: продолжение работы после отключения питания компьютера

Сообщение nkp »

заметил такую фишку(может конечно у меня только так)):
раньше в ини путь к файлу ,окрывающемуся по дефолту, писал в кавычках...
так Axis (os.path.exists(initialfile)) перестал видеть файл...
потом заметил,что в тексте ошибки путь в двух парах кавычек))
написал так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc

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

Re: продолжение работы после отключения питания компьютера

Сообщение Serg »

fredy79 писал(а):в таком случае должна быть возможность вручную обойти все препятствия
Т.е. об этом
fredy79 писал(а):Тое-сть станок должен во время работы запоминать исполненные кадры, после отключения питания и его возобновлении должен автоматически загрузить файл прерванной обработки, обнулиться и предложить продолжить работу с прерванного кадра.
уже не говорим? Тогда всё намного проще. :)
nkp писал(а):в INI файл пишем путь к нашему файлу file_yesterday.ngc:
у меня к примеру так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc
Лучше писать в файл file_yesterday.ini только эту строчку, тогда останется только в основном ini написать:

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

...
#INCLUDE file_yesterday.ini
...
nkp писал(а):написал так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc
работает ;)
Кавычки обязательны только если в значении встречаются пробелы. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

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