// Use this for initialization
    void Start()
    {
        Xaxis = GameObject.Find("XAxis");
        Yaxis = GameObject.Find("YAxis");
        Zaxis = GameObject.Find("ZAxis");

        Xaxis.SetActive(false);
        Yaxis.SetActive(false);
        Zaxis.SetActive(false);
    }
    // Use this for initialization
    void Start()
    {
        count       = 1;
        state       = 1;
        endPosition = new Vector3(.3f, 0, 1f);
        //endPosition = new Vector3(.4f, .6f, 1.7f);

        /*Xaxis = GameObject.Find("XAxis");
        *  Yaxis = GameObject.Find("YAxis");
        *  Zaxis = GameObject.Find("ZAxis");*/
        v2.SetActive(false);
        v3.SetActive(false);
        v4.SetActive(false);
        Yaxis.SetActive(false);
        Zaxis.SetActive(false);
        holderStart = false;
    }
    // Use this for initialization
    void Start()
    {
        txtRef1.text = "We can represent a scalar in a one dimentional space using a point on a scaled line";
        count        = 1;
        state        = 1;
        endPosition  = new Vector3(.6f, 0, 1.5f);
        //endPosition = new Vector3(.4f, .6f, 1.7f);
        Xaxis = GameObject.Find("XAxis");
        Yaxis = GameObject.Find("YAxis");
        Zaxis = GameObject.Find("ZAxis");
        cube1 = GameObject.Find("cube1");
        cube2 = GameObject.Find("cube2");
        cube3 = GameObject.Find("cube3");

        Yaxis.SetActive(false);
        Zaxis.SetActive(false);
        cube1.SetActive(false);
        cube2.SetActive(false);
        cube3.SetActive(false);
        holderStart = false;
    }
        private Box <IPlotProperty> _CreateLayoutProperties()
        {
            var xaxis  = Scene.xaxis(Xaxis.color("red"));
            var yaxis  = Scene.yaxis(Yaxis.color("green"));
            var zaxis  = Scene.zaxis(Zaxis.color("blue"));
            var camera = Camera.up(Up.x(0), Up.y(1), Up.z(0));
            var scene  = Layout.scene(Scene.Aspectmode.data(), Scene.camera(camera), xaxis, yaxis, zaxis);
            var shapes = Layout.shapes(_Shapes.ToArray());



            return(Plot.layout
                       (Layout.autosize(true)
                       // , Layout.width(0)
                       , Layout.height(920)
                       // , Layout.margin(Margin.autoexpand(true))
                       // , Layout.margin(Margin.pad(5))
                       // , Layout.margin(Margin.t(5), Margin.b(5))
                       , scene
                       , shapes
                       ));
        }
Exemple #5
0
        private void frmTeach_Load(object sender, EventArgs e)
        {
            //defaultView = new PositionDefaultView();

            ProductTeach       = new ProductTeach(m_station1);
            mCameraAxis        = new CameraAxis(m_station1);
            CameraRelationship = new CameraRelationship(m_station1);
            RootAxis           = new RootAxis(m_station1);

            mYaxis              = new Yaxis(m_station1);
            mZaxis              = new Zaxis(m_station1);
            m_panelOperate      = new Panel();
            m_panelOperate.Dock = DockStyle.Fill;

            treeView1.Nodes.Add("贴框设备");
            foreach (string str in Enum.GetNames(typeof(PositionName)))
            {
                treeView1.Nodes[0].Nodes.Add(str);
            }

            treeView1.ExpandAll();
            timer1.Enabled = true;
        }
