MarlinFirmware / Marlin

Marlin is an optimized firmware for RepRap 3D printers based on the Arduino platform. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.
https://marlinfw.org
GNU General Public License v3.0
16.29k stars 19.24k forks source link

Improvement idea, outage detection #6397

Closed Gaben5224 closed 7 years ago

Gaben5224 commented 7 years ago

Hey Guys!

So, in the last few days he were some outage, and I was thinking about it. I think it will be a greate improvment, if we could define in the firmware an outage pins. I the market have some solution for this problem, like MKS Power Outage Detection module but, as far as I know it is working with the MKS TFT.

So my idea the case of outage:

Maybe if it could define an other GCode or Mcode to start the outage method, and than it could controll with raspberry pi too.

I'm not a programmer so I dont know what is possible from my idea, but if the whole things could work, it will be a great thing.

What do you think? If it possible?

Thanks for your answer, and sorry for my bad English!

Tannoo commented 7 years ago

This has been brought up before: #6028

Gaben5224 commented 7 years ago

Okay! I have read this, but the 2 thing is not equal.

I thought that we could increase the uptime to the UPS if the printer is stopping when the outage is happening. The printer wouldn't lost the Z axis original zero point, because the printer would be under current all the time by the UPS.

Tannoo commented 7 years ago

The real problem is losing the stepper positions when power does fail...even with a ups.

Tannoo commented 7 years ago

All the time... Depends on how long the power is out and how much power the ups has.

Gaben5224 commented 7 years ago

Yes, exactly! And this would be the point. Normally my UPS can give power until 15 minutes to the printer, but if the printer would go to "I don't know... hibernate mode", than this short time would increase.

But, if you say this isn't possible, I believe you. This was only an idea.

Tannoo commented 7 years ago

Oh no, it's possible, but it has to be written to save to an SD card. I have a hard enough time writing code that fits Marlin "standard". So, please don't look at me. Lol

Tannoo commented 7 years ago

The other issue is that the host that is sending commands. Marlin could send a KILL command, but that stops the host from resuming. Anything else, I don't believe the host will pick up from where it left off after power is restored.

Tannoo commented 7 years ago

It would be a much easier task to write something like that on the host side. There's plenty of room to store needed info to resume a print. Especially since the host has the files anyway.

thinkyhead commented 7 years ago

This has been brought up before: #6028

Okay! I have read this, but the 2 thing is not equal.

How about #2085?

ghost commented 7 years ago

I have asked for this job to the communauty , but no one have made an issue , and i have tried to make it myself , learn arduino language , learn marlin system and here is the list of the big problems to make it possible

Marlin works by incrementation , and impossible to take a picture of the instant of the state of the printer , all datas are incremented and not stored like a database The gcode read instruction is just read by the planner one after one , no position of read exist For this reason , impossible to mark the position of the last gcode read

To solve this problem , you have to rewrite the planner , you have to script your own gcode to add a new gcode instruction that is the number of the line between each lines of gcode

My first idea was to make a state pause when a ONLY MOVE gcode is read , but in the case of a big printer , a solid layer can take one hour to be made , and the UPS will never survive

To make this possible , your gcode file must have a GCODE ID LINE , your planner will use it to save the exact line totally made by the planner We can made a quick code , but , this code will never work in all case ... In the case of a big printer and a spiral mode with 50cm height , if you don't have THE PERFECT POSITION to restart , you will explode the print , and all is finished. And if you solve this , don't forget , you have to make a new homing when restart , and the only idea i had , is to make a ZMAX endstop , to make a homing , with zmin and zmax , to store the distance , and in the case of resuming , we can use only the zmax to restart

I repeat , it's possible to make a firmware to restart the print , but not in ALL SITUATION and in all case , and , if we want to make a good release , the firmware must be perfect in all situation , on all printers , and this firmware can not make it

To make it possible , you need , more space , more ram , and make work marlin like a database that store all it does everytime , to always have a database of the state everytime .

Marlin is an incrementation system , all is flow , no data stored , it's a gear , that flow and execute 16 intructions in the planner , because of the calculation of the lookahead , the jerk , the speed , the brakes and more smooth algorithms

and to finish to dye , the print pop off the bed when too cold , and , resuming will need , human intervention , to evaluate if the print is sure

