This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Calentar antes de hacer Home Recovery Power
#1
Estoy probando la funcion Recovery Power loss de Marlin 2.0 Final (no bugfix)
Pero al recuperar la impresión la impresora hace home antes de calentar lo cual me mueve la pieza
Alguien sabe como revertir esto? calentar antes de hacer home.
Muchas gracias.

#define POWER_LOSS_RECOVERY
  #if ENABLED(POWER_LOSS_RECOVERY)
    //#define BACKUP_POWER_SUPPLY       // Backup power / UPS to move the steppers on power loss
    //#define POWER_LOSS_ZRAISE       2 // (mm) Z axis raise on resume (on power loss with UPS)
    //#define POWER_LOSS_PIN         44 // Pin to detect power loss
    //#define POWER_LOSS_STATE     HIGH // State of pin indicating power loss
    //#define POWER_LOSS_PULL           // Set pullup / pulldown as appropriate
    #define POWER_LOSS_PURGE_LEN   20 // (mm) Length of filament to purge on resume
    //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power.

    // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
    // especially with "vase mode" printing. Set too high and vases cannot be continued.
    #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data
  #endif
  Responder
#2
Hola, @Drathelern, bienvenido al foro.
Si no estoy equivocado, no veo mayor dificultad en hacer lo que indicas, pero para ello tendrás que modificar el orden en que se realizan esos pasos en la función PrintJobRecovery::resume(), que se encuentra en el archivo Marlin-2.0.x\Marlin\src\feature\power_loss_recovery.cpp.
Esta es la función:

/**
* Resume the saved print job
*/
void PrintJobRecovery::resume() {

 const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it

Habría que trasladar aquí el código que está en color verde más abajo

 #if HAS_LEVELING
   // Make sure leveling is off before any G92 and G28
   gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
 #endif

 // Reset E, raise Z, home XY...
 gcode.process_subcommands_now_P(PSTR("G92.9 E0"
   #if Z_HOME_DIR > 0

     // If Z homing goes to max, just reset E and home all
     "\n"
     "G28R0"
     #if ENABLED(MARLIN_DEV_MODE)
       "S"
     #endif

   #else // "G92.9 E0 ..."

     // Set Z to 0, raise Z by RECOVERY_ZRAISE, and Home (XY only for Cartesian)
     // with no raise. (Only do simulated homing in Marlin Dev Mode.)
     #if ENABLED(BACKUP_POWER_SUPPLY)
       "Z" STRINGIFY(POWER_LOSS_ZRAISE)    // Z-axis was already raised at outage
     #else
       "Z0\n"                              // Set Z=0
       "G1Z" STRINGIFY(POWER_LOSS_ZRAISE)  // Raise Z
     #endif
     "\n"

     "G28R0"
     #if ENABLED(MARLIN_DEV_MODE)
       "S"
     #elif !IS_KINEMATIC
       "XY"
     #endif
   #endif
 ));

 // Pretend that all axes are homed
 axis_homed = axis_known_position = xyz_bits;

 char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16];

 // Select the previously active tool (with no_move)
 #if EXTRUDERS > 1
   sprintf_P(cmd, PSTR("T%i S"), info.active_extruder);
   gcode.process_subcommands_now(cmd);
 #endif

 // Recover volumetric extrusion state
 #if DISABLED(NO_VOLUMETRICS)
   #if EXTRUDERS > 1
     for (int8_t e = 0; e < EXTRUDERS; e++) {
       dtostrf(info.filament_size[e], 1, 3, str_1);
       sprintf_P(cmd, PSTR("M200 T%i D%s"), e, str_1);
       gcode.process_subcommands_now(cmd);
     }
     if (!info.volumetric_enabled) {
       sprintf_P(cmd, PSTR("M200 T%i D0"), info.active_extruder);
       gcode.process_subcommands_now(cmd);
     }
   #else
     if (info.volumetric_enabled) {
       dtostrf(info.filament_size, 1, 3, str_1);
       sprintf_P(cmd, PSTR("M200 D%s"), str_1);
       gcode.process_subcommands_now(cmd);
     }
   #endif
 #endif

 #if HAS_HEATED_BED
   const int16_t bt = info.target_temperature_bed;
   if (bt) {
     // Restore the bed temperature
     sprintf_P(cmd, PSTR("M190 S%i"), bt);
     gcode.process_subcommands_now(cmd);
   }
 #endif

 // Restore all hotend temperatures
 #if HOTENDS
   HOTEND_LOOP() {
     const int16_t et = info.target_temperature[e];
     if (et) {
       #if HOTENDS > 1
         sprintf_P(cmd, PSTR("T%i"), e);
         gcode.process_subcommands_now(cmd);
       #endif
       sprintf_P(cmd, PSTR("M109 S%i"), et);
       gcode.process_subcommands_now(cmd);
     }
   }
 #endif


 // Restore print cooling fan speeds
 FANS_LOOP(i) {
   uint8_t f = info.fan_speed[i];
   if (f) {
     sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f);
     gcode.process_subcommands_now(cmd);
   }
 }

 // Restore retract and hop state
 #if ENABLED(FWRETRACT)
   for (uint8_t e = 0; e < EXTRUDERS; e++) {
     if (info.retract[e] != 0.0) {
       fwretract.current_retract[e] = info.retract[e];
       fwretract.retracted[e] = true;
     }
   }
   fwretract.current_hop = info.retract_hop;
 #endif

 #if HAS_LEVELING
   // Restore leveling state before 'G92 Z' to ensure
   // the Z stepper count corresponds to the native Z.
   if (info.fade || info.leveling) {
     sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1));
     gcode.process_subcommands_now(cmd);
   }
 #endif

 #if ENABLED(GRADIENT_MIX)
   memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient));
 #endif

 // Extrude and retract to clean the nozzle
 #if POWER_LOSS_PURGE_LEN
   //sprintf_P(cmd, PSTR("G1 E%d F200"), POWER_LOSS_PURGE_LEN);
   //gcode.process_subcommands_now(cmd);
   gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F200"));
 #endif

 #if POWER_LOSS_RETRACT_LEN
   sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN - (POWER_LOSS_RETRACT_LEN));
   gcode.process_subcommands_now(cmd);
 #endif

 // Move back to the saved XY
 sprintf_P(cmd, PSTR("G1 X%s Y%s F3000"),
   dtostrf(info.current_position.x, 1, 3, str_1),
   dtostrf(info.current_position.y, 1, 3, str_2)
 );
 gcode.process_subcommands_now(cmd);

 // Move back to the saved Z
 dtostrf(info.current_position.z, 1, 3, str_1);
 #if Z_HOME_DIR > 0
   sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1);
 #else
   gcode.process_subcommands_now_P(PSTR("G1 Z0 F200"));
   sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1);
 #endif
 gcode.process_subcommands_now(cmd);

 // Un-retract
 #if POWER_LOSS_PURGE_LEN
   //sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN);
   //gcode.process_subcommands_now(cmd);
   gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F3000"));
 #endif

 // Restore the feedrate
 sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate);
 gcode.process_subcommands_now(cmd);

 // Restore E position with G92.9
 sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1));
 gcode.process_subcommands_now(cmd);

 // Relative axis modes
 gcode.axis_relative = info.axis_relative;

 #if HAS_HOME_OFFSET
   home_offset = info.home_offset;
 #endif
 #if HAS_POSITION_SHIFT
   position_shift = info.position_shift;
 #endif
 #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
   LOOP_XYZ(i) update_workspace_offset((AxisEnum)i);
 #endif

 // Resume the SD file from the last position
 char *fn = info.sd_filename;
 extern const char M23_STR[];
 sprintf_P(cmd, M23_STR, fn);
 gcode.process_subcommands_now(cmd);
 sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed);
 gcode.process_subcommands_now(cmd);
}


Naturalmente, lo anterior creo que es correcto pero no he podido probarlo, por lo que no garantizo al 100% que funcione. Tú decides.
  Responder
