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

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

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

Сообщение nkp »

если кто то попробовать решит - вот архивчик с файлами и README :
rs.rar
(201.73 КБ) 295 скачиваний

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



numstr.py - компонент ,который пишет номер текущей строки gcode(сделать исполняемым)
line-number.log - файл,в котором сохраняется номер текущей строки gcode
file_yesterday.ngc - файл,в котором сохраняется последний выполняемый gcode
restart.py - скрипт функции рестарта со строки в line-number.log(сделать исполняемым)

test_restart.ngc - просто файл Gcode для проверки
==================================

test_restart.ngc - в папке с gcode

файлы restart.py , file_yesterday.ngc  - в папке с gcode
файлы numstr.py , line-number.log  - в папке конфига

===============================

в ini файле прописываем новую скцию:

[RESTART]
MAIN_NAME = restart.py

======================================
в основной  hal файл добавляем:

loadusr -Wn numstr python numstr.py
net line  motion.program-line       numstr.in 
net enbl  halui.program.is-running  numstr.enbl

==========================================

в файле axis (/usr/bin/axis) (файл без расширения)

для внесения нижеуказанных изменений в терминале командуем:
sudo gedit /usr/bin/axis

находим строки :
    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.
        
и ПОСЛЕ них вставляем :
	        
        file_yesterday = inifile.find("DISPLAY", "OPEN_FILE")#nkp
        main_file =  inifile.find("RESTART", "MAIN_NAME")
        if (f != file_yesterday):
            string_fy = ''
            fy  = open(file_yesterday, "w")
            if (os.path.basename(f) != main_file):                           
                string_fy = '(source %s)\n' % f
            for ysf in open(f):
                string_fy += ysf 
            fy.write(string_fy)
            fy.close()




=====================================================================
СЛЕДУЮЩИЕ ИЗМЕНЕНИЯ ДЛЯ КНОПКИ В AXIS
ее можно и не делать - просто из стандартного меню емс 
открывать файл restart.py (в принципе  это и делает кнопочка))
====================================================================
в файле axis.tcl (/usr/share/axis/tcl/axis.tcl)

для внесения нижеуказанных изменений в терминале командуем:
sudo gedit /usr/share/axis/tcl/axis.tcl

находим строку :

vrule .toolbar.rule4

и ПЕРЕД ней вставляем :

Button .toolbar.gcode_cycle_load \
	-command { open_explicit_code } \
	-helptext [_ "open explicit code_cycle "] \
	-image [load_image code] \
	-relief link \
	-takefocus 0	
setup_widget_accel .toolbar.gcode_cycle_load {}
-------------------------------------------------
находим строки :

# Pack widget .toolbar.reload
pack .toolbar.reload \
	-side left
	
и ПОСЛЕ них вставляем :	

# Pack widget .toolbar.gcode_cycle_load
pack .toolbar.gcode_cycle_load \
	-side left
===============================================
файл code.gif  помещаем в /usr/share/axis/images
================================================

в файле axis (/usr/bin/axis) (файл без расширения)

для внесения нижеуказанных изменений в терминале командуем:
sudo gedit /usr/bin/axis

находим строку :

class TclCommands(nf.TclCommands):

и ПЕРЕД ней вставляем :

def open_explicit_code(refilter=False):
    if running(): return
    s.poll()
    if not loaded_file:
        root_window.tk.call("set_mode_from_tab")
        return
    line = vars.highlight_line.get()
    o.set_highlight_line(None)
    
    main_file =  inifile.find("RESTART", "MAIN_NAME")
    fs=os.path.join(open_directory, main_file)
    open_file_guts(fs, False, True)
    if line:
        o.set_highlight_line(line)
        
-------------------------------














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

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

Сообщение nkp »

интересно - что генерирует код вот такого вида:

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

