Extruder stops during print

Hi, I've been running into an issue where the extruder motor stops turning midway through a print. It consistently happens at the same point every time.

I'm not sure whats causing this, but I've only had issues since I slowed the printing speed right down (I'm using 55 mm/min). The extruder shouldn't have issues extruding at this low speed though, as I have no issues when just extruding.

Does anyone know why this might be happening?

If it would help, I can upload the gcode file

Any help would be much appreciated!

Comments

  • Update: The problem appears to be with relative extrusion (M83). Any gcode which uses it seems to stop extruding after around 120 mm has been extruded. I doubled the EXTRUDE_MAXLENGTH term, and this then changed.

    Is there a way around this bug without changing the EXTRUDE_MAXLENGTH term to something huge?

  • Is it extruding correctly up to exceeding 120mm and how do you know you reached 120? If you see increasing E values in sliced models especially if > 10mm it is normally because the slicer is sending them in absolute mode and having extruder in relative mode mode than makes them first to extruch too much and then nothing when position exceeds max length.

    Normally you should select relative extrusion for slicer and put extruder in relative mode. That keeps the precision high on same level during print. With absolute extrusion you should reset extrusion every level.
  • Thanks for the quick reply!

    Yes, the extruder works fine up until 120 mm. The printer has a menu option where it shows the E position. After every print which had issues (i.e. relative extrusion, and stopping some way in), this value would read somewhere between 110 and 120 mm. Additionally, after putting the printer in relative extrusion mode (M83), if I manually send extrusion commands (G1 E10), after reaching 120 mm, the printer would no longer extrude. Resetting the extrusion distance (G92 E0), would allow extrusion to start again.

    The Gcode is definitely in relative mode, all E values are under 1 mm (I'm trying to print a cylinder).

    Maybe a stupid question, but how do I put the extruder in relative mode? Do you mean send the command M83? This is automatically added to the gcode when I tick the relative extrusion box in Cura.

    I'm also not sure why the EXTRUDE_MAXLENGTH term would influence this behaviour. Is it treating the relative extrusion commands
  • Looking at the code, I think I might have found the problem in Printer.cpp:

            p = convertToMM(com->E * axisStepsPerMM[E_AXIS]);
            if(relativeCoordinateMode || relativeExtruderCoordinateMode)
            {
                if(
    #if MIN_EXTRUDER_TEMP > 30
                    Extruder::current->tempControl.currentTemperatureC<MIN_EXTRUDER_TEMP ||
    #endif // MIN_EXTRUDER_TEMP > 30

                    fabs(p - queuePositionLastSteps[E_AXIS]) > EXTRUDE_MAXLENGTH * axisStepsPerMM[E_AXIS])
                {
                    p = 0;
                }
                queuePositionTargetSteps[E_AXIS] = queuePositionLastSteps[E_AXIS] + p;
               
            }

    I can't find how queuePositionLastSteps is updated, but assuming that it's a running total of the extruder position, after it reaches EXTRUDE_MAXLENGTH , no increases in extrusion will be sent.
  • edited March 2023
    Changing the if condition to:

    fabs(p) > EXTRUDE_MAXLENGTH * axisStepsPerMM[E_AXIS]

    has solved the problem. This should now just check if any individual command exceeds the max length.

    Is there anything I should be worried about, having changed this?
  • I wonder what version you are using. This is how it looks in latest version and there the test is correct:

    if (com->hasE() && !Printer::debugDryrun()) {
    p = convertToMM(com->E * axisStepsPerMM[E_AXIS]);
    if (relativeCoordinateMode || relativeExtruderCoordinateMode) {
    if (
    #if MIN_EXTRUDER_TEMP > 20
    (Extruder::current->tempControl.currentTemperatureC < MIN_EXTRUDER_TEMP && !Printer::isColdExtrusionAllowed() && Extruder::current->tempControl.sensorType != 0) ||
    #endif
    fabs(com->E) * extrusionFactor > EXTRUDE_MAXLENGTH) {
    p = 0;
    destinationPositionTransformed[E_AXIS] = currentPositionTransformed[E_AXIS] = 0;
    } else {
    destinationPositionTransformed[E_AXIS] = 0;
    currentPositionTransformed[E_AXIS] = -convertToMM(com->E);
    }

                destinationSteps[E_AXIS] = 0;
    currentPositionSteps[E_AXIS] = -p;
    } else {
    if (
    #if MIN_EXTRUDER_TEMP > 20
    (Extruder::current->tempControl.currentTemperatureC < MIN_EXTRUDER_TEMP && !Printer::isColdExtrusionAllowed() && Extruder::current->tempControl.sensorType != 0) ||
    #endif
    fabs(p - currentPositionSteps[E_AXIS]) * extrusionFactor > EXTRUDE_MAXLENGTH * axisStepsPerMM[E_AXIS]) {
    currentPositionSteps[E_AXIS] = p;
    destinationPositionTransformed[E_AXIS] = currentPositionTransformed[E_AXIS] = convertToMM(com->E);
    } else {
    destinationPositionTransformed[E_AXIS] = convertToMM(com->E);
    }
    destinationSteps[E_AXIS] = p;
    }


    You see the here for relative positions the E value is already used.

    - M82 - Set E codes absolute (default)
    - M83 - Set E codes relative while in Absolute Coordinates (G90) mode

    so slicer is doing it correct, but you seem to be on an old version with a bug in relative mode.
  • The printer I'm using is a Renkforce RF2000, it uses a forked version of the Repetier firmware from 2016. Unfortunately the company doesn't offer any support for the printer anymore, and it uses quite a few features which aren't available in the standard Repetier firmware, so I can't just update to the latest version.

    Anyway, I'm glad I managed to fix my niche issue!
Sign In or Register to comment.