From f9c7928bff92596686e05a15fef21d499e954088 Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期一, 06 七月 2020 18:17:41 +0800
Subject: [PATCH] Merge branch 'master' of http://gitblit.broconcentric.com:8088/r/M071

---
 src/Bro.M071.Process/M071Process_MotionCard.cs |  493 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 455 insertions(+), 38 deletions(-)

diff --git a/src/Bro.M071.Process/M071Process_MotionCard.cs b/src/Bro.M071.Process/M071Process_MotionCard.cs
index 514b46d..29b2055 100644
--- a/src/Bro.M071.Process/M071Process_MotionCard.cs
+++ b/src/Bro.M071.Process/M071Process_MotionCard.cs
@@ -16,11 +16,12 @@
 {
     public partial class M071Process
     {
-        Timer _resetTimer = null;
+        public Timer ResetTimer = null;
         const int FULLRESETTIME = 5;
 
+        object machineStateLock = new object();
         MachineState machineState = MachineState.Unknown;
-        MachineState MachineState
+        public MachineState MachineState
         {
             get => machineState;
             set
@@ -30,16 +31,157 @@
                 switch (machineState)
                 {
                     case MachineState.Ready:
+                        lock (machineStateLock)
+                        {
+                            SwitchBeep(false);
+                            SwitchLightRed(false);
+                            SwitchLightYellow(false);
+                        }
+
+                        Task.Run(() =>
+                        {
+                            lock (machineStateLock)
+                            {
+                                while (MachineState == MachineState.Ready)
+                                {
+                                    SwitchLightGreen(true);
+                                    Thread.Sleep(1000);
+                                    SwitchLightGreen(false);
+                                    Thread.Sleep(1000);
+                                }
+                            }
+                        });
+
                         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(() =>
+                        {
+                            lock (machineStateLock)
+                            {
+                                while (MachineState == MachineState.Pause)
+                                {
+                                    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(() =>
+                        {
+                            lock (machineStateLock)
+                            {
+                                while (MachineState == MachineState.Resetting)
+                                {
+                                    SwitchLightYellow(true);
+                                    Thread.Sleep(1000);
+                                    SwitchLightYellow(false);
+                                    Thread.Sleep(1000);
+                                }
+                            }
+                        });
                         break;
                     default:
                         break;
                 }
+
+                OnMachineStateChanged?.Invoke(machineState);
+            }
+        }
+
+        private void MotionCardSettingCheck()
+        {
+            IDevice device = DeviceCollection.FirstOrDefault(u => u is IMotionCard);
+            if (device.InitialConfig is MotionCardInitialConfigBase iConfig)
+            {
+                outputCtrlCard = device as MotionCardBase;
+
+                var redDefinition = iConfig.IODefinitionCollection.FirstOrDefault(u => u.IOPreStatement == IOPrestatement.Light_Red);
+                if (redDefinition != null)
+                {
+                    index_RedLight = redDefinition.IONum;
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, $"{iConfig.Name}鏈厤缃孩鑹茬伅杈撳嚭绱㈠紩", "");
+                }
+
+                var greenDefinition = iConfig.IODefinitionCollection.FirstOrDefault(u => u.IOPreStatement == IOPrestatement.Light_Green);
+                if (greenDefinition != null)
+                {
+                    index_GreenLight = greenDefinition.IONum;
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, $"{iConfig.Name}鏈厤缃豢鑹茬伅杈撳嚭绱㈠紩", "");
+                }
+
+                var yellowDefinition = iConfig.IODefinitionCollection.FirstOrDefault(u => u.IOPreStatement == IOPrestatement.Light_Yellow);
+                if (yellowDefinition != null)
+                {
+                    index_YellowLight = yellowDefinition.IONum;
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, $"{iConfig.Name}鏈厤缃粍鑹茬伅杈撳嚭绱㈠紩", "");
+                }
+
+                var beepDefinition = iConfig.IODefinitionCollection.FirstOrDefault(u => u.IOPreStatement == IOPrestatement.Beep);
+                if (beepDefinition != null)
+                {
+                    index_Beep = beepDefinition.IONum;
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, $"{iConfig.Name}鏈厤缃渹楦e櫒杈撳嚭绱㈠紩", "");
+                }
+
+                var lightDefinition = iConfig.IODefinitionCollection.FirstOrDefault(u => u.IOPreStatement == IOPrestatement.Light);
+                if (lightDefinition != null)
+                {
+                    index_NormalLight = lightDefinition.IONum;
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, $"{iConfig.Name}鏈厤缃棩鍏夌伅杈撳嚭绱㈠紩", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "鏈厤缃澘鍗¤澶�", "");
             }
         }
 
@@ -64,17 +206,27 @@
             //    }
             //}
 
-            MotionCardDefaultRun("Reset", ref opConfig, ref invokeDevice);
-
-            if (_resetTimer == null)
+            if (IsSafetyBeamTrigged || IsSafetyDoorTrigged)
             {
-                _resetTimer = new Timer(FullReset, null, -1, -1);
+                LogAsync(DateTime.Now, $"{(IsSafetyDoorTrigged ? "瀹夊叏闂�" : "")}{(IsSafetyBeamTrigged ? " 瀹夊叏鍏夌嚎" : "")}瑙﹀彂涓紝澶嶄綅澶辫触", "");
+                return new ProcessResponse(false);
+            }
+
+            MotionCardDefaultRun("Reset", ref opConfig, ref invokeDevice);
+            //(invokeDevice as IMotionCard).Reset();
+
+            RaisedAlarm("");
+            MachineState = MachineState.Ready;
+
+            if (ResetTimer == null)
+            {
+                ResetTimer = new Timer(FullReset, null, -1, -1);
             }
 
             if (opConfig.InputPara.Count > 0)
             {
                 //澶у浣嶄俊鍙�
-                _resetTimer.Change(-1, opConfig.InputPara[0] == 1 ? FULLRESETTIME * 1000 : -1);
+                ResetTimer.Change(-1, opConfig.InputPara[0] == 1 ? FULLRESETTIME * 1000 : -1);
             }
 
             //if (invokeDevice is MotionCardBase motionCard)
@@ -82,12 +234,21 @@
             //    motionCard.Run(opConfig);
             //}
 
+            LogAsync(DateTime.Now, "鏅�氬浣嶅姩浣滃畬鎴�", "");
+
             return new ProcessResponse(true);
         }
 
         private void FullReset(object state)
         {
-            FullReset(null, null, null);
+            try
+            {
+                FullReset(null, null, null);
+            }
+            catch (Exception ex)
+            {
+                ExceptionRaisedInMonitor(ex);
+            }
         }
 
         [ProcessMethod("MotionCardOperationConfigCollection", "FullReset", "澶у浣嶆搷浣�", InvokeType.TestInvoke)]
