From 8a3ab64a65da226636743be07c4bee63f50da25d Mon Sep 17 00:00:00 2001 From: patrick.xu <patrick.xu@broconcentric.com> Date: 星期六, 06 三月 2021 11:35:20 +0800 Subject: [PATCH] 1. 解决软件异常崩溃问题 --- src/Bro.M071.Process/M071Process_MotionCard.cs | 266 +++++++++++++++++++++++++++-------------------------- 1 files changed, 136 insertions(+), 130 deletions(-) diff --git a/src/Bro.M071.Process/M071Process_MotionCard.cs b/src/Bro.M071.Process/M071Process_MotionCard.cs index fbc4314..baf87f7 100644 --- a/src/Bro.M071.Process/M071Process_MotionCard.cs +++ b/src/Bro.M071.Process/M071Process_MotionCard.cs @@ -7,6 +7,7 @@ using System.ComponentModel; using System.Drawing.Design; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -17,7 +18,6 @@ public partial class M071Process { public Timer ResetTimer = null; - const int FULLRESETTIME = 5; object machineStateLock = new object(); //MachineState _machineStatePre = MachineState.Unknown; @@ -30,112 +30,103 @@ if (machineState == value) return; - //_machineStatePre = machineState; - + LogAsync(DateTime.Now, $"璁惧鐘舵�佸垏鎹�:{machineState.ToString()}->{value.ToString()}", ""); machineState = value; - switch (machineState) + Task.Run(() => { - case MachineState.Ready: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightYellow(false); - } + OnMachineStateChanged?.Invoke(machineState); - Task.Run(() => - { - - while (MachineState == MachineState.Ready) + switch (machineState) + { + case MachineState.Ready: + lock (machineStateLock) { - lock (machineStateLock) - { - SwitchLightGreen(true); - Thread.Sleep(1000); - SwitchLightGreen(false); - Thread.Sleep(1000); - } + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightYellow(false); } - }); - break; - case MachineState.Running: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightYellow(false); - SwitchLightGreen(true); - } - break; - case MachineState.Alarm: - lock (machineStateLock) - { - SwitchBeep(true); - SwitchLightRed(true); - SwitchLightYellow(false); - SwitchLightGreen(false); - } - break; - case MachineState.Pause: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - } - Task.Run(() => - { - while (MachineState == MachineState.Pause) + Task.Run(() => { - lock (machineStateLock) + while (MachineState == MachineState.Ready) { - SwitchLightYellow(true); - SwitchLightGreen(true); - Thread.Sleep(1000); - SwitchLightYellow(false); - SwitchLightGreen(false); - Thread.Sleep(1000); + lock (machineStateLock) + { + SwitchLightGreen(true); + Thread.Sleep(1000); + SwitchLightGreen(false); + Thread.Sleep(1000); + } } - } - }); - break; - case MachineState.Resetting: - lock (machineStateLock) - { - SwitchBeep(false); - SwitchLightRed(false); - SwitchLightGreen(false); - } - Task.Run(() => - { - while (MachineState == MachineState.Resetting) + }); + + break; + case MachineState.Running: + lock (machineStateLock) { - lock (machineStateLock) - { - - SwitchLightYellow(true); - Thread.Sleep(1000); - SwitchLightYellow(false); - Thread.Sleep(1000); - } + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightYellow(false); + SwitchLightGreen(true); } - }); - break; - default: - break; - } - - OnMachineStateChanged?.Invoke(machineState); - - //if (_machineStatePre == MachineState.Running && machineState == MachineState.Pause) - //{ - // Pause(); - //} - //else if (_machineStatePre == MachineState.Pause && (machineState == MachineState.Running || machineState == MachineState.Ready)) - //{ - // Resume(); - //} + break; + case MachineState.Alarm: + lock (machineStateLock) + { + SwitchBeep(true); + SwitchLightRed(true); + SwitchLightYellow(false); + SwitchLightGreen(false); + } + break; + case MachineState.Pause: + lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + } + Task.Run(() => + { + while (MachineState == MachineState.Pause) + { + lock (machineStateLock) + { + SwitchLightYellow(true); + SwitchLightGreen(true); + Thread.Sleep(1000); + SwitchLightYellow(false); + SwitchLightGreen(false); + Thread.Sleep(1000); + } + } + }); + break; + case MachineState.Resetting: + lock (machineStateLock) + { + SwitchBeep(false); + SwitchLightRed(false); + SwitchLightGreen(false); + } + Task.Run(() => + { + while (MachineState == MachineState.Resetting) + { + lock (machineStateLock) + { + SwitchLightYellow(true); + Thread.Sleep(1000); + SwitchLightYellow(false); + Thread.Sleep(1000); + } + } + }); + break; + default: + break; + } + }); } } @@ -243,7 +234,7 @@ if (opConfig?.InputPara != null && opConfig.InputPara.Count > 0) { //澶у浣嶄俊鍙� - ResetTimer.Change(opConfig.InputPara[0] == 1 ? FULLRESETTIME * 1000 : -1, -1); + ResetTimer.Change(opConfig.InputPara[0] == 1 ? Config.FullResetRequiredDuration * 1000 : -1, -1); if (opConfig.InputPara[0] == 0) return new ProcessResponse(true); @@ -258,17 +249,21 @@ MotionCardDefaultRun("Reset", ref opConfig, ref invokeDevice); (invokeDevice as MotionCardBase).ResetAlarm(); - RaisedAlarm(""); + _isdoing = false; + _pausedHandle.Set(); - if (MachineState != MachineState.Pause) - { - MachineState = MachineState.Ready; - } - else - { - LogAsync(DateTime.Now, "璁惧鏆傚仠涓紝鏃犳硶澶嶄綅", ""); - return new ProcessResponse(true); - } + RaisedAlarm(""); + OnCheckHintUpload?.Invoke("", false); + + //if (MachineState != MachineState.Pause) + //{ + MachineState = MachineState.Ready; + //} + //else + //{ + // LogAsync(DateTime.Now, "璁惧鏆傚仠涓紝鏃犳硶澶嶄綅", ""); + // return new ProcessResponse(true); + //} if (IsEmergencyStopped) { @@ -278,6 +273,7 @@ } LogAsync(DateTime.Now, "鏅�氬浣嶅姩浣滃畬鎴�", ""); + OnResetDone?.Invoke(); return new ProcessResponse(true); } @@ -312,8 +308,11 @@ MachineState = MachineState.Resetting; MotionCardDefaultRun("FullReset", ref opConfig, ref invokeDevice); - productionList.ForEach(u => u.Dispose()); - productionList.Clear(); + lock (productionLock) + { + productionList.ForEach(u => u.Dispose()); + productionList.Clear(); + } OnFullResetDone?.Invoke(); @@ -653,35 +652,43 @@ ManualResetEventSlim _pausedHandle = new ManualResetEventSlim(true); MachineState _machineStateBeforePause = MachineState.Unknown; + object _pauseLock = new object(); private async void CheckMachinePauseState() { await Task.Run(() => { - if (IsMachinePaused) + lock (_pauseLock) { - _machineStateBeforePause = MachineState; - MachineState = MachineState.Pause; - _pausedHandle.Reset(); + if (IsMachinePaused) + { + if (MachineState == MachineState.Ready || MachineState == MachineState.Running) + { + _machineStateBeforePause = MachineState; + } + MachineState = MachineState.Pause; + _pausedHandle.Reset(); - if (_machineStateBeforePause == MachineState.Running) - { - Pause(); - } - } - else - { - if (MachineState == MachineState.Pause) - { if (_machineStateBeforePause == MachineState.Running) { - Resume(true); + Pause(); } - _pausedHandle.Set(); - RaisedAlarm(""); - MachineState = _machineStateBeforePause; + } + else + { + if (MachineState == MachineState.Pause) + { + if (_machineStateBeforePause == MachineState.Running || _machineStateBeforePause == MachineState.Ready) + { + Resume(true); + } + _pausedHandle.Set(); + RaisedAlarm(""); + MachineState = _machineStateBeforePause; + } } } - }); + } + ); } public bool IsMachinePaused @@ -690,6 +697,7 @@ } [ProcessMethod("", "SafetyDoorSignal", "瀹夊叏闂ㄤ俊鍙风洃鎺э紝姝e父ON锛孫FF鏃舵姤璀�", InvokeType.TestInvoke)] + [MethodImpl(MethodImplOptions.Synchronized)] public ProcessResponse SafetyDoorSignal(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { //if (MachineState != MachineState.Running && MachineState != MachineState.Pause) @@ -709,11 +717,9 @@ } [ProcessMethod("", "SafetyBeamSignal", "瀹夊叏鍏夊箷淇″彿鐩戞帶锛屾甯窸N锛孫FF鏃舵姤璀�", InvokeType.TestInvoke)] + [MethodImpl(MethodImplOptions.Synchronized)] public ProcessResponse SafetyBeamSignal(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { - //if (MachineState != MachineState.Running && MachineState != MachineState.Pause) - // return new ProcessResponse(true); - if (opConfig.InputPara == null || opConfig.InputPara.Count == 0) throw new ProcessException("瀹夊叏鍏夊箷鐩戞帶鏈厤缃緭鍏ヤ俊鍙�"); @@ -756,7 +762,7 @@ IsEmergencyStopped = opConfig.InputPara[0] == 0; - if (IsEmergencyStopped) + if (isEmergencyStopped) { RaisedAlarm("鎬ュ仠鎸夐挳琚媿涓�"); MachineState = MachineState.Alarm; -- Gitblit v1.8.0