From b3aa95bab5796caaf28a06922abf111ae55e37df Mon Sep 17 00:00:00 2001
From: patrick.xu <patrick.xu@broconcentric.com>
Date: 星期六, 20 二月 2021 10:58:39 +0800
Subject: [PATCH] xlsx文件异常处理

---
 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