//-->5、Y角度二次插补循环
        private void button9_Click(object sender, EventArgs e)
        {
            switch (comboBox1.Text.Trim())
            {
            case "-15":
                Class_Comm.SetYPosition(-15, 20, 10);
                break;

            case "-12":
                Class_Comm.SetYPosition(-12, 20, 10);
                break;

            case "-9":
                Class_Comm.SetYPosition(-9, 20, 10);
                break;

            case "-6":
                Class_Comm.SetYPosition(-6, 20, 10);
                break;

            case "-3":
                Class_Comm.SetYPosition(-3, 20, 10);
                break;

            case "0":
                Class_Comm.SetYPosition(0, 20, 10);
                break;

            case "3":
                Class_Comm.SetYPosition(3, 20, 10);
                break;

            case "6":
                Class_Comm.SetYPosition(6, 20, 10);
                break;

            case "9":
                Class_Comm.SetYPosition(9, 20, 10);
                break;

            case "12":
                Class_Comm.SetYPosition(12, 20, 10);
                break;

            case "15":
                Class_Comm.SetYPosition(15, 20, 10);
                break;
            }
        }
        //-->5、Y角度二次插补循环
        private void button9_Click(object sender, EventArgs e)
        {
            double _position;
            bool   _flag = false;

            _position = Convert.ToDouble(comboBox1.Text.Trim());
            foreach (double a in AngleRange)
            {
                if (a == _position)
                {
                    _flag = true;
                }
            }
            if (_flag == true)
            {
                Class_Comm.SetYPosition(_position, 20, 10);
            }
            else
            {
                MessageBox.Show("请输入正确的角度!");
            }
        }
        //-->4、台体转到相对位置12度(顺时针)
        private void button7_Click(object sender, EventArgs e)
        {//当前Y轴位置加上12
            double _yAngleToMove = Form_Rotate303.Yposition - 12;

            Class_Comm.SetYPosition(_yAngleToMove, 20, 10);
        }
        //-->3、倾角显示归零
        private void button5_Click(object sender, EventArgs e)
        {                                              //Y轴正数转台Y轴反转,负数正转
            double _yAngle = Form_Communicate.YAngle;  //当前X轴角度

            Class_Comm.SetYPosition(-_yAngle, 20, 10); //Y轴转动
        }
 //-->2、台体转到绝对位置0度
 private void button4_Click(object sender, EventArgs e)
 {
     Class_Comm.SetYPosition(0, 20, 10);//Y轴转到0度
 }
 //-->1、台体转到绝对位置180度
 private void button1_Click(object sender, EventArgs e)
 {
     Class_Comm.SetXPosition(-90, 20, 10); //X轴转到-90度
     Class_Comm.WaitXAxis();               //等待停止
     Class_Comm.SetYPosition(180, 20, 10); //Y轴转到0度
 }
