@droftarts I also thank you for the continued help with this issue
Those are fair questions, and I will split my answer in two parts:
How it works and what actually happens
My printer has two power plugs (one and a half actually
)
First, is the main power plug. Is the power plug for the UPS. Then, in the UPS is plugged the printer's ATX power supply and from it the Duet and DueX are powered.
The second, is a phone charger. A 5V 500mA power supply that serves as a power feedback.
From it I powering a 5V simple relay. The switching contacts of that relay (two of them) are wired to duex.e3stop
On that input, I have defined two triggers in config.g:
M950 J2 C"^duex.e3stop" ; Input 1 uses e2stop pin, pullup enabled (power feedback for UPS)
M581 P2 T2 S1 R1 ; external trigger 1, trigger occurs on the inactive-to-active edge, trigger at any time (UPS Backup power)
M581 P2 T3 S0 R2 ; external trigger 1, trigger occurs on the active-to-inactive edge, trigger only when not printing from SD card (AC back, resume prompt)
Trigger2.g senses if that relay has power to it, so if a print is in progress, it will be executed.
It's macro is this:
; Called when mains power is intrerrupted and UPS battery is in use
M118 S"Running on backup power !" L0 ; display warning message when using UPS battery
M25 ; Pause printing process
M400
M0 ; cancel current job
M568 P0 A0 ; turn off nozzle heater
G91
; G1 Z-5
M18 X Y E0 ; Disable steppers to conserve battery power, but leave Z stepper energized
M552 S-1 ; Disable Wi-Fi adapter
if global.MMUmode = true
echo >>"0:/sys/MMU Control/errLog.txt" state.time, ",", "Blackout occured", "Z="^move.axes[2].machinePosition-5 ; -5 is the Z lift in pause.g
M18 UVW ; disable MMU steppers
If the power goes out, the printer will continue to run on the UPS's battery, in the end safely shutting down the printer.
From what I intended to happen.. is as follows:
-
Show a dialog that the power is lost (really this never shows because of the pause dialog that is shown after that; not a problem)
-
list itemPause the print (using the M25), stage that the ressurect is created (if I'm not mistaken)
-
Cancel the print (M0) (stop.g behaves a bit differently in this case, compared with a normal job end, I will describe it later)
-
Turn off the nozzle heater, for a safe shutdown if the power is not restored in time
-
Disable X, Y and extruder steppers to conserve power
-
Disable the WiFi adapter (if the power goes out, the router will be also powered off, so to prevent the board from continuing to search for the network and flood the PanelDue interface with dialogs complaining that it can't find the network)
-
If the MMU is enabled, disable its steppers as well (to conserve power) and log this event to a file.
As stated above, regarding the M0 or stop.g
in this scenario:
; stop.g
; called when M0 (Stop) is run (e.g. when a print from SD card is cancelled)
;
; generated by RepRapFirmware Configuration Tool v3.2.0 on Tue Dec 29 2020 16:23:44 GMT+0200 (Eastern European Standard Time)
G91
G1 Z10 F6000 ; lift z by 10mm
if global.MMUmode = false
M221 S100 D0
T-1
M106 P0 S0
else
M221 S100 D0
M221 S100 D1
M221 S100 D2
M221 S100 D3
M221 S100 D4
M572 D{state.currentTool} S0
G1 E3 F800
M106 P0 S0
T-1
M98 P"0:/sys/MMU Control/moveIdler.g" S5
M98 P"0:/sys/MMU Control/counterCheck.g"
G90
G0 X0 Y300 F3600 ; go to the back left corner
M18 X Y E0 ; disable X, Y and E steppers
if global.MMUmode = true ; if MMU is enabled
M18 U V W ; disable MMU steppers
if state.status = "processing"
echo >>"0:/sys/MMU Control/errLog.txt" state.time, ",", "Print complete!"
M568 P0 A0 ; turn off tool 0 heater
if sensors.gpIn[1].value = 1
M140 S-273.15 ; turn off bed heater
if move.axes[2].machinePosition < 150
G1 Z150
M400
M18 Z
M81 S1 ; turn off ATX after nozzle cooldown
In normal operation, at the end of the print, I lift the nozzle above the print, reset extrude factor override percentage just in case it was modified during the print, disable pressure advance, and an attempt to give the filament end a nice, sharp tip , so it can be loaded easily next time, then unload the filament.
Then move the bed forward, park the tool carriage to endstop, disable the MMU steppers and turn off the nozzle heater.
Now, if the power feedback says that there is no mains power (the charger, relay and duex.e3stop
input), keep the bed at the print temperature, so the print will not detach from the print surface, and don't rise the Z too much but keep the Z steppers energized, so they keep their positions set by the G32
at the start of the print. Also, keep the power supply turned on (opposite to the M81 S1 if there are no power related issues)
After this is completed, the printer will wait until the power is recovered. The UPS cand provide almost one and a half time to resume.
How I resume after a power failure:
If the printer is still powered on using the UPS and the mains power comes back, the phone charger will receive power again, turning on the relay. The relay, will tell the bord that power is back, so in the rising edge of the duex.e3stop
will use the trigger3.g
:
; Called when mains power is back
M118 S"Back on AC power" L0 ; display warning message when using UPS battery
M552 S1 ; Enable Wi-Fi adapter again
if fileexists("0:/sys/resurrect.g")
M291 P"Back on AC power. Resume print ?" R"UPS Status" S3 ; Prompt if printing can be resumed
M916 ; Resume print after power loss
if global.MMUmode = true
echo >>"0:/sys/MMU Control/errLog.txt" state.time, ",", "Blackout recovered"
Now that everything is good to go:
-
Reenable the WiFi module and reconect to the router
-
Search for the ressurrect.g and if it is found, ask if the print can be resumed.
-
If I confirm, run the M916
command to go ahead.
Resurrect-prologue.g is this:
M17 E0
G28 X Y ; home X and Y, hope that Z hasn't moved
if global.MMUmode = true
M98 P"0:/sys/MMU Control/homeMMU.g"
G91
G1 Z-5
- Reenable the extruder stepper (this is a very old bug in RRF. I can't use the MMU to load filament if the extruder stepper is disabled, so enable it before anything else)
- Home X and Y axis (Z axis has never been disabled)
- Rehome the MMU (UVW axis)
- Lower the Z axis (I can't remember exactly why this is necessary, but it works)
And after, RRF executes ressurrect.g.
Until now, is anything that seems out of place?
Pause.g is this, but is complicated:
; pause.g
; called when a print from SD card is paused
;
; generated by RepRapFirmware Configuration Tool v3.2.0 on Tue Dec 29 2020 16:23:44 GMT+0200 (Eastern European Standard Time)
if global.MMUmode = false
M83 ; relative extruder moves
G10
G91 ; relative positioning
G1 Z5 F600 ; lift Z by 5mm
G90 ; absolute positioning
G1 X0 Y0 F6000 ; go to X=0 Y=0
M591 D0 S0
else
if state.status != "paused"
echo >>"0:/sys/MMU Control/errLog.txt" state.time, ",", "Pause"
set global.pause = false
if state.status = "pausing"
if global.errQueue[#global.errQueue-1] = "SELECTOR_CANNOT_HOME" || global.errQueue[#global.errQueue-1] = "SELECTOR_CANNOT_MOVE" || global.errQueue[#global.errQueue-1] = "INSPECT_FINDA"
M18 U
elif global.errQueue[#global.errQueue-1] = "PULLEY_CANNOT_MOVE"
M18 V
elif global.errQueue[#global.errQueue-1] = "IDLER_CANNOT_HOME" || global.errQueue[#global.errQueue-1] = "IDLER_CANNOT_MOVE"
M18 W
if global.spoolJoin = false && global.loadNext = false
M83 ; relative extruder moves
G10
G91 ; relative positioning
G1 Z5 F600 ; lift Z by 5mm
G90 ; absolute positioning
G1 X0 Y0 F6000 ; go to X=0 Y=0
M98 P"0:/sys/MMU Control/moveIdler.g" S5
elif global.spoolJoin = true
if global.loadNext = false
M83 ; relative extruder moves
G10
G91 ; relative positioning
G1 Z5 F600 ; lift Z by 5mm
G90 ; absolute positioning
G1 X0 Y0 F6000 ; go to X=0 Y=0
M98 P"0:/sys/MMU Control/moveIdler.g" S5
else
M83
G10 ; retract
G91 ; relative positioning
G1 Z5 ; lift
G90
G1 X310 Y0 ; go outside bed
G11 ; unretract
if state.currentTool = #tools - 1
T0
else
T{state.currentTool + 1}
if global.errQueue[#global.errQueue-1] = null
G1 E30 F300 ; purge air from the nozzle
G10 ; retract
During normal operation, or at least for now, commands after line 21 are not used
Pausing and resuming a print (not a power failure) works without problems, and the skew compensation has its normal value.
M556 is defined only in config.g, and for testing purposes I comment or uncomment it.
So I can do a power failure simply by unplugging the charger from its mains socket
Both cubes in the photo above, had a "power failure", the only difference between them is the skew compensation
A side note: the ressurect.g contains a resume command, but it behaves like a M24 P0 because it don't run the resume.g