Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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]);
        }