Преглед на файлове

重构ICamera接口及日志本地化,优化采集策略

本次提交主要内容:
- ICamera接口及各相机类Grab方法增加lastImageOnly参数,支持灵活采集模式;
- 移除多语言资源依赖,所有日志与异常信息改为中文字符串;
- 优化变量命名、代码风格及注释,提升一致性和可读性;
- OptCamera支持动态切换采集策略,增强功能灵活性;
- 设置光源后增加延时,确保设置生效。
孝锋 徐 преди 7 месеца
родител
ревизия
c1337dab71

+ 9 - 9
TeamAAS-VM/Core/Cameras/AHuaCamera.cs

@@ -26,7 +26,6 @@ using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
 using TeamAAS_VP;
 using static MVSDK_Net.IMVDefine;
-using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.Core.Cameras
 {
@@ -111,7 +110,7 @@ namespace TeamAAS_VP.Core.Cameras
             var list = GetDevices();
             foreach (var device in list)
             {
-                if (device.CameraType== CameraType.GIGE)
+                if (device.CameraType == CameraType.GIGE)
                 {
                     if (IsFindByIp)
                     {
@@ -139,7 +138,7 @@ namespace TeamAAS_VP.Core.Cameras
                             ModelName = device.Model;
                             SerialNumber = device.SerialNumber;
                             CameraType = device.CameraType;
-                            CameraIp= device.CameraIp;
+                            CameraIp = device.CameraIp;
                             int res = mvCameraAcq.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByCameraKey, 0, serialNumber);
                             if (res == IMVDefine.IMV_OK)
                             {
@@ -166,7 +165,7 @@ namespace TeamAAS_VP.Core.Cameras
                         break;
                     }
                 }
-                
+
             }
 
             IsConnected = false;
@@ -183,7 +182,7 @@ namespace TeamAAS_VP.Core.Cameras
             List<CameraInfo> cameras = new List<CameraInfo>();
             if (!CheckSoftwareInstalled().isInstalled)
             {
-                LogHelper.WriteLogInfo(Lang.未安装MVViewer);
+                LogHelper.WriteLogInfo("未安装MV Viewer");
                 return cameras.ToArray();
             }
             // 设备搜索 
@@ -220,7 +219,7 @@ namespace TeamAAS_VP.Core.Cameras
                             Model = deviceInfo.modelName,
                             SerialNumber = deviceInfo.serialNumber,
                             CameraIp = gigEDeviceInfo.ipAddress,
-                            IsFindByIp=true,
+                            IsFindByIp = true,
                         });
                     }
                     else if (deviceInfo.nCameraType == IMV_ECameraType.typeU3vCamera)
@@ -510,10 +509,11 @@ namespace TeamAAS_VP.Core.Cameras
         private IMVDefine.IMV_PixelConvertParam stPixelConvertParam = new IMVDefine.IMV_PixelConvertParam();
         private IMVDefine.IMV_EPixelType type = IMVDefine.IMV_EPixelType.gvspPixelMono8;
         /// <summary>
-        /// 采集图像
+        /// 采集单张图片
         /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
         /// <returns></returns>
-        public ICogImage Grab()
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             EnterOperation();
             try
@@ -845,7 +845,7 @@ namespace TeamAAS_VP.Core.Cameras
             }
             IsGrabbing = false;
         }
-        
+
         /// <summary>
         /// 图像是否为Mono格式
         /// </summary>

+ 9 - 9
TeamAAS-VM/Core/Cameras/BaslerCamera.cs

@@ -20,7 +20,6 @@ using System.Windows.Media.Media3D;
 using MvCamCtrl.NET;
 using TeamAAS_VP.Models;
 using Microsoft.Win32;
-using TeamAAS_VP.Resources.Languages;
 //using System.Drawing;
 //using System.Drawing.Imaging;
 