N80G0X[#<xscale>*53.]Y[#<yscale>*-56.128]
N100G1Z[#<zscale>*-25.372]F[#<fscale>*100]
N110G1Z[#<zscale>*-27.372]F[#<fscale>*225]
N120Y[#<yscale>*-56.12]Z[#<zscale>*-27.725]
N130Y[#<yscale>*-56.105]Z[#<zscale>*-27.894]
N140Y[#<yscale>*-56.06]Z[#<zscale>*-28.152]
N150Y[#<yscale>*-56.051]Z[#<zscale>*-28.184]
N160Y[#<yscale>*-55.992]Z[#<zscale>*-28.405]
широко он испольуетс? редко? почти нет?
просто в скриптах ,которые работают с жкодом трудно (сразу) всё учесть ;)
==================
вот , программа может заканчиваться не только m2 , но и m30
restert.py подправил:

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

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

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

dir_ini = str(os.getcwd())
all_files = os.listdir(os.getcwd()) 
n_ini = filter(lambda x: x.endswith('.ini'),all_files)
if len(n_ini)>1 : print 'ini file > 1'
f_ini = os.path.join(dir_ini, n_ini[0])
inifile = linuxcnc.ini(f_ini)

main_file =  inifile.find("RESTART", "MAIN_NAME")
open_file  = inifile.find("DISPLAY", "OPEN_FILE")

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
        
        string_f = ''        
        string_s = '' 
              
        if (os.path.basename(filename) == main_file):
            filename = open_file
            
        f = open(filename, "r")
        lines = f.readlines()
        f.close()
        self.number_line = int(self.entry.get_text())-1

        s=0
        tool,blending,pos_Z,pos_X,pos_Y = None,None,None,None,None
        
        while not re.search("(M2)|(M30)\s*",lines[s], re.I)  :
            if (s <= self.number_line):
                if (re.search("^\s*#<",lines[s], re.I)):
                    string_s += lines[s]

                if (re.search("^\s*\(",lines[s], re.I)):
                    string_f += lines[s]                                        
                try:
                    tool = int(re.search("T\s*([0-9.]+)",lines[s], re.I).group(1))
                except:
                    pass
                                                                              
                try:
                    blending = re.search("G\s*64\s*P?\s*[0-9.]*\s*Q?\s*[0-9\.]*",lines[s], re.I).group(0)
                except:
                    pass
                    
                try:
                    pos_Z = float(re.search("Z\s*([-+0-9.]+)",lines[s], re.I).group(1))
                except:
                    pass 
                                       

                try:
                    pos_X = float(re.search("X\s*([-+0-9.]+)",lines[s], re.I).group(1))
                except:
                    pass
                      
                try:
                    pos_Y = float(re.search("Y\s*([-+0-9.]+)",lines[s], re.I).group(1))
                except:
                    pass 
                                                                                    
            if (s > self.number_line):
                    string_s += lines[s]
            s+=1 
                                      
        string_f += '(restart line %d)\n' % (self.number_line + 1)
        
        for i in self.active_gcodes:
            string_f += str(i) + ' '
        string_f += '\n'
        
        for i in self.active_mcodes:
            string_f += str(i) + ' '
        string_f += '\n'
        
        if blending != None :
            string_f += blending + '\n'
        if self.feed_str != None :            
            string_f += self.feed_str + '\n'
        if self.speed_str != None :            
            string_f += self.speed_str + '\n'
        if tool != None :            
            string_f += 'M6 T%d \n' % tool
        if pos_X != None :            
            string_f += 'G1 X%.3f\n'  % pos_X 
        if pos_Y != None :                        
            string_f += 'G1 Y%.3f\n'  % pos_Y
        if pos_Z != None :            
            string_f += 'G1 Z%.3f \n\n'  % (pos_Z + 5)
        if self.feed != None :            
            string_f += 'F%.3f \n'   % (self.feed * 0.1)
        if pos_Z != None :            
            string_f += 'G1 Z%.3f \n'  % pos_Z 
        if self.feed != None :            
            string_f += 'F%.3f \n\n'   % self.feed 
                     
        string = string_f + string_s + '\nM2'
        try:
            sys.stdout.write(string)
        finally:            
            '''filename = open_file
            f = open(filename, "w") 
            f.write(string)
            f.close()'''
            
        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)
     
        fr = open('line-number.log','r')
        ls = fr.readlines()

        l = re.sub("^\s+|\n|\r|\s+$", '',  ls[0] )

        self.active_gcodes = []
        self.active_mcodes = []
        
        g_ar =  ls[1].split(')')
        g_arr = g_ar[0].split(',')
        for i in g_arr[2:]:
            if int(i) == -1: continue
            if int(i) % 10 == 0:
                self.active_gcodes.append("G%d" % (int(i)/10))
            else:
                self.active_gcodes.append("G%(ones)d.%(tenths)d" % {'ones': int(i)/10, 'tenths': int(i)%10})

        s_ar =  ls[3].split(')')
        s_arr = s_ar[0].split(',')
        self.feed_str = "F%.1f" % float(s_arr[1])
        self.feed = float(s_arr[1])

        self.speed_str = "S%.0f" % float(s_arr[2])
        self.speed = float(s_arr[2])
        
        m_ar =  ls[2].split(')')
        m_arr = m_ar[0].split(',')        
        for i in m_arr[1:-2]:
            if int(i) == -1: continue
            if int(i) == 2: continue
            self.active_mcodes.append("M%d" % int(i))            
                
        self.entry = gtk.Entry()
        self.entry.set_max_length(10)
        self.entry.set_text(l)
        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()
    
    
Аватара пользователя
MX_Master
Мастер
Сообщения: 7480
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

В том-то и дело, что для LCNC нельзя написать на 100% универсальный скрипт по продолжению УП после форс-мажора. А всё потому что конфигураций и типов УП у народа шибко много. И у кого-то обязательно будут проблемы (:

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

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

Сообщение nkp »

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

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

Сообщение nkp »

кстати,вспомнил,что когда то делал преобразование с Y[#<yscale>*-56.128] в "нормальный" вид...
щас найти скриптик надо только(заново не охота писать))
его и вставить для рестарта можно...
только вот пользует ли кто РЕАЛЬНО такой код??
Аватара пользователя
MX_Master
Мастер
Сообщения: 7480
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

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

Сообщение MX_Master »

Я думаю, что циклы и кадры G кода c переменными лучше не вносить в автоматику. Во-первых, постпроцессоров, которые создают такой код - не так много. Ну а, во-вторых.. Тот, кто своими руками написал подпрограмму или цикл, сможет продолжить свою УП безо всякой автоматики (:
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

Полагаю, надо вначале задаться требованиями к коду и ограничениями. А то у меня, к примеру, программы обработки в основном работают в бесконечном цикле с запросами на смену заготовки. И часто с параметрами и подпрограммами. Насчет автопродолжения таких программ даже не заикаюсь. Хотя иногда хочется :)
По мне, так надо ограничиться линейными программами с численными значениями координат.
Чудес не бывает. Бывают фокусы.
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

MX_Master писал(а):В том-то и дело, что для LCNC нельзя написать на 100% универсальный скрипт по продолжению УП после форс-мажора. А всё потому что конфигураций и типов УП у народа шибко много. И у кого-то обязательно будут проблемы (:
Но если посмотреть с другой стороны на вот что: при загрузке УП gremlin строит траекторию, исходя строк самой УП. При нажатии на строку УП выделяется контур в gremlin-е этой строки, а при нажатии на контру - выделяется строка УП. Можно как-то прочитать координаты этого начала?? Если как то можно их получить, то соответственно можно попробовать и вернуться на контур, ну а дальше - продолжить с этой строки. Или это все не реально
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

jo_key писал(а):Если как то можно их получить, то соответственно можно попробовать и вернуться на контур, ну а дальше - продолжить с этой строки.
Например в подсвеченной строке написано "X12345", что в этом случае надо делать?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

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

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

Сообщение Serg »

Допустим начальная точка кадра: "X10000, Y20000, Z0", содержимое кадра "X12345", что в этом случае надо делать?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

Переместится (вернуться) на траекторию X...Y....Z.... ,после - выполнить кадр X12345
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

jo_key писал(а):Переместится (вернуться) на траекторию X...Y....Z....
По какой именно траектории?.. :)
(X...Y....Z... это не траектория, а позиция, для траектории надо ещё направление и расстояние)
jo_key писал(а):выполнить кадр X12345
Что именно надо сделать, чтобы выполнить этот кадр?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

UAVpilot писал(а):По какой именно траектории?..
(X...Y....Z... это не траектория, а позиция, для траектории надо ещё направление и расстояние)
По полученным координатам перемещаемся в Х, Y потом в Z.
Находясь в положении X...Y....Z... начать с кадра nnnnnn
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

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

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

Сообщение Serg »

Начнём с того, что gremlin может быть отключён на больших УП и/или на некоторых участках...
gremlin игнорирует множество ненужных ему команд (некоторые G-коды и почти все M-коды).
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

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

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

Сообщение Serg »

Можно. Самый простой способ - сохранять их и состоянине LinuxCNC в отдельном файлике в процессе работы, а при "восстановлении" считывать. Об этом тут уже не раз писалось.
Но всегда будут нюансы и полностью автоматическое восстановление на все случаи сделать не получится.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
jo_key
Почётный участник
Почётный участник
Сообщения: 262
Зарегистрирован: 19 сен 2011, 14:49
Репутация: 30
Настоящее имя: Евгений
Откуда: Украина, Харьков
Контактная информация:

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

Сообщение jo_key »

В принципе, RS274 меня на первых порах устроит... попробуем поработать с ним. Всем спасибо за внимание
Ответить

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