I'm very sorry to tell you , to invest in UPS and to make a little hardware to make a pause , and wait the back of the power , MARLIN can not make a power outage recovery ' FOR ALL CASES AND ALL MACHINE'

You can close this thead

ghost commented 7 years ago

But i have a solution if you want ,

Creatbot have made a POWER OUTAGE RECOVERY PRINTER But , i'm sure , very sure that it can not work in all case .... In the case of of solid print , it can work , the print can resist if a nozzle touch Something , but if you make a very light printed object with high height , I'M SURE YOUR PRINT EXPLODES loll

Ask creatbot if you absolute need it

ghost commented 7 years ago

The best idea is a good ups and pause mode , or , to make the rest of the print and glue it

Secure Print will be , a technology of the future , two choices , a super firmware made for this , and may be a touch palper to scan the print to make a secure resuming

But not for today

Thks

Gaben5224 commented 7 years ago

The best idea is a good ups and pause mode...

Yes, you are absolutly right! That was the original idea!

Store the actual X,Y,Z position in EEPROM override the default DEFAULT_STEPPER_DEACTIVE_TIME to 1 hour pause the print...

I never sad that you guys should write a totaly new recovery method! I have never ask this!!! I had an idea and I share with you and I asked you opinion....

What do you think? If it possible?

Thanks!

ghost commented 7 years ago

Your idea was mine six month ago ... and was the idea of so many people.. I dream every night of this option... In a little printer this option is not dramatic. .. But now i have a big printer ...and this missing option is a crime .... I'm afraid of system crash.. It's for these reasons i have dreamed of these functionalities May be in the future

martinbogo commented 6 years ago

how does this feature work in the Creality 10S machine? ( new motherboard in there )

jonathanweinberg commented 6 years ago

Also, I believe the Prusa MK3 also has the ability to "pause" a print on a power failure.

EDIT: Found this on their GitHub: https://github.com/prusa3d/MK3_Power_Panic

UvarajGit commented 6 years ago

Is their an update on this topic. Is this accepted as a feature request or rejected and closed?

siana commented 6 years ago

A UPS for the 5V supply of the Arduino or similar control board is easily made. For example using many cheap single-cell power banks, they don't deliver a lot of current (good thing the 5V part of the printer is fairly frugal), but they usually have USB passthrough functionality, for example based on MP3401A.

Furthermore some boards like Geeetech GT2560 appear to have 12V/24V power detection. ADC0 and ADC1 (PF0 and PF1) receive motor/hotend supply and heated bed supply voltages respectively, via a 10k/100k resistive divider, attenuated 11fold.

What is the suggested course of action on this? Is it sensible to suggest a 5V UPS, and then pause print operations immediately on power outage, then resume from RAM? Is it sensible or possible to try to write to SD-Card the current state of printing and upon resume re-home - on Cartesian printer, X and Y axis only, no Z, and on a Delta, use Max Z endstops?

Perhaps it doesn't really matter that the firmware does too little state tracking, maybe it's possible to save the complete snapshot of printer's RAM to SD and then use a setjmp/longjmp style low level mechanism to restore? Is it something worth considering?

revilor commented 6 years ago

Check also another ongoing discussion on the topic: #9185

thinkyhead commented 6 years ago

maybe it's possible to save the complete snapshot of printer's RAM to SD

We'd have the printjob class write a special small file to SD, or a very small cookie to EEPROM which contains the filename and byte position on the SD card which was last buffered, plus the temperature of the nozzle, the speed of the fan, and a few other state values. On reboot the machine would take action on seeing the cookie. When host printing is interrupted, it may not be possible to get the host to resume. But interrupted SD prints are easy to continue.

This feature is implemented in some forks of Marlin, such as the Prusa MK3 firmware. Someone clever should eventually port it over to this fork. Everything in this feature can be implemented in a testable form without needing an actual POWER_LOSS_DETECT_PIN, then it would be up to end-users to choose how to implement the hardware part.

dosono commented 6 years ago

Very important for very long prints or places such as India where power is not 100% on all the time. Now the question is where is this clever person that can copy this feature from Prusa into Marlin ?!?

thinkyhead commented 6 years ago

Moreover, does this person have enough spare cycles?

github-actions[bot] commented 2 years ago

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.