/// <summary> /// 螺杆阀Inspect模式下的运行逻辑 /// </summary> /// <returns></returns> private Result SvValveInspectLogic(Line line) { Result ret = Result.OK; List <PointD> points = this.CaculateSvValvePoints(line); if (line.LineCmd.lineCmdLine == null || points == null) { return(ret); } if (line.LineCmd.lineCmdLine.LineMethod != LineMethod.Single) { return(ret); } for (int i = 0; i < points.Count; i++) { //为了去到线段的起点,会跳过list的奇数部分(终点) if (i % 2 == 1) { continue; } else { ret = Machine.Instance.Robot.MovePosXYAndReply(points[i], FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); if (!ret.IsOk) { return(ret); } LineCmdLine lineCmdline = line.LineCmd.lineCmdLine; InspectionLine inspectionLine = InspectionMgr.Instance.FindBy((int)lineCmdline.inspectionKey) as InspectionLine; if (inspectionLine != null) { Thread.Sleep(inspectionLine.SettlingTime); double width1, width2; Machine.Instance.CaptureAndInspect(inspectionLine); width1 = inspectionLine.PhyWidth1; width2 = inspectionLine.PhyWidth2; Log.Dprint(inspectionLine.CurrResultStr); string resline = string.Format("{0},{1},{2},{3}", Math.Round(points[i].X, 3), Math.Round(points[i].Y, 3), Math.Round(width1, 3), Math.Round(width2, 3)); CsvUtil.WriteLine(line.Program.RuntimeSettings.FilePathInspectRect, resline); Thread.Sleep(inspectionLine.DwellTime); } } } return(ret); }
private void btnTest_Click(object sender, EventArgs e) { if (this.inspection == null) { return; } this.inspection.ExposureTime = this.cameraControl1.ExposureTime; this.inspection.Gain = this.cameraControl1.Gain; //this.inspection.LightType = this.cameraControl1.Lighting; this.inspection.ExecutePrm = this.cameraControl1.ExecutePrm; this.inspection.PosInMachine.X = tbLocationX.Value; this.inspection.PosInMachine.Y = tbLocationY.Value; Task.Factory.StartNew(() => { if (this.rbnTaught.Checked) { Machine.Instance.Robot.MoveSafeZAndReply(); //Machine.Instance.Robot.MovePosXYAndReply(this.inspection.PosInMachine); Machine.Instance.Robot.ManualMovePosXYAndReply(this.inspection.PosInMachine); } if (this.inspection is InspectionLine) { InspectionLine inspectionLine = this.inspection as InspectionLine; this.inspection = inspectionLine; } //double imgX, imgY, dx, dy; Result rtn = Machine.Instance.CaptureAndInspect(this.inspection); this.BeginInvoke(new Action(() => { if (rtn.IsOk) { this.txtResult.BackColor = Color.Green; } else { this.txtResult.BackColor = Color.Red; } this.txtResult.Text = this.inspection.CurrResultStr; })); }); }
/// <summary> /// 执行单条线段命令,连续插补模式,将每条线压入插补队列 /// </summary> /// <param name="line"></param> /// <param name="accStart">加速区间距离</param> /// <param name="decelEnd">减速区间距离</param> /// <param name="speed">线段区间的运动速度</param> /// <param name="points">每一滴胶水的点胶位置</param> /// <param name="intervalSec">每一滴胶水的打胶时间,单位秒</param> /// <returns></returns> private Result executeSingleLine(Line directiveLine, LineCoordinate line, PointD accStart, PointD decelEnd, double speed, PointD[] points, double intervalSec) { double lineOffset = line.Param.Offset; // 偏移调整 if (Machine.Instance.Valve1.RunMode == ValveRunMode.Dry || Machine.Instance.Valve1.RunMode == ValveRunMode.Wet || Machine.Instance.Valve1.RunMode == ValveRunMode.AdjustLine) { if (directiveLine.LineCmd.RunnableModule.CommandsModule.IsReversePattern) { lineOffset += line.LookOffsetRevs; } else { lineOffset += line.LookOffset; } } VectorD v = (line.End - line.Start).Normalize() * lineOffset; //相机位置 PointD cameraLineStart = line.Start + v; PointD cameraLineEnd = line.End + v; PointD cameraAccStart = accStart + v; PointD cameraDecEnd = decelEnd + v; PointD[] cameraPoints = new PointD[points.Length]; PointD[] cameraPoints2 = new PointD[points.Length];//副阀的点位 for (int i = 0; i < points.Length; i++) { cameraPoints[i] = points[i] + v; } //胶枪点胶起点 PointD valveAccStart = cameraAccStart.ToNeedle(directiveLine.Valve, directiveLine.Tilt); //副阀点胶起点位置(默认值为设定间距) PointD simulStart = new PointD(directiveLine.Program.RuntimeSettings.SimulDistence, 0) /*-胶阀原点间距?*/; ///生成副阀相关参数(起点、插补点位) if (directiveLine.RunnableModule.Mode == ModuleMode.MainMode) { //副阀插补坐标绝对值(X方向实际坐标取负值) = 主阀机械坐标-副阀机械坐标-双阀原点间距(理论情况-不考虑坐标系不平行) VectorD SimulModuleOffset = Machine.Instance.Robot.CalibPrm.NeedleCamera2 - Machine.Instance.Robot.CalibPrm.NeedleCamera1; for (int i = 0; i < points.Length; i++) { cameraPoints2[i] = cameraPoints[i] - directiveLine.RunnableModule.SimulTransformer.Transform(cameraPoints[i]).ToVector() - SimulModuleOffset; //乘以系数得到AB轴的移动位移 cameraPoints2[i].X = -Math.Abs(cameraPoints2[i].X) / Machine.Instance.Robot.CalibPrm.HorizontalRatio; cameraPoints2[i].Y = -cameraPoints2[i].Y / Machine.Instance.Robot.CalibPrm.VerticalRatio; } //副阀在加速段直接使用实际点胶起始位置 simulStart = cameraPoints2[0]; } Result ret = Result.OK; double targZ = 0; if (Machine.Instance.Laser.Laserable.Vendor == Drive.Sensors.HeightMeasure.Laser.Vendor.Disable) { targZ = directiveLine.Program.RuntimeSettings.BoardZValue + line.Param.DispenseGap; } else { targZ = Converter.NeedleBoard2Z(line.Param.DispenseGap, directiveLine.CurMeasureHeightValue, directiveLine.Tilt); } if (Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.Look || Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.AdjustLine || Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.InspectRect) { ret = Machine.Instance.Robot.BufMoveSafeZ(); if (!ret.IsOk) { return(ret); } if (Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.Look) { ret = Machine.Instance.Robot.BufMoveLnXY(cameraLineStart, FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); if (!ret.IsOk) { return(ret); } ret = Machine.Instance.Robot.BufMoveLnXY(cameraLineEnd, line.Param.Speed, FluidProgram.Current.MotionSettings.AccXY); if (!ret.IsOk) { return(ret); } Log.Print("current position in LookMode: " + cameraAccStart.ToString() + " || the LookOffset:" + line.LookOffset); } else if (Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.AdjustLine) { ret = Machine.Instance.Robot.MovePosXYAndReply(cameraLineStart, FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); if (!ret.IsOk) { return(ret); } LineCmdLine lineCmdline = directiveLine.LineCmd.lineCmdLine; if (lineCmdline == null || line == null) { return(ret); } Machine.Instance.IsProducting = false; Line.WaitMsg.Reset(); switch (lineCmdline.LineMethod) { case LineMethod.Single: MsgCenter.Broadcast(MsgType.MSG_LINEEDITLOOK_SHOW, directiveLine, lineCmdline); break; case LineMethod.Multi: case LineMethod.Poly: MsgCenter.Broadcast(MsgType.MSG_LINEEDITLOOK_SHOW, directiveLine, lineCmdline, directiveLine.LineCoordinates.IndexOf(line)); break; default: break; } Line.WaitMsg.WaitOne(); Machine.Instance.IsProducting = true; } else if (Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.InspectRect) { ret = Machine.Instance.Robot.MovePosXYAndReply(cameraLineStart, FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); if (!ret.IsOk) { return(ret); } LineCmdLine lineCmdline = directiveLine.LineCmd.lineCmdLine; if (lineCmdline == null || line == null) { return(ret); } if (lineCmdline.LineMethod != LineMethod.Single) { return(ret); } InspectionLine inspectionLine = InspectionMgr.Instance.FindBy((int)lineCmdline.inspectionKey) as InspectionLine; if (inspectionLine != null) { Thread.Sleep(inspectionLine.SettlingTime); double width1, width2; Machine.Instance.CaptureAndInspect(inspectionLine); width1 = inspectionLine.PhyWidth1; width2 = inspectionLine.PhyWidth2; Log.Dprint(inspectionLine.CurrResultStr); string resline = string.Format("{0},{1},{2},{3}", Math.Round(cameraLineStart.X, 3), Math.Round(cameraLineStart.Y, 3), Math.Round(width1, 3), Math.Round(width2, 3)); CsvUtil.WriteLine(directiveLine.Program.RuntimeSettings.FilePathInspectRect, resline); Thread.Sleep(inspectionLine.DwellTime); } } return(ret); } // 倾斜到位 Log.Dprint("change tilt status : " + directiveLine.Tilt.ToString()); ret = Machine.Instance.Valve1.BufChangeValveTiltStatus(directiveLine.Tilt, FluidProgram.Current.MotionSettings.VelU, FluidProgram.Current.MotionSettings.AccU); if (!ret.IsOk) { return(ret); } double currZ = Machine.Instance.Robot.PosZ; //到起点,Z轴到点胶位置 if (currZ > targZ) { // 移动到加速区间起始位置 Log.Dprint("move to position XY : " + valveAccStart); if (directiveLine.RunnableModule.Mode == ModuleMode.MainMode) { ret = Machine.Instance.Robot.MovePosXYABAndReply(valveAccStart, simulStart, FluidProgram.Current.MotionSettings.VelXYAB, FluidProgram.Current.MotionSettings.AccXYAB, (int)Machine.Instance.Setting.CardSelect); } else { ret = Machine.Instance.Robot.BufMoveLnXY(valveAccStart, FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); } if (!ret.IsOk) { return(ret); } Log.Dprint("move down to Z : " + targZ.ToString("0.000000") + ", DispenseGap=" + line.Param.DispenseGap.ToString("0.000000")); ret = Machine.Instance.Robot.BufMovePosZ(targZ, line.Param.DownSpeed, line.Param.DownAccel); if (!ret.IsOk) { return(ret); } } else { Log.Dprint("move up to Z : " + targZ.ToString("0.000000") + ", DispenseGap=" + line.Param.DispenseGap.ToString("0.000000")); ret = Machine.Instance.Robot.BufMovePosZ(targZ, line.Param.DownSpeed, line.Param.DownAccel); if (!ret.IsOk) { return(ret); } // 移动到加速区间起始位置 Log.Dprint("move to position XY : " + valveAccStart); if (directiveLine.RunnableModule.Mode == ModuleMode.MainMode) { ret = Machine.Instance.Robot.MovePosXYABAndReply(valveAccStart, simulStart, FluidProgram.Current.MotionSettings.VelXYAB, FluidProgram.Current.MotionSettings.AccXYAB, (int)Machine.Instance.Setting.CardSelect); } else { ret = Machine.Instance.Robot.BufMoveLnXY(valveAccStart, FluidProgram.Current.MotionSettings.VelXY, FluidProgram.Current.MotionSettings.AccXY); } if (!ret.IsOk) { return(ret); } } // 移动: 加速区间--线段区间--减速区间 Log.Dprint("fluid line, accStart=" + cameraAccStart + " start=" + cameraLineStart + ", end=" + cameraLineEnd + ", decelEnd=" + cameraDecEnd + ", spped=" + speed); //printPoints(newPoints); if (directiveLine.RunnableModule.Mode == ModuleMode.MainMode) { ret = Machine.Instance.DualValve.FluidLine(cameraAccStart, cameraLineStart, cameraLineEnd, cameraDecEnd, speed, cameraPoints, intervalSec, simulStart, cameraPoints2, FluidProgram.Current.MotionSettings.WeightAcc); GlueManagerMgr.Instance.UpdateGlueRemainWeight(0, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); GlueManagerMgr.Instance.UpdateGlueRemainWeight(1, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); } else if (directiveLine.RunnableModule.Mode == ModuleMode.DualFallow) { ret = Machine.Instance.DualValve.FluidLine(cameraAccStart, cameraLineStart, cameraLineEnd, cameraDecEnd, speed, cameraPoints, intervalSec, FluidProgram.Current.MotionSettings.WeightAcc); GlueManagerMgr.Instance.UpdateGlueRemainWeight(0, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); GlueManagerMgr.Instance.UpdateGlueRemainWeight(1, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); } else if (directiveLine.RunnableModule.Mode == ModuleMode.AssignMode2) { ret = Machine.Instance.Valve2.FluidLine(cameraAccStart, cameraLineStart, cameraLineEnd, cameraDecEnd, speed, cameraPoints, intervalSec, FluidProgram.Current.MotionSettings.WeightAcc); GlueManagerMgr.Instance.UpdateGlueRemainWeight(1, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); } else { ret = Machine.Instance.Valve1.BufFluidLine(cameraAccStart, cameraLineStart, cameraLineEnd, cameraDecEnd, speed, cameraPoints, intervalSec, FluidProgram.Current.MotionSettings.WeightAcc); GlueManagerMgr.Instance.UpdateGlueRemainWeight(0, points.Length * directiveLine.Program.RuntimeSettings.SingleDropWeight); } if (!ret.IsOk) { return(ret); } if (Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.Wet || Machine.Instance.Valve1.RunMode == Drive.ValveSystem.ValveRunMode.Dry) { Log.Dprint("RetractDistance : " + line.Param.RetractDistance); // 减速区间运动完成后,x y 轴速度为0, 此时需要抬升一段高度 if (line.Param.RetractDistance > 0) { Log.Dprint("move up RetractDistance : " + line.Param.RetractDistance); ret = Machine.Instance.Robot.BufMoveIncZ(line.Param.RetractDistance, line.Param.RetractSpeed, line.Param.RetractAccel); if (!ret.IsOk) { return(ret); } } } return(ret); }