예제 #1
0
        /// <summary>
        ///     运行部件驱动线程。
        /// </summary>
        /// <param name="runningMode">运行模式。</param>
        public virtual void Run(RunningModes runningMode)
        {
            StopEvent.Reset();

            if (_cancelTokenSource == null)
            {
                _cancelTokenSource = new CancellationTokenSource();
                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        Running(runningMode);
                        LogHelper.Debug($"{Name}部件启动。");
                    }
                    catch (OperationCanceledException)
                    {
                        //ignorl
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Debug("设备驱动程序异常", ex);
                    }
                }, TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning)
                .ContinueWith(task => Clean());
            }
        }
예제 #2
0
        /// <summary>
        /// Called when sensor ids and definitions are received - when both are received updates the 
        /// server data and if server is starting, sends and invitation and begins taking readings
        /// </summary>
        private void UpdateSensorTypes()
        {
            if (sensorIDsUpdated && sensorRangesUpdated)
             {
            log.Append("UpdateSensorTypes", "Updating sensor defintions");
            lock (CurrentServerData.sensors)
            {
               CurrentServerData.sensors.Clear();
               for (int i = 0; i < 4; i++)
               {
                  SensorDefinition sensor = DatabaseHelper.GetSensorData(CurrentSensors[i], sensorsDatabase);
                  log.Append("Sensor connected: " + sensor.Description);
                  CurrentServerData.sensors.Add(sensor);
               }
            }
            //this.Invoke(sensorsUpdate);

            sensorIDsUpdated = false;
            sensorRangesUpdated = false;

            if (runningMode == RunningModes.Starting)
            {
               runningMode = RunningModes.Started;
               StartTakingReadings();
            }
             }
        }
예제 #3
0
        /// <summary>
        ///     运行部件驱动线程。
        /// </summary>
        /// <param name="runningMode">运行模式。</param>
        public virtual void Run(RunningModes runningMode)
        {
            StopEvent.Reset();

            if (_cancelTokenSource == null)
            {
                _cancelTokenSource = new CancellationTokenSource();
                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        Running(runningMode);
                        log.Debug($"{Name}部件启动。");
                    }
                    catch (OperationCanceledException ex2)
                    {
                        MessageBox.Show("yichang" + ex2.ToString());
                        //ignorl
                    }
                    catch (Exception ex)
                    {
                        log.Fatal("设备驱动程序异常", ex);
                        MessageBox.Show("yichang" + ex.ToString());
                    }
                }, TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning)
                .ContinueWith(task => Clean());
            }
        }
예제 #4
0
        private void Start()
        {
            runningMode = RunningModes.Starting;

             connectLogbook();
             Thread.Sleep(200);
             logbook_identifySensors();
             StartServer();
        }
예제 #5
0
        /// <summary>
        /// Terminate the varous components of the application
        /// </summary>
        private void ShutdownSensorServer()
        {
            log.Append("ShutdownSensorServer", "Shutting down server");
             runningMode = RunningModes.Stopped;

             StopTakingReadings();
             StopWorkings();

             if (logbook != null)
             {
            logbook.Deactivate();
             }
             //log.LogMessage -= displayLogHandler;
        }
예제 #6
0
 /// <summary>
 ///     驱动部件运行。
 /// </summary>
 /// <param name="runningMode">运行模式。</param>
 public abstract void Running(RunningModes runningMode);
