コード例 #1
0
ファイル: MainUi.cs プロジェクト: TongqingChen/MotionControl
        private void button6_Click(object sender, EventArgs e)
        {
            double v_ = 200;  // mm/s
            double a_ = 2000; // mm/s^2

            double trigInterval = 3.0;
            double xc = 125, yc = 160; //扫描圆心
            double r = 100;            //扫描区域半径

            Axis    AX     = Motion.Axis(X);
            Axis    AY     = Motion.Axis(Y);
            Point2i axes   = new Point2i(X, Y);
            double  offset = -0.2; //两通道触发间隔


            Point2d pos2d_start = new Point2d();
            Point2d pos2d_end   = new Point2d();

            int err_ = 0;

            int direction_ = 0;

            bool use_tirgger_data = false;

            for (int i = 0; i < 2 * r / trigInterval - 1; i++)
            {
                //step0: 计算点位
                direction_    = (i % 2 == 0) ? 1 : -1;
                pos2d_start.y = yc - r + trigInterval * (i + 1);
                pos2d_start.x = xc - direction_ * Math.Sqrt(r * r - (pos2d_start.y - yc) * (pos2d_start.y - yc));
                pos2d_end.x   = 2 * xc - pos2d_start.x;
                pos2d_end.y   = pos2d_start.y - 0.3 * direction_; //Y适当错位,模拟斜着运动扫描(这里模拟走一个圆)
                Console.WriteLine("{0}: ({1}, {2}) -> ({3}, {4})", i, pos2d_start.x, pos2d_start.y, pos2d_end.x, pos2d_end.y);
                //step1: 运动到起点
                //XY移动到起点 AbsMoveOver = AbsMove + MotionDone
                //这里也可以用 Motion.Axis(X).AbsMove();
                if ((err_ = Motion.AbsMoveOver(axes, pos2d_start)) != 0)
                {
                    MessageBox.Show("Error: " + err_);
                    return;
                }
                //step2: 设置触发位置
                double triggerPos_ = pos2d_start.x + 0.5 * direction_; //第一个位置和当前位置相距一毫米
                //位置列表,绝对位置,单位mm
                if (use_tirgger_data)
                {
                    var trigPos0_ = new List <double>();
                    while ((pos2d_end.x - triggerPos_) * direction_ > 0)
                    {
                        trigPos0_.Add(triggerPos_);     //通道0触发光源
                        triggerPos_ += direction_ * trigInterval;
                    }
                    if ((err_ = AX.TriggerData(trigPos0_, direction_ * offset)) != 0)
                    {
                        MessageBox.Show("Error: " + err_);
                        return;
                    }
                }
                else //等间隔触发,绝对位置,单位mm
                {
                    int triggerCnt_ = (int)((Math.Abs(pos2d_end.x - pos2d_start.x) - 1.0) / trigInterval); //保证最后一个点至少与起点相距0.5mm
                    if ((err_ = AX.TriggerLinear(triggerPos_, direction_ * trigInterval, triggerCnt_, direction_ * offset)) != 0) //触发相机和光源
                    {
                        MessageBox.Show("Error: " + err_);
                        return;
                    }
                }

                //step3: 插补运动
                //LineOver = Line+LineDone
                if ((err_ = Motion.LineOver(axes, pos2d_end, v_, a_)) != 0)
                {
                    MessageBox.Show("Error: " + err_);
                    return;
                }

                //step4: 停止触发并process images
                if ((err_ = AX.TriggerStop()) != 0)
                {
                    MessageBox.Show("Error: " + err_);
                    return;
                }
            }
        }