/// <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_)); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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)); }