I started to write an application that calculates the estimated total print time from the G-code file for an already sliced model.
The program works and it's pretty accurate.
It works as follows:
- It scans the entire G-code file to identify all of the movements
- It calculates the time for each move by dividing segment distance by the speed in mm/s.
Let's assume this is the G-code:
G28 ; home all axes
G1 Z0.200 F5400.000
G1 X158.878 Y27.769 E6.65594 F900.000
This is the calculation it does:
totalTime = 0
# G28 ; home all axes
currentX = 0 mm
currentY = 0 mm
currentZ = 0 mm
# G1 Z0.200 F5400.000
newZ = 0.2 mm
mmPerSecond = 5400 / 60 = 90 mm/s
deltaZ = newZ - currentZ = 0.2 - 0 = 0.2 mm
segmentLength = deltaZ = 0.2 mm
moveTime = segmentLength / mmPerSecond = 0.2 / 90 = 0.002 s
totalTime = totalTime + moveTime = 0 + 0.002 = 0.002 s
# G1 X158.878 Y27.769 E6.65594 F900.000
newX = 158.878 mm
newY = 27.769 mm
mmPerSecond = 900 / 60 = 15 mm/s
deltaX = newX - currentX = 158.878 - 0 = 158.878 mm
deltaY = newY - currentY = 27.769 - 0 = 27.769 mm
segmentLength = square_root(deltaX² + deltaY²) = 161.287 mm
moveTime = deltaZ / mmPerSecond = 161.287 / 15 = 10.755 s
totalTime = totalTime + moveTime = 0.002 + 10.755 = 10.757 s
In this example, the print will take approximately 10.7 seconds.
More generally, the formula used is, for each movement:
moveTime = segmentLength / mmPerSecond
By summing up all the move times, we have the total estimated print time.
I've seen that some forums state that the 3D print time also depends on some settings on the 3D printer, especially Acceleration X, Acceleration Y, Acceleration Z, Jerk, and Z-Jerk.
I'd like to make it possible to use those values to more accurately calculate print time; however, I don't understand how those values affect the move time:
- How should Acceleration and Jerk be considered; and, how do they speed up or slow down the print time?
- How should I edit my formula in order to include Acceleration and Jerk in the print time calculation?