예제 #1
0
        /// <summary>
        /// 计算普通线段上每个点胶位置
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        private PointD[] calNormalLinePoints(LineCoordinate line, double speed, out double intervalSec)
        {
            double totalTime = line.CalculateDistance() / speed;
            // 计算点胶时间 (需要将微秒单位转换成秒)
            double dispenseTime = Machine.Instance.Valve1.SpraySec;

            intervalSec = dispenseTime;

            PointD[] points = null;
            // Control Mode: 控制模式,一共有四种:
            // 1. Pos-based spacing: 指定两滴胶水之间的间距长度值
            // 2. Time-based spacing: 相邻两滴胶水喷胶开始时间的最小时间间隔,单位:秒,如果该参数值为s,本次喷胶开始时间距离上次喷胶开始时间为d,
            //                        如果d < s,则还需要等待(s-d)秒,否则无需等待。
            // 3. Total # of dots: 指定一条线上一共有几个点
            // 4. No dispense: 只运动不喷胶
            if (line.Param.ControlMode == LineParam.CtrlMode.POS_BASED_SPACING)
            {
                points      = calFixedTotalOfDots(line, (int)(line.CalculateDistance() / line.Param.Spacing) + 1);
                intervalSec = totalTime / (points.Length - 1);
                if (intervalSec < dispenseTime)
                {
                    intervalSec = dispenseTime;
                    points      = calFixedTotalOfDots(line, (int)(totalTime / intervalSec) + 1);
                }
            }
            else if (line.Param.ControlMode == LineParam.CtrlMode.TIME_BASED_SPACING)
            {
                intervalSec = line.Param.ShotTimeInterval / 1000.0 < dispenseTime ? dispenseTime : line.Param.ShotTimeInterval / 1000.0;
                points      = calFixedTotalOfDots(line, (int)(totalTime / intervalSec) + 1);
            }
            else if (line.Param.ControlMode == LineParam.CtrlMode.TOTAL_OF_DOTS && line.Param.TotalOfDots > 0)
            {
                intervalSec = totalTime / (line.Param.TotalOfDots - 1);
                if (intervalSec < dispenseTime)
                {
                    intervalSec = dispenseTime;
                    points      = calFixedTotalOfDots(line, (int)(totalTime / intervalSec) + 1);
                }
                else
                {
                    points = calFixedTotalOfDots(line, line.Param.TotalOfDots);
                }
            }
            else
            {
                points = new PointD[0];
            }
            return(points);
        }
예제 #2
0
        /// <summary>
        /// 计算在所有模式下,执行重量线或胶量模式时线命令所需要的参数
        /// </summary>
        private void CalculateWtLineParam(LineCoordinate line, Line directiveLine, out PointD accStartPoint, out PointD decelEndPoint, out double runSpeed, out PointD[] linePoints, out double fluidIntervalSec)
        {
            double accDistance = 0, decelDistance = 0;
            double lineDistance = line.CalculateDistance();
            // 计算点胶数量
            int shots = 0;

            if (directiveLine.LineCmd.lineCmdLine.IsWholeWtMode && directiveLine.LineCmd.lineCmdLine.LineMethod != LineMethod.Single)
            {
                shots = line.Dots;
            }
            else
            {
                shots = (int)((decimal)line.Weight / (decimal)directiveLine.Program.RuntimeSettings.SingleDropWeight);
            }
            // 计算时间 (需要将微秒单位转换成秒)
            double totalTime = Machine.Instance.Valve1.SpraySec * shots;
            // 计算速度
            double wtSpeed = lineDistance / totalTime;

            if (line.Param.WtCtrlSpeedValueType != LineParam.ValueType.COMPUTE)
            {
                wtSpeed = line.Param.WtCtrlSpeed > wtSpeed ? wtSpeed : line.Param.WtCtrlSpeed;
            }
            // 运动速度不能超过设定的最大速度
            wtSpeed = wtSpeed > FluidProgram.Current.MotionSettings.WeightMaxVel ? FluidProgram.Current.MotionSettings.WeightMaxVel : wtSpeed;
            Log.Dprint(string.Format("lineDistance={0}, weight={1} totalTime={2}, param.WtCtrlSpeedValueType={3}, param.WtCtrlSpeed={4}, wtSpeed={5}",
                                     lineDistance, line.Weight, totalTime, line.Param.WtCtrlSpeedValueType, line.Param.WtCtrlSpeed, wtSpeed));

            // 计算加速区间距离
            if (line.Param.AccelDistanceValueType == LineParam.ValueType.COMPUTE)
            {
                accDistance = MathUtils.CalculateDistance(0, wtSpeed, Machine.Instance.Robot.AxisX.ConvertAcc2Mm(FluidProgram.Current.MotionSettings.WeightAcc));
                Log.Dprint("Acc Distance COMPUTE wtSpeed=" + wtSpeed + ", WeightAcc=" + FluidProgram.Current.MotionSettings.WeightAcc
                           + ", distance=" + accDistance);
            }
            else
            {
                accDistance = line.Param.AccelDistance;
            }
            // 计算减速区间距离
            if (line.Param.DecelDistanceValueType == LineParam.ValueType.COMPUTE)
            {
                decelDistance = MathUtils.CalculateDistance(wtSpeed, 0, -Machine.Instance.Robot.AxisX.ConvertAcc2Mm(FluidProgram.Current.MotionSettings.WeightAcc));
                Log.Dprint("Decel Distance COMPUTE wtSpeed=" + wtSpeed + ", WeightAcc=" + FluidProgram.Current.MotionSettings.WeightAcc
                           + ", distance=" + decelDistance);
            }
            else
            {
                decelDistance = line.Param.DecelDistance;
            }
            // 计算加速区间起始位置和减速区间结束位置
            PointD accStart = calAccStartPosition(line, accDistance);
            PointD decelEnd = calDecelEndPosition(line, decelDistance);

            // 计算点胶位置
            PointD[] points = calFixedTotalOfDots(line, shots);

            //基于时间控制
            totalTime = lineDistance / wtSpeed;
            double intervalSec = totalTime / (shots - 1);
            double dispenseSec = Machine.Instance.Valve1.SpraySec;

            if (intervalSec < dispenseSec)
            {
                intervalSec = dispenseSec;
                points      = calFixedTotalOfDots(line, (int)(totalTime / intervalSec) + 1);
            }

            accStartPoint    = accStart;
            decelEndPoint    = decelEnd;
            runSpeed         = wtSpeed;
            linePoints       = points;
            fluidIntervalSec = intervalSec;
        }