#3
Muchas Gracias.Funcionó, 
lo verde es lo que se movió y lo rojo lo que se borró. 
Quedó de la siguiente manera:
/**
* Resume the saved print job
*/
void PrintJobRecovery::resume() {

 const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it


 #if HAS_LEVELING
   // Make sure leveling is off before any G92 and G28
   gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
 #endif

[b]char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16];
[/b]
[b]
 #if HAS_HEATED_BED
   const int16_t bt = info.target_temperature_bed;
   if (bt) {
     // Restore the bed temperature
     sprintf_P(cmd, PSTR("M190 S%i"), bt);
     gcode.process_subcommands_now(cmd);
   }
 #endif

 // Restore all hotend temperatures
 #if HOTENDS
   HOTEND_LOOP() {
     const int16_t et = info.target_temperature[e];
     if (et) {
       #if HOTENDS > 1
         sprintf_P(cmd, PSTR("T%i"), e);
         gcode.process_subcommands_now(cmd);
       #endif
       sprintf_P(cmd, PSTR("M109 S%i"), et);
       gcode.process_subcommands_now(cmd);
     }
   }
 #endif


 // Reset E, raise Z, home XY...
 gcode.process_subcommands_now_P(PSTR("G92.9 E0"
   #if Z_HOME_DIR > 0

     // If Z homing goes to max, just reset E and home all
     "\n"
     "G28R0"
     #if ENABLED(MARLIN_DEV_MODE)
       "S"
     #endif

   #else // "G92.9 E0 ..."

     // Set Z to 0, raise Z by RECOVERY_ZRAISE, and Home (XY only for Cartesian)
     // with no raise. (Only do simulated homing in Marlin Dev Mode.)
     #if ENABLED(BACKUP_POWER_SUPPLY)
       "Z" STRINGIFY(POWER_LOSS_ZRAISE)    // Z-axis was already raised at outage
     #else
       "Z0\n"                              // Set Z=0
       "G1Z" STRINGIFY(POWER_LOSS_ZRAISE)  // Raise Z
     #endif
     "\n"

     "G28R0"
     #if ENABLED(MARLIN_DEV_MODE)
       "S"
     #elif !IS_KINEMATIC
       "XY"
     #endif
   #endif
 ));

 // Pretend that all axes are homed
 axis_homed = axis_known_position = xyz_bits;

 char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16];


 // Select the previously active tool (with no_move)
 #if EXTRUDERS > 1
   sprintf_P(cmd, PSTR("T%i S"), info.active_extruder);
   gcode.process_subcommands_now(cmd);
 #endif

 // Recover volumetric extrusion state
 #if DISABLED(NO_VOLUMETRICS)
   #if EXTRUDERS > 1
     for (int8_t e = 0; e < EXTRUDERS; e++) {
       dtostrf(info.filament_size[e], 1, 3, str_1);
       sprintf_P(cmd, PSTR("M200 T%i D%s"), e, str_1);
       gcode.process_subcommands_now(cmd);
     }
     if (!info.volumetric_enabled) {
       sprintf_P(cmd, PSTR("M200 T%i D0"), info.active_extruder);
       gcode.process_subcommands_now(cmd);
     }
   #else
     if (info.volumetric_enabled) {
       dtostrf(info.filament_size, 1, 3, str_1);
       sprintf_P(cmd, PSTR("M200 D%s"), str_1);
       gcode.process_subcommands_now(cmd);
     }
   #endif
 #endif

 [/b]
[b]#if HAS_HEATED_BED
   const int16_t bt = info.target_temperature_bed;
   if (bt) {
     // Restore the bed temperature
     sprintf_P(cmd, PSTR("M190 S%i"), bt);
     gcode.process_subcommands_now(cmd);
   }
 #endif

 // Restore all hotend temperatures
 #if HOTENDS
   HOTEND_LOOP() {
     const int16_t et = info.target_temperature[e];
     if (et) {
       #if HOTENDS > 1
         sprintf_P(cmd, PSTR("T%i"), e);
         gcode.process_subcommands_now(cmd);
       #endif
       sprintf_P(cmd, PSTR("M109 S%i"), et);
       gcode.process_subcommands_now(cmd);
     }
   }
 #endif
