示例#1
0
        /// <summary>
        /// Make a femm model using parameters from rotor creation process
        /// </summary>
        /// <param name="outfile">Output femm model</param>
        /// <param name="original">The original femm model to insert into</param>
        public void MakeAFEMMModelFile(String outfile, String original = "")
        {
            if (!isPointsCoordCalculated)
            {
                CalcPointsCoordinates();
            }

            // create new or open an exist
            if (original == "")
            {
                FEMM.newdocument(FEMM.DocumentType.Magnetic);
            }
            else
            {
                FEMM.open(original);
            }

            //
            double Rrotor = RotorParams.Rrotor;
            double alpha  = 2 * Math.PI / (4 * RotorParams.p);
            double alphaM = RotorParams.alphaM;
            int    p      = RotorParams.p;

            ///// Build 1 poles
            // point far right of rotors
            double xI = Rrotor;
            double yI = 0;

            // segments (magnet)
            FEMM.mi_addSegmentEx(xA, yA, xB, yB, Group_Lines); //AB
            FEMM.mi_addSegmentEx(xA, yA, xF, yF, Group_Lines); //AF
            FEMM.mi_addSegmentEx(xA, yA, xD, yD, Group_Lines); //AD
            FEMM.mi_addSegmentEx(xB, yB, xC, yC, Group_Lines); //BC
            FEMM.mi_addSegmentEx(xC, yC, xD, yD, Group_Lines); //CD

            // mirrored segments (magnet)
            FEMM.mi_addSegmentEx(xA, -yA, xB, -yB, Group_Lines); //AB
            FEMM.mi_addSegmentEx(xA, -yA, xF, -yF, Group_Lines); //AF
            FEMM.mi_addSegmentEx(xA, -yA, xD, -yD, Group_Lines); //AD
            FEMM.mi_addSegmentEx(xB, -yB, xC, -yC, Group_Lines); //BC
            FEMM.mi_addSegmentEx(xC, -yC, xD, -yD, Group_Lines); //CD

            // barrier segments
            FEMM.mi_addSegmentEx(xC, yC, xC, -yC, Group_Lines); //AB
            FEMM.mi_addSegmentEx(xD, yD, xD, -yD, Group_Lines); //AF

            // arcsegments
            double a = (Math.Atan(yF / xF) - Math.Atan(yB / xB)) * 180 / Math.PI;

            FEMM.mi_addArcEx(xB, yB, xF, yF, a, 1, Group_Lines);
            FEMM.mi_addArcEx(xF, -yF, xB, -yB, a, 1, Group_Lines);

            // arcsegments rotor
            FEMM.mi_addArcEx(xI, yI, xG, yG, alpha * 180 / Math.PI, 1, Group_Lines);
            FEMM.mi_addArcEx(xG, -yG, xI, yI, alpha * 180 / Math.PI, 1, Group_Lines);

            // blocks
            // air block label
            double air1X = (xA + xB + xF) / 3;
            double air1Y = (yA + yB + yF) / 3;

            FEMM.mi_addBlockLabelEx(air1X, air1Y, AirBlockName, Group_Label);
            FEMM.mi_addBlockLabelEx(air1X, -air1Y, AirBlockName, Group_Label);
            FEMM.mi_addBlockLabelEx((xC + xD) / 2, 0, AirBlockName, Group_Label);

            // magnet block label
            double magBlockLabelX = (xA + xC) / 2;
            double magBlockLabelY = (yA + yC) / 2;

            FEMM.mi_addBlockLabelEx(magBlockLabelX, magBlockLabelY, MagnetBlockName, Group_Label, alphaM * 180 / Math.PI - 90 + 180);//+180 but set back later
            FEMM.mi_addBlockLabelEx(magBlockLabelX, -magBlockLabelY, MagnetBlockName, Group_Label, 90 - alphaM * 180 / Math.PI + 180);

            ///// Build 2 poles
            FEMM.mi_clearselected();
            FEMM.mi_selectgroup(Group_Lines);
            FEMM.mi_selectgroup(Group_Label);
            FEMM.mi_copyrotate(0, 0, 360 / (2 * p), 1, FEMM.EditMode.group);
            // rotate the magnet direction
            FEMM.mi_clearselected();
            FEMM.mi_selectlabel(magBlockLabelX, magBlockLabelY);
            FEMM.mi_setblockprop(MagnetBlockName, true, 0, "", alphaM * 180 / Math.PI - 90, Group_Label, 0);
            FEMM.mi_clearselected();
            FEMM.mi_selectlabel(magBlockLabelX, -magBlockLabelY);
            FEMM.mi_setblockprop(MagnetBlockName, true, 0, "", 90 - alphaM * 180 / Math.PI, Group_Label, 0);

            ///// Build p-1 pair of poles remaining
            FEMM.mi_clearselected();
            FEMM.mi_selectgroup(Group_Lines);
            FEMM.mi_selectgroup(Group_Label);
            FEMM.mi_copyrotate(0, 0, 360 / p, p - 1, FEMM.EditMode.group);

            FEMM.mi_addBlockLabelEx(0, 0, SteelBlockName, Group_Rotor_Steel);

            // clear selected, refresh, and go to natural zoom
            FEMM.mi_clearselected();
            FEMM.mi_zoomnatural();

            // save as
            if (Path.GetDirectoryName(outfile) == "")
            {
                outfile = Path.GetDirectoryName(original) + "\\" + outfile;
            }
            FEMM.mi_saveas(outfile);

            FEMM.mi_close();
        }
