а кто собрался делать?..fredy79 писал(а):я про доработки, если уж делать то все должно быть на высшем уровне
А за доработку?..fredy79 писал(а):За FMS3000 платить нет желания
а кто собрался делать?..fredy79 писал(а):я про доработки, если уж делать то все должно быть на высшем уровне
А за доработку?..fredy79 писал(а):За FMS3000 платить нет желания
Тут уже озвучено как минимум два варианта решения...peg писал(а):Видимо, задача, поставленная в названии темы, не так проста, как это утверждает UAVpilot...
А вот это самый трудный вопрос.fredy79 писал(а):вопрос кто может этим заняться?
Ни одного варианта я тут не увидел.UAVpilot писал(а):Тут уже озвучено как минимум два варианта решения...
УП же реально выполнялась до отключения питания. Все эти параметры УП можно периодически сохранять в файл по ходу выполнения. Включая путь к УП, номер строки, позицию и т.п. По завершению УП этот файл нужно удалить. А если такой файл остался в живых и найден при запуске LCNC, это означает, что УП была прервана. Восстановление всех параметров из этого файла для продолжения работы - не составит большого труда. Этим всем может заниматься буквально 1 скрипт на питоне. Я делал себе похожую (но проще) сохранялку с целью ручного запуска УП после форс-мажоров. Большего мне не надо, т.к. питание боль мень стабильное.peg писал(а):Читать программу до заданного кадра и исполнять ее фиктивно
Код: Выделить всё
#!/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()Завтра начало?peg писал(а):Надо делать, как в посте №71.
Есть как и на любых станках. Только, как и на любых станках, предварительно надо сделать множество подготовительных действий, например привести инструмент в такую точку, с которой обработка начнётся без сюрпризов. И тут никакая автоматика не поможет, ибо никакая автоматика не разумеет полностью форму детали/заготовки/крепежа.peg писал(а):А запустить программу с заданного кадра есть возможность?
Проблема в том, что в этой теме желают автоматического продолжения после восстановления питания.MX_Master писал(а):Я делал себе похожую (но проще) сохранялку с целью ручного запуска УП после форс-мажоров.
А откуда и по какой траектории поедет инструмент в эту точку?..nkp писал(а):наш скриптик загружает наш код не весь,а только начиная со строки 22222
я полагаю что ось Z должна находиться в крайнем верхнем положении а оси X и Y двигаться из точки 0.0 в точку Х.Х , где Х координаты положения осей в предпоследнем исполненном кадре, далее когда оси Х и У придут в эти координаты ось Z должна опуститься до своей координаты. Опускание должно происходить таким образом, ось опускается на большой скорости до значения например Z+5, далее опускается с медленной скоростью, чтоб исключить резкого врезания в материал. Наверное как то так.UAVpilot писал(а):А откуда и по какой траектории поедет инструмент в эту точку?
А что будет, если на пути движения из точки 0.0 в точку Х.Х окажется какой-либо крепёж, высотой более, чем максимальная высота подъёма инструмента?..fredy79 писал(а):я полагаю что ось Z должна находиться в крайнем верхнем положении а оси X и Y двигаться из точки 0.0 в точку Х.Х , где Х координаты положения осей в предпоследнем исполненном кадре, далее когда оси Х и У придут в эти координаты ось Z должна опуститься до своей координаты.
Так обсуждение только в этой теме уже на третий круг заходит...nkp писал(а):так я и предлагаю обсуждать именно такие вопросы, а не подкалывать друг друга:-)
Код: Выделить всё
        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")Т.е. об этомfredy79 писал(а):в таком случае должна быть возможность вручную обойти все препятствия
уже не говорим? Тогда всё намного проще.fredy79 писал(а):Тое-сть станок должен во время работы запоминать исполненные кадры, после отключения питания и его возобновлении должен автоматически загрузить файл прерванной обработки, обнулиться и предложить продолжить работу с прерванного кадра.
Лучше писать в файл file_yesterday.ini только эту строчку, тогда останется только в основном ini написать:nkp писал(а):в INI файл пишем путь к нашему файлу file_yesterday.ngc:
у меня к примеру так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc
Код: Выделить всё
...
#INCLUDE file_yesterday.ini
...Кавычки обязательны только если в значении встречаются пробелы.nkp писал(а):написал так:
OPEN_FILE = /home/nkp/linuxcnc-reverse-run/nc_files/file_yesterday.ngc
работает