コード例 #1
0
        /// <summary>
        /// 查找并初始化系统里面所有的 PCI-9014
        /// </summary>
        /// <returns></returns>
        public override int Init()
        {
            int rc;
            int boarkCount = 0;

            int[] card_id = new int[16];
            //初始化运动轴;
            rc = CPci9014.p9014_initial(ref boarkCount, card_id);
            if (rc != 0)
            {
                Log.GetInstance().ErrorWrite("Initialize PCI-9014 fail");

                return(1);
            }
            //PCI9014的数目;
            //boarkCount = 1;
            if (boarkCount < 1)
            {
                Log.GetInstance().ErrorWrite("Find No PCI-9014 device");
                return(1);
            }
            //获取运动轴的参数
            if (!GetParameter())
            {
                return(1);
            }
            else
            {
                Log.GetInstance().NormalWrite("获取运动轴参数成功!!");
            }
            foreach (var Axis in Global.LstAxis)
            {
                //设置运动参数
                //Alarm 0:低有效  1: 高有效
                rc &= CPci9014.p9014_set_alarm(Axis.No, 0, 1);

                //0:PULSE/DIR  1: CW/CCW
                rc &= CPci9014.p9014_set_pls_outmode(Axis.No, 0);

                //0:PULSE/DIR  1:4X AB
                rc &= CPci9014.p9014_set_pls_iptmode(Axis.No, 0);

                //EL Level 0:低有效  1: 高有效
                rc &= CPci9014.p9014_set_el_level(Axis.No, 0);

                //mode(0:ORG Only  1:ORG+EZ)
                //ORG Level(0:低有效  1: 高有效)
                //EZ  Level(0:低有效  1: 高有效)
                rc &= CPci9014.p9014_home_config(Axis.No, 0, 0, 0);

                //设置T Profile 下的速度,加速度等参数
                rc &= CPci9014.p9014_set_t_profile(Axis.No, Axis.startSpeed, Axis.maxSpeed, Axis.AccTime, Axis.DecTime);
            }
            //关闭所有输出
            SetAllOutBit(false);
            return(rc);
        }
コード例 #2
0
        /// <summary>
        /// 单轴回原点;
        /// </summary>
        /// <param name="axisinfo"></param>
        /// <param name="BitNum"></param>
        /// <returns></returns>
        public override int SingleAxisHomeBack(PCI9014AxisInfo axisinfo, uint BitNum)
        {
            int waittime         = 0;
            int res              = 0;
            int FindORLCondition = 0;

            res = CPci9014.p9014_set_t_profile(axisinfo.No, axisinfo.HomeBackSpeed, axisinfo.HomeBackSpeed, axisinfo.AccTime, axisinfo.DecTime);
            res = CPci9014.p9014_home_move(axisinfo.No, FindORLCondition);//设置为反向查找;
            if (res != 0)
            {
                Log.GetInstance().ErrorWrite("回原点失败!!");
                return(res);
            }
            while (true)
            {
                if (waittime == 50)
                {
                    Log.GetInstance().ErrorWrite(string.Format("{0}回原点超时!!", axisinfo.AxisName));
                    Global.AxisControlCard.Stop(axisinfo);
                    return(res);
                }
                waittime++;
                res = (int)Global.AxisControlCard.GetInBit(0, BitNum);
                if (res == 2)
                {
                    continue;
                }
                else if (res == 1 && axisinfo.AxisName == "检测相机")
                {
                    Log.GetInstance().ErrorWrite(string.Format("{0}-运动轴报警!!!", axisinfo.AxisName));
                    Global.AxisControlCard.Stop(axisinfo);
                    return(res);
                }
                else if (res == 0 && axisinfo.AxisName == "遮光幕布")
                {
                    Log.GetInstance().ErrorWrite(string.Format("{0}-运动轴报警!!!", axisinfo.AxisName));
                    Global.AxisControlCard.Stop(axisinfo);
                    return(res);
                }
                res = (int)IsMotionDone(axisinfo);
                if (res == 2)
                {
                    Log.GetInstance().ErrorWrite("获取运动状态失败!!");
                    break;
                }
                else if (res == 0)
                {
                    Log.GetInstance().NormalWrite(string.Format("{0}轴的运动状态已停止!!", axisinfo.AxisName));
                    break;
                }
                Thread.Sleep(1000);
            }
            return(res);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: yisea123/smtm
        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));
            }
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
 public override int HomeMoveConfig(PCI9014AxisInfo axinfo)
 {
     CPci9014.p9014_set_t_profile(axinfo.No, 5000, 20000, 1000, 1000);//固定一个回原速度
     return(CPci9014.p9014_home_config(axinfo.No, 0, 1, 1));
 }
コード例 #7
0
 public override int SettProfile(SingleDemura.PCI9014AxisInfo axinfo)
 {
     return(CPci9014.p9014_set_t_profile(axinfo.No, axinfo.startSpeed, axinfo.maxSpeed, axinfo.AccTime, axinfo.DecTime));
 }
コード例 #8
0
        /// <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);
        }