示例#2
0
        /// <summary>
        /// Assuming a FEMM window is opened, build rotor into that
        /// </summary>
        /// <param name="MaterialParams"></param>
        public override void BuildInFEMM(FEMM femm = null)
        {
            if (femm == null)
            {
                femm = FEMM.DefaultFEMM;
            }

            bool fullbuild = Motor.GeneralParams.FullBuildFEMModel;

            // create material data
            femm.mi_addmaterialAir(AirMaterialName);
            femm.mi_addmaterialMagnet(MagnetMaterialName, mu_M, Hc, 0);
            femm.mi_addmaterialSteel(SteelMaterialName, 1, 1, Lam_d, Lam_fill, FEMM.LaminationType.NotLaminated,
                                     BH.Select(p => p.b).ToArray(), BH.Select(p => p.h).ToArray());

            // create boundary data
            femm.mi_addboundprop_Prescribed_A(BoundaryProperty, 0, 0, 0, 0);

            /////// Build 1 poles
            ////Half one
            // segments (magnet)
            femm.mi_addSegmentEx(xA, yA, xB, yB, Group_Lines_Rotor); //AB
            femm.mi_addSegmentEx(xB, yB, xE, yE, Group_Lines_Rotor); //BE
            femm.mi_addSegmentEx(xD, yD, xE, yE, Group_Lines_Rotor); //DE
            femm.mi_addSegmentEx(xE, yE, xF, yF, Group_Lines_Rotor); //EF
            femm.mi_addSegmentEx(xF, yF, xC, yC, Group_Lines_Rotor); //FC
            femm.mi_addSegmentEx(xD, yD, xG, yG, Group_Lines_Rotor); //DG
            femm.mi_addSegmentEx(xH, yH, xG, yG, Group_Lines_Rotor); //HG
            femm.mi_addSegmentEx(xH, yH, xI, yI, Group_Lines_Rotor); //HI
            femm.mi_addSegmentEx(xI, yI, xF, yF, Group_Lines_Rotor); //IF
            femm.mi_addSegmentEx(xH, yH, xJ, yJ, Group_Lines_Rotor); //HJ
            femm.mi_addSegmentEx(xI, yI, xK, yK, Group_Lines_Rotor); //IK
            if (Poletype == PoleType.MiddleAir)
            {
                femm.mi_addSegmentEx(xJ, yJ, xJ, 0, Group_Lines_Rotor);//JJ1
            }
            else
            {
                femm.mi_addSegmentEx(xJ, yJ, xK, yK, Group_Lines_Rotor); //JK
            }
            // arcsegments AC
            double a = (Math.Atan(yA / xA) - Math.Atan(yC / xC)) * 180 / Math.PI;

            femm.mi_addArcEx(xC, yC, xA, yA, a, 1, Group_Lines_Rotor);
            // arcsegment RS
            femm.mi_addArcEx(xR, yR, xS, yS, alphaDegree, 1, Group_Lines_Rotor);

            // blocks
            // air block label
            double air1X = (xA + xB + xC) / 3;
            double air1Y = (yA + yB + yC) / 3;

            femm.mi_addBlockLabelEx(air1X, air1Y, AirMaterialName, Group_BlockLabel_Magnet_Air);
            //FEMM.mi_addBlockLabelEx(air1X, -air1Y, AirBlockName, Group_Label);

            if (Poletype != PoleType.MiddleAir)
            {
                double air2X = (xJ + xK + xI + xH) / 4;
                double air2Y = (yJ + yK + yI + yH) / 4;
                femm.mi_addBlockLabelEx(air2X, air2Y, AirMaterialName, Group_BlockLabel_Magnet_Air);
                //  femm.mi_addBlockLabelEx(air2X, -air2Y, AirBlockName, Group_Label);
            }

            // magnet block label
            double magBlockLabelX = (xD + xI) / 2;
            double magBlockLabelY = (yD + yI) / 2;

            femm.mi_addBlockLabelEx(magBlockLabelX, magBlockLabelY, MagnetMaterialName, Group_BlockLabel_Magnet_Air, alphaM * 180 / Math.PI - 90 + 180);//+180 but set back later
            //femm.mi_addBlockLabelEx(magBlockLabelX, -magBlockLabelY, MagnetBlockName, Group_Label, 90 - alphaM * 180 / Math.PI + 180);

            ///// mirrored all
            femm.mi_clearselected();
            femm.mi_selectgroup(Group_Lines_Rotor);
            femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
            femm.mi_mirror(0, 0, 1, 0, FEMM.EditMode.group);

            //// the remainings: not symmetrical
            if (Poletype == PoleType.MiddleAir)
            {
                femm.mi_addBlockLabelEx((xJ + xK0) / 2, 0, AirMaterialName, Group_BlockLabel_Magnet_Air);
            }

            ////////// Build 2 poles
            // copy pole if full build
            if (fullbuild)
            {
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_copyrotate(0, 0, 360 / (2 * p), 1, FEMM.EditMode.group);
            }
            // rotate the magnet direction (of the first pole)
            femm.mi_clearselected();
            femm.mi_selectlabel(magBlockLabelX, magBlockLabelY);
            femm.mi_setblockprop(MagnetMaterialName, true, 0, "", alphaM * 180 / Math.PI - 90, Group_BlockLabel_Magnet_Air, 0);
            femm.mi_clearselected();
            femm.mi_selectlabel(magBlockLabelX, -magBlockLabelY);
            femm.mi_setblockprop(MagnetMaterialName, true, 0, "", 90 - alphaM * 180 / Math.PI, Group_BlockLabel_Magnet_Air, 0);

            if (fullbuild)
            {
                //////// Build p-1 pair of poles remaining
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_copyrotate(0, 0, 360 / p, p - 1, FEMM.EditMode.group);
            }

            /////// The remaining: not symmetrical: add label for rotor steel
            femm.mi_addBlockLabelEx((DiaYoke / 2 + O2 / 2), 0, SteelMaterialName, Group_BlockLabel_Steel);


            if (fullbuild)
            {
                // pre-rotate rotor (only in fullbuild)
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_selectgroup(Group_BlockLabel_Steel);
                femm.mi_moverotate(0, 0, PreviewRotateAngle, FEMM.EditMode.group);
            }

            if (!fullbuild)
            {
                //build boundary of motor: 2 lines, anti-periodic
                String boundaryName = "rotor-apb-1";
                femm.mi_addSegmentEx(0, 0, xS, yS, Group_Lines_Rotor);
                femm.mi_addSegmentEx(0, 0, xS, -yS, Group_Lines_Rotor);

                femm.mi_addboundprop_AntiPeriodic(boundaryName);

                femm.mi_clearselected();
                femm.mi_selectsegment(xS, yS);
                femm.mi_selectsegment(xS, -yS);
                femm.mi_setsegmentprop(boundaryName, 0, true, false, Group_Lines_Rotor);
            }
        }
