From 6935238d2b7fdabbe46514b50e154df44af862f8 Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期一, 06 七月 2020 11:32:09 +0800
Subject: [PATCH] 合并

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs            |    6 
 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs |    2 
 src/Bro.M071.Process/M071Process.cs                |   44 +++---
 src/Bro.M071.Process/M071Process_MotionCard.cs     |  296 ++++++++++++++++++++++++++++++++++++++++++++++--
 src/Bro.M071.Process/M071Config.cs                 |    2 
 src/Bro.Common.Model/Helper/EnumHelper.cs          |    4 
 6 files changed, 309 insertions(+), 45 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
index 355739a..7fb7839 100644
--- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
@@ -57,7 +57,7 @@
         /// </summary>
         public List<MovingOption> AxisMovingOptionValues { get; set; } = new List<MovingOption>();
 
-        public abstract void WriteOutput(short cardNum, short index, IOValue value);
+        public abstract void WriteOutput(short index, IOValue value);     
     }
 
     public class MotionCardInitialConfigBase : InitialConfigBase, IMonitorConfig
diff --git a/src/Bro.Common.Model/Helper/EnumHelper.cs b/src/Bro.Common.Model/Helper/EnumHelper.cs
index a9cf25a..03c6d7a 100644
--- a/src/Bro.Common.Model/Helper/EnumHelper.cs
+++ b/src/Bro.Common.Model/Helper/EnumHelper.cs
@@ -532,9 +532,9 @@
 
             [Description("鎸囩ず鐏�-榛�")]
             Light_Yellow = 1,
-            [Description("鎸囩ず鐏�-绾�")]
-            Light_Green = 2,
             [Description("鎸囩ず鐏�-缁�")]
+            Light_Green = 2,
+            [Description("鎸囩ず鐏�-绾�")]
             Light_Red = 3,
             [Description("铚傞福鍣�")]
             Beep = 4,
diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index 3d06c3f..adba5c9 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -767,17 +767,17 @@
         /// </summary>
         /// <param name="index">杈撳嚭鍙�,杩斿洖1-16</param>
         /// <param name="value">false琛ㄧず杈撳嚭锛宼rue琛ㄧず鍏抽棴</param>
-        public override void WriteOutput(short cardNum, short index, IOValue value)
+        public override void WriteOutput(short index, IOValue value)
         {
             short outNum = (short)(index % 100 + 1);
             if ((int)value <= 1)
             {
-                GTSCardAPI.GT_SetDoBit(cardNum, GTSCardAPI.MC_GPO, outNum, (short)value);
+                GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, (short)value);
             }
             else
             {
                 var currentValue = (int)MonitorValues.FirstOrDefault(u => u.IONum == outNum && u.IOType == IOType.OUTPUT).Value;
-                GTSCardAPI.GT_SetDoBit(cardNum, GTSCardAPI.MC_GPO, outNum, (short)(currentValue == 1 ? 0 : 1));
+                GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPO, outNum, (short)(currentValue == 1 ? 0 : 1));
             }
         }
 
diff --git a/src/Bro.M071.Process/M071Config.cs b/src/Bro.M071.Process/M071Config.cs
index cdee3bc..9f8559f 100644
--- a/src/Bro.M071.Process/M071Config.cs
+++ b/src/Bro.M071.Process/M071Config.cs
@@ -75,7 +75,7 @@
 
         [Category("鍥剧墖淇濆瓨閰嶇疆")]
         [Description("鍗曢敭鍥剧墖淇濆瓨鐩綍璺緞")]
-        [Editor(typeof(FoldDialogEditor),typeof(UITypeEditor))]
+        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
         public string ImageSaveFolder { get; set; } = "";
 
         [Category("灞忚斀閰嶇疆")]
diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs
index 12b9601..c026e29 100644
--- a/src/Bro.M071.Process/M071Process.cs
+++ b/src/Bro.M071.Process/M071Process.cs
@@ -56,6 +56,8 @@
             //鏁版嵁搴撹縼绉绘鏌�
             DatabaseInitialize.Initialize();
 
