Power failure and resurrection on a CNC machine
-
@infiniteloop OK, thank you. I'll ask this question separately then, burt I didn't want to seem impatient
Again, I really appreciate the time and effort you've put in to help me with this - you've been brilliant
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
I'll ask this question separately
Maybe you search before you ask? Chances are good that then, your questions are more specific. Fore example, I still face the miracle that my Duet doesn't execute the M911 command sequence if I shut off my large power supply but keep the 5V rail alive. Remember, I came across that when I ran some macro tests for this thread on my Duet.
So I'll dive into the ocean of Duet3D documentation and figure out how and when resurrect.g is triggered. This, in turn, seems to depend on how I configure and supply my various voltages.
What I mean is: if you ask how to connect a UPS (or a power bank), the replies don't include the aspect of recovery from power failure. Is the way we elaborated in this thread still viable, or do you then need a different solution? Or: depending on your power setup, you might be able to came along with a simple capacitor - which won't work well if all your steppers suck from that, too.
I suggest you go to the hardware section first (as a first read, I suggest this, this and something like this) and figure out how to separate the 5V from the rest. If you got the idea, ask the forum - not the other way round, because then, there's too much noise in the replies.
-
Thanks, @infiniteloop. I do try to search the forums and the documentation first, but I don't seem to find anything descriptive enough to work from so ask on the forum.
Of course, as I get to know stuff, I'll be asking fewer questions and giving more help
Thanks again, my friend
-
@infiniteloop
So maybe the issue may not be power decline related...I changed a couple of things in the M911 line in the config.g file from:
M911 S23 R23.5 P"M98 P""SaveSpindleSpeed.g"" M913 X0 Y0 G91 M83 G1 Z3 E-5 F1000"
...to...
M911 S23 R23.5 P"M913 X0 Y0 G91""M98 P""SaveSpindleSpeed.g"
...effectively deleting the printer stuff and changing the file order, although I'm not sure if the latter made any difference. I also raised the threshold for power loss.
Now, the ResumeSpidleSpeed.g file is fully formed, which is great, but I'm getting a different error, twice, when I enter M916 in the MDI:
M292 Error: No P parameter and no active tool with spindle M916 Error: No P parameter and no active tool with spindle
This clearly relates to the spindle - again - so I think the SaveSpindleSpeed.g file will need to edited to add those variables from the Object Browser.
I'm going to use your lead to see if I can finish this off....
-
@nightowl999
I changed a couple of things in the M911 line
M911 S23 R23.5 P"M913 X0 Y0 G91""M98 P""SaveSpindleSpeed.g"
There's something wrong: the double quotation marks following G91 should not be there (and you can skip G91 completely), then, a second quotation mark to end the M98 argument is missing, finally, the closing quotation mark of M911 is missing, too. So try this instead:
M911 S23 R 23.5 P"M913 X0 Y0 M98 P""SaveSpindleSpeed.g"""
Let's try and see if the M292 and M916 errors persist.
-
@infiniteloo
Ooh, that's a lot of quotation marks...
I'll let you know how it goes...
-
That change truncated the writing of the RestoreSpindleSpeed. g
This is all I got...
; 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)} global abort_process = true else set global.abort_process = true
-
@infiniteloop
I deleted the RestoreSpindleSpeed.g to see how much SaveSpindleSpeed.g would write, but there was nothing. Running the SaveSpindleSpeed.g file from the MDI produced the file, but obviously it didn't have any proer values -
@nightowl999 said in Power failure and resurrection on a CNC machine:
That change truncated the writing of the RestoreSpindleSpeed. g
That's what I expected. Due to the misplaced quotation marks,
M911
didn't execute properly - I think that even resurrect.g has been malformed by that: this would explain the "No P parameterβ¦" errors.Sigh. One measure of last resort is to trim the execution time of SaveSpindleSpeed.g - with luck, we gain some nanoseconds. So make a copy of your actual SaveSpindleSpee.g file and put this into the macro, instead:
var fName = "RestoreSpindleSpeed.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} "M291 S3 R""Resurrect:"" P""Continue with <"^{job.file.fileName}^">?""" echo >>{var.fName} "set global.abort_process = false" echo >>{var.fName} "M3 S"^{spindles[0].active}
With luck, this will work, depending on the current load on the Duet. But I have to insist: that's not good practice, it's more like a ride on a razor blade.
-
@infiniteloop
Sorry, about this, but I tried something while you were cogitating...I edited the M911 file to this:
M911 S23 R 23.5 P"M913 X0 Y0 M98 P"SaveSpindleSpeed.g"
...and it worked, apart from the spindle errors. The SavedSpindleSpeed was fully formed, too.
I don't think it's a timing thing afterall. The "processing" stays onscreen in the DWC for a few seconds, perhaps 2 or 3?
-
This is the file:
; 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
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
I deleted the RestoreSpindleSpeed.g to see how much SaveSpindleSpeed.g would write, but there was nothing.
That's why I decidedly put the macro call at the beginning of the
M911
sequence -
@infiniteloop
OK, I'll change them back... -
@nightowl999 said in Power failure and resurrection on a CNC machine:
This is the file:
We are out of sync. delete that and look at the file resulting from the next power outage.
-
@infiniteloop
File deleted. I'm just changing the M911 line back...And now I'm going to try again...
And RestoreSpindleSpeed .g only got to line 6...
This is the M911 line in config.g...
M911 S23 R23.5 P"M98 P""SaveSpindleSpeed.g"" M913 X0 Y0" ; set voltage thresholds and actions to run on power loss
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
And RestoreSpindleSpeed .g only got to line 6
At that point, remaining power has gone.
-
@Nightowl999 Obviously, SaveSpindleSpeed.g has not enough time to finish its job before power is totally lost. You have two options:
- take measures to keep power up a bit longer
- forego the dialog, so that RestoreSpindleSpeed.g becomes a one-liner
The second option requires changes to SaveSpindleSpeed.g and resurrect-prologue.g. If you want to go this route, I will provide the sources.
-
I'm still hoping someone will answer my question about using a small powerbank permanently plugged in to the USB port on the Duet3, but nothing yet. If that isn't an option, there may be an alternative!
I can REM out the unnecessary lines in SaveSpindleSpeed.g and resurrect-prologue.g quite easily, and see if that makes a difference. I'll do that this evening, but won't be able to test them until tomorrow, though.
Thanks for your perseverence!
-
@nightowl999 said in Power failure and resurrection on a CNC machine:
I can REM out the unnecessary lines in SaveSpindleSpeed.g and resurrect-prologue.g quite easily, and see if that makes a difference
It does. I am pretty sure that SaveSpindleSpeed.g has enough time to write a one-liner to the SD card. By now, it gets 4-6 lines done.
-
OK, so I've done that, leaving the SaveSpindleSpeed.g at this:
var fName = "RestoreSpindleSpeed.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} "M291 S3 R""Resurrect:"" P""Continue with <"^{job.file.fileName}^">?""" echo >>{var.fName} "set global.abort_process = false" echo >>{var.fName} "M3 S"^{spindles[0].active}
Which produces this RestoreSpindleSpeed.g file:
if {!exists(global.abort_process)} global abort_process = true else set global.abort_process = true M291 S3 R"Resurrect:" P"Continue with <null>?" set global.abort_process = false M3 S0
What I was surprised to see is that if I don't delete the RestoreSpindleSpeed.g and run the SaveSpindleSpeed.g again, it appends to the existing file - perpetually.