An implementation of the "Moody Method" for surface plate flatness.
Try It. Click "Create Tables" and then "Fill Test Data" if you don't have any real values to put in.
Two different grading standards for the overall measured flatness of a surface plate are defined by ISO and ASME. Both standards provide a list of standard table sizes and their associated flatness tolerances for the different grades as well as an equation for calculating the flatness tolerance when the size is ±5% outside the range of a standard size. The ISO equation is linear, whereas the ASME equation is a second degree polynomial (both are a function of the plate's diagonal length). An important difference between the two standards is that the equation provided by the ISO standard matches the values in the standard sizes table. This is not the case for the ASME standard.
ASME B89.3.7-2013:
4.3.4 Flatness Tolerance (Entire Work Surface)
All points of the work surface shall be contained between two parallel planes. For sizes not listed in Table 1 (more specifically, for sizes that are outside +-5% of the sizes listed in Table 1) the "AA" grade flatness tolerance can be calculated by the following second degree polynomial (D = diagonal of the plate):
Overall flatness tolerance (µm) = 1.6D² + 1 Overall flatness tolerance (µinch) = D² / 25 + 40
The tolerance for grades "A" and "B" are calculated by multiplying the "AA" tolerance grade by 2 and 4 respectively:
tolerance(A) = tolerance(AA) * 2 tolerance(B) = tolerance(AA) * 4
The specification states that the calculated flatness tolerance for grade "AA" is rounded up to the nearest 0.5 micrometer or 25 µinch increments. However, this makes the calculated values even farther off than the tabulated values.
The table values do not match the calculated values. For example:
For a 12" x 12" standard size surface plate the table lists an overall flatness tolerance of 50 µinch:
((sqrt(12² + 12²))² / 25) + 40 = ((12² + 12²) / 25) + 40 = 51.52
Rounded up to nearest 25 µinch increment = 75
This doesn't match (the calculated value is 1.52 µinches more than the table value). The rounding makes matters worse.
For a 18" x 24" standard size surface plate the table lists an overall flatness tolerance of 80 µinch:
40 + ((sqrt(18² + 24²))² / 25) = 76
Rounded up to nearest 25 µinch increment = 100
This doesn't match (the calculated value is 4 µinches less than the table value). The rounding again makes matters worse.
Here is a table that shows the difference between the tabulated and calculated values for ASME (and a comparison between ISO grade 0 and ASME grade "AA"):
Plate Length | Plate Width | Diagonal | Diagonal (µm) | AA Overall Flatness Calc (µinch) | AA Overall Flatness Table (µinch) | Diff(Calc - Table) | ISO Equation Grade 0 (µm) | ISO Grade 0 (µinch) | A Overall Flatness Calc (µinch) | B Overall Flatness Calc (µinch) | A Overall Flatness Table (µinch) | B Overall Flatness Table (µinch) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
12 | 12 | 16.97056275 | 431.0522938 | 51.52 | 50 | 1.52 | 4 | 157.480315 | 103.04 | 206.08 | 100 | 200 |
12 | 18 | 21.63330765 | 549.4860144 | 58.72 | 50 | 8.72 | 4.3 | 169.2913386 | 117.44 | 234.88 | 100 | 200 |
18 | 18 | 25.45584412 | 646.5784407 | 65.92 | 50 | 15.92 | 4.6 | 181.1023622 | 131.84 | 263.68 | 100 | 200 |
18 | 24 | 30 | 762 | 76 | 80 | -4 | 4.9 | 192.9133858 | 152 | 304 | 160 | 320 |
24 | 24 | 33.9411255 | 862.1045876 | 86.08 | 80 | 6.08 | 5.2 | 204.7244094 | 172.16 | 344.32 | 160 | 320 |
24 | 36 | 43.26661531 | 1098.972029 | 114.88 | 100 | 14.88 | 5.8 | 228.3464567 | 229.76 | 459.52 | 200 | 400 |
24 | 48 | 53.66563146 | 1363.107039 | 155.2 | 150 | 5.2 | 6.7 | 263.7795276 | 310.4 | 620.8 | 300 | 600 |
30 | 48 | 56.60388679 | 1437.738725 | 168.16 | 180 | -11.84 | 7 | 275.5905512 | 336.32 | 672.64 | 360 | 720 |
36 | 36 | 50.91168825 | 1293.156881 | 143.68 | 150 | -6.32 | 6.4 | 251.9685039 | 287.36 | 574.72 | 300 | 600 |
36 | 48 | 60 | 1524 | 184 | 200 | -16 | 7.3 | 287.4015748 | 368 | 736 | 400 | 800 |
36 | 60 | 69.97142274 | 1777.274138 | 235.84 | 250 | -14.16 | 7.9 | 311.023622 | 471.68 | 943.36 | 500 | 1000 |
36 | 72 | 80.49844719 | 2044.660559 | 299.2 | 300 | -0.8 | 8.8 | 346.4566929 | 598.4 | 1196.8 | 600 | 1200 |
48 | 48 | 67.88225099 | 1724.209175 | 224.32 | 200 | 24.32 | 7.9 | 311.023622 | 448.64 | 897.28 | 400 | 800 |
48 | 60 | 76.83749085 | 1951.672268 | 276.16 | 300 | -23.84 | 8.5 | 334.6456693 | 552.32 | 1104.64 | 600 | 1200 |
48 | 72 | 86.53323061 | 2197.944058 | 339.52 | 350 | -10.48 | 9.1 | 358.2677165 | 679.04 | 1358.08 | 700 | 1400 |
48 | 96 | 107.3312629 | 2726.214078 | 500.8 | 500 | 0.8 | 10.9 | 429.1338583 | 1001.6 | 2003.2 | 1000 | 2000 |
48 | 120 | 129.2439554 | 3282.796466 | 708.16 | 700 | 8.16 | 12.4 | 488.1889764 | 1416.32 | 2832.64 | 1400 | 2800 |
60 | 120 | 134.1640786 | 3407.767598 | 760 | 750 | 10 | 13 | 511.8110236 | 1520 | 3040 | 1500 | 3000 |
72 | 96 | 120 | 3048 | 616 | 600 | 16 | 11.8 | 464.5669291 | 1232 | 2464 | 1200 | 2400 |
72 | 144 | 160.9968944 | 4089.321117 | 1076.8 | 1100 | -23.2 | 14.8 | 582.6771654 | 2153.6 | 4307.2 | 2200 | 4400 |
We believe that the table values should be changed to match the calculated values from the second degree polynomial and that the advice on rounding up to the nearest 25 µinches for calculated values should be abandoned.
- Add a way to show a semi-transparent plane that corresponds to grade "AA", "A", and "B" flatness. tolerance(AA) = (40 + diagonal squared/25) x .000001″, A = tolerance(AA) * 2, B=tolerance(AA) * 4
- Show a scale for the z-axis height values or add axes to the 3D scene.
- Add a thickness for the table slab (add manufacturer's label).
- Allow for "importing" a number set (maybe from a CSV file or a textarea with a simple format).
- Fix the way that some measuring lines are cut off on the 3D representation (this happens because the vertices are located at the first foot location).
- Make zooming relative to where the mouse cursor is (keep the mouse centered on zoom).
You can just open index.html to run MoodyJS but because external resources are used (textures) these assets need to be served via http:// (and not file://) for the browser not to complain.
This can be done by running npm run serve
in the root project directory.
Bruce Allen - Published a very useful paper that corrects some mistakes from Moody's original magazine article and provides some useful citations.