[/b]


 // Restore print cooling fan speeds
 FANS_LOOP(i) {
   uint8_t f = info.fan_speed[i];
   if (f) {
     sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f);
     gcode.process_subcommands_now(cmd);
   }
 }

 // Restore retract and hop state
 #if ENABLED(FWRETRACT)
   for (uint8_t e = 0; e < EXTRUDERS; e++) {
     if (info.retract[e] != 0.0) {
       fwretract.current_retract[e] = info.retract[e];
       fwretract.retracted[e] = true;
     }
   }
   fwretract.current_hop = info.retract_hop;
 #endif

 #if HAS_LEVELING
   // Restore leveling state before 'G92 Z' to ensure
   // the Z stepper count corresponds to the native Z.
   if (info.fade || info.leveling) {
     sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1));
     gcode.process_subcommands_now(cmd);
   }
 #endif

 #if ENABLED(GRADIENT_MIX)
   memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient));
 #endif

 // Extrude and retract to clean the nozzle
 #if POWER_LOSS_PURGE_LEN
   //sprintf_P(cmd, PSTR("G1 E%d F200"), POWER_LOSS_PURGE_LEN);
   //gcode.process_subcommands_now(cmd);
   gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F200"));
 #endif

 #if POWER_LOSS_RETRACT_LEN
   sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN - (POWER_LOSS_RETRACT_LEN));
   gcode.process_subcommands_now(cmd);
 #endif

 // Move back to the saved XY
 sprintf_P(cmd, PSTR("G1 X%s Y%s F3000"),
   dtostrf(info.current_position.x, 1, 3, str_1),
   dtostrf(info.current_position.y, 1, 3, str_2)
 );
 gcode.process_subcommands_now(cmd);

 // Move back to the saved Z
 dtostrf(info.current_position.z, 1, 3, str_1);
 #if Z_HOME_DIR > 0
   sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1);
 #else
   gcode.process_subcommands_now_P(PSTR("G1 Z0 F200"));
   sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1);
 #endif
 gcode.process_subcommands_now(cmd);

 // Un-retract
 #if POWER_LOSS_PURGE_LEN
   //sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN);
   //gcode.process_subcommands_now(cmd);
   gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F3000"));
 #endif

 // Restore the feedrate
 sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate);
 gcode.process_subcommands_now(cmd);

 // Restore E position with G92.9
 sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1));
 gcode.process_subcommands_now(cmd);

 // Relative axis modes
 gcode.axis_relative = info.axis_relative;

 #if HAS_HOME_OFFSET
   home_offset = info.home_offset;
 #endif
 #if HAS_POSITION_SHIFT
   position_shift = info.position_shift;
 #endif
 #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
   LOOP_XYZ(i) update_workspace_offset((AxisEnum)i);
 #endif

 // Resume the SD file from the last position
 char *fn = info.sd_filename;
 extern const char M23_STR[];
 sprintf_P(cmd, M23_STR, fn);
 gcode.process_subcommands_now(cmd);
 sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed);
 gcode.process_subcommands_now(cmd);
}
  Responder
#4
Me alegro que te funcionase.
Un saludo.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Power Loss Recovery Configuracion bbouett 1 0 07-06-2023, 08:07 PM
Último mensaje: Simemart
  Power loss recovery Impresora + octopi Inderlard 4 305 24-07-2022, 06:14 PM
Último mensaje: Simemart
  CONSULTA !!Ayuda!! Marlin 2.0 No consigo hacer Home en el centro de la cama caliente juankike 8 3,547 28-03-2022, 09:57 PM
Último mensaje: SoMAG
  Problema power loss recovery alguiens 9 3,344 14-06-2021, 07:08 PM
Último mensaje: Simemart
  Problema con power loss recovery Clanck 1 719 20-03-2021, 12:59 PM
Último mensaje: Simemart