а кто собрался делать?..fredy79 писал(а):я про доработки, если уж делать то все должно быть на высшем уровне
![Smile :)](./images/smilies/icon_e_smile.gif)
А за доработку?..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
работает