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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.

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

Сообщение nkp » 26 ноя 2017, 16:24

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

Код: Выделить всёРазвернуть


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
Мастер
 
Сообщения: 7286
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1198
Медальки:

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

Сообщение nkp » 26 ноя 2017, 22:19

интересно - что генерирует код вот такого вида:
Код: Выделить всёРазвернуть
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()
   
   
nkp
Мастер
 
Сообщения: 7286
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1198
Медальки:

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

Сообщение MX_Master » 26 ноя 2017, 22:43

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

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

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

Сообщение nkp » 26 ноя 2017, 23:01

MX_Master писал(а):И у кого-то обязательно будут проблемы (:

ну зачем ты так??)))) (только вот поутихли хождения по кругу с тоннами воды) :hehehe: )))
MX_Master писал(а):Самое интересное - как продолжить подпрограмму со всякими циклами.

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

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

Сообщение nkp » 26 ноя 2017, 23:05

кстати,вспомнил,что когда то делал преобразование с Y[#<yscale>*-56.128] в "нормальный" вид...
щас найти скриптик надо только(заново не охота писать))
его и вставить для рестарта можно...
только вот пользует ли кто РЕАЛЬНО такой код??
nkp
Мастер
 
Сообщения: 7286
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1198
Медальки:

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

Сообщение MX_Master » 26 ноя 2017, 23:10

Я думаю, что циклы и кадры G кода c переменными лучше не вносить в автоматику. Во-первых, постпроцессоров, которые создают такой код - не так много. Ну а, во-вторых.. Тот, кто своими руками написал подпрограмму или цикл, сможет продолжить свою УП безо всякой автоматики (:
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 2651
Зарегистрирован: 27 июн 2015, 19:45
Откуда: форт Верный
Репутация: 1378
Медальки:
Настоящее имя: Михаил

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

Сообщение Сергей Саныч » 27 ноя 2017, 04:14

Полагаю, надо вначале задаться требованиями к коду и ограничениями. А то у меня, к примеру, программы обработки в основном работают в бесконечном цикле с запросами на смену заготовки. И часто с параметрами и подпрограммами. Насчет автопродолжения таких программ даже не заикаюсь. Хотя иногда хочется :)
По мне, так надо ограничиться линейными программами с численными значениями координат.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7799
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2395
Медальки:

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

Сообщение jo_key » 25 апр 2018, 15:46

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

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

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

Сообщение UAVpilot » 25 апр 2018, 16:04

jo_key писал(а):Если как то можно их получить, то соответственно можно попробовать и вернуться на контур, ну а дальше - продолжить с этой строки.

Например в подсвеченной строке написано "X12345", что в этом случае надо делать?
1. Робот не может ответить отказом на предложение человека выпить или своим бездействием допустить, чтобы человек напился один.
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 16023
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 3907
Медальки:
Настоящее имя: Сергей

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

Сообщение jo_key » 26 апр 2018, 09:19

UAVpilot писал(а):Например в подсвеченной строке написано "X12345", что в этом случае надо делать?
Проблема не в том, что написано в кадре, а что можно ли получить координаты точки начала кадра
jo_key
Почётный участник
Почётный участник
 
Сообщения: 260
Зарегистрирован: 19 сен 2011, 14:49
Откуда: Украина, Харьков
Репутация: 30
Медальки:
Настоящее имя: Евгений

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

Сообщение UAVpilot » 26 апр 2018, 11:44

Допустим начальная точка кадра: "X10000, Y20000, Z0", содержимое кадра "X12345", что в этом случае надо делать?
1. Робот не может ответить отказом на предложение человека выпить или своим бездействием допустить, чтобы человек напился один.
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 16023
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 3907
Медальки:
Настоящее имя: Сергей

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

Сообщение jo_key » 26 апр 2018, 12:12

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

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

Сообщение UAVpilot » 26 апр 2018, 13:34

jo_key писал(а):Переместится (вернуться) на траекторию X...Y....Z....

По какой именно траектории?.. :)
(X...Y....Z... это не траектория, а позиция, для траектории надо ещё направление и расстояние)

jo_key писал(а):выполнить кадр X12345

Что именно надо сделать, чтобы выполнить этот кадр?
1. Робот не может ответить отказом на предложение человека выпить или своим бездействием допустить, чтобы человек напился один.
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 16023
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 3907
Медальки:
Настоящее имя: Сергей

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

Сообщение jo_key » 26 апр 2018, 14:51

UAVpilot писал(а):По какой именно траектории?..
(X...Y....Z... это не траектория, а позиция, для траектории надо ещё направление и расстояние)

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

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

Сообщение jo_key » 26 апр 2018, 14:54

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

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

Сообщение UAVpilot » 26 апр 2018, 15:13

Начнём с того, что gremlin может быть отключён на больших УП и/или на некоторых участках...
gremlin игнорирует множество ненужных ему команд (некоторые G-коды и почти все M-коды).
1. Робот не может ответить отказом на предложение человека выпить или своим бездействием допустить, чтобы человек напился один.
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 16023
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 3907
Медальки:
Настоящее имя: Сергей

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

Сообщение jo_key » 27 апр 2018, 09:24

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

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

Сообщение UAVpilot » 27 апр 2018, 11:17

Можно. Самый простой способ - сохранять их и состоянине LinuxCNC в отдельном файлике в процессе работы, а при "восстановлении" считывать. Об этом тут уже не раз писалось.
Но всегда будут нюансы и полностью автоматическое восстановление на все случаи сделать не получится.
1. Робот не может ответить отказом на предложение человека выпить или своим бездействием допустить, чтобы человек напился один.
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 16023
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 3907
Медальки:
Настоящее имя: Сергей

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

Сообщение jo_key » 27 апр 2018, 12:07

В принципе, RS274 меня на первых порах устроит... попробуем поработать с ним. Всем спасибо за внимание
jo_key
Почётный участник
Почётный участник
 
Сообщения: 260
Зарегистрирован: 19 сен 2011, 14:49
Откуда: Украина, Харьков
Репутация: 30
Медальки:
Настоящее имя: Евгений

Пред.

Вернуться в LinuxCNC

Кто сейчас на конференции

Зарегистрированные пользователи: aftaev, and361, bawero, Bender, Bing [Bot], Ershoff, FLUKE, Google [Bot], jkwe45, Lexxa, michael-yurov, Nonstopich, Rom327, SeReGa Sh, Stein82, systemvel, Udjin, Yandex [bot], Тима, шпиндель

Поделиться

Reputation System ©'