@@ -187,7 +186,7 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 if (!CheckSoftwareInstalled().isInstalled)
                 {
-                    LogHelper.WriteLogInfo(Lang.未安装pylon7);
+                    LogHelper.WriteLogInfo("未安装pylon 7");
                     return cameras.ToArray();
                 }
                 List<Basler.Pylon.ICameraInfo> allCameraInfos = Basler.Pylon.CameraFinder.Enumerate();
@@ -256,7 +255,7 @@ namespace TeamAAS_VP.Core.Cameras
             }
             catch (Exception ex)
             {
-                LogHelper.WriteLogError(Lang.搜索巴斯勒相机列表时出错, ex);
+                LogHelper.WriteLogError("搜索巴斯勒相机列表时出错!", ex);
             }
 
             return cameras.ToArray();
@@ -386,7 +385,7 @@ namespace TeamAAS_VP.Core.Cameras
                     }
                     if (m_MyCamera == null)
                     {
-                        throw new Exception(Lang.没有识别到相机);
+                        throw new Exception("没有识别到相机");
                     }
                 }
 
@@ -457,10 +456,11 @@ namespace TeamAAS_VP.Core.Cameras
         }
 
         /// <summary>
-        /// 采集图像
+        /// 采集单张图片
         /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
         /// <returns></returns>
-        public ICogImage Grab()
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             EnterOperation();
             try
@@ -468,7 +468,7 @@ namespace TeamAAS_VP.Core.Cameras
                 Stopwatch sw = Stopwatch.StartNew();
                 if (m_MyCamera == null)
                 {
-                    throw new Exception(Lang.相机未连接);
+                    throw new Exception("相机未连接");
                 }
                 if (!m_MyCamera.IsOpen)
                 {
@@ -612,11 +612,11 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 if (m_MyCamera == null)
                 {
-                    throw new Exception(Lang.相机未连接);
+                    throw new Exception("相机未连接");
                 }
                 if (!m_MyCamera.IsOpen)
                 {
-                    throw new Exception(Lang.相机未打开);
+                    throw new Exception("相机未打开");
                 }
 
                 m_MyCamera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);

+ 15 - 15
TeamAAS-VM/Core/Cameras/CognexCamera.cs

@@ -16,7 +16,6 @@ using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
 using TeamAAS_VP;