@@ -115,8 +276,16 @@
             //{
             //    motionCard.Run(opConfig);
             //}
+            MachineState = MachineState.Resetting;
+            MotionCardDefaultRun("FullReset", ref opConfig, ref invokeDevice);
 
-            //MotionCardDefaultRun("FullReset", ref opConfig, ref invokeDevice);
+            productionList.ForEach(u => u.Dispose());
+            productionList.Clear();
+
+            OnFullResetDone?.Invoke();
+
+            LogAsync(DateTime.Now, "澶у浣嶅姩浣滃畬鎴�", "");
+            MachineState = MachineState.Ready;
 
             return new ProcessResponse(true);
         }
@@ -131,61 +300,255 @@
             WaitHandle = new ManualResetEvent(true),
             WaitResult = true,
         };
-
+        MachineState _machineStateBeforePause = MachineState.Unknown;
+        List<MachineState> _statesAllowPause = new List<MachineState>() { MachineState.Running, MachineState.Ready, MachineState.Pause };
         [ProcessMethod("", "PauseJob", "鏆傚仠娴佺▼", InvokeType.TestInvoke)]
-        public ProcessResponse PauseJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        public ProcessResponse SwitchJobStatus(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
         {
-            if (_pauseHandle.WaitResult)
-            {
-                #region 鏉垮崱鏆傚仠鍔ㄤ綔
-                #endregion
+            if (!_statesAllowPause.Contains(MachineState))
+                return new ProcessResponse(-999);
 
-                _pauseHandle.WaitHandle.Reset();
+            MotionCardBase motionDevice = sourceDevice as MotionCardBase;
+            if (motionDevice == null)
+            {
+                motionDevice = DeviceCollection.FirstOrDefault(u => u is MotionCardBase) as MotionCardBase;
+            }
+
+            if (motionDevice == null)
+                throw new ProcessException("鏈幏鍙栨澘鍗¤澶�");
+
+            bool? isToPause = null; //true 鏆傚仠 false 缁х画
+            if (opConfig.InputPara != null && opConfig.InputPara.Count > 0)
+            {
+                isToPause = opConfig.InputPara[0] == 1;
+            }
+
+            if (isToPause == null)
+            {
+                if (!_pauseHandle.WaitResult)
+                {
+                    #region 鏉垮崱鏆傚仠鍔ㄤ綔
+                    motionDevice.StateChange(DeviceState.DSPause);
+                    #endregion
+
+                    _pauseHandle.WaitHandle.Reset();
+                    _pauseHandle.WaitResult = true;
+                    _machineStateBeforePause = MachineState;
+                    MachineState = MachineState.Pause;
+                }
+                else if (!_pauseHandle.WaitResult)
+                {
+                    #region 鏉垮崱鎭㈠鍔ㄤ綔
+                    motionDevice.StateChange(DeviceState.DSOpen);
+                    #endregion
+
+                    _pauseHandle.WaitHandle.Set();
+                    _pauseHandle.WaitResult = false;
+                    MachineState = _machineStateBeforePause;
+                }
             }
             else
             {
-                #region 鏉垮崱鎭㈠鍔ㄤ綔
-                #endregion
+                if (isToPause.Value)
+                {
+                    if (!_pauseHandle.WaitResult)
+                    {
+                        #region 鏉垮崱鏆傚仠鍔ㄤ綔
+                        motionDevice.StateChange(DeviceState.DSPause);
+                        #endregion
 
-                _pauseHandle.WaitHandle.Set();
+                        _pauseHandle.WaitHandle.Reset();
+                        _pauseHandle.WaitResult = true;
+                        MachineState = MachineState.Pause;
+                    }
+                }
+                else
+                {
+                    if (!_pauseHandle.WaitResult)
+                    {
+                        #region 鏉垮崱鎭㈠鍔ㄤ綔
+                        motionDevice.StateChange(DeviceState.DSOpen);
+                        #endregion
+
+                        _pauseHandle.WaitHandle.Set();
+                        _pauseHandle.WaitResult = false;
+                        MachineState = _machineStateBeforePause;
+                    }
+                }
             }
 
-            _pauseHandle.WaitResult = !_pauseHandle.WaitResult;
             return new ProcessResponse(_pauseHandle.WaitResult);
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchLightRed", "鍒囨崲鎸囩ず鐏�-绾�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchLightRed(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        ////[ProcessMethod("", "PauseJob", "鏆傚仠娴佺▼", InvokeType.TestInvoke)]
+        //public ProcessResponse PauseJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    if (!_pauseHandle.WaitResult)
+        //    {
+        //        #region 鏉垮崱鏆傚仠鍔ㄤ綔
+        //        #endregion
+
+        //        _pauseHandle.WaitHandle.Reset();
+        //    }
+
+        //    _pauseHandle.WaitResult = !_pauseHandle.WaitResult;
+        //    return new ProcessResponse(_pauseHandle.WaitResult);
+        //}
+
+        ////[ProcessMethod("", "ResumeJob", "缁х画娴佺▼", InvokeType.TestInvoke)]
+        //public ProcessResponse ResumeJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    if (_pauseHandle.WaitResult)
+        //    {
+        //        #region 鏉垮崱鎭㈠鍔ㄤ綔
+        //        #endregion
+
+        //        _pauseHandle.WaitHandle.Set();
+        //    }
+
+        //    _pauseHandle.WaitResult = !_pauseHandle.WaitResult;
+        //    return new ProcessResponse(_pauseHandle.WaitResult);
+        //}
+
+        #region 涓夎壊鐏� & 铚傞福鍣�
+        //[ProcessMethod("MotionCardBase", "SwitchLightRed", "鍒囨崲鎸囩ず鐏�-绾�", InvokeType.TestInvoke)]
+        //public ProcessResponse SwitchLightRed(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    MotionCardDefaultRun("SwitchLightRed", ref opConfig, ref invokeDevice);
+        //    return new ProcessResponse(true);
+        //}
+
+        //[ProcessMethod("MotionCardBase", "SwitchLightYellow", "鍒囨崲鎸囩ず鐏�-榛�", InvokeType.TestInvoke)]
+        //public ProcessResponse SwitchLightYellow(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    return new ProcessResponse(true);
+        //}
+
+        //[ProcessMethod("MotionCardBase", "SwitchLightGreen", "鍒囨崲鎸囩ず鐏�-缁�", InvokeType.TestInvoke)]
+        //public ProcessResponse SwitchLightGreen(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    return new ProcessResponse(true);
+        //}
+
+        //[ProcessMethod("MotionCardBase", "SwitchBeep", "鍒囨崲铚傞福鍣�", InvokeType.TestInvoke)]
+        //public ProcessResponse SwitchBeep(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    return new ProcessResponse(true);
+        //}
+
+        //[ProcessMethod("MotionCardBase", "SwitchNormalLight", "鍒囨崲鏃ュ厜鐏�", InvokeType.TestInvoke)]
+        //public ProcessResponse SwitchNormalLight(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        //{
+        //    MotionCardDefaultRun("SwitchNormalLight", ref opConfig, ref invokeDevice);
+
+        //    return new ProcessResponse(true);
+        //}
+
+        int index_RedLight = -1;
+        int index_GreenLight = -1;
+        int index_YellowLight = -1;
+        int index_Beep = -1;
+        int index_NormalLight = -1;
+        MotionCardBase outputCtrlCard = null;
+
+        public void SwitchLightRed(bool isOn)
         {
-            MotionCardDefaultRun("SwitchLightRed", ref opConfig, ref invokeDevice);
-            return new ProcessResponse(true);
+            if (index_RedLight >= 0)
+            {
+                if (outputCtrlCard != null)
+                {
+                    outputCtrlCard.WriteOutput((short)index_RedLight, isOn ? IOValue.TRUE : IOValue.FALSE);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "鏈缃澘鍗¤緭鍑鸿澶�", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "绾㈣壊鐏湭閰嶇疆姝g‘杈撳嚭绱㈠紩", "");
+            }
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchLightYellow", "鍒囨崲鎸囩ず鐏�-榛�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchLightYellow(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        public void SwitchLightYellow(bool isOn)
         {
-            return new ProcessResponse(true);
+            if (index_YellowLight >= 0)
+            {
+                if (outputCtrlCard != null)
+                {
+                    outputCtrlCard.WriteOutput((short)index_YellowLight, isOn ? IOValue.TRUE : IOValue.FALSE);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "鏈缃澘鍗¤緭鍑鸿澶�", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "榛勮壊鐏湭閰嶇疆姝g‘杈撳嚭绱㈠紩", "");
+            }
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchLightGreen", "鍒囨崲鎸囩ず鐏�-缁�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchLightGreen(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        public void SwitchLightGreen(bool isOn)
         {
-            return new ProcessResponse(true);
+            if (index_GreenLight >= 0)
+            {
+                if (outputCtrlCard != null)
+                {
+                    outputCtrlCard.WriteOutput((short)index_GreenLight, isOn ? IOValue.TRUE : IOValue.FALSE);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "鏈缃澘鍗¤緭鍑鸿澶�", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "缁胯壊鐏湭閰嶇疆姝g‘杈撳嚭绱㈠紩", "");
+            }
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchBeep", "鍒囨崲铚傞福鍣�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchBeep(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        public void SwitchLight(bool isOn)
         {
-            return new ProcessResponse(true);
+            if (index_NormalLight >= 0)
+            {
+                if (outputCtrlCard != null)
+                {
+                    outputCtrlCard.WriteOutput((short)index_NormalLight, isOn ? IOValue.TRUE : IOValue.FALSE);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "鏈缃澘鍗¤緭鍑鸿澶�", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "鐓ф槑鐏湭閰嶇疆姝g‘杈撳嚭绱㈠紩", "");
+            }
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchNormalLight", "鍒囨崲鏃ュ厜鐏�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchNormalLight(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        public void SwitchBeep(bool isOn)
         {
-            MotionCardDefaultRun("SwitchNormalLight", ref opConfig, ref invokeDevice);
+            if (Config.IsBeepBlocked)
+                return;
 
-            return new ProcessResponse(true);
+            if (index_Beep >= 0)
+            {
+                if (outputCtrlCard != null)
+                {
+                    outputCtrlCard.WriteOutput((short)index_Beep, isOn ? IOValue.TRUE : IOValue.FALSE);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "鏈缃澘鍗¤緭鍑鸿澶�", "");
+                }
+            }
+            else
+            {
+                LogAsync(DateTime.Now, "铚傞福鍣ㄦ湭閰嶇疆姝g‘杈撳嚭绱㈠紩", "");
+            }
         }
+        #endregion
 
         private void MotionCardDefaultRun(string methodCode, ref IOperationConfig opConfig, ref IDevice invokeDevice)
         {
@@ -210,8 +573,62 @@
 
             if (invokeDevice is MotionCardBase motionCard)
             {
-                motionCard.Run(opConfig);
+                var response = motionCard.Run(opConfig);
+                if (!response.Result)
+                {
+                    throw new ProcessException($"{motionCard.Name}寮傚父锛寋response.Message}", null, ExceptionLevel.Fatal);
+                }
             }
         }
+
+        #region 瀹夊叏闂� & 瀹夊叏鍏夌嚎
+        bool isSafetyDoorTrigged = false;
+        bool isSafetyBeamTrigged = false;
+
+        public bool IsSafetyDoorTrigged
+        {
+            get => !Config.IsSafetyDoorBlocked && isSafetyDoorTrigged;
+            set => isSafetyDoorTrigged = value;
+        }
+        public bool IsSafetyBeamTrigged
+        {
+            get => !Config.IsSafetyBeamBlocked && isSafetyBeamTrigged;
+            set => isSafetyBeamTrigged = value;
+        }
+
+        [ProcessMethod("", "SafetyDoorSignal", "瀹夊叏闂ㄤ俊鍙风洃鎺э紝姝e父ON锛孫FF鏃舵姤璀�", InvokeType.TestInvoke)]
+        public ProcessResponse SafetyDoorSignal(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        {
+            if (opConfig.InputPara == null || opConfig.InputPara.Count == 0)
+                throw new ProcessException("瀹夊叏闂ㄧ洃鎺ф湭閰嶇疆杈撳叆淇″彿");
+
+            IsSafetyDoorTrigged = opConfig.InputPara[0] == 0;
+
+            if (IsSafetyDoorTrigged)
+            {
+                RaisedAlarm("瀹夊叏闂ㄦ湭姝e父鍏抽棴");
+                MachineState = MachineState.Alarm;
+            }
+
+            return new ProcessResponse(true);
+        }
+
+        [ProcessMethod("", "SafetyBeamSignal", "瀹夊叏鍏夊箷淇″彿鐩戞帶锛屾甯窸N锛孫FF鏃舵姤璀�", InvokeType.TestInvoke)]
+        public ProcessResponse SafetyBeamSignal(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        {
+            if (opConfig.InputPara == null || opConfig.InputPara.Count == 0)
+                throw new ProcessException("瀹夊叏鍏夊箷鐩戞帶鏈厤缃緭鍏ヤ俊鍙�");
+
+            IsSafetyBeamTrigged = opConfig.InputPara[0] == 0;
+
+            if (IsSafetyBeamTrigged)
+            {
+                RaisedAlarm("瀹夊叏鍏夌嚎琚伄鎸�");
+                MachineState = MachineState.Alarm;
+            }
+
+            return new ProcessResponse(true);
+        }
+        #endregion
     }
 }

--
Gitblit v1.8.0