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

    Tool Change scripts not being called

    Scheduled Pinned Locked Moved
    Tuning and tweaking
    2
    4
    631
    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.
    • keyz182undefined
      keyz182
      last edited by keyz182

      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
      • chrishammundefined
        chrishamm administrators
        last edited by

        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
        • keyz182undefined
          keyz182
          last edited by

          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
          • keyz182undefined
            keyz182
            last edited by

            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
            • First post
              Last post
            Unless otherwise noted, all forum content is licensed under CC-BY-SA