Power failure and resurrection on a CNC machine
-
This is brilliant, thank you @infiniteloop
I'll check it out tomorrow morning (it's a bit too late here to wake the neighbours!) and let you know how I get on.
I really can't tell you how much I appreciate your help.
Thanks again, my friend
-
@nightowl999
This is brilliant
No, it’s attentive reading. The technique for the dialog is tricky, so it helped that I remembered the thread "Echo commands…", where @mikeabuilder explained the technique in detail - BTW, it was your thread, and he addressed his "trick" to you. So you could have written the code as well. At least, you were told how to do it…
In fact, a good programmer spends at least 95% of his time on reading, 100% on meditation and the remaining 5% on coding, tests and debugging - at most…
[Edit] Oh, I forgot: When we finally fall asleep (which is rare), we dream of an algorithm to calculate a 'something' of which we only know the result: 42
-
@infiniteloop said in Power failure and resurrection on a CNC machine:
No, it’s attentive reading.
I beg to differ. What you have done for me is brilliant, even if it's simple to you!
Anyway, on with the experiment...
-
@infiniteloop
There seems to be an error in the resurrect-prologue.g file, because when I use M916 in the MDI, I get the following:Error: in file macro line 3 column 26: meta command: unknown variable 'abort_process'
I've indented the line below, as instructed, so perhaps there's a typo. I'll investigate.
I'm also getting:
Warning: Macro file 0:/sys/workzero.g not found
...but I'm not sure what caused that!
-
@Nightowl999 Who the hell is "MDI"?
The complaint about a missing abort_process indicates that RestoreSpindleSpeed.g is either not run before - it should be called from line 3 of resurrect-prologue.g, please compare your prologue with the sample I posted yesterday…
… or, if RestoreSpindleSpeed.g has been called before, that macro does not reflect my recent modification of SaveSpindleSpeed.g: my latest version (refer to the yesterday post) generates a RestoreSpindleSpeed.g that initialises the global variable abort_process.
The warning "Macro file 0:/sys/workzero.g not found" is unrelated - I have no knowledge of a macro carrying that name, so I can't help you with that.
-
Yes, it's called from that file:
; resurrect-prologue.g M98 P"RestoreSpindleSpeed.g" if global.abort_process == true abort ; abort terminates this and all other macros in the cal chain, so 'rien ne va plus' ; Continuation has been approved, so here we go:" M98 P"homeall.g" ; homes all axes before restarting the job {1}
And all I did with the updated RestoreSpindleSpeed.g was copy and paste...
A thought: Should the variable be declared in config.g, or is it a system variable?
PS I tried without the curly brackets, but it made no difference, so I put them back
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
Yes, it's called from that file
Fine. Then please replace the contents of SaveSpindleSpeed.g with this here, as I've found an (unrelated) bug.
; SaveSpindleSpeed.g ; Macro to store the actual spindle speed (RPM) at the time this is called ; To restore the saved datum, call the macro "RestoreSpindleSpeed.g". ; Before it activates the spindle, RestoreSpindleSpeed.g asks whether to continue with the print or not. ; If not, the process can be stopped with these two lines in resurrect-prologue.g: ; ; if {global.abort_process == true} ; abort ;;; please not that this line must be indented ; ; Requires RRF 3.4 and a CNC configuration with valid spindles[0] entry in the object model var fName = "RestoreSpindleSpeed.g" echo >{var.fName} "; "^var.fName echo >>{var.fName} "; Spindle speed saved from running """^{job.file.fileName}^""" CNC file" echo >>{var.fName} "" echo >>{var.fName} "; set up the global variable abort_process so we can abort further execution of resurrect.g:" echo >>{var.fName} "if {!exists(global.abort_process)}" echo >>{var.fName} " global abort_process = true" echo >>{var.fName} "else" echo >>{var.fName} " set global.abort_process = true" echo >>{var.fName} "" echo >>{var.fName} "; now comes the dialog:" echo >>{var.fName} "M291 S3 R""Resurrect:"" P""Continue with <"^{job.file.fileName}^">?""" echo >>{var.fName} "" echo >>{var.fName} "; we will only arrive here if the dialog was closed with OK:" echo >>{var.fName} "set global.abort_process = false" echo >>{var.fName} "M3 S"^{spindles[0].active} echo >>{var.fName} "" echo >>{var.fName} ";EOF"
Then, please simulate a power outage - this step is needed to generate the proper RestoreSpindleSpeed.g macro.
-
@infiniteloop No, sorry. I get exactly the same error
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
No, sorry. I get exactly the same error
OK, let's see … Could you please compare your RestoreSpindleSpeed.g with this here:
; RestoreSpindleSpeed.g ; Spindle speed saved from running "null" CNC file ; set up the global variable abort_process so we can abort further execution of resurrect.g: if {!exists(global.abort_process)} global abort_process = true else set global.abort_process = true ; now comes the dialog: M291 S3 R"Resurrect:" P"Continue with <null>?" ; we will only arrive here if the dialog was closed with OK: set global.abort_process = false M3 S0 ;EOF
I generated this without a job running, that's why the CNC file name is "null", and without a spindle,
M3
will always be told a speed of 0 RPM. -
@infiniteloop Erm, my file looks like this...
; RestoreSpindleSpeed.g ; Spindle speed saved from running "0:/gcodes/Calibration Toolpath.gcode" CNC file ; set up the global variable abort_process so we can abort further execution of resurrect.g: if {!exists(global.abort_process)}
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
I just noted a difference between your resurrect-prologue.g and the template I sent you - here's my version:
if {global.abort_process == true}
and here's your corresponding line:
if global.abort_process == true
You see the difference?
-
@infiniteloop I do, yes. I tried it at that, but changed it back to using the squiggly brackets, as it made no difference.
They're currently in place, as per your version.
; resurrect-prologue.g M98 P"RestoreSpindleSpeed.g" if {global.abort_process == true} abort ; abort terminates this and all other macros in the call chain, so 'rien ne va plus' ; Continuation has been approved, so here we go:" M98 P"homeall.g" ; homes all axes before restarting the job {1}
I don't know why there are two {1} showing at the end of the file, though. There's only 1 in the actual file!
Where is the global.abort_process declared, or is it a ssytem variable?
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
Erm, my file looks like this...
That's a radically abbreviated version…
Either, your SaveSpindleSpeed.g has been truncated so that it just generates 4 lines of output, or we see the result of too little power left after pulling the plug.
[Edit] First, please check your copy of SaveSpindleSpeed.g carefully against the posted version. If both are equal, call SaveSpindleSpeed.g from the console:
- throws it an error?
- looks the resulting RestoreSpindleSpeed.g like the one I posted above?
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
I don't know why there are two {1} showing at the end of the file
I'm not quite sure, either, but I think they indicate empty lines.
-
@infiniteloop said in Power failure and resurrection on a CNC machine:
but I think they indicate empty lines.
Maybe you're right about the powerloss, then, or (sorry for asking again) the global.abort_process variable hasn't been declared?
-
@nightowl999 I've added some hints to my post above. Please try them …
-
@infiniteloop It says
the file's not found, but it's deffo there in my \sys folder!Error: in file macro line 28 column 26: meta command: control character in string
OK, there was a " missing on the last line...
-
@infiniteloop Now the file looks like this:
; RestoreSpindleSpeed.g ; Spindle speed saved from running "null" CNC file ; set up the global variable abort_process so we can abort further execution of resurrect.g: if {!exists(global.abort_process)} global abort_process = true else set global.abort_process = true ; now comes the dialog: M291 S3 R"Resurrect:" P"Continue with <null>?" ; we will only arrive here if the dialog was closed with OK: set global.abort_process = false M3 S0 ;EOF
I'll have another go at the power fail test...
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
Now the file looks like this:
That's perfect. Before pulling the plug again, you should call resurrect-prologue.g from the console to see if you still get an error. Note, however, that your router might execute the homing moves if the construct works as expected.
-
Same problem. Only half a RestoreSpindleSpeed.g file...