Power failure and resurrection on a CNC machine
-
@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.
-
@infiniteloop
Actually, why do I need to edit the resurrect-prologue.g file, as this is only run when power is restored? -
@nightowl999
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.
The first echo must be written with a single angular bracket, i.e. „echo >{var.fName} …
OK, so I've done that, leaving the SaveSpindleSpeed.g at this:
Hm, that’s the file I posted today at 19:14, and I know which RestoreSpindleSpeed.g it generates. That’s not the one-liner I had in mind. Don't mix things up, please.
Actually, why do I need to edit the resurrect-prologue.g file, as this is only run when power is restored?
Because if RestoreSpindleSpeed.g becomes a one-liner, the current resurrect-prologue.g throws an error on the missing variable abort_process.
-
@infiniteloop said in Power failure and resurrection on a CNC machine:
Hm, that’s the file I posted today at 19:14, and I know which RestoreSpindleSpeed.g it generates. That’s not the one-liner I had in mind. Don't mix things up, please.
I wasn't saying it isn't, just that is what I was left with once I'd deleted the REM lines, but which one-liner were you referring to, to replace those 8 lines, please?
The first echo must be written with a single angular bracket, i.e. „echo >{var.fName} …
Ah, I deleted the lines above it, leaving this one with two >>. Should it be like this, then?
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}
Because if RestoreSpindleSpeed.g becomes a one-liner
OK, but I'm still unsure how that file could possibly become a one-liner, to be honest!
Also, can I just check I've got the config.g M911 line correct, please:
M911 S23 R23.5 P"M98 P""SaveSpindleSpeed.g""M913 X0 Y0"
Thank you
-
FYI, the spurious {1} lines are a bug in the forum markup software.
You can alleviate them by specifying a language after the code ticks```php ```json ```perl
Just try different ones till it clears the extra lines
Edit: some references
https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks -
@nightowl999 said in Power failure and resurrection on a CNC machine:
Also, can I just check I've got the config.g M911 line correct, please:
You should insert a blank in front of
M913
.For the "one-liner", SaveSpindleSpeed.g will look like this:
; 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". ; var fName = "RestoreSpindleSpeed.g" ; echo >{var.fName} "M3 S"^{spindles[0].active}
… and resurrect-prologue.g must be modified like that:
; resurrect-prologue.g M98 P"RestoreSpindleSpeed.g" M98 P"homeall.g" ; homes all axes before restarting the job
-
@owend Thank you for the tip! Works
-
@infiniteloop said in Power failure and resurrection on a CNC machine:
From a first glance, I get the impression that this resurrect.g is missing all the things which are specific to CNC routers.
@infiniteloop and @Nightowl999 if you can list the items that are missing from resurrect.g for CNC machines then I can add that fixing those items the work list for release 3.5.
-
if you can list the items that are missing from resurrect.g for CNC machines…
From a coder’s point of view, this thread is more a lesson in practical chaos theory than about mills. So the list from this here is quite short:
spindles[n].active
According to @Nightowl999, the corresponding
M3
should follow the prologue call in resurrect.g. But I have reasonable doubts if this is sufficient for more complex CNC devices. For a better picture, I need advice from someone with profound CNC knowledge who in turn is willing to try some macros who emulate the required steps in resurrect.g - just without the power outage. -
@dc42
Thank you! It's been a really steep learning curve for me with this, but it has certainly provided me with a bit of an insight with programming, thanks to @infiniteloop!I'll include everything, so will probably mention things that are already preserved, but won't include 'stuff' from the config.g, as I guess this will run when the system restarts. I'm not sure where this information is stored in the Object Browser (Spindles or Tools?) so I'll give a little description.
- Active Spindle (tools[n].spindle) - which spindle/tool was active
- Spindle Speed (tools[n].spindleRpm) - the last programmed speed of the spindle/tool
- XYZ coordinates at power loss
I offer the following for considerations on power loss when the machine is in CNC Mode:
- Raise the Z height to Z(max-3) - in preparation for homing when the machine is restarted
- Turn the spindle off - after the Z axis is raised.
I don't know if a printer will automatically resume the job when the power is restored, but this is definitely not a good idea for a CNC machin, but I'd like you to consider on power being restored is:
- Home the machine - unless this isn't necessary. CNC machines can be quite a bit bigger than a 3D printer, so homing and resuming movements could take a while.
- Return to saved XY coordinates - could be a rapid move
- Turn the spindle on - at the saved spindle speed
- Return to saved Z coordinates - slowly
The option to Resume or Cancel the project should be included too?
Thank you