+            MotionCardSettingCheck();
+
             Config.SnapshotPointCollection.ForEach(u =>
             {
                 u.GetHalconToolPathList().ForEach(path =>
@@ -353,28 +355,28 @@
                     {
                         return;
                     }
-
-                    pMeasure.EndTime = DateTime.Now;
-                    bool pResult = pMeasure.Measurements.All(u => u.Spec.MeasureResult == true);
-                    OnUpdateResult?.Invoke(DateTime.Now, pResult ? 1 : 0);
-                    OnUpdateCT?.Invoke((float)(pMeasure.EndTime.Value - pMeasure.StartTime.Value).TotalSeconds);
-
-                    LogAsync(DateTime.Now, $"{pMeasure.Barcode} 妫�娴嬪畬鎴愶紝缁撴灉 {(pResult ? "OK" : "NG")}", "");
-
-                    if (MachineState == MachineState.Running)
-                        MachineState = MachineState.Ready;
-
-                    //MES杈撳嚭 todo
-
-                    //Excel鎶ヨ〃杈撳嚭 todo
-
-                    //鏁版嵁搴撲繚瀛� todo
-
-                    SaveWholeImage(pMeasure);
-
-                    productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
-                    pMeasure.Dispose();
                 }
+
+                pMeasure.EndTime = DateTime.Now;
+                bool pResult = pMeasure.Measurements.All(u => u.Spec.MeasureResult == true);
+                OnUpdateResult?.Invoke(DateTime.Now, pResult ? 1 : 0);
+                OnUpdateCT?.Invoke((float)(pMeasure.EndTime.Value - pMeasure.StartTime.Value).TotalSeconds);
+
+                LogAsync(DateTime.Now, $"{pMeasure.Barcode} 妫�娴嬪畬鎴愶紝缁撴灉 {(pResult ? "OK" : "NG")}", "");
+
+                if (MachineState == MachineState.Running)
+                    MachineState = MachineState.Ready;
+
+                //MES杈撳嚭 todo
+
+                //Excel鎶ヨ〃杈撳嚭 todo
+
+                //鏁版嵁搴撲繚瀛� todo
+
+                SaveWholeImage(pMeasure);
+
+                productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
+                pMeasure.Dispose();
             }
         }
 
diff --git a/src/Bro.M071.Process/M071Process_MotionCard.cs b/src/Bro.M071.Process/M071Process_MotionCard.cs
index 98ce638..06474aa 100644
--- a/src/Bro.M071.Process/M071Process_MotionCard.cs
+++ b/src/Bro.M071.Process/M071Process_MotionCard.cs
@@ -30,18 +30,116 @@
                 switch (machineState)
                 {
                     case MachineState.Ready:
+                        SwitchBeep(false);
+                        SwitchLightRed(false);
+                        SwitchLightYellow(false);
+
+                        Task.Run(() =>
+                        {
+                            while (MachineState == MachineState.Ready)
+                            {
+                                SwitchLightGreen(true);
+                                Thread.Sleep(1000);
+                                SwitchLightGreen(false);
+                            }
+                        });
+
                         break;
                     case MachineState.Running:
+                        SwitchBeep(false);
+                        SwitchLightRed(false);
+                        SwitchLightYellow(false);
+                        SwitchLightGreen(true);
                         break;
                     case MachineState.Alarm:
+                        SwitchBeep(true);
+                        SwitchLightRed(true);
+                        SwitchLightYellow(false);
+                        SwitchLightGreen(false);
                         break;
                     case MachineState.Pause:
+                        SwitchBeep(false);
+                        SwitchLightRed(false);
+                        Task.Run(() =>
+                        {
+                            while (MachineState == MachineState.Pause)
+                            {
+                                SwitchLightYellow(true);
+                                SwitchLightGreen(true);
+                                Thread.Sleep(1000);
+                                SwitchLightYellow(false);
+                                SwitchLightGreen(false);
+                            }
+                        });
                         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, "鏈厤缃澘鍗¤澶�", "");
             }
         }
 
@@ -66,7 +164,14 @@
             //    }
             //}
 
+            if (IsSafetyBeamTrigged || IsSafetyDoorTrigged)
+            {
+                LogAsync(DateTime.Now, $"{(IsSafetyDoorTrigged ? "瀹夊叏闂�" : "")}{(IsSafetyBeamTrigged ? " 瀹夊叏鍏夌嚎" : "")}瑙﹀彂涓紝澶嶄綅澶辫触", "");
+                return new ProcessResponse(false);
+            }
+
             MotionCardDefaultRun("Reset", ref opConfig, ref invokeDevice);
+            //(invokeDevice as IMotionCard).Reset();
 
             RaisedAlarm("");
             MachineState = MachineState.Ready;
@@ -175,38 +280,145 @@
             return new ProcessResponse(_pauseHandle.WaitResult);
         }
 
-        [ProcessMethod("MotionCardBase", "SwitchLightRed", "鍒囨崲鎸囩ず鐏�-绾�", InvokeType.TestInvoke)]
-        public ProcessResponse SwitchLightRed(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
+        #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)
         {
@@ -234,5 +446,55 @@
                 motionCard.Run(opConfig);
             }
         }
+
+        #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