From cad24aa1487f978fe38ee2897e20675c61f4e056 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Fri, 14 Feb 2025 11:48:36 +0200 Subject: [PATCH 1/5] Limit printing speed --- Marlin/Configuration_adv.h | 5 +++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++++ Marlin/src/module/planner.cpp | 13 +++++++++++++ Marlin/src/module/planner.h | 4 ++++ Marlin/src/module/settings.cpp | 20 +++++++++++++++++++- 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1cd89a9714..1a5afb068e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3970,6 +3970,11 @@ #endif #endif +//#define FEEDRATE_PRINTING_LIMIT +#if ENABLED(FEEDRATE_PRINTING_LIMIT) + #define DEFAULT_FEEDRATE_PRINTING_LIMIT 0 // (mm/sec) +#endif + // @section reporting /** diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index be309f53d8..6c9e3821e2 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -453,6 +453,7 @@ namespace LanguageNarrow_en { LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed"); LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed"); LSTR MSG_VMAX_N = _UxGT("Max @ Speed"); + LSTR MSG_MAX_PRINTING_SPEED = _UxGT("Max Printing Speed (mm/s)"); LSTR MSG_VMAX_E = _UxGT("Max E Speed"); LSTR MSG_VMAX_EN = _UxGT("Max * Speed"); LSTR MSG_VMIN = _UxGT("Min Velocity"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 65d7a88f0d..2f89e9988f 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -162,6 +162,10 @@ void menu_backlash(); } #endif // !NO_VOLUMETRICS + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + EDIT_ITEM_FAST(float5, MSG_MAX_PRINTING_SPEED, &planner.max_printing_feedrate_mm_s, 0, MAX(planner.settings.max_feedrate_mm_s[0]*1.414, planner.settings.max_feedrate_mm_s[1]*1.414)); + #endif + #if ENABLED(CONFIGURE_FILAMENT_CHANGE) constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 156ab142f9..e80624440c 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -189,6 +189,10 @@ uint32_t Planner::max_acceleration_steps_per_s2[DISTINCT_AXES]; // (steps/s^2) D Planner::volumetric_extruder_feedrate_limit[EXTRUDERS]; // pre calculated extruder feedrate limit based on volumetric_extruder_limit; pre-calculated to reduce computation in the planner #endif +#if ENABLED(FEEDRATE_PRINTING_LIMIT) + feedRate_t Planner::max_printing_feedrate_mm_s; // (mm/s) +#endif + #ifdef MAX7219_DEBUG_SLOWDOWN uint8_t Planner::slowdown_count = 0; #endif @@ -2331,6 +2335,15 @@ bool Planner::_populate_block( } } #endif + + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + if (max_printing_feedrate_mm_s > 0 && current_speed.e > 0) { + feedRate_t ps2 = (current_speed[0] * current_speed[0]) + (current_speed[1] * current_speed[1]); + if (ps2 > max_printing_feedrate_mm_s * max_printing_feedrate_mm_s) + NOMORE(speed_factor, max_printing_feedrate_mm_s / SQRT(ps2)); + } + #endif + } #endif // HAS_EXTRUDERS diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index eb8f2ed17f..cfec35f921 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -487,6 +487,10 @@ class Planner { volumetric_extruder_feedrate_limit[EXTRUDERS]; // (mm/s) Feedrate limit calculated from volume limit #endif + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + static feedRate_t max_printing_feedrate_mm_s; // (mm/s) Maximum feedrate when printing + #endif + static planner_settings_t settings; #if ENABLED(LASER_FEATURE) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8c3fae1393..b66b69ee41 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -36,7 +36,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V90" +#define EEPROM_VERSION "V91" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -486,6 +486,10 @@ typedef struct SettingsDataStruct { float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] float planner_volumetric_extruder_limit[EXTRUDERS]; // M200 T L planner.volumetric_extruder_limit[] + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + feedRate_t max_printing_feedrate_mm_s; + #endif + // // HAS_TRINAMIC_CONFIG // @@ -1417,6 +1421,10 @@ void MarlinSettings::postprocess() { #endif } + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + EEPROM_WRITE(planner.max_printing_feedrate_mm_s); + #endif + // // TMC Configuration // @@ -2489,6 +2497,12 @@ void MarlinSettings::postprocess() { #endif } + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + feedRate_t max_printing_feedrate_mm_s; + EEPROM_READ(max_printing_feedrate_mm_s); + if (!validating) planner.max_printing_feedrate_mm_s = max_printing_feedrate_mm_s; + #endif + // // TMC Stepper Settings // @@ -3600,6 +3614,10 @@ void MarlinSettings::reset() { #endif #endif + #if ENABLED(FEEDRATE_PRINTING_LIMIT) + planner.max_printing_feedrate_mm_s = DEFAULT_FEEDRATE_PRINTING_LIMIT; + #endif + endstops.enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); reset_stepper_drivers(); From c239a61cc520cb192cc2ee91edc588d56e823350 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 16 Mar 2025 03:12:46 -0500 Subject: [PATCH 2/5] adjust, update, add G-code 'M203 P' --- Marlin/Configuration.h | 2 ++ Marlin/Configuration_adv.h | 5 ---- Marlin/src/gcode/config/M200-M205.cpp | 14 ++++++++- Marlin/src/inc/Conditionals-1-axes.h | 1 + Marlin/src/inc/Conditionals-3-etc.h | 4 +++ Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 9 +++--- Marlin/src/module/planner.cpp | 15 +++++----- Marlin/src/module/planner.h | 4 +-- Marlin/src/module/settings.cpp | 43 +++++++++++++++++---------- 10 files changed, 63 insertions(+), 36 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5cb5682991..c1cdf719e9 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1319,6 +1319,8 @@ #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits #endif +//#define MAX_PRINT_FEEDRATE_MM_S 1000 // (mm/s) Adjustable maximum feedrate for printing moves + /** * Default Max Acceleration (speed change with time) (linear=mm/(s^2), rotational=°/(s^2)) * (Maximum start speed for accelerated moves) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1a5afb068e..1cd89a9714 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3970,11 +3970,6 @@ #endif #endif -//#define FEEDRATE_PRINTING_LIMIT -#if ENABLED(FEEDRATE_PRINTING_LIMIT) - #define DEFAULT_FEEDRATE_PRINTING_LIMIT 0 // (mm/sec) -#endif - // @section reporting /** diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index 7ad7de8617..dd9f804aa8 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -202,12 +202,20 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) { * With multiple extruders use T to specify which one. */ void GcodeSuite::M203() { - if (!parser.seen("T" STR_AXES_LOGICAL)) + if (!parser.seen("T" TERN_(HAS_MAX_PRINT_FEEDRATE, "P") STR_AXES_LOGICAL)) return M203_report(); const int8_t target_extruder = get_target_extruder_from_command(); if (target_extruder < 0) return; + #if HAS_MAX_PRINT_FEEDRATE + // Set the max Printing feedrate, applying only to moves with extrusion. + if (parser.seenval('P')) { + const float p = parser.value_linear_units(); + if (p == 0 || p > 100) planner.settings.max_print_feedrate_mm_s = p; + } + #endif + LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) { const AxisEnum a = TERN(HAS_EXTRUDERS, (i == E_AXIS ? E_AXIS_N(target_extruder) : (AxisEnum)i), (AxisEnum)i); @@ -244,6 +252,10 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) { SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS])); #endif + #if HAS_MAX_PRINT_FEEDRATE + SERIAL_ECHOPGM_P(SP_P_STR, LINEAR_UNIT(planner.settings.max_print_feedrate_mm_s)); + #endif + if (eol) SERIAL_EOL(); #if ENABLED(DISTINCT_E_FACTORS) diff --git a/Marlin/src/inc/Conditionals-1-axes.h b/Marlin/src/inc/Conditionals-1-axes.h index 49b236d80e..46c0ae418e 100644 --- a/Marlin/src/inc/Conditionals-1-axes.h +++ b/Marlin/src/inc/Conditionals-1-axes.h @@ -73,6 +73,7 @@ #undef FILAMENT_RUNOUT_SENSOR #undef FILAMENT_RUNOUT_DISTANCE_MM #undef DISABLE_OTHER_EXTRUDERS + #undef MAX_PRINT_FEEDRATE_MM_S #endif #define E_OPTARG(N) OPTARG(HAS_MULTI_EXTRUDER, N) diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index 3fa80726f1..d54e1e7702 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -677,3 +677,7 @@ #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) #define HAS_PID_DEBUG 1 #endif + +#ifdef MAX_PRINT_FEEDRATE_MM_S + #define HAS_MAX_PRINT_FEEDRATE 1 +#endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 6c9e3821e2..839398e80c 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -449,11 +449,11 @@ namespace LanguageNarrow_en { LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); LSTR MSG_STEP_SMOOTHING = _UxGT("Step Smoothing"); LSTR MSG_MAX_SPEED = _UxGT("Max Speed (mm/s)"); + LSTR MSG_MAX_PRINT_SPEED = _UxGT("Max Print Speed"); LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed"); LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed"); LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed"); LSTR MSG_VMAX_N = _UxGT("Max @ Speed"); - LSTR MSG_MAX_PRINTING_SPEED = _UxGT("Max Printing Speed (mm/s)"); LSTR MSG_VMAX_E = _UxGT("Max E Speed"); LSTR MSG_VMAX_EN = _UxGT("Max * Speed"); LSTR MSG_VMIN = _UxGT("Min Velocity"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 2f89e9988f..5a857d34eb 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -162,10 +162,6 @@ void menu_backlash(); } #endif // !NO_VOLUMETRICS - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - EDIT_ITEM_FAST(float5, MSG_MAX_PRINTING_SPEED, &planner.max_printing_feedrate_mm_s, 0, MAX(planner.settings.max_feedrate_mm_s[0]*1.414, planner.settings.max_feedrate_mm_s[1]*1.414)); - #endif - #if ENABLED(CONFIGURE_FILAMENT_CHANGE) constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); @@ -712,6 +708,11 @@ void menu_advanced_settings() { // M203 / M205 - Feedrate items SUBMENU(MSG_MAX_SPEED, menu_advanced_velocity); + #if HAS_MAX_PRINT_FEEDRATE + const float max_rate = 1.4142135f * MAX(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); + EDIT_ITEM_FAST(float5, MSG_MAX_PRINT_SPEED, &planner.max_print_feedrate_mm_s, 0, max_rate); + #endif + // M201 - Acceleration items SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index e80624440c..ebfb1d88b2 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -189,8 +189,8 @@ uint32_t Planner::max_acceleration_steps_per_s2[DISTINCT_AXES]; // (steps/s^2) D Planner::volumetric_extruder_feedrate_limit[EXTRUDERS]; // pre calculated extruder feedrate limit based on volumetric_extruder_limit; pre-calculated to reduce computation in the planner #endif -#if ENABLED(FEEDRATE_PRINTING_LIMIT) - feedRate_t Planner::max_printing_feedrate_mm_s; // (mm/s) +#if HAS_MAX_PRINT_FEEDRATE + feedRate_t Planner::max_print_feedrate_mm_s; // (mm/s) M203 P - Maximum feedrate when printing #endif #ifdef MAX7219_DEBUG_SLOWDOWN @@ -2336,15 +2336,16 @@ bool Planner::_populate_block( } #endif - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - if (max_printing_feedrate_mm_s > 0 && current_speed.e > 0) { - feedRate_t ps2 = (current_speed[0] * current_speed[0]) + (current_speed[1] * current_speed[1]); - if (ps2 > max_printing_feedrate_mm_s * max_printing_feedrate_mm_s) - NOMORE(speed_factor, max_printing_feedrate_mm_s / SQRT(ps2)); + #if HAS_MAX_PRINT_FEEDRATE + if (max_print_feedrate_mm_s > 0 && current_speed.e) { + const feedRate_t ps2 = HYPOT2(current_speed.x, current_speed.y); + if (ps2 > sq(max_print_feedrate_mm_s)) + NOMORE(speed_factor, max_print_feedrate_mm_s / SQRT(ps2)); // Multiply by ISQRT? } #endif } + #endif // HAS_EXTRUDERS #ifdef XY_FREQUENCY_LIMIT diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index cfec35f921..2c6942d284 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -487,8 +487,8 @@ class Planner { volumetric_extruder_feedrate_limit[EXTRUDERS]; // (mm/s) Feedrate limit calculated from volume limit #endif - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - static feedRate_t max_printing_feedrate_mm_s; // (mm/s) Maximum feedrate when printing + #if HAS_MAX_PRINT_FEEDRATE + static feedRate_t max_print_feedrate_mm_s; // (mm/s) M203 P - Maximum feedrate when printing #endif static planner_settings_t settings; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index b66b69ee41..ae08306aff 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -486,8 +486,11 @@ typedef struct SettingsDataStruct { float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] float planner_volumetric_extruder_limit[EXTRUDERS]; // M200 T L planner.volumetric_extruder_limit[] - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - feedRate_t max_printing_feedrate_mm_s; + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + feedRate_t max_print_feedrate_mm_s; // M203 P planner.max_print_feedrate_mm_s #endif // @@ -1392,6 +1395,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(homing_current_mA); #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + EEPROM_WRITE(planner.max_print_feedrate_mm_s); + #endif + // // Volumetric & Filament Size // @@ -1421,10 +1431,6 @@ void MarlinSettings::postprocess() { #endif } - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - EEPROM_WRITE(planner.max_printing_feedrate_mm_s); - #endif - // // TMC Configuration // @@ -2473,6 +2479,13 @@ void MarlinSettings::postprocess() { EEPROM_READ(homing_current_mA); #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + EEPROM_READ(planner.max_print_feedrate_mm_s); + #endif + // // Volumetric & Filament Size // @@ -2497,12 +2510,6 @@ void MarlinSettings::postprocess() { #endif } - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - feedRate_t max_printing_feedrate_mm_s; - EEPROM_READ(max_printing_feedrate_mm_s); - if (!validating) planner.max_printing_feedrate_mm_s = max_printing_feedrate_mm_s; - #endif - // // TMC Stepper Settings // @@ -3601,6 +3608,14 @@ void MarlinSettings::reset() { homing_current_mA = base_homing_current_mA; #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + planner.max_print_feedrate_mm_s = MAX_PRINT_FEEDRATE_MM_S; + #endif + + // // // Volumetric & Filament Size // @@ -3614,10 +3629,6 @@ void MarlinSettings::reset() { #endif #endif - #if ENABLED(FEEDRATE_PRINTING_LIMIT) - planner.max_printing_feedrate_mm_s = DEFAULT_FEEDRATE_PRINTING_LIMIT; - #endif - endstops.enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); reset_stepper_drivers(); From 5d2745a58210293e14329c2b382adccb1fc32316 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 16 Mar 2025 03:20:25 -0500 Subject: [PATCH 3/5] old EEPROM version --- Marlin/src/module/settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index ae08306aff..f95182405b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -36,7 +36,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V91" +#define EEPROM_VERSION "V90" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. From 575f7aa46a1a97c15e8bd6e8152695d054c82a4a Mon Sep 17 00:00:00 2001 From: vovodroid Date: Sat, 5 Apr 2025 13:18:41 +0300 Subject: [PATCH 4/5] Use std::max --- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 5a857d34eb..b268edceee 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -709,7 +709,7 @@ void menu_advanced_settings() { SUBMENU(MSG_MAX_SPEED, menu_advanced_velocity); #if HAS_MAX_PRINT_FEEDRATE - const float max_rate = 1.4142135f * MAX(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); + const float max_rate = 1.4142135f * std::max(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); EDIT_ITEM_FAST(float5, MSG_MAX_PRINT_SPEED, &planner.max_print_feedrate_mm_s, 0, max_rate); #endif From 8998a0c45d679ee077b0a6bdfa862281ba9a34ff Mon Sep 17 00:00:00 2001 From: vovodroid Date: Tue, 8 Jul 2025 21:38:15 +0300 Subject: [PATCH 5/5] Use _MAX --- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b268edceee..9eacfafa36 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -709,7 +709,7 @@ void menu_advanced_settings() { SUBMENU(MSG_MAX_SPEED, menu_advanced_velocity); #if HAS_MAX_PRINT_FEEDRATE - const float max_rate = 1.4142135f * std::max(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); + const float max_rate = 1.4142135f * _MAX(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); EDIT_ITEM_FAST(float5, MSG_MAX_PRINT_SPEED, &planner.max_print_feedrate_mm_s, 0, max_rate); #endif