/// <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()); } }
/// <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(); } } }
/// <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()); } }
private void Start() { runningMode = RunningModes.Starting; connectLogbook(); Thread.Sleep(200); logbook_identifySensors(); StartServer(); }
/// <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; }
/// <summary> /// 驱动部件运行。 /// </summary> /// <param name="runningMode">运行模式。</param> public abstract void Running(RunningModes runningMode);
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.无消息; } } }
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.无消息; } } }