public List <double> ComputeCuttingForces(List <double> toolAngles) { CutPropertyCache prop = GetCutProperties(); List <double> results = new List <double>(); double k_z_resolution = Math.Max(0.001, prop.d / 100.0); double toolradius = prop.tooldiam / 2; double angleStep = toolAngles[1] - toolAngles[0]; foreach (double angle in toolAngles) { double total = 0; for (double tooth = 0; tooth < prop.teeth; tooth++) { double toothStartAngle = angle + 360 * (tooth / prop.teeth); double toothResult = 0; for (double z = prop.d; z >= 0; z -= k_z_resolution) //for (double z = 0; z <= prop.d; z += k_z_resolution) { double toothAngle = toothStartAngle + (180 / Math.PI) * (-z) * Math.Tan(prop.helix * (Math.PI / 180)) / toolradius; toothAngle = wrap(toothAngle, 360); double engagementAngle = Math.Acos(1.0 - prop.r / toolradius) * (180 / Math.PI); double engagementStartAngle = 180 - engagementAngle; double chipThickness = 0; if (toothAngle > engagementStartAngle && toothAngle < 180) { chipThickness = prop.fpt * Math.Sin(toothAngle * (Math.PI / 180)); } double materialRemoved = chipThickness * k_z_resolution * Math.Sin(angleStep * Math.PI / 180) * toolradius; toothResult += materialRemoved; } total += toothResult; } double rpm = 12 * prop.speed / (Math.PI * prop.tooldiam); double mrr = total * rpm; double feedfactor = 0.417 * Math.Pow(prop.fpt, -0.197); double powertool = feedfactor * prop.Kp * prop.wear * mrr; double powermotor = powertool / prop.E; double Fc = powertool * 550 / (prop.speed / 60); results.Add(Fc); } return(results); }
public List <double> ComputeMaterialRemoved(List <double> toolAngles) { CutPropertyCache prop = GetCutProperties(); List <double> results = new List <double>(); const double k_z_resolution = 0.001; double toolradius = prop.tooldiam / 2; double angleStep = toolAngles[1] - toolAngles[0]; foreach (double angle in toolAngles) { double total = 0; for (double tooth = 0; tooth < prop.teeth; tooth++) { double toothStartAngle = angle + 360 * (tooth / prop.teeth); double toothResult = 0; for (double z = prop.d; z >= 0; z -= k_z_resolution) //for (double z = 0; z <= prop.d; z += k_z_resolution) { double toothAngle = toothStartAngle + (180 / Math.PI) * (-z) * Math.Tan(prop.helix * (Math.PI / 180)) / toolradius; toothAngle = wrap(toothAngle, 360); double engagementAngle = Math.Acos(1.0 - prop.r / toolradius) * (180 / Math.PI); double engagementStartAngle = 180 - engagementAngle; double chipThickness = 0; if (toothAngle > engagementStartAngle && toothAngle < 180) { chipThickness = prop.fpt * Math.Sin(toothAngle * (Math.PI / 180)); } double materialRemoved = chipThickness * k_z_resolution * Math.Sin(angleStep * Math.PI / 180) * toolradius; toothResult += materialRemoved; } total += toothResult; } results.Add(total); } return(results); }
public CutPropertyCache GetCutProperties() { CutPropertyCache result = new CutPropertyCache(); result.speed = GetPropertyStrict("Cutting Speed"); result.tooldiam = GetPropertyStrict("Tool Diameter"); result.teeth = GetPropertyStrict("Number of Teeth"); result.helix = GetPropertyStrict("Helix Angle"); result.d = GetPropertyStrict("Axial Depth of Cut"); result.r = GetPropertyStrict("Radial Width of Cut"); result.Kp = GetPropertyStrict("Material Power Constant"); result.E = GetPropertyStrict("Power Efficiency"); result.stickout = GetPropertyStrict("Stick out"); result.youngs = GetPropertyStrict("Tool Youngs Modulus"); result.wear = GetPropertyStrict("Tool Wear Factor"); result.fpt = GetPropertyStrict("Feed Per Tooth"); return(result); }
public double ComputeValue(string name) { Dictionary <string, double> results = new Dictionary <string, double>(); CutPropertyCache prop = GetCutProperties(); double rpm = 12 * prop.speed / (Math.PI * prop.tooldiam); double feedrate = rpm * prop.fpt * prop.teeth; double mrr = feedrate * prop.d * prop.r; double feedfactor = 0.417 * Math.Pow(prop.fpt, -0.197); double powertool = feedfactor * prop.Kp * prop.wear * mrr; double powermotor = powertool / prop.E; double Fc = powertool * 550 / (prop.speed / 60); double Fmax = 1.11 * Fc; double comparedToSolid = 1.75; double deflection = (Fc * Math.Pow(prop.stickout, 3)) / (3 * prop.youngs * 145037 * comparedToSolid * Math.Pow(prop.tooldiam, 4) / 64); double engagementAngle = Math.Acos(1.0 - prop.r / (prop.tooldiam * 0.5)) * (180 / Math.PI); double chipthicknessAngle = Math.Min(90, engagementAngle); double chipthickness = prop.fpt * Math.Sin(chipthicknessAngle * Math.PI / 180); double ultimateTensileStrength = prop.Kp * 292207; // this conversion factor is just a guess based on one datapoint for aluminum double WoverD = prop.r / prop.tooldiam; double engagementFactor = lerp(1.0, 1.1, saturate((WoverD - 0.66) / 0.34)); // for aluminum... Fmax = ultimateTensileStrength * prop.d * prop.fpt * prop.teeth * (engagementAngle / 360) * engagementFactor * prop.wear; powermotor = Fmax * prop.speed / 33000; results.Add("Feed Rate", feedrate); results.Add("RPM", rpm); results.Add("Material Removal Rate", mrr); results.Add("Power at Tool 1", powertool); results.Add("Power at Tool 2", powermotor); results.Add("Tangential Cutting Force 1", Fc); results.Add("Tangential Cutting Force 2", Fmax); results.Add("Deflection of Tool", deflection); results.Add("Chip Thickness", chipthickness); return(results[name]); }