я имею в виду что при возобновлении питания нажимаем кнопку "идти в дом" при этом должна быть загружена незавершенная программа, и должна быть кнопка "продолжить незавершенную работу"fredy79 писал(а):Тое-сть станок должен во время работы запоминать исполненные кадры, после отключения питания и его возобновлении должен автоматически загрузить файл прерванной обработки, обнулиться и предложить продолжить работу с прерванного кадра.
продолжение работы после отключения питания компьютера
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Я ж только что привёл пример того, что опасно "продолжать незавершенную работу" из какой попало точки...fredy79 писал(а):я имею в виду что при возобновлении питания нажимаем кнопку "идти в дом" при этом должна быть загружена незавершенная программа, и должна быть кнопка "продолжить незавершенную работу"
Предварительно выставив инструмент в некую безопасную точку и запустить обработку с повтора последнего исполненного кадра нет проблем.
Хотя всётаки есть: для полного счастья этот кадр должен содержать движение по всем задействованным осям, а т.к. такое довольно редко, то придётся перед продолжением выполнить некоторые операции вручную.
P.S. Вашу цитату я поправил, чтобы ваши слова не приписывались мне.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
запоминание места ,где остановила авария:
файл numstr.py
помещаем в папку конфига и делаем исполняемым
-------------------------
в хал файл допишем :
loadusr -Wn numstr python numstr.py
net line motion.program-line => numstr.in
---------------------------
редактируем наше "окошко" (файл restart.py)^
теперь оно берет номер строки...
----------------
путь к файлам разумеется подправляем...
файл numstr.py
Код: Выделить всё
#!/usr/bin/python
import hal
h = hal.component("numstr")
h.newpin("in", hal.HAL_S32, hal.HAL_IN)
h.ready()
tmp = 0
flog = '/home/nkp/linuxcnc-reverse-run/configs/sim/axis/line-number.log'
f = open(flog,'w')
f.write('0')
f.close()
try:
while 1:
if h['in'] == 0:
continue
else:
if h['in'] > tmp:
f = open(flog,'w')
f.write(str(int(h['in'])))
f.close()
tmp = h['in']
except KeyboardInterrupt:
raise SystemExit-------------------------
в хал файл допишем :
loadusr -Wn numstr python numstr.py
net line motion.program-line => numstr.in
---------------------------
редактируем наше "окошко" (файл restart.py)^
Код: Выделить всё
#!/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()
fr = open('/home/nkp/linuxcnc-reverse-run/configs/sim/axis/line-number.log','r')
ls = fr.readlines()
l = re.sub("^\s+|\n|\r|\s+$", '', ls[0] )
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()
----------------
путь к файлам разумеется подправляем...
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
так для этого и делается кнопка, отвел на безопасную позицию и нажал))UAVpilot писал(а):опасно "продолжать незавершенную работу" из какой попало точки...
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
А есть понимание какая позиция безопасна для продолжения?fredy79 писал(а):так для этого и делается кнопка, отвел на безопасную позицию и нажал))
Например если пилим паз или делаем раскрой, то перед нажатием кнопки "продолжение" придётся сначала инструмент во включенном шпинделе завести точно в прорезанный паз - ибо только именно эта позиция будет безопасна всегда (ну почти всегда).
Я думаю пока не стоит заострять внимание, что электричество предпочитает пропадать не строго между кадрами, а где-то посередине выполняемого.
Т.е. про "функцию автоматического продолжения работы после отключения питания" всётаки уже не говорим?fredy79 писал(а):отвел на безопасную позицию и нажал
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
говорим, шпиндель естественно должен включиться до того момента как ось Z пойдет вниз, оси Х и У уже должны стоять в нужном месте и в этом случае фреза опускается вниз со включенным шпинделем при приближении шпинделя к заданной точке скорость оси должна уменьшиться.
и подразумевает нажатие кнопки оператором без поиска нужной строки и позиции. То есть если нет никаких препятствий движению фрезы то нажал кнопку и станок поехал в нужную точку и продолжил, если есть, отвел оси в безопасное место, нажал кнопку и станок продолжил работу.UAVpilot писал(а):"функцию автоматического продолжения работы после отключения питания"
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
я писал ранее что продолжение работы должно быть с номера кадра = номер последнего кадра -1UAVpilot писал(а):Я думаю пока не стоит заострять внимание, что электричество предпочитает пропадать не строго между кадрами, а где-то посередине выполняемого.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Допустим этот кадр выглядит так:
что именно стано должен будет сделать?..
Код: Выделить всё
X100Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
система должна при этом знать позицию У и Z, скорость и направление шпинделя, скорость подачи осей , у строки Х100 есть номер, допустим 50 , продолжение должно быть со строки 50-1=49
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Так с этим никаких проблем нет - решение не раз описывалось на этом форуме и в этой теме.fredy79 писал(а):и подразумевает нажатие кнопки оператором без поиска нужной строки и позиции.
fredy79 писал(а):система должна при этом знать позицию У и Z, скорость и направление шпинделя, скорость подачи осей , у строки Х100 есть номер, допустим 50 , продолжение должно быть со строки 50-1=49
Код: Выделить всё
...
N49 X90
N50 X100
...Ах да, чуть не забыл:
Код: Выделить всё
...
N40 G90 G98 G81 X0 Y0 Z-10 R5
...P.S. LinuxCNC развивается с 2000-ого года. Вы правда считаете разработчиков LinuxCNC настолько глупыми, что они за 17 лет так и не смогли реализовать сию фичу?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
так я этой фичи не вижу, или я не туда смотрю?
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
автоматического продолжения нет и скорее всего не будет. Причины тут 100500 раз описывались, например в #110.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
fredy79
- Опытный
- Сообщения: 100
- Зарегистрирован: 03 июн 2014, 20:22
- Репутация: 3
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
так она особо не нужна там, где время обработки небольшое и обрабатываемый материал не дорогой, эта функция нужна там, где коды из поста 110 не используются, как это реализовано в дешевой Nc-studio? как это реализовано в пультах RichAuto? я работаю с камнем и деревом, в основном гравировка надписей и 3D рельефы, да и многие кому интересна эта функция занимаются подобной работой, так если китайцы смогли это реализовать, неужели это невозможно сделать в Linuxcnc?
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Видимо все вы выбрали не ту систему ЧПУ, наверно надо было брать Nc-studio и RichAuto.fredy79 писал(а):я работаю с камнем и деревом, в основном гравировка надписей и 3D рельефы, да и многие кому интересна эта функция занимаются подобной работой
Сделать чтобы иногда работало, а иногда крушило фрезы, заготовки, оснастку можно - в этой теме описывалось несколько способов по несколько раз.fredy79 писал(а):так если китайцы смогли это реализовать, неужели это невозможно сделать в Linuxcnc?
Китайцы без проблем сделают какую угодно фигню и назовут её как нравится покупателям, а когда эта фигня что-то у вас порушит, то просто не ответят на ваши претензии/вопросы или ответят с стиле "сам дурак", ибо ваши деньги уже давно у них.
Я, например, ни разу не встречал подобную фичу в стойках Fanuc - неужели не могут сделать?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
добавил сканирование "модальных" жкодов:
(т.н. строка безопасности и не только)
в массив
помещаем "модальные" группы, выводится активный (один из группы)
(т.н. строка безопасности и не только)
в массив
Код: Выделить всё
self.gcodes = [
['G90','G91'], ['G20','G21'], ['G17','G18','G19'],['G54','G55','G56'],
['G41','G42','G40'],
]Код: Выделить всё
#!/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_f = ''
string_s = ''
str_code = ''
w=0
while not re.search("M2\s*",lines[w], re.I):
w+=1
if (w <= number_line):
for i in range(len(self.gcodes)):
for n in range(len(self.gcodes[i])):
if (re.search(str(self.gcodes[i][n]),lines[w], re.I)):
self.G[i].append(str(self.gcodes[i][n]))
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_s += lines[w]
string_f += 'M6 T%d\n' % tool
string_f += 'M3 S%d\n' % speed
string_f +=' F%d\n' % feed
for i in self.G:
try:
str_code += i[-1]
except:
pass
string = str_code + '\n' + string_f + string_s
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.gcodes = [
['G90','G91'], ['G20','G21'], ['G17','G18','G19'],['G54','G55','G56'],
['G41','G42','G40'],
]
self.G = []
for i in range(len(self.gcodes)):
self.G.append([])
fr = open('line-number.log','r')
ls = fr.readlines()
l = re.sub("^\s+|\n|\r|\s+$", '', ls[0] )
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
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
https://www.youtube.com/watch?v=fwC-rRY ... e=youtu.be
подумалось еще о таком варианте:
просто сканировать все коды подряд(кроме ж1,2,3) и вставлять их в таком же порядке в шапку "нового" файла
подумалось еще о таком варианте:
просто сканировать все коды подряд(кроме ж1,2,3) и вставлять их в таком же порядке в шапку "нового" файла
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Всякие M6 порушат всю автоматику. 
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
не совсем понял даже кому это адресовано))UAVpilot писал(а):Всякие M6 порушат всю автоматику.
но на всякий случай,если мне - то я не пытаюсь сделать какую то "автоматику"
просто ,можно сказать:
1). проверяю выложенные "решения" (вот например в этой теме (наверно) никто так и не попробовал код Ника,
потому что он с ошибкой
2). собираю "до кучи" эти мелкие фичи(загрузка последнего файла, запоминание номера строки, старт с этой строки)
пока так
вот между делом убрал везде явные пути, прописываем только в ини файле:
Код: Выделить всё
#!/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
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())-2
string_f = ''
string_s = ''
str_code = ''
s=-1
while not re.search("M2\s*",lines[s], re.I):
s+=1
if (s <= self.number_line):
for i in range(len(self.gcodes)):
for n in range(len(self.gcodes[i])):
if (re.search(str(self.gcodes[i][n]),lines[s], re.I)):
self.G[i].append(str(self.gcodes[i][n]))
try:
tool = int(re.search("T\s*([0-9.]+)",lines[s], re.I).group(1))
except:
pass
try:
speed = int(re.search("S\s*([0-9.]+)",lines[s], re.I).group(1))
except:
pass
try:
feed = int(re.search("F\s*([0-9.]+)",lines[s], re.I).group(1))
except:
pass
try:
pos_Z = float(re.search("Z\s*([-0-9.]+)",lines[s], re.I).group(1))
except:
pass
if (s == self.number_line):
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]
try:
string_f += 'M3 S%d \n' % speed
string_f += 'M6 T%d \n' % tool
string_f += 'F%d \n\n' % feed
#self.string_add(string_f,'G0 X%f\n',pos_X)
#self.string_add(string_f,'G0 Y%f\n',pos_Y)
string_f += 'G0 X%f\n' % pos_X
string_f += 'G0 Y%f\n' % pos_Y
string_f += 'G0 Z%f \n\n' % (pos_Z + 5)
string_f += 'F%d \n' % (feed * 0.1)
string_f += 'G1 Z%f \n' % pos_Z
string_f += 'F%d \n\n' % feed
except:
pass
for i in self.G:
try:
str_code += str(i[-1] + ' ')
except:
pass
string = str_code + '\n' + string_f + string_s + '\n'
try:
sys.stdout.write(string)
finally:
filename = open_file
f = open(filename, "w")
f.write(string)
f.close()
gtk.main_quit()
def chang(self):
if self.check.get_active():
self.go()
else:
self.go()
def string_add(self,s,reg,v):
try:
s += 'reg' % v
except:
pass
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.gcodes = [
['G90','G91'], ['G20','G21'], ['G17','G18','G19'],['G54','G55','G56'],
['G41','G42','G40'],['G49'],
]
self.G = []
for i in range(len(self.gcodes)):
self.G.append([])
fr = open('line-number.log','r')
ls = fr.readlines()
l = re.sub("^\s+|\n|\r|\s+$", '', ls[0] )
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.chang())
self.vbox.pack_start(self.button, True, True, 2)
self.button.show()
self.vbox.show()
self.hbox = gtk.HBox(False, 0)
self.vbox.add(self.hbox)
self.hbox.show()
self.check = gtk.CheckButton("All codes")
self.hbox.pack_start(self.check, True, True, 0)
self.check.set_active(0)
self.check.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
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
Ну эта тема про автоматическое возобновление...nkp писал(а):не совсем понял даже кому это адресовано))
но на всякий случай,если мне - то я не пытаюсь сделать какую то "автоматику"
Если забыть про это, то всё решается просто - отдельный компонент, который мониторит состояние LinuxCNC (координаты, активные G-коды, номер строки и т.п.) и периодически пишет его в файл. При необходимости продолжения восстанавливает записанное состояние.
Правда всё равно будут нюансы со всякими локальными нестандартными кодами и пинами.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: продолжение работы после отключения питания компьютера
если ТС посчитает,что мои потуги здесь неуместны - я открою отдельныю тему))UAVpilot писал(а):Ну эта тема про автоматическое возобновление..
так я и выкладываю УЖЕ это решениеUAVpilot писал(а):Если забыть про это, то всё решается просто - отдельный компонент, который мониторит состояние LinuxCNC (координаты, активные G-коды, номер строки и т.п.) и периодически пишет его в файл. При необходимости продолжения восстанавливает записанное состояние.
а "просто" - видать не всем,потому в теме одна вода ))