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

    M291 S4 with timeout only runs a couple of commands

    Scheduled Pinned Locked Moved Solved
    Gcode meta commands
    2
    4
    207
    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.
    • kerfunundefined
      kerfun
      last edited by kerfun

      I'm trying to make a Macro that will shut down the printer after giving the user a 60 second window to cancel it once a print is finished. I created this macro called PowerOff.g that looks like this:

      M98 P"0:/macros/YesNoInput.g" H"Shutdown Requested" S"Start the shutdown procedure?" T60
      if (input == 0)
          echo "Shutting down procedure started"
          echo "test"
          M18 				; Turn off motors
          M568 H1 R41 S0		; Set hotend standby to 41 and active to 0
          M568 H1 A1			; Set hotend to standby temp
          M140 S0				; Turn bed off
          M116 H1				; Wait for hotend to reach 41 degrees (This is the lowest you can wait for a temp)
          M568 H1 A2			; Turn hotend back to active
          M42 P0 S1 			; Turn bed ps off
          M42 P1 S1 			; Turn main ps off
          echo "Sutdown finished"
      else
          echo "Shutdown won't run"
      echo "Script finished"
      

      This macro calls another macro I call "YesNoInput.g." The idea behind this is to display a yes button and a cancel button. The popup will automatically timeout and select cancel, making the printer proceed to shut down. Here is "YesNoInput.g":

      M291 R{param.H} P{param.S} K{"Yes",} T{param.T} S4 F"Yes" J1
      

      I put this in an external macro, so it doesn't cancel my main macro that does the shutdown procedure.

      The problem is when the popup is shown and the user presses cancel or when the popup times out, I only see "Shutting down procedure started" in my consol. However, I don't see "test" in my consol, and the shutdown sequence doesn't start.

      I saw this solution but I wanted to use the functionality built into the M291 command. Any help would be greatly appreciated!

      M122 Output

      === Diagnostics ===
      RepRapFirmware for Duet 3 Mini 5+ version 3.5.0-rc.3 (2024-01-24 17:56:48) running on Duet 3 Mini5plus Ethernet (SBC mode)
      Board ID: 9Z2U8-1B67A-G65J0-401GL-K592Z-ZUDS9
      Used output buffers: 1 of 40 (18 max)
      === Duet Control Server ===
      Duet Control Server version 3.5.0-rc.3 (2024-01-26 12:34:19)
      Code buffer space: 4096
      Configured SPI speed: 8000000Hz, TfrRdy pin glitches: 0
      Full transfers per second: 39.48, max time between full transfers: 73.9ms, max pin wait times: 59.6ms/9.7ms
      Codes per second: 3.55
      Maximum length of RX/TX data transfers: 4558/2432

      droftartsundefined 1 Reply Last reply Reply Quote 0
      • kerfunundefined kerfun marked this topic as a question
      • kerfunundefined
        kerfun @kerfun
        last edited by

        @kerfun I got a solution that does what I wanted to do. I have my power off script now that looks like this:

        var now = state.time
        var timeOut = 60
        M98 P"0:/macros/YesNoInput.g" H"Shutdown Requested" S"Start the shutdown procedure?" T{var.timeOut}
        
        var startShutdown = true
        
        if state.time - var.now >= {var.timeOut}
          set var.startShutdown = true
        elif input == null
          set var.startShutdown = false
        
        if var.startShutdown == true
            echo "shutdown started"
            M18            ; Turn off motors
            M568 H1 R41 S0 ; Set hotend standby to 41 and active to 0
            M568 H1 A1     ; Set hotend to standby temp
            M140 S0        ; Set bed to 0
            M116 H1        ; Wait for hotend to reach 41 degrees (This is the lowest you can wait for a temp)
            M568 H1 A2     ; Set hotend back to active
            M42 P0 S1      ; Turn bed ps off
            M42 P1 S1      ; Turn main ps off
        

        And then I have my YesNoInput.g file that looks like this:

        M291 R{param.H} P{param.S} K{"Yes",} S4 F"Yes" T{param.T} J1
        

        When the print is done I have the slicer always call the shutdown macro. When the shutdown macro runs it will ask the user if they want the printer to power down (in case they want to keep printing). If the user presses "Yes" the printer will start the shutoff procedure (the shutdown procedure usually takes pretty long because I want to wait for the hotend to cool off). If the user doesn't press any buttons on the message the printer will shut off. If the user presses "cancel" before the 60 seconds, the printer will stay on.

        1 Reply Last reply Reply Quote 0
        • droftartsundefined
          droftarts administrators @kerfun
          last edited by

          @kerfun I think you’re hitting the same problem as reported in this thread https://forum.duet3d.com/topic/34945/meta-gcode-result-variable-inconsistent-with-docs where hitting cancel immediately cancels the current job or macro. See @T3P3Tony response later in the thread for a workaround.

          Ian

          Bed-slinger - Mini5+ WiFi/1LC | RRP Fisher v1 - D2 WiFi | Polargraph - D2 WiFi | TronXY X5S - 6HC/Roto | CNC router - 6HC | Tractus3D T1250 - D2 Eth

          kerfunundefined 1 Reply Last reply Reply Quote 0
          • kerfunundefined
            kerfun @droftarts
            last edited by

            @droftarts the solution in that post doesn't seem to work for me as I want the prompt to timeout after a minute and start the shutdown process. This requires me to put the J1 in the M291 command which is giving me inconstant results. It seems like the proposed functionality of a J2 option would work for me though, but this isn't implemented yet.

            I also thought that canceling a child Macro wouldn't cancel the parent macro from this post.

            I tried making a new test that would call the same macro I posted above, "YesNoInput.g." With this new test way I could see if the parent macro is being cancelled by the child macro.

            M98 P"0:/macros/YesNoInput.g" H"Bed was cold at startup" S"Wait 10 minuets for expansion?" T5
            if (input == 0)
                echo "running yes"
                echo "still runnning yes"
            else
                echo "running no"
                echo "still running no"
            echo "done"
            

            When this Macro is run, and I select Yes in the popup "running yes", "still running yes", and "done" are printed to the console. When I run this macro and I select cancel the first time I don't get anything printed to the console. That would make me think the child macro is canceling the parent macro. However, when I run the Macro again and select cancel the popup prints "running no" to the console and that's it. This would make it seem like the child macro is partially cancelling the parent macro.

            kerfunundefined 1 Reply Last reply Reply Quote 0
            • kerfunundefined
              kerfun @kerfun
              last edited by

              @kerfun I got a solution that does what I wanted to do. I have my power off script now that looks like this:

              var now = state.time
              var timeOut = 60
              M98 P"0:/macros/YesNoInput.g" H"Shutdown Requested" S"Start the shutdown procedure?" T{var.timeOut}
              
              var startShutdown = true
              
              if state.time - var.now >= {var.timeOut}
                set var.startShutdown = true
              elif input == null
                set var.startShutdown = false
              
              if var.startShutdown == true
                  echo "shutdown started"
                  M18            ; Turn off motors
                  M568 H1 R41 S0 ; Set hotend standby to 41 and active to 0
                  M568 H1 A1     ; Set hotend to standby temp
                  M140 S0        ; Set bed to 0
                  M116 H1        ; Wait for hotend to reach 41 degrees (This is the lowest you can wait for a temp)
                  M568 H1 A2     ; Set hotend back to active
                  M42 P0 S1      ; Turn bed ps off
                  M42 P1 S1      ; Turn main ps off
              

              And then I have my YesNoInput.g file that looks like this:

              M291 R{param.H} P{param.S} K{"Yes",} S4 F"Yes" T{param.T} J1
              

              When the print is done I have the slicer always call the shutdown macro. When the shutdown macro runs it will ask the user if they want the printer to power down (in case they want to keep printing). If the user presses "Yes" the printer will start the shutoff procedure (the shutdown procedure usually takes pretty long because I want to wait for the hotend to cool off). If the user doesn't press any buttons on the message the printer will shut off. If the user presses "cancel" before the 60 seconds, the printer will stay on.

              1 Reply Last reply Reply Quote 0
              • kerfunundefined kerfun has marked this topic as solved
              • kerfunundefined kerfun has marked this topic as solved
              • First post
                Last post
              Unless otherwise noted, all forum content is licensed under CC-BY-SA