Exemple #6
0
        /// <summary>
        /// 从世界坐标变换到摄像机坐标
        /// </summary>
        /// <param name="eye"></param>
        /// <param name="at"></param>
        /// <param name="up"></param>
        /// <returns></returns>
        public static Matrix GetViewMatrix(Vector eye, Vector at, Vector up)
        {
            Vector Xaxis, Yaxis, Zaxis;

            Zaxis = at - eye;
            Zaxis.NormalizedVector();
            Xaxis = Vector.CrossMultiply(up, Zaxis);
            Xaxis.NormalizedVector();
            Yaxis = Vector.CrossMultiply(Zaxis, Xaxis);

            Matrix mat = new Matrix();

            mat[0, 0] = Xaxis.x;
            mat[1, 0] = Xaxis.y;
            mat[2, 0] = Xaxis.z;
            mat[3, 0] = -Vector.DotMultiply(Xaxis, eye);

            mat[0, 1] = Yaxis.x;
            mat[1, 1] = Yaxis.y;
            mat[2, 1] = Yaxis.z;
            mat[3, 1] = -Vector.DotMultiply(Yaxis, eye);

            mat[0, 2] = Zaxis.x;
            mat[1, 2] = Zaxis.y;
            mat[2, 2] = Zaxis.z;
            mat[3, 2] = -Vector.DotMultiply(Zaxis, eye);

            mat[0, 3] = 0;
            mat[1, 3] = 0;
            mat[2, 3] = 0;
            mat[3, 3] = 1;

            //-----------------------得到旋转矩阵------------------

            return(mat);
        }
    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if (Vector3.Distance(this.transform.position, endPosition) > .0005f)
        {
            transform.position = Vector3.Lerp(this.transform.position, endPosition, Time.deltaTime);
        }
        else
        {
            transform.position = endPosition;
            if (timer >= 0 && timer < 5 * speed)
            {
                endPosition = GameObject.Find("XAxisNumber4").transform.position;
            }
            if (timer >= 5 * speed && timer < 10 * speed)
            {
                endPosition = GameObject.Find("XAxisNumber-3").transform.position;
            }
            if (timer >= 10 * speed && timer < 15 * speed)
            {
                endPosition = GameObject.Find("XAxisNumber0").transform.position;
            }
            if (timer >= 15 * speed && timer < 20 * speed)
            {
                Yaxis.SetActive(true);
                endPosition = GameObject.Find("YAxisNumber2").transform.position;
            }
            if (timer >= 20 * speed && timer < 25 * speed)
            {
                endPosition = new Vector3(0.12f + x0, .08f, z0);
            }
            if (timer >= 25 * speed && timer < 30 * speed)
            {
                endPosition = new Vector3(0.12f + x0, .14f, z0);
            }
            if (timer >= 30 * speed && timer < 35 * speed)
            {
                Zaxis.SetActive(true);
                endPosition = new Vector3(.12f + x0, .08f, .08f + z0);
            }
            if (timer >= 35 * speed && timer < 40 * speed)
            {
                endPosition = new Vector3(.08f + x0, .12f, .04f + z0);
            }
            if (timer >= 60 * speed && timer < 65 * speed)
            {
                v3.SetActive(true);
            }
            if (timer >= 85 * speed && timer < 90 * speed)
            {
                v2.SetActive(true);
                v4.SetActive(true);
            }
            if (timer >= 95 * speed && timer < 100 * speed)
            {
                v2.SetActive(false);
                v4.SetActive(false);
            }
            if (timer >= 100 * speed && timer < 105 * speed)
            {
                MeshRenderer gameObjectRenderer = v3.transform.Find("x1").GetComponent <MeshRenderer>();
                Material     newMaterial        = new Material(Shader.Find("Standard"));
                newMaterial.color           = new Color(1, 0, 0, 1);
                gameObjectRenderer.material = newMaterial;
            }
            if (timer >= 105 * speed && timer < 110 * speed)
            {
                MeshRenderer gameObjectRenderer = v3.transform.Find("y1").GetComponent <MeshRenderer>();
                Material     newMaterial        = new Material(Shader.Find("Standard"));
                newMaterial.color           = new Color(0, 1, 0, 1);
                gameObjectRenderer.material = newMaterial;
            }
            if (timer >= 110 * speed && timer < 115 * speed)
            {
                MeshRenderer gameObjectRenderer = v3.transform.Find("z1").GetComponent <MeshRenderer>();
                Material     newMaterial        = new Material(Shader.Find("Standard"));
                newMaterial.color           = new Color(0, 0, 1, 1);
                gameObjectRenderer.material = newMaterial;
            }
            if (timer >= 115 * speed && timer < 120 * speed)
            {
                Material newMaterial = new Material(Shader.Find("Standard"));
                newMaterial.color = new Color(1, 1, 1, 1);
                MeshRenderer gameObjectRenderer1 = v3.transform.Find("x1").GetComponent <MeshRenderer>();
                MeshRenderer gameObjectRenderer2 = v3.transform.Find("y1").GetComponent <MeshRenderer>();
                MeshRenderer gameObjectRenderer3 = v3.transform.Find("z1").GetComponent <MeshRenderer>();
                gameObjectRenderer1.material = newMaterial;
                gameObjectRenderer2.material = newMaterial;
                gameObjectRenderer3.material = newMaterial;
            }
            //switch (state){
            //    case(1):
            //        endPosition = GameObject.Find("XAxisNumber4").transform.position;//new Vector3(-0.16f, 0, 1.5f);
            //        state++;
            //        break;
            //    case (2):
            //        endPosition = GameObject.Find("XAxisNumber0").transform.position;//new Vector3(-0.16f, 0, 1.5f);
            //        state++;
            //        break;
            //    case (3):
            //        //txtRef1.text ="This number can refer to other directions of axes";
            //        Yaxis.SetActive(true);
            //        endPosition = GameObject.Find("YAxisNumber2").transform.position;//new Vector3(-0.16f, 0, 1.5f);
            //        state++;
            //        break;
            //    case (4):
            //        //txtRef1.text = "These components can represent a vector in a space, in this case a two dimensional space";
            //        endPosition = new Vector3(0.6f, .4f, .5f);
            //        state++;
            //        break;
            //    case (5):
            //        endPosition = new Vector3(0.6f, .4f, .5f);
            //        state++;
            //        break;
            //    case (6):
            //        //txtRef1.text = "If we use a third demension we can represent it like this";
            //        Zaxis.SetActive(true);
            //        endPosition = new Vector3(.6f, .4f, .9f);
            //        state++;
            //        break;
            //    case (7):
            //        //txtRef1.text = "and also represent it as a vector... we can represent the values of each dimen";
            //        endPosition = new Vector3(.4f, .6f, .7f);
            //        state++;
            //        break;
            //    case (8):
            //        //txtRef1.text = "Now we can represent the values of each component of a vector as colors in cubes. ";
            //        Xaxis.SetActive(false);
            //        Yaxis.SetActive(false);
            //        Zaxis.SetActive(false);
            //        state++;
            //        break;
            //    case (9):
            //        //txtRef1.text = "and also represent it as a vector by concatenating cubes";
            //        endPosition = new Vector3(0, 0, 20f);
            //        holderStart = true;
            //        //Camera.current.transform.Translate(new Vector3(0, 0, -3.5f));
            //        state++;
            //        break;
            //    case (10):
            //       // txtRef1.text = "now if we concatenate these cube vectores we can represnt a matrix, accessing each component with two indices.";
            //        //txtRef2.text = "";
            //        endPosition = new Vector3(0, 0, 0);
            //        //Camera.current.transform.Translate(new Vector3(-.5f, 0, 1.8f));
            //        //Camera.current.transform.Rotate(Vector3.up, -90);
            //        state++;
            //        break;
            //    case (11):
            //        //txtRef1.text = "if we go furthur and concatenate matrices we can find a rank 3 tensor represented liek this";
            //        //Camera.current.transform.Translate(new Vector3(-1.0f, 0, 0));
            //        endPosition = new Vector3(0, 0, 20f);
            //        state++;
            //        break;
            //    case (12):
            //       // txtRef1.text = "Tensors can have higher or lower ranks. scalar is a rank 0 tensor, vector is a rank 1 tensor and matrix is rank 2 vector.";
            //        //Camera.current.transform.Rotate(Vector3.up, 90);
            //        //Camera.current.transform.Translate(new Vector3(0, 0, -2.3f));

            //        endPosition = new Vector3(0, 0, 0);
            //        state++;
            //        break;
            //    default:
            //        break;
            //}
        }
    }
    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        float speed = 1;

        if (Vector3.Distance(this.transform.position, endPosition) > .005f)
        {
            transform.position = Vector3.Lerp(this.transform.position, endPosition, speed * Time.deltaTime);
        }
        else
        {
            transform.position = endPosition;
            switch (state)
            {
            case (1):
                endPosition = GameObject.Find("XAxisNumber-4").transform.position;    //new Vector3(-0.16f, 0, 1.5f);
                state++;
                break;

            case (2):
                endPosition = GameObject.Find("XAxisNumber0").transform.position;    //new Vector3(-0.16f, 0, 1.5f);
                state++;
                break;

            case (3):
                txtRef1.text = "This number can refer to other directions of axes";
                Yaxis.SetActive(true);
                endPosition = GameObject.Find("YAxisNumber2").transform.position;    //new Vector3(-0.16f, 0, 1.5f);
                state++;
                break;

            case (4):
                txtRef1.text = "These components can represent a vector in a space, in this case a two dimensional space";
                endPosition  = new Vector3(0.6f, .4f, 1.5f);
                state++;
                break;

            case (5):
                endPosition = new Vector3(0.6f, .4f, 1.5f);
                state++;
                break;

            case (6):
                txtRef1.text = "If we use a third demnsion we can represent it like this";
                Zaxis.SetActive(true);
                endPosition = new Vector3(.6f, .4f, 1.9f);
                state++;
                break;

            case (7):
                txtRef1.text = "and also represent it as a vector... we can represent the values of each dimen";
                endPosition  = new Vector3(.4f, .6f, 1.7f);
                state++;
                break;

            case (8):
                txtRef1.text = "Now we can represent the values of each component of a vector as colors in cubes. ";
                //Xaxis.SetActive(false);
                //Yaxis.SetActive(false);
                //Zaxis.SetActive(false);
                cube1.SetActive(true);
                cube2.SetActive(true);
                cube3.SetActive(true);
                if (timer > 50)
                {
                    state++;
                }
                break;

            case (9):
                txtRef1.text = "and also represent it as a vector by concatenating cubes";
                //endPosition = new Vector3(0, 0, 20f);
                //cube1.SetActive(false);
                //cube2.SetActive(false);
                //cube3.SetActive(false);
                if (timer > 60)
                {
                    holderStart = true;
                    //Camera.current.transform.Translate(new Vector3(0, 0, -3.5f));
                    state++;
                }
                break;

            case (10):
                txtRef1.text = "now if we concatenate these cube vectores we can represnt a matrix, accessing each component with two indices.";
                //endPosition = new Vector3(0, 0, 0);
                //Camera.current.transform.Translate(new Vector3(-.5f, 0, 1.8f));
                //Camera.current.transform.Rotate(Vector3.up, -90);
                state++;
                break;

            case (11):
                txtRef1.text = "if we go furthur and concatenate matrices we can find a rank 3 tensor represented liek this";
                //Camera.current.transform.Translate(new Vector3(-1.0f, 0, 0));
                //endPosition = new Vector3(0, 0, 20f);
                state++;
                break;

            case (12):
                txtRef1.text = "Tensors can have higher or lower ranks. scalar is a rank 0 tensor, vector is a rank 1 tensor and matrix is rank 2 vector.";
                //Camera.current.transform.Rotate(Vector3.up, 90);
                //Camera.current.transform.Translate(new Vector3(0, 0, -2.3f));

                //endPosition = new Vector3(0, 0, 0);
                state++;
                break;

            default:
                break;
            }
        }
    }
        public override void Running(RunningModes runningMode)
        {
            var step               = 0;
            var ScrewIsDone        = 0;
            var CannotTorIn        = false;
            var GetScrewPos        = new Point3D <int>();
            var ScrewHolePos       = new Point3D <int>();
            var ZaxisScrewpos      = 0;
            var watchCameratimeout = new Stopwatch();
            //var watchScrewtimeout = new Stopwatch();
            var tempPut1    = false;
            var tempPut2    = false;
            var GetScrew1   = false;
            var GetScrew2   = false;
            var pressPulse  = false;
            var startForbid = false;
            var _watch      = new Stopwatch();

            _watch.Start();

            PlateformAlarm alarm = 0;

            while (true)
            {
                Thread.Sleep(10);
                InhaleCylinder.Condition.External = externalSign;
                #region 判断后端设备交互信号
                if (tempPut1 && !GetScrew2)
                {
                    tempPut1  = false;
                    GetScrew1 = true;
                }
                if (tempPut2 && !GetScrew1)
                {
                    tempPut2  = false;
                    GetScrew2 = true;
                }
                if (!IoPoints.TDI7.Value && !Global.GetScrew1SignSheild)
                {
                    tempPut1 = false;
                }
                if (!IoPoints.TDI8.Value && !Global.GetScrew2SignSheild)
                {
                    tempPut2 = false;
                }
                if ((IoPoints.TDI7.Value || Global.GetScrew1SignSheild) && !GetScrew1 && !GetScrew2)
                {
                    tempPut1 = true;
                }
                if ((IoPoints.TDI8.Value || Global.GetScrew2SignSheild) && !GetScrew1 && !GetScrew2)
                {
                    tempPut2 = true;
                }
                #endregion
                #region 自动流程
                if (stationOperate.Running)
                {
                    switch (step)
                    {
                    case 0:
                        Marking.CoderResult.SN     = "";
                        Marking.CoderResult.Result = "";
                        step = 10;
                        Marking.watchCT.Restart();
                        break;

                    case 10:    //触发读码器读码
                        ReadCodePort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1
                        });
                        step = 20;
                        break;

                    case 20:    //判断读码器是否读到SN
                        Thread.Sleep(300);
                        if (Marking.CoderResult.SN == "")
                        {
                            step = 10;
                        }
                        else
                        {
                            step = 30;
                        }
                        break;

                    case 30:    //双按钮启动,双按钮按下的时间间隔必须小于500ms才正常启动设备
                        if (!pressPulse && (IoPoints.TDI15.Value || IoPoints.TDI16.Value))
                        {
                            pressPulse  = true;
                            startForbid = true;
                            _watch.Restart();
                        }
                        if (startForbid && IoPoints.TDI15.Value && IoPoints.TDI16.Value)
                        {
                            step        = 40;
                            startForbid = false;
                            pressPulse  = false;
                        }
                        else
                        {
                            if (500 <= _watch.ElapsedMilliseconds)
                            {
                                startForbid = false;
                            }
                        }
                        if (!IoPoints.TDI15.Value && !IoPoints.TDI16.Value)
                        {
                            pressPulse  = false;
                            startForbid = false;
                        }
                        break;

                    case 40:    //判断哪个螺丝整列机优先准备好
                        if (GetScrew1 && !GetScrew2)
                        {
                            GetScrewPos = Position.Put1ScrewPosition;
                            step        = 50;
                        }
                        else if (!GetScrew1 && GetScrew2)
                        {
                            GetScrewPos = Position.Put2ScrewPosition;
                            step        = 50;
                        }
                        break;

                    case 50:    //判断Z轴是否在0位置,X轴移动到取螺丝位置
                        if (Zaxis.IsInPosition(0))
                        {
                            Xaxis.MoveTo(GetScrewPos.X, AxisParameter.XvelocityCurve);
                            step = 60;
                        }
                        break;

                    case 60:    //X轴到达取螺丝位置,Z轴下降
                        if (Xaxis.IsInPosition(GetScrewPos.X))
                        {
                            Zaxis.MoveTo(GetScrewPos.Z, AxisParameter.ZvelocityCurve);
                            step = 70;
                        }
                        break;

                    case 70:    //Z轴到达取螺丝位置,吸真空
                        if (Zaxis.IsInPosition(GetScrewPos.Z))
                        {
                            InhaleCylinder.Set();
                            step = 80;
                        }
                        break;

                    case 80:    //Z轴上升0位置
                        if (InhaleCylinder.OutMoveStatus)
                        {
                            Zaxis.MoveTo(0, AxisParameter.ZvelocityCurve);
                            ScrewHolePos = Position.ScrewHolePosition[Marking.WorkIndex - 1];
                            step         = 90;
                        }
                        break;

                    case 90:    //Z轴到达0位置,XY轴移动拧螺丝位置
                        if (Zaxis.IsInPosition(0))
                        {
                            Xaxis.MoveTo(ScrewHolePos.X, AxisParameter.XvelocityCurve);
                            Yaxis.MoveTo(ScrewHolePos.Y, AxisParameter.YvelocityCurve);
                            step = 100;
                        }
                        break;

                    case 100:    //XY轴到达拧螺丝位置,Z轴下降
                        if (Xaxis.IsInPosition(ScrewHolePos.X) && Yaxis.IsInPosition(ScrewHolePos.Y))
                        {
                            Zaxis.MoveTo(ScrewHolePos.Z, AxisParameter.ZvelocityCurve);
                            step = 110;
                        }
                        break;

                    case 110:    //Z轴到达拧螺丝位置,启动电批,并Z轴慢速下行
                        if (Zaxis.IsInPosition(ScrewHolePos.Z))
                        {
                            IoPoints.TDO11.Value = true;
                            ZaxisScrewpos        = ScrewHolePos.Z + Position.ScrewDepth;
                            if (IoPoints.TDI9.Value)
                            {
                                Zaxis.MoveTo(ZaxisScrewpos, new VelocityCurve(0, (double)Position.ZScrewSpeed, 0));
                                step = 120;
                            }
                        }
                        break;

                    case 120:    //Z轴到达位置,判断螺丝是否拧紧
                        if (Zaxis.IsInPosition(ZaxisScrewpos))
                        {
                            if (alarm == PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号)
                            {
                                CannotTorIn          = true;
                                alarm                = PlateformAlarm.无消息;
                                IoPoints.TDO11.Value = false;
                                IoPoints.TDO12.Value = true;
                                Thread.Sleep(200);
                                IoPoints.TDO12.Value = false;
                                step = 130;
                            }
                            if (IoPoints.TDI10.Value || IoPoints.TDI11.Value)
                            {
                                step = 130;
                            }
                            else
                            {
                                if (ScrewIsDone > 2)
                                {
                                    alarm   = PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号;
                                    m_Alarm = PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号;
                                }
                                Thread.Sleep(100);
                                ScrewIsDone++;
                            }
                        }
                        break;

                    case 130:    //触发读取数据
                        ScrewPort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1,
                            message  = "0,TR"
                        });
                        HeightGaugePort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1
                        });
                        Thread.Sleep(200);
                        step = 140;
                        break;

                    case 140:    //判断检测结果
                        if (CannotTorIn)
                        {
                            Marking.ResultScrew[Marking.WorkIndex].Result = "NG";
                            step = 150;
                        }
                        else
                        {
                            if (Marking.ResultScrew[Marking.WorkIndex].Result == "OK")
                            {
                                var data = Marking.ResultScrew[Marking.WorkIndex].HeightValue - Global.BaseHeight;
                                if (data > Position.MinHeight && data <= Position.MaxHeight)
                                {
                                    Marking.ResultScrew[Marking.WorkIndex].Result = "OK";
                                }
                                else
                                {
                                    Marking.ResultScrew[Marking.WorkIndex].Result = "NG";
                                }
                                step = 150;
                            }
                            if (Marking.ResultScrew[Marking.WorkIndex].Result == "NG")
                            {
                                step = 150;
                            }
                        }
                        break;

                    case 150:    //电批停止,真空吸气OFF,Z轴回到0位置
                        IoPoints.TDO11.Value = false;
                        InhaleCylinder.Reset();
                        Zaxis.MoveTo(0, AxisParameter.ZvelocityCurve);
                        step = 160;
                        break;

                    case 160:    //真空吸气达到,Z轴到达0位置,计数加+1
                        if (InhaleCylinder.OutOriginStatus && Zaxis.IsInPosition(0))
                        {
                            Marking.WorkIndex++;
                            if (Marking.WorkIndex < Position.HoleNum)
                            {
                                step = 40;
                            }
                            else
                            {
                                step = 170;
                            }
                        }
                        break;

                    case 170:    //判断产品拧螺丝结果
                        for (var i = 0; i < Position.HoleNum; i++)
                        {
                            if (Marking.ResultScrew[i].Result == "OK")
                            {
                                Marking.ProductResult &= true;
                            }
                            else
                            {
                                Marking.ProductResult &= false;
                            }
                        }
                        if (Marking.ProductResult)
                        {
                            Config.ProductOkTotal++;
                        }
                        else
                        {
                            Config.ProductNgTotal++;
                        }
                        step = 180;
                        break;

                    case 180:    //XY轴回到0位置
                        Xaxis.MoveTo(0, AxisParameter.XvelocityCurve);
                        Yaxis.MoveTo(0, AxisParameter.YvelocityCurve);
                        step = 190;
                        break;

                    case 190:    //XY轴到达0位置
                        if (Xaxis.IsInPosition(0) && Yaxis.IsInPosition(0))
                        {
                            step = 200;
                        }
                        break;

                    default:
                        Marking.ProductResult      = true;
                        stationOperate.RunningSign = false;
                        Marking.WorkIndex          = 0;
                        step = 0;
                        break;
                    }
                }
                #endregion

                #region 初始化流程
                if (stationInitialize.Running)
                {
                    switch (stationInitialize.Flow)
                    {
                    case 0:       //清除所有标志位的状态
                        stationInitialize.InitializeDone = false;
                        stationOperate.RunningSign       = false;
                        alarm = PlateformAlarm.无消息;
                        Marking.ProductResult = true;
                        Marking.WorkIndex     = 0;
                        step = 0;
                        Xaxis.Stop();
                        Yaxis.Stop();
                        Zaxis.Stop();
                        if (!Xaxis.IsAlarmed && !Yaxis.IsAlarmed)
                        {
                            Xaxis.IsServon         = true;
                            Yaxis.IsServon         = true;
                            Zaxis.IsServon         = true;
                            stationInitialize.Flow = 10;
                        }
                        break;

                    case 10:      //复位Z轴,真空
                        IoPoints.ApsController.BackHome(Zaxis.NoId);
                        InhaleCylinder.InitExecute();
                        InhaleCylinder.Reset();
                        stationInitialize.Flow = 20;
                        break;

                    case 20:        //判断所有气缸到位,启动Z轴回原点
                        if (InhaleCylinder.OutOriginStatus)
                        {
                            if (IoPoints.ApsController.CheckHomeDone(Zaxis.NoId, 10.0) == 0)
                            {
                                IoPoints.ApsController.BackHome(Xaxis.NoId);
                                IoPoints.ApsController.BackHome(Yaxis.NoId);
                                stationInitialize.Flow = 30;
                            }
                            else
                            {
                                Zaxis.Stop();
                                stationInitialize.InitializeDone = false;;
                                stationInitialize.Flow           = -1;
                            }
                        }
                        break;

                    case 30:    //判断XY轴是否异常,为0,正常,为1:原点异常,为<0:故障
                        var resultX = IoPoints.ApsController.CheckHomeDone(Xaxis.NoId, 10.0);
                        var resultY = IoPoints.ApsController.CheckHomeDone(Yaxis.NoId, 10.0);
                        if (IoPoints.ApsController.CheckHomeDone(Xaxis.NoId, 10.0) == 0 &&
                            IoPoints.ApsController.CheckHomeDone(Yaxis.NoId, 10.0) == 0)
                        {
                            stationInitialize.InitializeDone = true;
                            stationInitialize.Flow           = 40;
                        }
                        else    //异常处理
                        {
                            stationInitialize.InitializeDone = false;;
                            stationInitialize.Flow           = -1;
                        }
                        break;

                    default:
                        break;
                    }
                }
                #endregion

                //故障清除
                if (externalSign.AlarmReset)
                {
                    m_Alarm = PlateformAlarm.无消息;
                }
            }
        }
        public void UpdateAI(float DT)
        {
            if (firstInit)
            {
                waveSegment = (float)wavePosition / (float)waveSize;
                initSpeed();
                UpdateTransform();
                AI_Functions.Instance.RandomiseHover(this);
            }

            // Set variables for specific wave AI.
            switch (waveBehaviour)
            {
            case SPAWN_BEHAVIOUR.STRAIGHT:
                UpdateStraight(DT);
                break;

            case SPAWN_BEHAVIOUR.ZIGZAGGED:
                updateZigzagWave(DT);
                break;

            case SPAWN_BEHAVIOUR.FORMATION:
                if (firstInit)
                {
                    initFormationDelay(1);
                }
                updateFormationWave(DT);
                break;

            case SPAWN_BEHAVIOUR.SLOW_THEN_FAST:
                if (firstInit)
                {
                    initFormationDelay(1);
                }
                updateSlowThenFastWave(DT);
                break;

            case SPAWN_BEHAVIOUR.IN_THEN_OUT:
                if (firstInit)
                {
                    initFormationDelay(1);    //this probably isn't necessary now
                }
                UpdateInThenOut(DT);
                break;

            case SPAWN_BEHAVIOUR.PATROLLING_EDGE:
                UpdatePatrollingEdge(DT);
                break;

            case SPAWN_BEHAVIOUR.ASSAULT:
                UpdateAssault(DT);
                break;

            case SPAWN_BEHAVIOUR.COVERT:
                UpdateCovert(DT);
                break;

            case SPAWN_BEHAVIOUR.ROLLING_TOPBOTTOM:
                UpdateRollingTopBottom(DT);
                break;

            case SPAWN_BEHAVIOUR.TOPBOTTOM:
                UpdateTopBottom(DT);
                break;

            case SPAWN_BEHAVIOUR.STRAIGHT_AIMING:
                UpdateStraightAiming(DT);
                break;

            case SPAWN_BEHAVIOUR.MIDDLE_TOPBOTTOM:
                UpdateMiddleTopBottom(DT);
                break;

            case SPAWN_BEHAVIOUR.KAMIKAZE:
                UpdateKamikaze(DT);
                break;

            case SPAWN_BEHAVIOUR.STRAIGHT_SLOW:
                UpdateStraightSlow(DT);
                break;
            }

            // Limit Y-axis.
            if (waveFormation != SPAWN_STATE.SINGLE_FROM_SIDE && waveFormation != SPAWN_STATE.SINGLE_FROM_TOPBOTTOM)
            {
                if (m_Position.Y < -110)
                {
                    m_Position.Y = -110;
                }
                if (m_Position.Y > 110)
                {
                    m_Position.Y = 110;
                }
            }

            // Fix bounding error.
            if (waveFormation == SPAWN_STATE.SINGLE_FROM_SIDE || waveFormation == SPAWN_STATE.SINGLE_FROM_TOPBOTTOM)
            {
                if (currentMove != 0)
                {
                    if (waveBehaviour == SPAWN_BEHAVIOUR.ASSAULT || currentMove != (totalMoves - 1))
                    {
                        if (m_Position.Y < -110)
                        {
                            Yaxis.pushValue += DT * 2;
                        }
                        if (m_Position.Y > 110)
                        {
                            Yaxis.pushValue -= DT * 2;
                        }

                        // For the rare chance that highly mobile ship ends up too close to the left, just out of range.
                        if (m_Position.Y < -80 && m_Position.Z > -100)
                        {
                            Yaxis.pushValue += DT;
                        }
                        if (m_Position.Y > 80 && m_Position.Z > -100)
                        {
                            Yaxis.pushValue -= DT;
                        }
                    }
                }
            }

            rotationX = MathHelper.Clamp(rotationX, -1f, 1f);
            rotationX = MathHelper.Lerp(0.0f, rotationX, 0.97f);

            if (waveFormation != SPAWN_STATE.SINGLE_FROM_TOPBOTTOM)
            {
                rotationZ = MathHelper.Lerp(0.5f, rotationZ, 0.97f);
                rotationZ = MathHelper.Clamp(rotationZ, -0.25f, 1.3f);
            }

            m_Position.Y += Yaxis.baseSpeed;
            m_Position.Z += Zaxis.baseSpeed;
            Zaxis.Update(DT);
            Yaxis.Update(DT);
            currentMoveTimer += DT;
        }