示例#3
0
        /// <summary>
        /// Assuming a FEMM window is opened, build rotor into that
        /// </summary>
        /// <param name="MaterialParams"></param>
        public override void BuildInFEMM(FEMM femm = null)
        {
            if (femm == null)
            {
                femm = FEMM.DefaultFEMM;
            }

            bool fullbuild = Motor.GeneralParams.FullBuildFEMModel;

            // create material data
            //femm.mi_addmaterialAir(AirMaterialName);
            femm.mi_addmaterialMagnet(MagnetMaterialName, mu_M, Hc, 0);
            femm.mi_addmaterialSteel(SteelMaterialName, 1, 1, Lam_d, Lam_fill, FEMM.LaminationType.NotLaminated,
                                     BH.Select(p => p.b).ToArray(), BH.Select(p => p.h).ToArray());

            // create boundary data
            femm.mi_addboundprop_Prescribed_A(BoundaryProperty, 0, 0, 0, 0);

            /////// Build 1 poles
            ////Half one

            // arcsegments AC
            double a = GammaM / 180 * alphaDegree;

            femm.mi_addArcEx(xR, yR, xA, yA, a, 1, Group_Lines_Rotor);
            // arcsegment RS
            femm.mi_addArcEx(xRR, yRR, xSS, ySS, alphaDegree, 1, Group_Lines_Rotor);
            // segments (magnet)
            femm.mi_addSegmentEx(xA, yA, xB, yB, Group_Lines_Rotor);

            // blocks
            // magnet block label
            double magBlockLabelX = (xR + xRR) / 2;
            double magBlockLabelY = 0;

            femm.mi_addBlockLabelEx(magBlockLabelX, magBlockLabelY, MagnetMaterialName, Group_BlockLabel_Magnet_Air, 180);//+180 but set back later
            //femm.mi_addBlockLabelEx(magBlockLabelX, -magBlockLabelY, MagnetBlockName, Group_Label, 90 - alphaM * 180 / Math.PI + 180);

            ///// mirrored all
            femm.mi_clearselected();
            femm.mi_selectgroup(Group_Lines_Rotor);
            femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
            femm.mi_mirror(0, 0, 1, 0, FEMM.EditMode.group);

            ////////// Build 2 poles
            // copy pole if full build
            if (fullbuild)
            {
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_copyrotate(0, 0, 360 / (2 * p), 1, FEMM.EditMode.group);
            }
            // rotate the magnet direction (of the first pole)
            femm.mi_clearselected();
            femm.mi_selectlabel(magBlockLabelX, magBlockLabelY);
            femm.mi_setblockprop(MagnetMaterialName, true, 0, "", 0, Group_BlockLabel_Magnet_Air, 0);

            if (fullbuild)
            {
                //////// Build p-1 pair of poles remaining
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_copyrotate(0, 0, 360 / p, p - 1, FEMM.EditMode.group);
            }

            /////// The remaining: not symmetrical: add label for rotor steel
            femm.mi_addBlockLabelEx(RYoke / 2, 0, SteelMaterialName, Group_BlockLabel_Steel);


            if (fullbuild)
            {
                // pre-rotate rotor (only in fullbuild)
                femm.mi_clearselected();
                femm.mi_selectgroup(Group_Lines_Rotor);
                femm.mi_selectgroup(Group_BlockLabel_Magnet_Air);
                femm.mi_selectgroup(Group_BlockLabel_Steel);
                femm.mi_moverotate(0, 0, PreRotateAngle, FEMM.EditMode.group);
            }

            if (!fullbuild)
            {
                //build boundary of motor: 2 lines, anti-periodic
                String boundaryName = "rotor-apb-1";
                femm.mi_addSegmentEx(0, 0, xS, yS, Group_Lines_Rotor);
                femm.mi_addSegmentEx(0, 0, xS, -yS, Group_Lines_Rotor);

                femm.mi_addboundprop_AntiPeriodic(boundaryName);

                femm.mi_clearselected();
                femm.mi_selectsegment(xS, yS);
                femm.mi_selectsegment(xS, -yS);
                femm.mi_setsegmentprop(boundaryName, 0, true, false, Group_Lines_Rotor);
            }
        }