public override AbstractAnalyticalAnalyser GetAnalyticalAnalyser() { if (!isPointsCoordCalculated) { CalcPointsCoordinates(); } if (analyticalAnalyser == null) { analyticalAnalyser = new PMAnalyticalAnalyser(); } // General analyticalAnalyser.L = GeneralParams.MotorLength; // Stator // count of teeth that have flux lines go through double Nz = Rotor.GammaM / 180 * Stator.Q / (2 * Rotor.p); // teeth length double lz = Stator.HS0 + Stator.HS1 + Stator.HS2 + Stator.RS; // teeth width double wz = Stator.alpha * (2 * Stator.Rinstator + 2 * Stator.HS0 + 2 * Stator.HS1 + Stator.HS2) - (Stator.BS1 + Stator.BS2) / 2; // yoke width double wy = Stator.Rstator - Stator.xF; // yoke length double ly = 0.5 * (Stator.DiaYoke - wy) * Math.PI / (2 * Rotor.p); // slot width double wslot = 2 * Stator.Rinstator * Math.PI / Stator.Q - wz; analyticalAnalyser.Sz = Nz * wz * GeneralParams.MotorLength * 1e-6; analyticalAnalyser.Sy = 2 * wy * GeneralParams.MotorLength * 1e-6; analyticalAnalyser.lz = lz * 1e-3; analyticalAnalyser.ly = ly * 1e-3; analyticalAnalyser.Pslot = Constants.mu_0 * wslot * GeneralParams.MotorLength / lz * 1e-3; // Rotor /////assign for shorten variables //material double Br = Rotor.Br; double mu_0 = Constants.mu_0; double mu_M = Rotor.mu_M; double Hc = Rotor.Hc; //stator (may be use a general class to store general data) double L = GeneralParams.MotorLength; // magnet double wm = (Rotor.GammaM / 180 * 2 * Rotor.alpha) * (Rotor.RGap + Rotor.Rrotor) / 2; double lm = Rotor.ThickMag; // magnet parameters analyticalAnalyser.phiR = Br * wm * L * 1e-6; analyticalAnalyser.PM = mu_0 * mu_M * wm * L / lm * 1e-3; analyticalAnalyser.Fc = Hc * lm * 1e-3; // leakage path parameters analyticalAnalyser.phiHFe = 0; analyticalAnalyser.PFe = 0; analyticalAnalyser.Pb = 0; // some sizes (rotor) analyticalAnalyser.wm = wm; analyticalAnalyser.lm = lm; analyticalAnalyser.gammaM = Rotor.GammaM; // Airgap analyticalAnalyser.delta = Airgap.delta; analyticalAnalyser.wd = Rotor.GammaM / 180 * (Rotor.RGap + Airgap.delta / 2) * 2 * Math.PI / (2 * Rotor.p); analyticalAnalyser.Pd = mu_0 * analyticalAnalyser.wd * GeneralParams.MotorLength / (Airgap.delta * Airgap.Kc) * 1e-3; // Material (stator considering only) analyticalAnalyser.Barray = Stator.BH.Select(p => p.b).ToArray(); analyticalAnalyser.Harray = Stator.BH.Select(p => p.h).ToArray(); //other analyticalAnalyser.p = Rotor.p; analyticalAnalyser.Q = Stator.Q; analyticalAnalyser.Nstrand = Stator.NStrands; // magnet and airgap together double wPd = (2 * Rotor.alpha) * (Rotor.RGap + Rotor.Rrotor) / 2;//all arc double lPd = lm + Airgap.delta * Airgap.Kc; analyticalAnalyser.PMd = mu_0 * mu_M * wPd * L / lPd * 1e-3; analyticalAnalyser.PMq = analyticalAnalyser.PMd; // set motor analyticalAnalyser.Motor = this; return(analyticalAnalyser); }
public override AbstractAnalyticalAnalyser GetAnalyticalAnalyser() { if (!isPointsCoordCalculated) { CalcPointsCoordinates(); } if (analyticalAnalyser == null) { analyticalAnalyser = new PMAnalyticalAnalyser(); } // General analyticalAnalyser.L = GeneralParams.MotorLength; // Stator // count of teeth that have flux lines go through double Nz = Rotor.gammaMedeg / 180 * Stator.Q / (2 * Rotor.p); // teeth length double lz = Stator.HS0 + Stator.HS1 + Stator.HS2 + Stator.RS; // teeth width double wz = Stator.alpha * (2 * Stator.Rinstator + 2 * Stator.HS0 + 2 * Stator.HS1 + Stator.HS2) - (Stator.BS1 + Stator.BS2) / 2; // yoke width double wy = Stator.Rstator - Stator.xF; // yoke length double ly = 0.5 * (Stator.DiaYoke - wy) * Math.PI / (2 * Rotor.p); // slot width double wslot = 2 * Stator.Rinstator * Math.PI / Stator.Q - wz; Console.WriteLine("alphaM = " + (Rotor.alphaM * 180 / Math.PI * 2)); analyticalAnalyser.Sz = Nz * wz * GeneralParams.MotorLength * 1e-6; analyticalAnalyser.Sy = 2 * wy * GeneralParams.MotorLength * 1e-6; analyticalAnalyser.lz = lz * 1e-3; analyticalAnalyser.ly = ly * 1e-3; analyticalAnalyser.Pslot = Constants.mu_0 * wslot * GeneralParams.MotorLength / lz * 1e-3; // Rotor /////assign for shorten variables //material double Br = Rotor.Br; double mu_0 = Constants.mu_0; double mu_M = Rotor.mu_M; double Bsat = Rotor.Bsat; double Hc = Rotor.Hc; //stator (may be use a general class to store general data) double L = GeneralParams.MotorLength; // magnet double wm = Rotor.WidthMag; double lm = Rotor.ThickMag; //calc sizes of barrier double wb1 = Rotor.HRib / 2; double lb1 = Math.Sqrt(Math.Pow(Rotor.xA - Rotor.xC, 2) + Math.Pow(Rotor.yA - Rotor.yC, 2));//AC if (lb1 < wb1) { lb1 = wb1; } double wb2 = Math.Sqrt(Math.Pow(Rotor.xB - Rotor.xE, 2) + Math.Pow(Rotor.yB - Rotor.yE, 2)); //BE double lb2 = Rotor.B1; double wb3 = Math.Sqrt(Math.Pow(Rotor.xH - Rotor.xJ, 2) + Math.Pow(Rotor.yH - Rotor.yJ, 2)); //GJ double lb3 = Rotor.B1; double wb4 = (Rotor.yJ + Rotor.yK) / 2; double lb4 = Rotor.xK - Rotor.xJ; //steel bridge double wFe = Rotor.Rrotor - Rotor.R1; double lFe = Math.Sqrt(Math.Pow(Rotor.xA - Rotor.xC, 2) + Math.Pow(Rotor.yA - Rotor.yC, 2));//AC if (lFe < wFe) { lFe = wFe; } double wFe2 = Rotor.yK + Rotor.yJ; double lFe2 = Rotor.xK - Rotor.xJ; //refine by poletype: if (Rotor.Poletype == VPMRotor.PoleType.MiddleAir)//middle is air then no steel { wFe2 = 0; } else { wb4 = 0; //else, no air } // magnet parameters analyticalAnalyser.phiR = Br * wm * L * 1e-6; analyticalAnalyser.PM = mu_0 * mu_M * wm * L / lm * 1e-3; analyticalAnalyser.Fc = Hc * lm * 1e-3; // leakage path parameters analyticalAnalyser.phiHFe = Bsat * 2 * wFe * L * 1e-6; analyticalAnalyser.PFe = mu_0 * 2 * wFe * L / lFe * 1e-3; double Pb1 = mu_0 * wb1 * L / lb1; double Pb2 = mu_0 * wb2 * L / lb2; double Pb3 = mu_0 * wb3 * L / lb3; double Pb4 = mu_0 * wb4 * L / lb4; analyticalAnalyser.Pb = 2 * (Pb1 + Pb2 + Pb3 + Pb4) * 1e-3; // some sizes (rotor) analyticalAnalyser.wm = wm; analyticalAnalyser.lm = lm; analyticalAnalyser.wm2 = 2 * (Math.Sqrt(Math.Pow(Rotor.xC - Rotor.xK, 2) + Math.Pow(Rotor.yC - Rotor.yK, 2))) + 2 * wFe; // Airgap // calc Kc from other parameters //double tz = 2 * Stator.Rinstator * Math.PI / Stator.Q; //double bp = wslot; //double bp_on_delta = bp / Airgap.delta; //double cp = bp_on_delta * bp_on_delta / (5 + bp_on_delta); //double kc = tz / (tz - cp * Airgap.delta); double kc = Airgap.Kc; analyticalAnalyser.delta = Airgap.delta; analyticalAnalyser.wd = Rotor.gammaMedeg / 180 * (Rotor.Rrotor + Airgap.delta / 2) * 2 * Math.PI / (2 * Rotor.p); analyticalAnalyser.Pd = Constants.mu_0 * analyticalAnalyser.wd * GeneralParams.MotorLength / (Airgap.delta * kc) * 1e-3; analyticalAnalyser.gammaM = Rotor.gammaMedeg; // Material (stator considering only) analyticalAnalyser.Barray = Stator.BH.Select(p => p.b).ToArray(); analyticalAnalyser.Harray = Stator.BH.Select(p => p.h).ToArray(); //other analyticalAnalyser.p = Rotor.p; analyticalAnalyser.Q = Stator.Q; analyticalAnalyser.Nstrand = Stator.NStrands; double wf = (180 - Rotor.gammaMedeg) / 180.0 * 2 * Rotor.alpha * Rotor.Rrotor; double pp = mu_0 * wf * L / lm * 1e-3; double Pdelta = analyticalAnalyser.Pd;// * 180 / Rotor.gammaM; analyticalAnalyser.PMd = 1 / (1 / (analyticalAnalyser.PM + analyticalAnalyser.Pb + pp) + 1 / Pdelta); analyticalAnalyser.PMq = Pdelta; // set motor analyticalAnalyser.Motor = this; return(analyticalAnalyser); }