Пример #1
0
        /// <summary>
        /// 两轴阻塞检测运动完成函数,调用Axis类中的MotionDone函数
        /// </summary>
        /// <param name="axis">轴号,0-based</param>
        /// <returns>0表示成功,非0值表示错误码</returns>
        public static int MotionDone(Point2i axis)
        {
            var axis_ = new List <int>()
            {
                axis.x, axis.y
            };

            return(MotionDone(axis_));
        }
Пример #2
0
        /// <summary>
        /// 两轴直线插补运动,发指令后,阻塞检测完成。
        /// </summary>
        /// <param name="axis">轴1,0-based</param>
        /// <param name="pos">目标位置</param>
        /// <param name="resultantVel">运动合速度,单位m/s</param>
        /// <param name="resultantAcc">运动合加速度,单位m/s^2</param>
        /// <param name="maxSeconds">最大检测完成时间,超时时间,单位秒</param>
        /// <returns>0表示成功,非零值表示错误码</returns>
        public static int LineOver(Point2i axis, Point2d pos, double resultantVel, double resultantAcc, double maxSeconds = 20)
        {
            int err_ = 0;

            if ((err_ = Line(axis, pos, resultantVel, resultantAcc)) != 0)
            {
                return(err_);
            }
            Thread.Sleep(100);
            return(err_ = LineDone(maxSeconds));
        }
Пример #3
0
        /// <summary>
        /// 两轴直线插补运动指令,不检测完成
        /// </summary>
        /// <param name="axis">轴ID, 0-based</param>
        /// <param name="pos">目标位置</param>
        /// <param name="resultantVel">运动合速度,单位m/s</param>
        /// <param name="resultantAcc">运动合加速度,单位m/s^2</param>
        /// <returns>0表示成功,负值表示错误码</returns>
        public static int Line(Point2i axis, Point2d pos, double resultantVel, double resultantAcc)
        {
            int err_ = 0;

            if (!online_)
            {
                return(0);
            }
            if (!_isIdNormal(axis.x) || !_isIdNormal(axis.y))
            {
                return((int)(Error.IdOutOfRange));
            }
            if (axisList_[axis.x].cardId != axisList_[axis.y].cardId)
            {
                return((int)(Error.AxesNotInOneCard));
            }
            lhmtc.CrdCfg crdCfg_ = new lhmtc.CrdCfg();
            crdCfg_.dimension = 2;
            crdCfg_.profile   = new short[8] {
                axisList_[axis.x].id, axisList_[axis.y].id, 0, 0, 0, 0, 0, 0
            };
            crdCfg_.orignPos = new int[8] {
                0, 0, 0, 0, 0, 0, 0, 0
            };
            crdCfg_.setOriginFlag = 1;
            crdCfg_.evenTime      = 10;
            crdCfg_.synAccMax     = 720; //[0-750]
            crdCfg_.synVelMax     = 720; //[0-750]
            crdCfg_.synDecSmooth  = 1;
            crdCfg_.synDecAbrupt  = 500;

            if ((err_ = lhmtc.LH_SetCrdPrm(crdSys_, ref crdCfg_, false)) != 0)
            {
                return(err_);
            }
            if ((err_ = lhmtc.LH_CrdClear(crdSys_, 1, fifo_, false)) != 0)
            {
                return(err_);
            }
            if ((err_ = lhmtc.LH_LnXY(crdSys_,
                                      axisList_[axis.x]._mm2pls(pos.x), axisList_[axis.y]._mm2pls(pos.y),
                                      axisList_[axis.x]._vel2pls(resultantVel), axisList_[axis.x]._acc2pls(resultantAcc),
                                      0, fifo_)) != 0)
            {
                return(err_);
            }
            if ((err_ = lhmtc.LH_CrdStart((short)(1 << (crdSys_ - 1)), (short)(1 << (fifo_ - 1)), false)) != 0)
            {
                return(err_);
            }
            return(0);
        }
Пример #4
0
        /// <summary>
        /// 两轴绝对运动+阻塞检测完成,调用Axis类中的AbsMove + Done方法
        /// </summary>
        /// <param name="axis">轴号,0-based</param>
        /// <param name="pos">目标位置,单位mm</param>
        /// <param name="spd_ratio">运动速率,正数,可以大于1</param>
        /// <returns>0表示成功,非0值表示错误码</returns>
        public static int AbsMoveOver(Point2i axis, Point2d pos, double spd_ratio = 1.0)
        {
            var axis_ = new List <int>()
            {
                axis.x, axis.y
            };
            var pos_ = new List <double>()
            {
                pos.x, pos.y
            };

            return(AbsMoveOver(axis_, pos_, spd_ratio));
        }
Пример #5
0
 /// <summary>
 /// 设置两通道分别线性触发位置,并启动位置监控
 /// </summary>
 /// <param name="startPos">两个触发通道的起始点,绝对位置,单位mm</param>
 /// <param name="interval">间距,单位mm,如果设置往负方向等间距触发,则为负值</param>
 /// <param name="trigCnt">触发次数</param>
 /// <returns>0表示成功,非零表示错误</returns>
 public int TriggerLinear(Point2d startPos, Point2d interval, Point2i trigCnt)
 {
     if (!online_)
     {
         return(0);
     }
     int[] pBuf1 = new int[trigCnt.x];
     for (int i = 0; i < trigCnt.x; i++)
     {
         pBuf1[i] = _mm2pls(startPos.x + interval.x * i);
     }
     int[] pBuf2 = new int[trigCnt.y];
     for (int i = 0; i < trigCnt.y; i++)
     {
         pBuf2[i] = _mm2pls(startPos.y + interval.y * i);
     }
     return(lhmtc.LH_CompareData(id, 1, 0, 0, pulseWidth_, ref pBuf1[0], (short)trigCnt.x, ref pBuf2[0], (short)trigCnt.y, false));
 }