• Tags
  • Documentation
  • Order
  • Register
  • Login
Duet3D Logo Duet3D
  • Tags
  • Documentation
  • Order
  • Register
  • Login

Tool Change scripts not being called

Scheduled Pinned Locked Moved
Tuning and tweaking
2
4
624
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • undefined
    keyz182
    last edited by keyz182 10 Nov 2018, 13:50 11 Oct 2018, 13:49

    I'm trying to set up single hotend/heater, dual extruder. I think I've got all the config, tfree# and tpre# scripts set up right, but when I run T0 or T1 they're not being executed. Not sure where to look/start figuring out why though.

    config.g

    ; General preferences
    G90 ; Send absolute coordinates...
    M83 ; ...but relative extruder moves
    M667 S1 ; Select CoreXY mode
    ; Network
    M550 PThreedee ; Set machine name
    M552 S1 ; Enable network
    M587 S"********" P"********" ; Configure access point. You can delete this line once connected
    M586 P0 S1 ; Enable HTTP
    M586 P1 S0 ; Disable FTP
    M586 P2 S0 ; Disable Telnet
    ; Drives
    M569 P0 S1 ; Drive 0 goes forwards
    M569 P1 S1 ; Drive 1 goes forwards
    M569 P2 S1 ; Drive 2 goes forwards
    M569 P3 S0 ; Drive 3 goes forwards
    M569 P4 S1 ; Drive 4 goes backwards
    M92 X80 Y80 Z1600.00 E414.8:402.4 ; Set steps per mm
    M350 X16 Y16 Z16 I1;E16:16 I1 ; Configure microstepping with interpolation
    M350 E64:64 ; https://wilriker.github.io/microstep-calculator/
    M566 X600 Y600 Z50 ; Set maximum instantaneous speed changes (mm/min)
    M203 X18000 Y18000 Z480 E3600:3600 ; Set maximum speeds (mm/min)
    M201 X1000 Y1000 Z240 ; Set accelerations (mm/s^2)
    M906 X1600 Y1600 Z1800 E1100:1100 I30 ; Set motor currents (mA) and motor idle factor in per cent
    M84 S30 ; Set idle timeout
    ; Retraction Settings
    ;M207 S4.5 F6500 T3500 R0.025 Z0.4 ; Distance 4.5mm, Speed 6500, de-retract 3500, extra distance 0.025, zhop 0.4
    ;M204 T7500 ; Set Travel Accel
    ;M566 E4000:4000 ; Set Extruder Jerk
    ;M201 E6600:6600 ; Set Extruder Accel
    ; Axis Limits
    M208 X0 Y-25 Z0 S1 ; Set axis minima
    M208 X300 Y285 Z290 S0 ; Set axis maxima
    ; Stall Detection
    M915 X Y S4 F0 H200 R1
    ; Endstops
    M574 Z1 S2 ; Set Z-Probe at low end
    M574 X1 Y1 S3 ; Set active high endstops
    ; Z-Probe
    M558 P8 F360 T1800 I1 R0.5 A5 S0.03
    ;M558 P8 F350 T750 I1 R0.4 A5 Z1 A0.05 H7.5 ; Piezo Z probe
    G31 P100 X0 Y0 Z-0.1 ; Set Z probe trigger value, offset and trigger height
    M557 X30:270 Y30:270 S48 ; Define mesh grid
    ; Bed Heater
    ;M305 P0 T100000 B4138 C0 R4700 ; Set thermistor + ADC parameters for heater 0
    M305 P0 T100000 B4725 C7.060000e-8 R4700
    M143 H0 S120
    ; Extruder Heaters
    M305 P1 T100000 B4725 C7.060000e-8 R4700 ; Set thermistor + ADC parameters for heater 1
    M143 H1 S285 ; Set temperature limit for heater 1 to 280C
    ; Tools
    M563 P0 D1 H1 S"Extruder1" ; Define tool 0
    G10 P0 X0 Y0 Z0 ; Set tool 0 axis offsets
    G10 P0 R0 S0 ; Set initial tool 0 active and standby temperatures to 0C
    M563 P1 D0 H1 S"Extruder2" ; Define tool 1
    G10 P1 X0 Y0 Z0 ; Set tool 1 axis offsets
    G10 P1 R0 S0 ; Set initial tool 1 active and standby temperatures to 0C
    ; Fans
    M106 P0 S0 I0 F75 H-1 C"PartFan" ; Set fan 2 value, PWM signal inversion and frequency. Thermostatic control is turned off
    M106 P1 S1 I0 F75 H1:2 T45 C"ExtruderFan" ; Set fan 1 value, PWM signal inversion and frequency. Thermostatic control is turned on
    M106 P2 S1 I0 F75 H100 T45 C"DuetCooling" ; Set fan 0 value, PWM signal inversion and frequency. Thermostatic control is turned off
    ; Automatic power saving
    M911 S22 R23 P"M913 X0 Y0 G91 M83 G1 Z3 E-5 F1000" ; Set voltage thresholds and actions to run on power loss
    ; Pressure Advance
    M572 D0 S0.02
    ; Heater 3 LEDs
    M307 H3 A-1 C-1 D-1
    M42 P3 S0
    ; Heater 4 Servo
    M307 H4 A-1 C-1 D-1
    M42 P4 S0
    ; Filament out
    ;M591 D0 P1 C3 S1
    M591 D1 P5 C4 R70:110 E3.0 S1
    T0
    ; Load override
    M501

    tfree0.g

    M117 "Freeing Extruder0"
    M83 ; Make sure extruder is in relative mode (prob not needed anymore)
    G1 E-5.0 F3600 ; Retract filament as soon as possible...
    G91 ; Relative
    G1 Z2 F600 ; ...Then lower the bed...
    G90 ; Absolute
    G1 X10 Y150 F18000 ; ...Then get the hell away from the print
    G4 S2 ; Pause two seconds to cool the retracted filament
    G1 E4.9 F3600 ; Pack the filament to eliminate the tail
    G1 E-155 F8000 ; Yank the filament past the Y adapter and into its Bowden tube

    tpre0.g

    M117 "Selecting Extruder0"
    

    tpost0.g

    M116 P0 ; wait for tool 0 only to reach operating temperature
    G1 E150 F6000 ; Extrude 145mm @ 100mm/s
    G1 E5 F1500 ; Extrude 5mm @ 25mm/s
    G91 ; Relative
    G1 Z-2 F6000 ; Raise bed
    G90 ; Absolute
    1 Reply Last reply Reply Quote 0
    • undefined
      chrishamm administrators
      last edited by 11 Oct 2018, 14:17

      The reason is quite simple, the tool change macros are not invoked if the axes are not homed when a T-code is called. If you run G28 or G92 XYZ before your T0 code in config.g, I bet it will work.

      Duet software engineer

      1 Reply Last reply Reply Quote 0
      • undefined
        keyz182
        last edited by 11 Oct 2018, 14:20

        That'll be it. Now that you say that, I seem to remember reading it a while ago, evidently that snippet of information failed to stay in my brain 🙂

        Would it be a good idea to make T commands output a message to the console along the lines of "free/pre/post scripts not executed as axes are not homed"?

        1 Reply Last reply Reply Quote 2
        • undefined
          keyz182
          last edited by 12 Oct 2018, 09:31

          I think it's as simple as this, unfortunately can't get the firmware to compile (even unchanged) to test.

          diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp
          index f3ca91a..43a2233 100644
          --- a/src/GCodes/GCodes.cpp
          +++ b/src/GCodes/GCodes.cpp
          @@ -580,59 +580,65 @@ void GCodes::RunStateMachine(GCodeBuffer& gb, const StringRef& reply)
          toolChangeRestorePoint.feedRate = gb.MachineState().feedRate;
          gb.AdvanceState();
          if ((gb.MachineState().toolChangeParam & TFreeBit) != 0)
          {
          const Tool * const oldTool = reprap.GetCurrentTool();
          if (oldTool != nullptr && AllAxesAreHomed())
          {
          String<ShortScratchStringLength> scratchString;
          scratchString.printf("tfree%d.g", oldTool->Number());
          DoFileMacro(gb, scratchString.c_str(), false);
          + }else {
          + reply.printf("No previous tool or axes not homed, skipping tfree%d.g", oldTool->Number());
          }
          }
          break;
          case GCodeState::toolChange1: // Release the old tool (if any), then run tpre for the new tool
          case GCodeState::m109ToolChange1: // Release the old tool (if any), then run tpre for the new tool
          if (LockMovementAndWaitForStandstill(gb)) // wait for tfree.g to finish executing
          {
          const Tool * const oldTool = reprap.GetCurrentTool();
          if (oldTool != nullptr)
          {
          reprap.StandbyTool(oldTool->Number(), simulationMode != 0);
          }
          gb.AdvanceState();
          if (reprap.GetTool(gb.MachineState().newToolNumber) != nullptr && AllAxesAreHomed() && (gb.MachineState().toolChangeParam & TPreBit) != 0)
          {
          String<ShortScratchStringLength> scratchString;
          scratchString.printf("tpre%d.g", gb.MachineState().newToolNumber);
          DoFileMacro(gb, scratchString.c_str(), false);
          + }else {
          + reply.printf("No previous tool or axes not homed, skipping tpre%d.g", gb.MachineState().newToolNumber);
          }
          }
          break;
          case GCodeState::toolChange2: // Select the new tool (even if it doesn't exist - that just deselects all tools) and run tpost
          case GCodeState::m109ToolChange2: // Select the new tool (even if it doesn't exist - that just deselects all tools) and run tpost
          if (LockMovementAndWaitForStandstill(gb)) // wait for tpre.g to finish executing
          {
          reprap.SelectTool(gb.MachineState().newToolNumber, simulationMode != 0);
          UpdateCurrentUserPosition(); // get the actual position of the new tool
          gb.AdvanceState();
          if (AllAxesAreHomed())
          {
          if (reprap.GetTool(gb.MachineState().newToolNumber) != nullptr && (gb.MachineState().toolChangeParam & TPostBit) != 0)
          {
          String<ShortScratchStringLength> scratchString;
          scratchString.printf("tpost%d.g", gb.MachineState().newToolNumber);
          DoFileMacro(gb, scratchString.c_str(), false);
          }
          + }else {
          + reply.printf("Axes not homed, skipping tpost%d.g", gb.MachineState().newToolNumber);
          }
          }
          break;
          case GCodeState::toolChangeComplete:
          case GCodeState::m109ToolChangeComplete:
          if (LockMovementAndWaitForStandstill(gb)) // wait for tpost.g to finish executing
          {
          // Restore the original Z axis user position, so that different tool Z offsets work even if the first move after the tool change doesn't have a Z coordinate
          currentUserPosition[Z_AXIS] = toolChangeRestorePoint.moveCoords[Z_AXIS];
          1 Reply Last reply Reply Quote 0
          4 out of 4
          • First post
            4/4
            Last post
          Unless otherwise noted, all forum content is licensed under CC-BY-SA