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