Exemplo n.º 7
0
        bool relSaveFlag      = false;                                      //相对定位时,间隔停止采集标志位

        #endregion

        //-->转台转动相对位置
        private void button_RPosition_Click(object sender, EventArgs e)
        {
            _stopFlag = false; //置位标志位
            if (Form_Rotate303.Control_State == false)
            {
                MessageBox.Show("请先连接转台!");
                return;
            }
            if (RPosition.Text.Trim() == "")
            {
                MessageBox.Show("请输入正确的角度!");
                return;
            }
            //try
            //{
            double _rPosition = Convert.ToDouble(RPosition.Text.Trim()); //要转动的相对位置

            if (radSingleGo.Checked == true)                             //单次定位
            {
                try
                {
                    button_RPosition.Enabled = false;
                    Class_Comm.RelXRun(_rPosition, 20, 10);
                    button_RPosition.Enabled = true;
                }
                catch (Exception a)
                {
                    MessageBox.Show(a.Message);
                }
            }
            else //连续定位
            {
                if (Convert.ToDouble(RPosition.Text.Trim()) == 0)
                {
                    MessageBox.Show("请输入正确的角度!");
                    return;
                }
                if (360 % _rPosition != 0)
                {
                    MessageBox.Show("请输入一个能被360整除的角度!");
                    return;
                }
                if (txtTime.Text.Trim() == "")
                {
                    MessageBox.Show("请输入时间!");
                    return;
                }
                if (_path == string.Empty)
                {
                    MessageBox.Show("请选择文件存储路径!");
                    return;
                }

                #region 禁止按键

                radSingleGo.Enabled     = false;
                radContinuousGo.Enabled = false;
                RPosition.Enabled       = false;
                txtTime.Enabled         = false;
                txtFileName.Enabled     = false;

                #endregion

                _countNum = Convert.ToInt32(Math.Truncate(360 / _rPosition)); //计算中间停止次数
                double[] maxAzimuth       = new double[_countNum + 1];        //存储每次停止数据中出现频率最大的值
                double[] azimuthPrecision = new double[_countNum + 1];        //存储方位角的精确值

                #region 设置进度条

                progressBar1.Visible = true;
                progressBar1.Value   = 0;
                progressBar1.Minimum = 0;
                progressBar1.Maximum = _countNum + 1;
                progressBar1.Step    = 1;
                Num = 0;
                timerProcessBar.Enabled = true; //开启定时器

                #endregion

                _collectFlag             = true;                                                 //采集
                button_RPosition.Enabled = false;
                relSaveFlag = true;                                                              //开始存储静态方位角
                Class_Comm.Delay(Convert.ToInt32(Convert.ToDouble(txtTime.Text.Trim()) * 1000)); //暂停指定的时间
                //Thread.Sleep(Convert.ToInt32(txtTime.Text.Trim()));
                relSaveFlag = false;
                ;                     //停止存储静态方位角
                _collectFlag = false; //停止采集

                #region 方位角处理

                #region backup

                //Dictionary<double, Int32> azimuthMax = new Dictionary<double, int>();//存放已经遍历过的方位角和此方位角出现的次数
                //for (int i = 0; i < azimuthSave.Count; i++)//遍历所有方位角数据
                //{
                //    if (azimuthMax.Count == 0)
                //    {
                //        azimuthMax.Add((double)azimuthSave[i], 1);//增加这一数据并计次数为1
                //        return;
                //    }
                //    foreach (KeyValuePair<double, Int32> kvp in azimuthMax)
                //    {
                //        if (kvp.Key == (double)azimuthSave[i])//键值对中已经有此数据
                //        {
                //            azimuthMax[(double)azimuthSave[i]]++;//数据出现次数+1
                //        }
                //        else//键值对中没有此数据
                //        {
                //            azimuthMax.Add((double)azimuthSave[i],1);//增加这一数据并计次数为1
                //        }
                //    }
                //}
                //KeyValuePair<double, Int32> max = azimuthMax.Max();

                #endregion

                maxAzimuth[Num] = GetMaxAzimuth(azimuthSave); //赋值当前转动次数的最大值
                if (maxAzimuth[Num] == -1)
                {
                    MessageBox.Show("产品没有数据,请检查!");
                    btnStop_Click(null, null);
                    return;
                }
                azimuthSave.Clear(); //清空保存的数据

                #endregion

                #region 连续转动的处理

                for (int i = 0; i < _countNum; i++)
                {
                    Num = i + 1; //当前转动次数增加
                    if (_stopFlag)
                    {
                        return;
                    }
                    Class_Comm.RelXRun(_rPosition, 20, 10);                                          //转动
                    //int start = Environment.TickCount;
                    _collectFlag = true;                                                             //采集
                    relSaveFlag  = true;                                                             //开始存储静态方位角
                    //MessageBox.Show("开始采集");
                    Class_Comm.Delay(Convert.ToInt32(Convert.ToDouble(txtTime.Text.Trim()) * 1000)); //暂停指定的时间
                    //Thread.Sleep(Convert.ToInt32(txtTime.Text.Trim()));
                    relSaveFlag = false;
                    ;                     //停止存储静态方位角
                    _collectFlag = false; //停止采集
                    //int end = Math.Abs(Environment.TickCount - start);
                    //MessageBox.Show(end.ToString());
                    maxAzimuth[Num] = GetMaxAzimuth(azimuthSave); //赋值当前转动次数的最大值
                    azimuthSave.Clear();                          //清空保存的数据
                }

                #endregion

                #region 解算精度

                azimuthPrecision[0] = 0; //第一次精度为0(精度计算方法:当前角度 - 上一角度 - 相对转动角度)
                for (int i = 1; i < _countNum + 1; i++)
                {
                    azimuthPrecision[i] = maxAzimuth[i] - maxAzimuth[i - 1] - Math.Abs(Convert.ToDouble(RPosition.Text));
                    if (Math.Abs(maxAzimuth[i] - maxAzimuth[i - 1]) > 180) //判断过渡0°和360°方法
                    {
                        if (maxAzimuth[i] < maxAzimuth[i - 1])             //后一个值小于前一个值  例如 5° 355°
                        {
                            azimuthPrecision[i] = maxAzimuth[i] + 360 - maxAzimuth[i - 1] -
                                                  Math.Abs(Convert.ToDouble(RPosition.Text));
                        }
                        else //后一个值大于前一个值  例如 355° 5°
                        {
                            azimuthPrecision[i] = 360 - maxAzimuth[i] + maxAzimuth[i - 1] -
                                                  Math.Abs(Convert.ToDouble(RPosition.Text));
                        }
                    }
                    azimuthPrecision[i] = Math.Round(azimuthPrecision[i], 2);
                }

                #endregion

                #region 合成要写入EXCEL的信息

                string[] infoHead      = new string[_countNum + 2]; //时间,0,1,...
                string[] infoAzimuth   = new string[_countNum + 2]; //方位角,a1,a2,...
                string[] infoPrecision = new string[_countNum + 2]; //精度值,p1,p2....
                infoHead[0]      = DateTime.Now.ToString("MM-dd HH:mm:ss");
                infoAzimuth[0]   = "方位角";
                infoPrecision[0] = "精度值";
                for (int i = 1; i < _countNum + 2; i++)
                {
                    infoHead[i]      = (i - 1).ToString();
                    infoAzimuth[i]   = maxAzimuth[i - 1].ToString("0.0");
                    infoPrecision[i] = azimuthPrecision[i - 1].ToString("0.000");
                }

                #endregion

                #region 将精度数据写入excel

                #region 微软方法写数据(不兼容不同的office 版本)

                ////查询是否有excel文件,如果没有则建立一个
                //_exclePath = _filePath + "\\" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ".xlsx";
                //if (!File.Exists(_exclePath))//不存在
                //{
                //    Class_Comm.CreateExcel(_exclePath); //创建
                //}
                //Class_Comm.OpenExcel(_exclePath, infoHead, infoAzimuth, infoPrecision);//打开并修改文件

                #endregion

                #region NPOI方法

                _exclePath = _filePath + "\\" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ".xls";
                if (!File.Exists(_exclePath)) //文件不存在则创建一个
                {
                    Class_Comm.NPOICreateExcel(_exclePath);
                }
                Class_Comm.NPOIReadExcel(_exclePath, infoHead, infoAzimuth, infoPrecision); //打开并修改文件

                #endregion

                #endregion

                #region 生成图表

                Class_Comm.MakeChart(chart1, azimuthPrecision, txtFileName.Text.Trim());

                #endregion

                #region 使能按键

                radSingleGo.Enabled      = true;
                radContinuousGo.Enabled  = true;
                RPosition.Enabled        = true;
                txtTime.Enabled          = true;
                txtFileName.Enabled      = true;
                button_RPosition.Enabled = true;

                #endregion

                timerProcessBar.Enabled = false; //关闭定时器
                progressBar1.Visible    = false;
            }
            //}
            //catch (Exception a)
            //{
            //    MessageBox.Show(a.Message);
            //    #region 使能按键
            //    radSingleGo.Enabled = true;
            //    radContinuousGo.Enabled = true;
            //    RPosition.Enabled = true;
            //    txtTime.Enabled = true;
            //    txtFileName.Enabled = true;
            //    #endregion
            //}
        }