Since I can't do any printing at the moment (printer is broken), I have put together a bit of a tutorial on "best practice" when creating conditional G code.
There will be many far more qualified people than I on the forum to do this, and I'm sure that there is better and more concise documentation coming, but some may find it useful.
It is far from a complete or even comprehensive treatise on the subject, nor is it meant to be.
Feel free to correct, disagree or ignore as you see fit.
Especially since the code therein is untested (printer broken remember)
Conditional G Code best practice.pdf
Best posts made by OwenD
-
Conditional G Code introduction "tutorial" (PDF)
-
RE: Baby Stepping.. can it, or can it not be permanent?
just run a macro. (assuming you're running RRF3)
You could either do it manually or put it in the stop gcode of your slicer;save_babystep.g ; Add babystep to Z offset and make "persistant" if move.axes[2].babystep !=0 echo {"Z trigger height altered by " ^ move.axes[2].babystep ^ "mm"} echo {"OLD: " ^ sensors.probes[0].triggerHeight ^ " new: " ^ sensors.probes[0].triggerHeight - move.axes[2].babystep} G31 Z{sensors.probes[0].triggerHeight - move.axes[2].babystep} M500 P10:31 ; save settings to config-overide.g - Must have M501 in config.g else echo "No babystepping set. Nothing to save"
EDIT: Original post incorrectly added baby steps to trigger height. It should subtract.
-
Pressure Advance Tuning file generator
Hi All,
In my quest to tune my various settings I decided I needed to be able to automatically generate a test file that would change the pressure advance at set intervals.
The only programming language I know is Delphi/Lazarus, so I created a windows application to carry out the task.Essentially that application creates a square box with two wall perimeters.
The inner wall prints at a constant speed and acts merely for support.
The outer wall alternates between a high and low speed with the transition point being mid way along the wall.
At the end of each layer a retraction is added.This allows you to see how the PA adjustments are affecting corners at the two speeds and how it is affecting the retraction settings.
A start and end G code section takes care of temps etc.
Here are some pics of tests starting a PA of zero and increasing by 0.05 every 5mm in height.
My printer runs about a 350mm bowden tube.Pic 1: PA range 0-0.35
Note the distinct thickness variations at the speed change point and the blobbing at the retraction/layer change point.
Pic2: PA Range 0.4-0.75
Transition line still faintly visible and some issues around retraction area
Pic3: PA range 0.8-1.15
Looks pretty good at about mid way
Pic4: PA range 1.2-1.55
Here we can see that pressure advance is starting to cause too much retraction.
I'd either have to reduce PA or try again with less retraction.
If anyone would like to try the application and provide feedback , I have put a link to my dropbox.
Download link:
https://www.dropbox.com/s/nolo5aca26e7fni/PaAdvanceTestInstall_v1-0.zip?dl=0BE WARNED!!
This should be considered very much beta software.
Use at your own risk.
I've only tested on Windows 10.I'm not sure my extrusion volume calculations are 100% accurate.
They seem close, but not identical to Cura's values.
At any rate it seems good enough for the test purposes. -
Macro for "automatic" calibration of BL Touch
This macro uses variables so needs RRF3.3b2 or later.
EDIT: Object model values for M558 are now stored in mm/min so no conversion necessary. - please used amended macro below which includes improvements and corrects some errors pointed out in this thread by other users.
It prompts you to jog the nozzle to the bed and then runs 10 probe offset tests (this number is configurable as a variable)
At the end, it discards the highest and lowest reading and averages the rest.
You can then choose to save the result in config-overide.g;Calibrate BL Touch ; Reprap firmware version 3.3b2 or later required! ; if two speed probing is configured in M558,we probably want to reduce the speed for this test var ProbeSpeedHigh = sensors.probes[0].speeds[0]*60 ; Speeds are saved in mm/sec in the object model but M558 uses mm/min var ProbeSpeedLow = sensors.probes[0].speeds[1]*60 M558 F60 ; reduce probe speed to 60mm/min for accuracy - adjust F parameter as required ;define some variables to store readings var NumTests=10 ; modify this value to define number of tests ; Do not change below this line var RunningTotal=0 var Average=0 var Lowest=0 var Highest=0 ; If the printer hasn't been homed, home it if !move.axes[0].homed || !move.axes[1].homed || !move.axes[2].homed G28 else G1 Z{sensors.probes[0].diveHeight} F360 ; if axes homed move to dive height M561 ; clear any bed transform M290 R0 S0 ; clear babystepping ; move nozzle to centre of bed G1 X{(move.axes[0].min + move.axes[0].max)/2} Y{(move.axes[1].min + move.axes[1].max)/2} M564 S0 H0 ; Allow movement beyond limits ;ensure you have room for the probe if move.axes[2].machinePosition < sensors.probes[0].diveHeight G1 Z{sensors.probes[0].diveHeight} M280 P0 S160 I1 ; reset BL Touch G4 S0.5 M98 P"0:/sys/retractprobe.g" ; Ensure probe is retracted & reset G4 S0.5 M561 ; clear any bed transform ; Jog head to position M291 P"Jog nozzle to touch bed" R"Set nozzle to zero" S3 Z1 G92 Z0 ; set Z position to zero M291 P"Press OK to begin" R"Ready?" S3; ; Move probe over top of same point that nozzle was when zero was set G1 Z{sensors.probes[0].diveHeight}; lift head G1 X{move.axes[0].machinePosition - sensors.probes[0].offsets[0]} Y{move.axes[1].machinePosition - sensors.probes[0].offsets[1]} F1800 echo "Current probe offset = " ^ sensors.probes[0].triggerHeight ^ "mm" ; carry out 10 probes (or what is set in NumTests variable) while iterations < var.NumTests G1 Z{sensors.probes[0].diveHeight} ; move to dive height if sensors.probes[0].value[0]=1000 ; if probe is in error state echo "Probe in error state- resetting" M280 P0 S160 I1 ; reset BL Touch G4 S0.5 M98 P"0:/sys/retractprobe.g" ; Ensure probe is retracted & reset G4 S0.5 G30 S-1 M118 P2 S{"Test # " ^ (iterations+1) ^ " Triggered @ " ^ move.axes[2].machinePosition ^ "mm"} ; send trigger height to Paneldue console M118 P3 S{"Test # " ^ (iterations+1) ^ " Triggered @ " ^ move.axes[2].machinePosition ^ "mm"} ; send trigger height to DWC console if iterations == 0 set var.Lowest={move.axes[2].machinePosition} ; set the new lowest reading to first probe height set var.Highest={move.axes[2].machinePosition} ; set the new highest reading to first probe height if move.axes[2].machinePosition < var.Lowest set var.Lowest={move.axes[2].machinePosition} ; set the new lowest reading ;M118 P3 S{"new low reading = " ^ move.axes[2].machinePosition} ; send trigger height to DWC console G4 S0.3 if move.axes[2].machinePosition > var.Highest set var.Highest={move.axes[2].machinePosition} ; set the new highest reading ;M118 P3 S{"new high reading = " ^ move.axes[2].machinePosition} ; send trigger height to DWC console G4 S0.3 set var.RunningTotal={var.RunningTotal + move.axes[2].machinePosition} ; set new running total ;M118 P3 S{"running total = " ^ var.RunningTotal} ; send running total to DWC console G4 S0.5 set var.Average = {(var.RunningTotal - var.Highest - var.Lowest) / (var.NumTests - 2)} ; calculate the average after discarding th ehigh & low reading ;M118 P3 S{"running total = " ^ var.RunningTotal} ; send running total to DWC console ;M118 P3 S{"low reading = " ^ var.Lowest} ; send low reading to DWC console ;M118 P3 S{"high reading = " ^ var.Highest} ; send high reading to DWC console M118 P2 S{"Average excluding high and low reading = " ^ var.Average} ; send average to PanelDue console M118 P3 S{"Average excluding high and low reading = " ^ var.Average} ; send average to DWC console G31 P500 Z{var.Average} ; set Z probe offset to the average reading M564 S0 H1 ; Reset limits M558 F{var.ProbeSpeedHigh}:{var.ProbeSpeedLow} ; reset probe speed to original G1 Z{sensors.probes[0].diveHeight} F360 ; move head back to dive height M291 P{"Trigger height set to : " ^ sensors.probes[0].triggerHeight ^ " OK to save to config-overide.g, cancel to use until next restart"} R"Finished" S3 M500 P31 ; optionally save result to config-overide.g
-
RE: oibject model "status" dcos.
@Tinchus
Political correctness has spread even to RRF.
In the spirit of inclusiveness , you must now use "processing" in deference to those machines that do not identify as "printers" -
Setting up video streaming using raspberry pi
Recently I had to set up a Raspberry Pi is camera to use as a monitoring device for my printer.
I found that pretty much all the online information was outdated and had no end trouble getting it to work on the current version of Pi OS (BullseyeBookworm).
The entire camera and video handling system has changed over the years.
So I decided to document what worked for me.
In the end it was relatively easy (once you knew the correct steps0I must first point out I know bugger all about Linux.
All this work is taken from bits and pieces I found on various sites and cobbled together, so my apologies for not crediting the original author(s)NOTE: These instructions were done using a Raspberry Pi 4 running
BullseyeBookworm 64 bit and an official Pi camera
Also if you're running RRF in SBC mode, you don't need to do this as I believe it has a built in camera setup.The first step is to install the OS using the Pi Imager
https://www.raspberrypi.com/software/When prompted, choose your user name, password and Wifi details.
NOTE: The current version no longer uses the default user pi and password raspberrywhen you get to this point, click on "edit settings"
Enable SSH so that you can connect to the Pi via PUTTY rather than always needing a monitor and keyboard.
If you installed a Pi OS that has a desktop you can use the inbuilt command line terminal for all the steps listed below.Then click on YES to apply the settings.
Once the image has been loaded onto the SD card, insert the card in your Pi and start it up.
Start Putty (or some other terminal) and SSH into the Pi
If you used the default settings, you should be able to go to
raspberrypi.local
You should see something like this
You may get any updates/upgrade by using these commands
sudo apt update
sudo apt upgrade
sudo apt install
Change directory
cd /usr/local/bin/
Open a text edior
sudo nano streamVideo.py
Paste in the following code
#!/usr/bin/python3 # This is the same as mjpeg_server.py, but uses the h/w MJPEG encoder. import io import logging import socketserver from http import server from threading import Condition from picamera2 import Picamera2 from picamera2.encoders import MJPEGEncoder from picamera2.outputs import FileOutput PAGE = """\ <html> <head> <title>3D Printer Camera</title> </head> <body> <img src="stream.mjpg" width="800" height="600" /> </body> </html> """ class StreamingOutput(io.BufferedIOBase): def __init__(self): self.frame = None self.condition = Condition() def write(self, buf): with self.condition: self.frame = buf self.condition.notify_all() class StreamingHandler(server.BaseHTTPRequestHandler): def do_GET(self): if self.path == '/': self.send_response(301) self.send_header('Location', '/index.html') self.end_headers() elif self.path == '/index.html': content = PAGE.encode('utf-8') self.send_response(200) self.send_header('Content-Type', 'text/html') self.send_header('Content-Length', len(content)) self.end_headers() self.wfile.write(content) elif self.path == '/stream.mjpg': self.send_response(200) self.send_header('Age', 0) self.send_header('Cache-Control', 'no-cache, private') self.send_header('Pragma', 'no-cache') self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME') self.end_headers() try: while True: with output.condition: output.condition.wait() frame = output.frame self.wfile.write(b'--FRAME\r\n') self.send_header('Content-Type', 'image/jpeg') self.send_header('Content-Length', len(frame)) self.end_headers() self.wfile.write(frame) self.wfile.write(b'\r\n') except Exception as e: logging.warning( 'Removed streaming client %s: %s', self.client_address, str(e)) else: self.send_error(404) self.end_headers() class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer): allow_reuse_address = True daemon_threads = True picam2 = Picamera2() picam2.configure(picam2.create_video_configuration(main={"size": (640, 480)})) output = StreamingOutput() picam2.start_recording(MJPEGEncoder(), FileOutput(output)) try: address = ('', 8888) server = StreamingServer(address, StreamingHandler) server.serve_forever() finally: picam2.stop_recording()
Press CTRL + X to exit and choose Y to save file
change directory
cd /etc/systemd/system
Open the text editor to create a system service file
sudo nano streamVideo.service
Paste in the following code
[Unit] Description=A script for straming video to http After=syslog.target network.target [Service] WorkingDirectory=/usr/local/bin/ ExecStart=/usr/bin/python3 /usr/local/bin/streamVideo.py Restart=always RestartSec=120 [Install] WantedBy=multi-user.target
PRess CTRL + X
press Y and enter to saveEnter the following to reload the daemon
sudo systemctl daemon-reload
Enable the service
sudo systemctl enable streamVideo.service
You should see something like
Created symlink /etc/systemd/system/multi-user.target.wants/streamVideo.service ā /etc/systemd/system/streamVideo.service.
Restart the Pi
sudo shutdown -r now
After the Pi has rebooted, you should be able to access the stream by going to the following URL in your browser
http://raspberrypi.local:8888/index.html
In DWC you need to enter this URL on order to get the stream
http://raspberrypi.local:8888/stream.mjpg
Your video stream should now be visible in the Webcam tab
I hope this saves someone some frustration.
-
RE: Reprap G-Code syntax now part of RJ TextEd text editor
I have updated the syntax file for RJ TextEd to include more object model items.
I have also included a suggested colour format file.
You will need to update RJ TextEd to the latest version in order to take advantage of hints etc.Replace the existing files (reprap.syx, reprap.ini) in C:\Users"yourname"\AppData\Roaming\RJ TextEd\Syntax
Copy the file "Reprap Dark.xml" to C:\Users"yourname"\AppData\Roaming\RJ TextEd\Syntax color themes\To install.
1: Go to ENVIRONMENT > THEMES > CUSTOMISE
2: Select "Reprap G Code" from the drop down list of highlighters
3: Click the button, and select import colors from file
4: Select the "Reprap Dark.xml" file previously copied.
You can customize the colours to suit yourself.
Different G Code parameters such as X, Y, Z , E, F, G etc can be coloured to make individually.
Likewise, comments and other items can be individually coloured.
-
Forum categories for conditional Gcode & macros
Now that 3.1 is released, I think it would be beneficial to have a forum category dedicated to conditional gcode & macros.
This should probably be broken down into various kinematic types.
Furthermore it may be good to have some sort of āduet approvedā marker like the āsolvedā marker, once the macros have been peer reviewed and improved where necessary.
I usually try to make macros āportableā by not hard coding anything, but the very fact that certain parts of the object model are not visible if you donāt run that type of configuration, probably makes putting them in the categories for which they were designed beneficial and will reduce angst and support time.
(Yes, I know we should be checking for null objects and kinematic types as a matter of course in every macro)
Which leads to my final point, which is once we have some documentation on the object model, perhaps someone could do a small tutorial on best practice when writing macros.
My programming background is not in C or its variants so I admit Iām constantly searching for proper syntax etc.
To a non-programmer it is just gobbledygook.
If thereās going to be dozens of people learning to do it, they may as well learn to do it in a way that ensure portability and reduces the chance of unexpected issues.
Iāve always found it usually takes 10 lines of code to do the job, the another 50 lines of code to stop people trying to do it out of order or in a way you never imagined -
RE: Setting up video streaming using raspberry pi
I found another application that works quite easily and has the benefit of being able to adjust all the settings from the web interface.
It's called picamera2-WebUI-Lite
There's a slight error on the instructions to install and it doesn't tell you how to set it up as a service, so I've listed thesteps.
To install.
SSH into your PI (or open a terminal if using a desktop)
Change directory
cd /usr/local/bin/
Clone the repositry
sudo git clone https://github.com/monkeymademe/picamera2-WebUI-Lite.git
Change directory
cd /usr/local/bin/picamera2-WebUI-Lite
Test that it's running
python3 app.py
Open your browser and go to
http://raspberrypi.local:8080/To see just the video feed go to
http://raspberrypi.local:8080/video_feedGo back to the terminal and hot CTRL + C to shut the app down
To set it up as a service
Change directorycd /etc/systemd/system
Open a text editor to create a system service file
sudo nano webui-lite.service
Paste in the following
[Unit] Description=Start script for WebUi-Lite as a service After=syslog.target network.target [Service] WorkingDirectory=/usr/local/bin/picamera2-WebUI-Lite/ ExecStart=/usr/bin/python3 /usr/local/bin//picamera2-WebUI-Lite/app.py Restart=always RestartSec=120 [Install] WantedBy=multi-user.target
Press CTRL + X to exit and Y to save
Reload the daemon
sudo systemctl daemon-reload
Enable the service
sudo systemctl enable webui-lite.service
NOTE that if you already have the other streamVideo service I listed above using Picamera you will have to disable it as you can't run both.
sudo systemctl disable streamVideo.service
Reboot the system to make sure the service starts
sudo shutdown -r now
Adjust your DWC settings as follows
This will allow you to easily get to the settings page by clicking on the webcam image in DWC
From there adjust your resolution and you can also zoom in a particular area using the scaler crop settings.Full view
Cropped view
-
RE: Conditional G Code - RJ TextEd Syntax file.
For those using RJ Text Editor, I have posted an updated syntax file that includes the new object model items and G Codes contained in RRF3.5.0 b2
It can be downloaded here
https://www.rj-texted.se/Forum/viewtopic.php?p=18659#p18659It includes mouse over hints for G Code commands and auto-complete
The program comes with the RRF syntax file as standard but you may need to update it as new firmware versions come out.
Latest posts made by OwenD
-
RE: Home Z incorrect position
@SonnyD1
I'm afraid I know nothing about scanning probes, so I'll leave that for someone else -
RE: Home Z incorrect position
You have M557 commented out in your config so I'm guessing it's (the probe grid) undefined when you access the object model variables in your home.z
; Mesh Bed Compensation ;M557 X25:175 Y25:175 S40:40 ; define grid for mesh bed compensation
Try echoing the variable positions to confirm
; home Z
var xCenter = move.compensation.probeGrid.mins[0] + (move.compensation.probeGrid.maxs[0] - move.compensation.probeGrid.mins[0]) / 2 - sensors.probes[0].offsets[0]
var yCenter = move.compensation.probeGrid.mins[1] + (move.compensation.probeGrid.maxs[1] - move.compensation.probeGrid.mins[1]) / 2 - sensors.probes[0].offsets[1]echo "x position " , var.Center
echo "y position " , var.yCenterG1 X{var.xCenter} Y{var.yCenter} F6000 ; go to bed centre
M558 F4000:150 -
RE: metacode rread-only variables
@dc42 said in metacode rread-only variables:
@OwenD using 'const' wouldn't affect the memory usage.
Ah well.
In that case I can dress in either direction.
Can't hurt anyone and may help some. -
RE: metacode rread-only variables
@dc42 said in metacode rread-only variables:
maybe "global const" could create a global constant and "const" by itself create a local constant.
This is probably closest to convention with most languages.
If it resulted in lower memory usage then I'd vote for it. -
RE: Triggering 'Load Filament' prompt with a macro
@Surgikill said in Triggering 'Load Filament' prompt with a macro:
@dc42 Yes, I am doing that now. However, I want the prompt to contain options that are dynamically created based on the content of "0:/filaments". I don't want to update the prompt every time I add a filament, or modify the name of a filament. Just like how DWC creates the prompt when pressing the 'Load Filament' button.
At present RRF doesn't have any string handling routines and no way of extracting file information or file lists.
The best you can do is use the object model item
move.extruders[0].filament
which will show the currently loaded filament (or null)
I ran into a similar issue trying to create a filament change macro to use from PanelDue as my printer is in the shed and my computer inside.
I had to manually list all the filament types I use in an array.This is what I came up with.
It may (or may not) help in your case.; ChangeFilament.g ; requires RRF 3.5 or later! ; list of filaments must follow rules for array ; https://docs.duet3d.com/User_manual/Reference/Gcode_meta_commands#array-expressions var filaments = {"ABS","ABS-CF","ABS-GF","ASA","EDGE","eFlex","eLastic","FLEX","HIPS","NGEN","NYLON","PA-CF","PC","PCABS","PDVF","PEEK","PEI","PEKK","PET","PETG","PLA","POM","PP","PSU","PVA","SCAFF","TPE","TPU",} ; list your filaments here var maxBtns = 10; Max number of buttons per page on PanelDue. Adjust as required. 5 works OK on 7"paneldue - 9 is max! ; don't change below here var thisTool = state.currentTool var allTools = vector(#tools,null) if var.thisTool = -1 if #tools > 1 while iterations < #tools set var.allTools[iterations] = tools[iterations].name ^ "" M291 S4 P"Select tool" K{var.allTools} F0 T{input} G4 S1 if state.currentTool = -1 abort "No tool selected" else set var.thisTool = state.currentTool else T1 var thisExtruder = 0 var allExtruders = vector(#tools[var.thisTool].extruders,null) if #tools[var.thisTool].extruders > 1 while iterations < #tools[var.thisTool].extruders set var.allExtruders[iterations] = iterations ^ "" M291 P"Select extruder" S4 K{var.allExtruders} F0 set var.thisExtruder = input var thisFilament = move.extruders[tools[var.thisTool].extruders[var.thisExtruder]].filament var newFilament = null if var.maxBtns > 10 set var.maxBtns = 10 echo "Paneldue can only display 10 buttons in total" echo "Max buttons has been reset" var thisPage = vector(var.maxBtns,"") var numPages = floor(#var.filaments / (var.maxBtns - 1)) if mod(#var.filaments , var.maxBtns - 1) > 0 set var.numPages = var.numPages + 1 var pagesDone = 0; var btnsDone = 0 var nextFilament = "" var nextItem = 0 while var.pagesDone < var.numPages set var.thisPage = vector(var.maxBtns,"") set var.btnsDone = 0 while var.btnsDone < var.maxBtns-1 set var.nextItem = iterations + (var.pagesDone * (var.maxBtns-1)) if var.nextItem = #var.filaments break set var.thisPage[var.btnsDone] = var.filaments[var.nextItem] set var.nextFilament = var.filaments[var.nextItem] set var.btnsDone = var.btnsDone + 1 if var.pagesDone = var.numPages - 1 set var.thisPage[{var.maxBtns-1}] = "Cancel" else set var.thisPage[{var.maxBtns-1}] = "Next" set var.pagesDone = var.pagesDone + 1 M291 P"Select filament" S4 K{var.thisPage} if input = var.maxBtns-1 continue else set var.newFilament = var.thisPage[input] break if (var.newFilament = null) || (var.newFilament = "") abort "No filaments chosen" else echo "Filament chosen : ", var.newFilament, " : commence change" ; M701 only works if the tool only has one extruder ; If more than one extruder is present on the tool, we'll directly call the macros for load, unload and config ; It's unclear if the filament will be marked as loaded in DWC after this approach. if var.newFilament = "noFilament" if #tools[var.thisTool].extruders > 1 M98 P{directories.filaments ^ var.newFilament ^ "/load.g"} S{var.thisExtruder} M98 P{directories.filaments ^ var.newFilament ^ "/config.g"} S{var.thisExtruder} else M701 S{var.newFilament} if result != 0 abort "Error during loading" M703 else if (var.thisFilament != "noFilament") && (var.thisFilament != null) if #tools[var.thisTool].extruders > 1 ; M701 only works if the too only has one extruder M98 P{directories.filaments ^ var.newFilament ^ "/unload.g"} S{var.thisExtruder} M98 P{directories.filaments ^ var.newFilament ^ "/load.g"} S{var.thisExtruder} M98 P{directories.filaments ^ var.newFilament ^ "/config.g"} S{var.thisExtruder} else M702 M701 S{var.newFilament} if result != 0 abort "Error during loading" M703
-
RE: avoid crashing the bed if probe fails
From the docs..,
The H parameter defines the Z probe dive height, which is the height above the trigger height from which probing starts. The default is 3mm or 5mm depending on firmware version. You may wish to increase it during initial calibration. When using mesh bed compensation or running G30 commands with specified XY coordinates (for example from the bed.g file), the firmware moves the Z probe to this height above where it expects the bed to be before commencing probing. The maximum depth of probing from this position is twice the dive height.I think you'll find on straight G30 Z home, the dive height is ignored as the height is unknown.
Otherwise you would never be able to home from any height.
About the best you can do is check for typical errors before you start using the object model.I use this macro which is called before any Z homing or bed leveling
check BL Touch var probeOK = true if sensors.probes[0].value[0]=1000 ; if probe is in error state set var.probeOK = false echo "Probe in error state- resetting" M280 P0 S160 ; reset BL Touch G4 S0.5 if state.gpOut[0].pwm < 0.05 set var.probeOK = false echo "Probe is already deployed - retracting" M98 P"0:/sys/retractprobe.g" G4 S0.5 if sensors.endstops[2].triggered set var.probeOK = false echo "Probe is already triggered - resetting" M280 P0 S160 ; reset BL Touch G4 S0.5
I also use this check in my homeall.g to cancel the print if any errors occur during homing
Any successful command should return a value of 0G30 ; home Z by probing the bed if result !=0 abort "Print cancelled due to probe error"
Outside that, you'd have to have a secondary switch, pressure sensor or similar attached I'd think.
-
RE: Movement halted because of step timing [version 3.6.0-beta.1]
@dc42
I have attached the config.g and the other macros called.
Also the filament config.g as that is where I am setting pressure advance if that's relevant.config(ABS).g
set_max_speeds.g
config.g
setInputShaping.g
config-override.g
daemon.g -
RE: M300 Behavior is Inconsistent in 3.5
@curieos
I've found that if you have much going on in daemon.g the any "songs" will be very erratic in behaviour.
I have a variable at the start of daemon.g which allows me to temporarily skip it, which helps, but doesn't make it perfect.
I suspect there's so much going on in the firmware now that's taking up cycles that M300 will not be useful for much more than single tones. -
Movement halted because of step timing [version 3.6.0-beta.1]
Just had this error occur again.
It's not 100% repeatable as I've had it fail twice on the same print (with two firmware versions) but print successfully the next try.
Both failures were 5-6 hours into the print.M122 === Diagnostics === RepRapFirmware for Duet 2 WiFi/Ethernet version 3.6.0-beta.1 (2024-09-24 10:07:04) running on Duet WiFi 1.02 or later Board ID: 08DGM-917NK-F2MS4-7J1DA-3S86T-TZTWD Used output buffers: 10 of 26 (26 max) === RTOS === Static ram: 23360 Dynamic ram: 71876 of which 12 recycled Never used RAM 8860, free system stack 100 words Tasks: NETWORK(2,nWait 6,15.7%,181) ACCEL(6,nWait 5,0.0%,345) HEAT(3,nWait 5,0.1%,307) Move(4,invalid,3.6%,266) MAIN(1,running,80.1%,630) IDLE(0,ready,0.5%,29), total 100.0% Owned mutexes: WiFi(NETWORK) === Platform === Last reset 09:14:16 ago, cause: software Last software reset at 2024-09-22 17:49, reason: User, Gcodes spinning, available RAM 22200, slot 2 Software reset code 0x0003 HFSR 0x00000000 CFSR 0x00000000 ICSR 0x00400000 BFAR 0xe000ed38 SP 0x00000000 Task MAIN Freestk 0 n/a Error status: 0x1c Aux0 errors 0,0,0 MCU temperature: min 19.6, current 26.3, max 26.7 Supply voltage: min 0.4, current 24.2, max 24.5, under voltage events: 0, over voltage events: 0, power good: yes Heap OK, handles allocated/used 99/22, heap memory allocated/used/recyclable 2048/596/212, gc cycles 945 Events: 0 queued, 0 completed Date/time: 2024-09-28 16:07:45 Slowest loop: 1122.06ms; fastest: 0.10ms I2C nak errors 0, send timeouts 0, receive timeouts 0, finishTimeouts 0, resets 0 === Storage === Free file entries: 8 SD card 0 detected, interface speed: 20.0MBytes/sec SD card longest read time 13.0ms, write time 417.1ms, max retries 0 === Move === Segments created 582, maxWait 3825401ms, bed comp in use: mesh, height map offset 0.000, hiccups added 0 (0.00ms), max steps late 1, ebfmin 0.00, ebfmax 0.00 Pos req/act/dcf: 8937.00/8893/0.97 7099.00/7144/-0.16 48408.00/48408/0.00 no step interrupt scheduled Driver 0: standstill, SG min n/a Driver 1: standstill, SG min 201 Driver 2: standstill, SG min 0 Driver 3: standstill, SG min 0 Driver 4: standstill, SG min 228 Driver 5: Driver 6: Driver 7: Driver 8: Driver 9: Driver 10: Driver 11: === DDARing 0 === Scheduled moves 2520037, completed 2520035, LaErrors 0, Underruns [21, 0, 0] === Heat === Bed heaters 0 -1 -1 -1, chamber heaters -1 -1 -1 -1, ordering errs 0 Heater 0 is on, I-accum = 0.3 Heater 1 is on, I-accum = 0.3 === GCodes === Movement locks held by null HTTP is idle in state(s) 0 Telnet is idle in state(s) 0 File is idle in state(s) 3 USB is idle in state(s) 0 Aux is idle in state(s) 0 Trigger is idle in state(s) 0 Queue is idle in state(s) 0 LCD is idle in state(s) 0 Daemon is doing "G4 S2" in state(s) 0 0, running macro Autopause is idle in state(s) 0 Q0 segments left 9 Code queue 0 is empty === Filament sensors === check 107327487 clear 16019414 Extruder 0 sensor: ok === Network === Slowest loop: 1253.54ms; fastest: 0.00ms Responder states: HTTP(0) HTTP(4) HTTP(0) FTP(0) Telnet(0) HTTP sessions: 1 of 8 === WiFi === Interface state: active Module is connected to access point Failed messages: pending 0, notrdy 0, noresp 0 Firmware version 2.1.0 MAC address bc:dd:c2:89:a0:bb Module reset reason: Power up, Vcc 3.38, flash size 4194304, free heap 40588 WiFi IP address 192.168.1.163 Signal strength -41dBm, channel 6, mode 802.11n, reconnections 0 Clock register 00002002 Socket states: 0 0 0 0 0 0 0 0
EDIT
One difference this time is that when I shut the power off, no resurrect.g was created, so it looks like I've lost this print. -
RE: G94 appears in resurect.g - FFF Mode (3.6.0-alpha.5+1 )
Now the print is finished I have just tested sending G94 from the command line and it gives no errors, so I've answered that half of the question.