예제 #7
0
        public override void Running(RunningModes runningMode)
        {
            while (true)
            {
                Thread.Sleep(10);
                #region  自动流程
                if (stationOperate.Running)
                {
                    switch (stationOperate.step)
                    {
                    case 0:    //判断mes选择
                        switch (ProductConfig.Instance.switchCom)
                        {
                        case SwitchCom.None:
                            stationOperate.step = 10;
                            break;

                        case SwitchCom.MES:
                            stationOperate.step = 10;
                            break;

                        case SwitchCom.Interlocking:
                            stationOperate.step = 10;
                            break;
                        }
                        break;

                    case 10:    //请扫描产品SN
                        using (FormProductCode frm = new FormProductCode("请扫描产品SN!"))
                        {
                            Global.ProductSn    = frm.ProductSn;
                            stationOperate.step = 20;
                        }
                        break;

                    case 20:    //确认扫描SN
                        if (!string.IsNullOrEmpty(Global.ProductSn))
                        {
                            switch (ProductConfig.Instance.switchCom)
                            {
                            case SwitchCom.None:
                                stationOperate.step = 30;
                                break;

                            case SwitchCom.MES:
                                //if (InterlockingClass.MES_MoveIn_64(Global.ProductSn, mLocking.mes) == 0)
                                //{
                                //    stationOperate.step = 30;
                                //}
                                //else
                                //{
                                //    m_Alarm = Station1Alarm.互锁失败;
                                //    stationOperate.step = 10;
                                //}
                                break;

                            case SwitchCom.Interlocking:
                                //if (InterlockingClass.SV_Interlocking(Global.ProductSn, mLocking.mes) == 0)
                                //{
                                //    stationOperate.step = 30;
                                //}
                                //else
                                //{
                                //    m_Alarm = Station1Alarm.互锁失败;
                                //    stationOperate.step = 10;
                                //}
                                break;
                            }
                        }
                        else
                        {
                            stationOperate.step = 10;
                        }
                        break;

                    case 30:    //按钮启动
                        watchRun.Restart();
                        stationOperate.step = 40;
                        break;

                    case 40:    //产品是否放好 是否在待料位置

                        stationOperate.step = 50;
                        break;

                    case 50:    //产品定位


                        stationOperate.step = 60;
                        break;

                    case 60:    //定位OK,判断左边开始还是右边开始(右边开始)
                        if (IoPoints.S1.Value)
                        {
                            stationOperate.step = 70;
                        }

                        break;

                    case 500:    //相机到对应拍照位置,气缸到对应位置

                        break;

                    case 510:    //相机到位,气缸到位,切换完成

                        break;

                    case 70:    //Y轴到取料位置

                        stationOperate.step = 80;
                        break;

                    case 80:    //Y轴到位Z轴上升到拍照位置

                        stationOperate.step = 90;
                        break;

                    case 90:    //Z轴到位,位置切换完成,拍照

                        stationOperate.step = 100;
                        break;

                    case 100:    //拍照完成结果计算

                        stationOperate.step = 110;
                        break;

                    case 110:    //负压开启,机械手取屏,Z轴下降

                        stationOperate.step = 120;
                        break;

                    case 120:    //机械手取屏完成,机械手到拍屏位置

                        stationOperate.step = 130;
                        break;

                    case 130:    //机械手到位拍照

                        stationOperate.step = 140;
                        break;

                    case 140:    //拍照后数据处理

                        stationOperate.step = 150;
                        break;

                    case 150:    //机械手补正(XYR)

                        stationOperate.step = 160;
                        break;

                    case 160:    //补正后拍照

                        stationOperate.step = 170;
                        break;

                    case 170:    //拍照后数据处理

                        stationOperate.step = 180;
                        break;

                    case 180:    //数据OK,Z轴上升到贴合位置

                        stationOperate.step = 190;
                        break;

                    case 190:    //Z轴完成,

                        stationOperate.step = 200;
                        break;

                    case 200:    //贴合延时,

                        stationOperate.step = 210;
                        break;

                    case 210:    //Z轴下降到出料位置,机械手到安全高度

                        stationOperate.step = 220;
                        break;

                    case 220:    //机械手到位,机械手退回安全位置

                        stationOperate.step = 230;
                        break;

                    case 230:    //Z轴到位,机械手到待机位置

                        stationOperate.step = 240;
                        break;

                    case 240:                      //机械手到位,判断是否右边贴合
                        stationOperate.step = 60;  //换另一边
                        stationOperate.step = 250; //贴合完成
                        break;

                    case 250:    //Y轴到待料位置,切换到右边,生成报告
                        switch (ProductConfig.Instance.switchCom)
                        {
                        case SwitchCom.None:
                            stationOperate.step = 270;
                            break;

                        case SwitchCom.MES:
                            //InterlockingClass.MES_MoveStd_64(Global.ProductSn, "Passed", mLocking.mes);
                            stationOperate.step = 260;
                            break;

                        case SwitchCom.Interlocking:
                            stationOperate.step = 260;
                            break;
                        }
                        break;

                    case 260:    //生成报告
                        if (mLocking.Test_WriteMesTxtAndCsvFile())
                        {
                            stationOperate.step = 270;
                        }
                        else
                        {
                            m_Alarm = Station1Alarm.报告生成失败;
                            //stationOperate.step = 270;
                        }
                        break;

                    case 270:    //Y轴到位,切换完成
                        watchRun.Stop();
                        stationOperate.step = 280;
                        break;

                    case 280:    //判断产品是否取走
                        stationOperate.step = 290;
                        break;

                    default:
                        stationOperate.RunningSign = false;
                        stationOperate.step        = 0;
                        break;
                    }
                    Global.Beattime = watchRun.ElapsedMilliseconds * 1.0 / 1000;
                }
                #endregion

                #region 初始化流程
                if (stationInitialize.Running)
                {
                    if (watchinit.ElapsedTicks > 10000)
                    {
                        m_Alarm = Station1Alarm.初始化故障;
                    }
                    switch (stationInitialize.Flow)
                    {
                    case 0:
                        watchinit.Restart();
                        stationInitialize.InitializeDone = false;
                        stationOperate.RunningSign       = false;
                        stationOperate.step    = 0;
                        stationInitialize.Flow = 10;
                        break;

                    case 10:
                        ZaxisServo.BackHome();
                        YaxisServo.BackHome();
                        stationInitialize.Flow = 20;
                        break;

                    case 20:
                        if (ZaxisServo.CheckHomeDone(500) == 0 && YaxisServo.CheckHomeDone(500) == 0)
                        {
                            stationInitialize.Flow = 30;
                        }
                        break;

                    case 30:    //判断机器人是否安全
                        if (YAMAHA.CurrentPosR <= 50 && YAMAHA.CurrentPosZ <= 10)
                        {
                            stationInitialize.Flow = 70;     //机器人安全
                        }
                        else
                        {
                            stationInitialize.Flow = 40;     //机器人不安全
                        }
                        break;

                    case 40:    //判断机器人是否安全

                        break;

                    case 70:     //相机轴回原点
                        LFXaxisServo.BackHome();
                        LFYaxisServo.BackHome();
                        XaxisServo.BackHome();
                        RYaxisServo.BackHome();
                        LRYaxisServo.BackHome();
                        LRXaxisServo.BackHome();
                        stationInitialize.Flow = 80;
                        break;

                    case 80:
                        if (LFXaxisServo.CheckHomeDone(500) == 0 && LFYaxisServo.CheckHomeDone(500) == 0 &&
                            LRXaxisServo.CheckHomeDone(500) == 0 && LRYaxisServo.CheckHomeDone(500) == 0 &&
                            XaxisServo.CheckHomeDone(500) == 0 && RYaxisServo.CheckHomeDone(500) == 0)
                        {
                            stationInitialize.Flow = 90;
                        }
                        break;

                    case 90:
                        stationInitialize.InitializeDone = true;
                        break;

                    default:
                        break;
                    }
                }
                #endregion


                //故障清除
                if (AlarmReset.AlarmReset)
                {
                    m_Alarm = Station1Alarm.无消息;
                }
            }
        }
