Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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;
                }));
            });
        }
Exemplo n.º 3
0
        /// <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);
        }