/// <summary> /// 单轴回负极线位置; /// </summary> /// <param name="axisinfo"></param> /// <returns></returns> public override int SingleAxisBackWorkPos(PCI9014AxisInfo axisinfo) { int res = 0; if (IsORG(axisinfo) != 1) { res = CPci9014.p9014_set_t_profile(axisinfo.No, axisinfo.HomeBackSpeed, axisinfo.HomeBackSpeed, axisinfo.AccTime, axisinfo.DecTime); res = CPci9014.p9014_home_move(axisinfo.No, 0);//设置为反向查找; while (true) { if (IsMotionDone(axisinfo) == 0) { break; } Thread.Sleep(100); } if (res != 0) { Log.GetInstance().ErrorWrite("测试完成后回原点失败!!"); return(res); } res = IsORG(axisinfo); if (res != 1) { Log.GetInstance().ErrorWrite("测试完成回后原点失败!!"); return(res); } } axisinfo.cmdPos = axisinfo.WorkPosition1; res = CPci9014.p9014_set_t_profile(axisinfo.No, axisinfo.startSpeed, axisinfo.maxSpeed, axisinfo.AccTime, axisinfo.DecTime); res = CPci9014.p9014_pmove(axisinfo.No, axisinfo.cmdPos, 0, 2); //检查运动是否完成,且检查运动轴是否报警; while (true) { if (IsMotionDone(axisinfo) == 0) { break; } Thread.Sleep(50); } if (Global.AxisControlCard.GetCurrentPos(axisinfo) == 0) { if (System.Math.Abs(axisinfo.curPos - axisinfo.cmdPos) > 1000) { Log.GetInstance().ErrorWrite("与目标位置相差大于1000个脉冲!!"); res = 2; } } return(res); }
private void button1_Click(object sender, EventArgs e) { double start_vel, max_vel, acc, dec; int dist; int rc = 0; start_vel = Convert.ToDouble(textBox1.Text); max_vel = Convert.ToDouble(textBox2.Text); acc = Convert.ToDouble(textBox3.Text); dec = Convert.ToDouble(textBox4.Text); dist = Convert.ToInt32(textBox5.Text); CPci9014.p9014_set_t_profile(m_axis, start_vel, max_vel, acc, dec); switch (m_type) { case 0: { CPci9014.p9014_pmove(m_axis, dist, 0, 2); break; } case 1: { CPci9014.p9014_vmove(m_axis, 1, 2); break; } case 2: { CPci9014.p9014_vmove(m_axis, 0, 2); break; } } if (rc != 0) { MessageBox.Show("Stop Axis fail,return code:" + Convert.ToString(rc)); } }
/// <summary> /// 距离间的运动; /// </summary> /// <param name="axinfo"></param> /// <param name="VStart"></param> /// <param name="VMax"></param> /// <param name="MovePosition"></param> /// <param name="MovedDistance"></param> /// <returns></returns> public override ErrorInfo SectionMotion(PCI9014AxisInfo axinfo, int VStart, int VMax, int MovePosition, int MovedDistance) { int requesttimes = 0; while (CPci9014.p9014_set_t_profile(axinfo.No, VStart, VMax, axinfo.AccTime, axinfo.DecTime) != 0) { Thread.Sleep(10); } while (CPci9014.p9014_pmove(axinfo.No, MovePosition, 0, 2) != 0) { Thread.Sleep(10); } //Thread.Sleep(10); while (true) { if (IsMotionDone(axinfo) == 0) { break; } Thread.Sleep(50); } while (GetCurrentPos(axinfo) != 0) { Thread.Sleep(10); requesttimes++; if (requesttimes == 100) { Log.GetInstance().ErrorWrite("获取当前位置失败!"); return(ErrorInfo.ErrorCmdExcuteFail); } } if (System.Math.Abs((double)axinfo.curPos - (double)MovedDistance) > 1000) //实际位置和期望位置误差太大,超过了1000 { Log.GetInstance().ErrorWrite("运动完成了,但实际位置和期望位置误差大于1000脉冲!"); return(ErrorInfo.ErrorNotMoveToCorrectPos); } return(ErrorInfo.ErrorSucceed); }
/// <summary> /// 回原运动 /// </summary> /// <param name="axbase"></param> /// <returns></returns> public override int HomeAllAxis(PCI9014AxisInfo SetAxis) { Log.GetInstance().WarningWrite("正在回原点,请等待......"); //当处于原点时,需要往正向移动一定距离,然后再进行复位动作,保证每次复位位置一致 int res = 0; res = IsORG(SetAxis); if (res == 1) { Log.GetInstance().WarningWrite(string.Format("{0}--已经在原点位置无需回原运动!", SetAxis.AxisName)); goto WorkPos; } else if (res == 2) { return((int)(ErrorInfo.ErrorCmdExcuteFail)); } CPci9014.p9014_set_t_profile(SetAxis.No, SetAxis.startSpeed, SetAxis.maxSpeed, SetAxis.AccTime, SetAxis.DecTime); CPci9014.p9014_pmove(SetAxis.No, SetAxis.StartBackHomeDis, 0, 2); while (true) { if (IsMotionDone(SetAxis) == 0) { break; } Thread.Sleep(50); } //固定回原速度,起止速度相同; CPci9014.p9014_set_t_profile(SetAxis.No, SetAxis.HomeBackSpeed, SetAxis.HomeBackSpeed, SetAxis.AccTime, SetAxis.DecTime); CPci9014.p9014_home_move(SetAxis.No, 0); while (true) { if (IsMotionDone(SetAxis) == 0) { break; } Thread.Sleep(50); } Thread.Sleep(100); res = IsORG(SetAxis); if (res == 1) { Log.GetInstance().WarningWrite("回原点成功!!"); } else { Log.GetInstance().ErrorWrite("回原点失败!!"); return((int)ErrorInfo.ErrorCmdExcuteFail); } Log.GetInstance().WarningWrite(string.Format("{0}--准备运动到工作位置!", SetAxis.AxisName)); res = Global.AxisControlCard.GetCurrentPos(SetAxis); if (res != 0) { Log.GetInstance().ErrorWrite("获取当前位置失败!!"); return((int)ErrorInfo.ErrorCmdExcuteFail); } WorkPos : SetAxis.cmdPos = SetAxis.WorkPosition1 - SetAxis.curPos; res = Global.AxisControlCard.PRelativeMove(SetAxis); if (res != (int)ErrorInfo.ErrorSucceed) { Log.GetInstance().ErrorWrite(string.Format("{0}运动失败!!", SetAxis.AxisName)); return((int)ErrorInfo.ErrorCmdExcuteFail); } return((int)ErrorInfo.ErrorSucceed); }
/// <summary> /// 点位绝对运动(单个轴点到点的驱动,根据不同模式做出不同的加减速) /// </summary> /// <param name="axinfo"></param> /// <returns></returns> public override int PAbsoluteMove(SingleDemura.PCI9014AxisInfo axinfo) { return(CPci9014.p9014_pmove(axinfo.No, axinfo.cmdPos, 1, 2)); }