//-->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度 }
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 //} }