예제 #8
0
        public override void Running(RunningModes runningMode)
        {
            var step               = 0;
            var ScrewIsDone        = 0;
            var CannotTorIn        = false;
            var GetScrewPos        = new Point3D <int>();
            var ScrewHolePos       = new Point3D <int>();
            var ZaxisScrewpos      = 0;
            var watchCameratimeout = new Stopwatch();
            //var watchScrewtimeout = new Stopwatch();
            var tempPut1    = false;
            var tempPut2    = false;
            var GetScrew1   = false;
            var GetScrew2   = false;
            var pressPulse  = false;
            var startForbid = false;
            var _watch      = new Stopwatch();

            _watch.Start();

            PlateformAlarm alarm = 0;

            while (true)
            {
                Thread.Sleep(10);
                InhaleCylinder.Condition.External = externalSign;
                #region 判断后端设备交互信号
                if (tempPut1 && !GetScrew2)
                {
                    tempPut1  = false;
                    GetScrew1 = true;
                }
                if (tempPut2 && !GetScrew1)
                {
                    tempPut2  = false;
                    GetScrew2 = true;
                }
                if (!IoPoints.TDI7.Value && !Global.GetScrew1SignSheild)
                {
                    tempPut1 = false;
                }
                if (!IoPoints.TDI8.Value && !Global.GetScrew2SignSheild)
                {
                    tempPut2 = false;
                }
                if ((IoPoints.TDI7.Value || Global.GetScrew1SignSheild) && !GetScrew1 && !GetScrew2)
                {
                    tempPut1 = true;
                }
                if ((IoPoints.TDI8.Value || Global.GetScrew2SignSheild) && !GetScrew1 && !GetScrew2)
                {
                    tempPut2 = true;
                }
                #endregion
                #region 自动流程
                if (stationOperate.Running)
                {
                    switch (step)
                    {
                    case 0:
                        Marking.CoderResult.SN     = "";
                        Marking.CoderResult.Result = "";
                        step = 10;
                        Marking.watchCT.Restart();
                        break;

                    case 10:    //触发读码器读码
                        ReadCodePort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1
                        });
                        step = 20;
                        break;

                    case 20:    //判断读码器是否读到SN
                        Thread.Sleep(300);
                        if (Marking.CoderResult.SN == "")
                        {
                            step = 10;
                        }
                        else
                        {
                            step = 30;
                        }
                        break;

                    case 30:    //双按钮启动,双按钮按下的时间间隔必须小于500ms才正常启动设备
                        if (!pressPulse && (IoPoints.TDI15.Value || IoPoints.TDI16.Value))
                        {
                            pressPulse  = true;
                            startForbid = true;
                            _watch.Restart();
                        }
                        if (startForbid && IoPoints.TDI15.Value && IoPoints.TDI16.Value)
                        {
                            step        = 40;
                            startForbid = false;
                            pressPulse  = false;
                        }
                        else
                        {
                            if (500 <= _watch.ElapsedMilliseconds)
                            {
                                startForbid = false;
                            }
                        }
                        if (!IoPoints.TDI15.Value && !IoPoints.TDI16.Value)
                        {
                            pressPulse  = false;
                            startForbid = false;
                        }
                        break;

                    case 40:    //判断哪个螺丝整列机优先准备好
                        if (GetScrew1 && !GetScrew2)
                        {
                            GetScrewPos = Position.Put1ScrewPosition;
                            step        = 50;
                        }
                        else if (!GetScrew1 && GetScrew2)
                        {
                            GetScrewPos = Position.Put2ScrewPosition;
                            step        = 50;
                        }
                        break;

                    case 50:    //判断Z轴是否在0位置,X轴移动到取螺丝位置
                        if (Zaxis.IsInPosition(0))
                        {
                            Xaxis.MoveTo(GetScrewPos.X, AxisParameter.XvelocityCurve);
                            step = 60;
                        }
                        break;

                    case 60:    //X轴到达取螺丝位置,Z轴下降
                        if (Xaxis.IsInPosition(GetScrewPos.X))
                        {
                            Zaxis.MoveTo(GetScrewPos.Z, AxisParameter.ZvelocityCurve);
                            step = 70;
                        }
                        break;

                    case 70:    //Z轴到达取螺丝位置,吸真空
                        if (Zaxis.IsInPosition(GetScrewPos.Z))
                        {
                            InhaleCylinder.Set();
                            step = 80;
                        }
                        break;

                    case 80:    //Z轴上升0位置
                        if (InhaleCylinder.OutMoveStatus)
                        {
                            Zaxis.MoveTo(0, AxisParameter.ZvelocityCurve);
                            ScrewHolePos = Position.ScrewHolePosition[Marking.WorkIndex - 1];
                            step         = 90;
                        }
                        break;

                    case 90:    //Z轴到达0位置,XY轴移动拧螺丝位置
                        if (Zaxis.IsInPosition(0))
                        {
                            Xaxis.MoveTo(ScrewHolePos.X, AxisParameter.XvelocityCurve);
                            Yaxis.MoveTo(ScrewHolePos.Y, AxisParameter.YvelocityCurve);
                            step = 100;
                        }
                        break;

                    case 100:    //XY轴到达拧螺丝位置,Z轴下降
                        if (Xaxis.IsInPosition(ScrewHolePos.X) && Yaxis.IsInPosition(ScrewHolePos.Y))
                        {
                            Zaxis.MoveTo(ScrewHolePos.Z, AxisParameter.ZvelocityCurve);
                            step = 110;
                        }
                        break;

                    case 110:    //Z轴到达拧螺丝位置,启动电批,并Z轴慢速下行
                        if (Zaxis.IsInPosition(ScrewHolePos.Z))
                        {
                            IoPoints.TDO11.Value = true;
                            ZaxisScrewpos        = ScrewHolePos.Z + Position.ScrewDepth;
                            if (IoPoints.TDI9.Value)
                            {
                                Zaxis.MoveTo(ZaxisScrewpos, new VelocityCurve(0, (double)Position.ZScrewSpeed, 0));
                                step = 120;
                            }
                        }
                        break;

                    case 120:    //Z轴到达位置,判断螺丝是否拧紧
                        if (Zaxis.IsInPosition(ZaxisScrewpos))
                        {
                            if (alarm == PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号)
                            {
                                CannotTorIn          = true;
                                alarm                = PlateformAlarm.无消息;
                                IoPoints.TDO11.Value = false;
                                IoPoints.TDO12.Value = true;
                                Thread.Sleep(200);
                                IoPoints.TDO12.Value = false;
                                step = 130;
                            }
                            if (IoPoints.TDI10.Value || IoPoints.TDI11.Value)
                            {
                                step = 130;
                            }
                            else
                            {
                                if (ScrewIsDone > 2)
                                {
                                    alarm   = PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号;
                                    m_Alarm = PlateformAlarm.收不到电批的螺丝拧紧正常或拧紧异常信号;
                                }
                                Thread.Sleep(100);
                                ScrewIsDone++;
                            }
                        }
                        break;

                    case 130:    //触发读取数据
                        ScrewPort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1,
                            message  = "0,TR"
                        });
                        HeightGaugePort.Trigger(new TriggerArgs()
                        {
                            tryTimes = 1
                        });
                        Thread.Sleep(200);
                        step = 140;
                        break;

                    case 140:    //判断检测结果
                        if (CannotTorIn)
                        {
                            Marking.ResultScrew[Marking.WorkIndex].Result = "NG";
                            step = 150;
                        }
                        else
                        {
                            if (Marking.ResultScrew[Marking.WorkIndex].Result == "OK")
                            {
                                var data = Marking.ResultScrew[Marking.WorkIndex].HeightValue - Global.BaseHeight;
                                if (data > Position.MinHeight && data <= Position.MaxHeight)
                                {
                                    Marking.ResultScrew[Marking.WorkIndex].Result = "OK";
                                }
                                else
                                {
                                    Marking.ResultScrew[Marking.WorkIndex].Result = "NG";
                                }
                                step = 150;
                            }
                            if (Marking.ResultScrew[Marking.WorkIndex].Result == "NG")
                            {
                                step = 150;
                            }
                        }
                        break;

                    case 150:    //电批停止,真空吸气OFF,Z轴回到0位置
                        IoPoints.TDO11.Value = false;
                        InhaleCylinder.Reset();
                        Zaxis.MoveTo(0, AxisParameter.ZvelocityCurve);
                        step = 160;
                        break;

                    case 160:    //真空吸气达到,Z轴到达0位置,计数加+1
                        if (InhaleCylinder.OutOriginStatus && Zaxis.IsInPosition(0))
                        {
                            Marking.WorkIndex++;
                            if (Marking.WorkIndex < Position.HoleNum)
                            {
                                step = 40;
                            }
                            else
                            {
                                step = 170;
                            }
                        }
                        break;

                    case 170:    //判断产品拧螺丝结果
                        for (var i = 0; i < Position.HoleNum; i++)
                        {
                            if (Marking.ResultScrew[i].Result == "OK")
                            {
                                Marking.ProductResult &= true;
                            }
                            else
                            {
                                Marking.ProductResult &= false;
                            }
                        }
                        if (Marking.ProductResult)
                        {
                            Config.ProductOkTotal++;
                        }
                        else
                        {
                            Config.ProductNgTotal++;
                        }
                        step = 180;
                        break;

                    case 180:    //XY轴回到0位置
                        Xaxis.MoveTo(0, AxisParameter.XvelocityCurve);
                        Yaxis.MoveTo(0, AxisParameter.YvelocityCurve);
                        step = 190;
                        break;

                    case 190:    //XY轴到达0位置
                        if (Xaxis.IsInPosition(0) && Yaxis.IsInPosition(0))
                        {
                            step = 200;
                        }
                        break;

                    default:
                        Marking.ProductResult      = true;
                        stationOperate.RunningSign = false;
                        Marking.WorkIndex          = 0;
                        step = 0;
                        break;
                    }
                }
                #endregion

                #region 初始化流程
                if (stationInitialize.Running)
                {
                    switch (stationInitialize.Flow)
                    {
                    case 0:       //清除所有标志位的状态
                        stationInitialize.InitializeDone = false;
                        stationOperate.RunningSign       = false;
                        alarm = PlateformAlarm.无消息;
                        Marking.ProductResult = true;
                        Marking.WorkIndex     = 0;
                        step = 0;
                        Xaxis.Stop();
                        Yaxis.Stop();
                        Zaxis.Stop();
                        if (!Xaxis.IsAlarmed && !Yaxis.IsAlarmed)
                        {
                            Xaxis.IsServon         = true;
                            Yaxis.IsServon         = true;
                            Zaxis.IsServon         = true;
                            stationInitialize.Flow = 10;
                        }
                        break;

                    case 10:      //复位Z轴,真空
                        IoPoints.ApsController.BackHome(Zaxis.NoId);
                        InhaleCylinder.InitExecute();
                        InhaleCylinder.Reset();
                        stationInitialize.Flow = 20;
                        break;

                    case 20:        //判断所有气缸到位,启动Z轴回原点
                        if (InhaleCylinder.OutOriginStatus)
                        {
                            if (IoPoints.ApsController.CheckHomeDone(Zaxis.NoId, 10.0) == 0)
                            {
                                IoPoints.ApsController.BackHome(Xaxis.NoId);
                                IoPoints.ApsController.BackHome(Yaxis.NoId);
                                stationInitialize.Flow = 30;
                            }
                            else
                            {
                                Zaxis.Stop();
                                stationInitialize.InitializeDone = false;;
                                stationInitialize.Flow           = -1;
                            }
                        }
                        break;

                    case 30:    //判断XY轴是否异常,为0,正常,为1:原点异常,为<0:故障
                        var resultX = IoPoints.ApsController.CheckHomeDone(Xaxis.NoId, 10.0);
                        var resultY = IoPoints.ApsController.CheckHomeDone(Yaxis.NoId, 10.0);
                        if (IoPoints.ApsController.CheckHomeDone(Xaxis.NoId, 10.0) == 0 &&
                            IoPoints.ApsController.CheckHomeDone(Yaxis.NoId, 10.0) == 0)
                        {
                            stationInitialize.InitializeDone = true;
                            stationInitialize.Flow           = 40;
                        }
                        else    //异常处理
                        {
                            stationInitialize.InitializeDone = false;;
                            stationInitialize.Flow           = -1;
                        }
                        break;

                    default:
                        break;
                    }
                }
                #endregion

                //故障清除
                if (externalSign.AlarmReset)
                {
                    m_Alarm = PlateformAlarm.无消息;
                }
            }
        }