-using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.Core.Cameras
 {
@@ -145,7 +144,7 @@ namespace TeamAAS_VP.Core.Cameras
             List<CameraInfo> cameras = new List<CameraInfo>();
             if (!CheckSoftwareInstalled().isInstalled)
             {
-                LogHelper.WriteLogInfo(Lang.未安装CognexVisionPro);
+                LogHelper.WriteLogInfo("未安装Cognex VisionPro");
                 return cameras.ToArray();
             }
             using (CogFrameGrabbers mFrameGrabbers = new CogFrameGrabbers())//识别已安装的帧抓取器的类//帧抓取器:相机
@@ -154,10 +153,10 @@ namespace TeamAAS_VP.Core.Cameras
                 foreach (ICogFrameGrabber item in mFrameGrabbers)
                 {
                     string[] bf1 = item.Name.Split(':');
-                    string manufacturerName=item.Name;
+                    string manufacturerName = item.Name;
                     string model = item.Name;
                     CameraType type = CameraType.GIGE;
-                    if (bf1.Length==3)
+                    if (bf1.Length == 3)
                     {
                         manufacturerName = bf1[1].Trim();
                         model = bf1[2].Trim();
@@ -174,7 +173,7 @@ namespace TeamAAS_VP.Core.Cameras
                             type = CameraType.Unknown;
                         }
                     }
-                    if (type== CameraType.GIGE)
+                    if (type == CameraType.GIGE)
                     {
                         cameras.Add(new Models.CameraInfo()
                         {
@@ -186,7 +185,7 @@ namespace TeamAAS_VP.Core.Cameras
                             Model = model,
                             SerialNumber = item.SerialNumber,
                             CameraIp = item.OwnedGigEAccess.CurrentIPAddress,
-                            IsFindByIp=true,
+                            IsFindByIp = true,
                         });
                     }
                     else
@@ -265,7 +264,7 @@ namespace TeamAAS_VP.Core.Cameras
             try
             {
                 IsConnected = false;
-                if (!IsHaveCamera || CameraAcq==null)
+                if (!IsHaveCamera || CameraAcq == null)
                 {
                     using (CogFrameGrabbers mFrameGrabbers = new CogFrameGrabbers())//识别已安装的帧抓取器的类//帧抓取器:相机
                     {
@@ -288,11 +287,11 @@ namespace TeamAAS_VP.Core.Cameras
                                     type = CameraType.Unknown;
                                 }
                             }
-                            if (type== CameraType.GIGE)
+                            if (type == CameraType.GIGE)
                             {
                                 if (IsFindByIp)
                                 {
-                                    if (CameraIp== item.OwnedGigEAccess.CurrentIPAddress)
+                                    if (CameraIp == item.OwnedGigEAccess.CurrentIPAddress)
                                     {
                                         var videoFormat = item.AvailableVideoFormats[0];
 
@@ -445,7 +444,7 @@ namespace TeamAAS_VP.Core.Cameras
             EnterOperation();
             try
             {
-                if (CameraAcq!=null)
+                if (CameraAcq != null)
                 {
                     CameraAcq = null;
 
@@ -459,10 +458,11 @@ namespace TeamAAS_VP.Core.Cameras
         }
 
         /// <summary>
-        /// 采集图像
+        /// 采集单张图片
         /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
         /// <returns></returns>
-        public ICogImage Grab()
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             EnterOperation();
             try
@@ -478,7 +478,7 @@ namespace TeamAAS_VP.Core.Cameras
                         }
 
                         CameraAcq.Flush();
-                        Image= CameraAcq.CompleteAcquireEx(new CogAcqInfo());
+                        Image = CameraAcq.CompleteAcquireEx(new CogAcqInfo());
                         ImageWidth = (uint)Image.Width;
                         ImageHeight = (uint)Image.Height;
                         TotalTime = sw.Elapsed;
@@ -555,7 +555,7 @@ namespace TeamAAS_VP.Core.Cameras
             EnterOperation();
             try
             {
-                if (CameraAcq==null)
+                if (CameraAcq == null)
                     return false;
                 CameraAcq.OwnedExposureParams.Exposure = (double)ExposureTime;
                 return true;
@@ -595,7 +595,7 @@ namespace TeamAAS_VP.Core.Cameras
             EnterOperation();
             try
             {
-                if (CameraAcq==null)
+                if (CameraAcq == null)
                     return false;
                 // 设置增益 
                 CameraAcq.OwnedBrightnessParams.Brightness = (double)Gain;

+ 10 - 6
TeamAAS-VM/Core/Cameras/GalaxyCamera.cs

@@ -18,7 +18,6 @@ using TeamAAS_VP.Core.GalaxyMethod;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
-using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.Core.Cameras
 {
@@ -106,7 +105,7 @@ namespace TeamAAS_VP.Core.Cameras
             var list = GetDevices();
             foreach (var device in list)
             {
-                if (device.CameraType== CameraType.GIGE)
+                if (device.CameraType == CameraType.GIGE)
                 {
                     if (IsFindByIp)
                     {
@@ -161,7 +160,7 @@ namespace TeamAAS_VP.Core.Cameras
             List<CameraInfo> cameras = new List<CameraInfo>();
             if (!CheckSoftwareInstalled().isInstalled)
             {
-                LogHelper.WriteLogInfo(Lang.未安装GalaxyViewer);
+                LogHelper.WriteLogInfo("未安装Galaxy Viewer");
                 return cameras.ToArray();
             }
             m_listIGXDeviceInfo.Clear();
@@ -172,7 +171,7 @@ namespace TeamAAS_VP.Core.Cameras
             // 判断当前连接设备个数
             if (m_listIGXDeviceInfo.Count <= 0)
             {
-                LogHelper.WriteLogInfo(Lang.未检测到设备请确保设备正常连接然后重启程序);
+                LogHelper.WriteLogInfo("未检测到设备,请确保设备正常连接然后重启程序!");
                 return cameras.ToArray();
             }
             for (int i = 0; i < m_listIGXDeviceInfo.Count; i++)
@@ -190,7 +189,7 @@ namespace TeamAAS_VP.Core.Cameras
                         Model = m_listIGXDeviceInfo[i].GetModelName(),
                         SerialNumber = m_listIGXDeviceInfo[i].GetSN(),
                         CameraIp = m_listIGXDeviceInfo[i].GetIP(),
-                        IsFindByIp=true,
+                        IsFindByIp = true,
                     });
                 }
                 else if (deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_USB2 || deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_U3V)
@@ -359,7 +358,12 @@ namespace TeamAAS_VP.Core.Cameras
                 ExitOperation();
             }
         }
-        public ICogImage Grab()
+        /// <summary>
+        /// 采集单张图片
+        /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
+        /// <returns></returns>
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             EnterOperation();
             try

+ 15 - 15
TeamAAS-VM/Core/Cameras/MvCamera.cs

@@ -26,7 +26,6 @@ using TeamAAS_VP;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
-using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.Core.Cameras
 {
@@ -49,7 +48,7 @@ namespace TeamAAS_VP.Core.Cameras
         public int Index { get; set; }
         public string ManufacturerName { get; private set; }
 
-        public bool IsFindByIp {  get; private set; }
+        public bool IsFindByIp { get; private set; }
 
         public string ModelName { get; private set; }
 
@@ -108,14 +107,14 @@ namespace TeamAAS_VP.Core.Cameras
         public event Action<Guid, bool> CameraConnectChangedEvent;
         #endregion
 
-        public MvCamera(Guid id,int index, string name, string serialNumber,string cameraip,bool isFindByIp)
+        public MvCamera(Guid id, int index, string name, string serialNumber, string cameraip, bool isFindByIp)
         {
             ID = id;
             Name = serialNumber;
             Index = index;
-            CameraIp=cameraip;
+            CameraIp = cameraip;
             SerialNumber = serialNumber;
-            IsFindByIp= isFindByIp;
+            IsFindByIp = isFindByIp;
             mvCameraAcq = new MvCameraAcqTool.MvCameraAcqTool();
             MyCamera.MV_CC_DEVICE_INFO_LIST stDeviceList = default(MyCamera.MV_CC_DEVICE_INFO_LIST);
             mvCameraAcq.EnumDeivce(ref stDeviceList);
@@ -130,8 +129,8 @@ namespace TeamAAS_VP.Core.Cameras
                     uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16);
                     uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8);
                     uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff);
-                    string ip= string.Format("{0}.{1}.{2}.{3}", nIp1, nIp2, nIp3, nIp4);
-                    
+                    string ip = string.Format("{0}.{1}.{2}.{3}", nIp1, nIp2, nIp3, nIp4);
+
                     if (IsFindByIp)
                     {
                         if (CameraIp == ip)
@@ -190,7 +189,7 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 if (!CheckSoftwareInstalled().isInstalled)
                 {
-                    LogHelper.WriteLogInfo(Lang.未安装MVS);
+                    LogHelper.WriteLogInfo("未安装MVS");
                     return cameras.ToArray();
                 }
                 List<CCameraInfo> m_ltDeviceList = new List<CCameraInfo>();
@@ -211,7 +210,7 @@ namespace TeamAAS_VP.Core.Cameras
                         string ip = string.Format("{0}.{1}.{2}.{3}", nIp1, nIp2, nIp3, nIp4);
                         cameras.Add(new CameraInfo()
                         {
-                            CameraNo= i + 1,
+                            CameraNo = i + 1,
                             CameraName = gigeInfo.UserDefinedName,
                             CameraBrand = CameraBrand.HikRobot_MVS,
                             CameraType = CameraType.GIGE,
@@ -219,7 +218,7 @@ namespace TeamAAS_VP.Core.Cameras
                             Model = gigeInfo.chModelName,
                             SerialNumber = gigeInfo.chSerialNumber,
                             CameraIp = ip,
-                            IsFindByIp=true,
+                            IsFindByIp = true,
                         });
                     }
                     else if (m_ltDeviceList[i].nTLayerType == CSystem.MV_USB_DEVICE)
@@ -256,7 +255,7 @@ namespace TeamAAS_VP.Core.Cameras
             }
             catch (Exception ex)
             {
-                LogHelper.WriteLogError(Lang.搜索海康相机列表时出错, ex);
+                LogHelper.WriteLogError("搜索海康相机列表时出错!", ex);
             }
 
             return cameras.ToArray();
@@ -286,7 +285,7 @@ namespace TeamAAS_VP.Core.Cameras
                         using (RegistryKey subKey = key.OpenSubKey(subKeyName))
                         {
                             string displayName = subKey.GetValue("DisplayName")?.ToString();
-                            if (displayName != null && displayName.ToUpper().Trim()==softwareName.ToUpper())
+                            if (displayName != null && displayName.ToUpper().Trim() == softwareName.ToUpper())
                             {
                                 string version = subKey.GetValue("DisplayVersion")?.ToString();
                                 Version v1 = new Version(version);
@@ -379,7 +378,7 @@ namespace TeamAAS_VP.Core.Cameras
                     }
                     if (!IsHaveCamera)
                     {
-                        throw new Exception(Lang.没有发现相机);
+                        throw new Exception("没有发现相机");
                     }
                 }
 
@@ -429,10 +428,11 @@ namespace TeamAAS_VP.Core.Cameras
         }
 
         /// <summary>
-        /// 采集图像
+        /// 采集单张图片
         /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
         /// <returns></returns>
-        public ICogImage Grab()
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             _operationSemaphore.Wait();
             try

+ 33 - 9
TeamAAS-VM/Core/Cameras/OptCamera.cs

@@ -18,7 +18,6 @@ using System.Threading.Tasks;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
-using TeamAAS_VP.Resources.Languages;
 
 namespace TeamAAS_VP.Core.Cameras
 {
@@ -93,6 +92,10 @@ namespace TeamAAS_VP.Core.Cameras
         /// 错误信息
         /// </summary>
         public string ErrorMessage { get; private set; }
+
+        //当前的图像采集模式
+        public SciCam.SciCamGrabStrategy CurrentGrabStrategy { get; private set; } = SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_Latest;
+
         #endregion
 
         #region 事件
@@ -176,7 +179,7 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 if (!CheckSoftwareInstalled().isInstalled)
                 {
-                    LogHelper.WriteLogInfo(Lang.未安装OPT);
+                    LogHelper.WriteLogInfo("未安装OPT");
                     return cameras.ToArray();
                 }
 
@@ -218,7 +221,7 @@ namespace TeamAAS_VP.Core.Cameras
             }
             catch (Exception ex)
             {
-                LogHelper.WriteLogError(Lang.搜索OPT相机列表时出错, ex);
+                LogHelper.WriteLogError("搜索OPT相机列表时出错!", ex);
             }
 
             return cameras.ToArray();
@@ -336,7 +339,7 @@ namespace TeamAAS_VP.Core.Cameras
                     }
                     if (!IsHaveCamera)
                     {
-                        throw new Exception(Lang.没有发现相机);
+                        throw new Exception("没有发现相机");
                     }
                 }
                 SciCam.SCI_DEVICE_INFO sCI_DEVICE_INFO = CameraInfo;
@@ -354,7 +357,7 @@ namespace TeamAAS_VP.Core.Cameras
                 // ch:注册事件回调 | en:Register event callback
                 //nReVal = mvCameraAcq.RegisterPayloadCallBack(new SciCam.fnOnPayloadDelegate(ImageCallBack), IntPtr.Zero, true);
                 // ch:设置采集策略 | en:Set Grab Strategy
-                nReVal = mvCameraAcq.SetGrabStrategy(SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_Latest);
+                nReVal = mvCameraAcq.SetGrabStrategy(CurrentGrabStrategy);
                 if (nReVal != SciCam.SCI_CAMERA_OK)
                 {
                     Console.WriteLine("Register Event CallBack fail! nRet {0}", nReVal);
@@ -408,10 +411,11 @@ namespace TeamAAS_VP.Core.Cameras
         }
 
         /// <summary>
-        /// 采集图像
+        /// 采集单张图片
         /// </summary>
+        /// <param name="lastImageOnly">true:采集一张新图像,false:返回最后一张图像</param>
         /// <returns></returns>
-        public ICogImage Grab()
+        public ICogImage Grab(bool lastImageOnly = true)
         {
             //_operationSemaphore.Wait();
             uint nReVal = SciCam.SCI_CAMERA_OK;
@@ -427,6 +431,26 @@ namespace TeamAAS_VP.Core.Cameras
                         {
                             OpenDevice();
                         }
+
+                        //如果仅仅采集最后一帧,则清空缓存
+                        if (lastImageOnly)
+                        {
+                            //判断当前的模式是否为最新模式,如果不是则设置为最新模式
+                            if (CurrentGrabStrategy != SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_OneByOne)
+                            {
+                                CurrentGrabStrategy = SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_OneByOne;
+                                nReVal = mvCameraAcq.SetGrabStrategy(CurrentGrabStrategy);
+                            }
+                        }
+                        else
+                        {
+                            //判断当前的模式是否为顺序模式,如果不是则设置为顺序模式
+                            if (CurrentGrabStrategy != SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_Latest)
+                            {
+                                CurrentGrabStrategy = SciCam.SciCamGrabStrategy.SciCam_GrabStrategy_Latest;
+                                nReVal = mvCameraAcq.SetGrabStrategy(CurrentGrabStrategy);
+                            }
+                        }
                         //if (!mvCameraAcq.IsGrabbing())
                         //{
                         //    mvCameraAcq.StartGrabbing();
@@ -452,7 +476,7 @@ namespace TeamAAS_VP.Core.Cameras
                             //_operationSemaphore.Release();
                             CloseDevice();
                             OpenDevice();
-                            ErrorMessage = Lang.图像采集失败;
+                            ErrorMessage = "图像采集失败!";
                         }
                     }
                     catch (Exception ex)
@@ -670,7 +694,7 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 try
                 {
-                    Grab();
+                    Grab(false);
                     ImageCallbackEvent?.Invoke(Image, TotalTime, ErrorMessage);
                 }
                 catch (Exception)

+ 3 - 2
TeamAAS-VM/Interfaces/ICamera.cs

@@ -100,10 +100,11 @@ namespace TeamAAS_VP.Interfaces
         void CloseDevice();
 
         /// <summary>
-        /// 采集单张图片
+        /// 采集单张图片,传入一个bool值,表示是否只需要采集最后一张图像,false:采集一张新图像,true:如果正在采集则返回最后一张图像,否则采集一张新图像
         /// </summary>
+        /// <param name="lastImageOnly"></param>
         /// <returns></returns>
-        ICogImage Grab();
+        ICogImage Grab(bool lastImageOnly=true);
 
         /// <summary>
         /// 开始实时采集图像

+ 4 - 0
TeamAAS-VM/Services/RemoteCommandService.cs

@@ -2327,6 +2327,10 @@ namespace TeamAAS_VP.Services
                         LogHelper.WriteLogInfo(string.Format(Lang.ÉèÖùâԴͨµÀ0ÁÁ¶È1ʧ°Ü, lightChannel.GlobalIndex, lightChannel.DefaultBrightness));
                     }
                 }
+                if (procedure.LightChannels.Count > 0)
+                {
+                    await Task.Delay(50);
+                }
             }
         }