using CCDCount.DLL; using CCDCount.DLL.Tools; using CCDCount.MODEL.CameraClass; using CCDCount.MODEL.ConfigModel; using CCDCount.MODEL.SqlDataModel; using LogClass; using MvCameraControl; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; using System.Windows.Media.Imaging; using System.Xml.Serialization; namespace CCDCountWpf { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { #region 变量与实例 Uri ShowUri = null; List Configs = null; bool IsShow = false; bool IsPLCShow = false; SystemMonitor monitor = new SystemMonitor(); #endregion #region 窗体事件 /// /// 主窗体构造函数 /// public MainWindow() { InitializeComponent(); OnScreenKeyboard.KillTabTipProcess(); DataContext = ShowMessageBus.ShowBinding; if (File.Exists(".\\Config\\CCDCountConfig.xml")) { Configs = XmlStorage.DeserializeFromXml>(".\\Config\\CCDCountConfig.xml"); } SDKSystem.Initialize(); FaultLog.FaultError += ShowErrorMesPage; InitCameraIdentify(); StartUpdataShowDataThread(); InitCamComboboxValue(); InitPlcManger(); UpdatePlcPara(); } private void Window_Loaded(object sender, RoutedEventArgs e) { MainPageBtn_Click(null, null); } /// /// 退出按钮点击事件 /// /// /// private void ExitBtn_Click(object sender, RoutedEventArgs e) { this.Close(); } /// /// 主界面按钮点击事件 /// /// /// private void MainPageBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\MainPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void SettingBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\SettingPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void ErrorMessageShowBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void PlcSettingBtn_Click(object sender, RoutedEventArgs e) { if(PlcSettingMessageBus.pLCManagement.IsConnect) { ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } else { var MessageResult = MessageBox.Show("尚未连接PLC,是否重连","重连确认",MessageBoxButton.YesNo); if(MessageResult == MessageBoxResult.Yes) { InitPlcManger(); if (PlcSettingMessageBus.pLCManagement.IsConnect) { ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } else { MessageBox.Show("连接PLC失败,请检查PLC状态"); } } } } private void HistoryDataBtn_Click(object sender, RoutedEventArgs e) { ShowUri = new Uri("WpfPage\\HistoryDataPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } private void UserMessageBtn_Click(object sender, RoutedEventArgs e) { if (MessageBus.NowLoginUserMessage != null) { if (!MessageBus.NowLoginUserMessage.IsAdmin) { MessageBox.Show("权限不足"); } else { ShowUri = new Uri("WpfPage\\UserManagementPage.xaml", UriKind.Relative); ShowFrame.Navigate(ShowUri); } } else { MessageBox.Show("请先登录"); } } /// /// 窗体关闭事件 /// /// /// private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { SaveConfig(); SDKSystem.Finalize(); if (MessageBus.MainThreadS.Count != 0) { foreach (var item in MessageBus.MainThreadS) { item.DisposeCamera(); } } StopUpdataShowDataThread(); FaultLog.FaultError -= ShowErrorMesPage; Environment.Exit(0); } #endregion #region 私有方法 private void InitCameraIdentify() { if (Configs.Count == 0) { MessageBox.Show("尚未添加相机,请前往配置页面配置相机"); return; } if (MessageBus.MainThreadS.Count != 0) { foreach (var item in MessageBus.MainThreadS) { item.StopMianThread(); } } MessageBus.MainThreadS = new List(); for (int i = 0; i < Configs.Count; i++) { MessageBus.MainThreadS.Add(new MainThreadClass(Configs[i].ShuLiConfigClass, Configs[i].CameraConfig)); MessageBus.MainThreadS[i].FormulationName = Configs[i].ConfigName; MessageBus.MainThreadS[i].IsLoadFormulation = Configs[i].IsFormulation; MessageBus.MainThreadS[i].ConnectModbus("127.0.0.1"); //MessageBus.MainThreadS[i].ConnectModbus("192.168.1.88"); MessageBus.MainThreadS[i].LoadCamera(); } } /// /// 启动更新显示数据线程 /// private void StartUpdataShowDataThread() { IsShow = true; BitmapImage ThumbnailImage1 = null; BitmapImage ThumbnailImage2 = null; BitmapImage ThumbnailImage3 = null; BitmapImage ThumbnailImage4 = null; const int targetMsPerFrame = 100; // 20FPS=50ms Stopwatch renderSW = new Stopwatch(); Task.Run(async () => { while (IsShow) { renderSW.Restart(); await Task.Run(() => { UpdataShuLiShowData(); UpdateMonitorMessage(); UpdateFaultLogMessage(); }); await Application.Current.Dispatcher.InvokeAsync(() => { if (MessageBus.MainThreadS.Count == 0) { LOG.log(string.Format("{0}:当前未加载识别流程", "IdentifyCameraForm-StartShowImageThread")); Thread.Sleep(100); return; } if(MessageBus.MainThreadS.Count>=1) { MessageBus.MainThreadS[0].GetShowImage(2000, out Bitmap image1); if (image1 == null) { LOG.log(string.Format("{0}:相机一获取图片为空", "IdentifyCameraForm-StartShowImageThread")); return; } ThumbnailImage1 = ConvertToBitmapImage(image1); } if (MessageBus.MainThreadS.Count >= 2) { MessageBus.MainThreadS[1].GetShowImage(2000, out Bitmap image2); if (image2 == null) { LOG.log(string.Format("{0}:相机二获取图片为空", "IdentifyCameraForm-StartShowImageThread")); return; } ThumbnailImage2 = ConvertToBitmapImage(image2); } if (MessageBus.MainThreadS.Count >= 3) { MessageBus.MainThreadS[2].GetShowImage(2000, out Bitmap image3); if (image3 == null) { LOG.log(string.Format("{0}:相机三获取图片为空", "IdentifyCameraForm-StartShowImageThread")); return; } ThumbnailImage3 = ConvertToBitmapImage(image3); } if (MessageBus.MainThreadS.Count >= 4) { MessageBus.MainThreadS[3].GetShowImage(2000, out Bitmap image3); if (image3 == null) { LOG.log(string.Format("{0}:相机四获取图片为空", "IdentifyCameraForm-StartShowImageThread")); return; } ThumbnailImage3 = ConvertToBitmapImage(image3); } if (ThumbnailImage1 != null) { ShowMessageBus.ShowBinding.ThumbnailImage1 = ThumbnailImage1; if(MessageBus.NowLoadCameraIndex == 0) ShowMessageBus.ShowBinding.BitmapImage = ThumbnailImage1; } if (ThumbnailImage2 != null) { ShowMessageBus.ShowBinding.ThumbnailImage2 = ThumbnailImage2; if (MessageBus.NowLoadCameraIndex == 1) ShowMessageBus.ShowBinding.BitmapImage = ThumbnailImage2; } if (ThumbnailImage3 != null) { ShowMessageBus.ShowBinding.ThumbnailImage3 = ThumbnailImage3; if (MessageBus.NowLoadCameraIndex == 2) ShowMessageBus.ShowBinding.BitmapImage = ThumbnailImage3; } if (ThumbnailImage4 != null) { ShowMessageBus.ShowBinding.ThumbnailImage4 = ThumbnailImage4; if (MessageBus.NowLoadCameraIndex == 3) ShowMessageBus.ShowBinding.BitmapImage = ThumbnailImage4; } if (MessageBus.NowLoadCameraIndex != -1) { if (MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].IsDebug) { Bitmap Splicebitmap = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].GetCamImageOnce(); if (Splicebitmap != null) { ShowMessageBus.ShowBinding.DebugImage = ConvertToBitmapImage(Splicebitmap); } } else { switch (MessageBus.NowLoadCameraIndex) { case 0: if (ThumbnailImage1 != null) { ShowMessageBus.ShowBinding.DebugImage = ThumbnailImage1; } break; case 1: if (ThumbnailImage2 != null) { ShowMessageBus.ShowBinding.DebugImage = ThumbnailImage2; } break; case 2: if (ThumbnailImage3 != null) { ShowMessageBus.ShowBinding.DebugImage = ThumbnailImage3; } break; case 3: if (ThumbnailImage4 != null) { ShowMessageBus.ShowBinding.DebugImage = ThumbnailImage4; } break; } } } }); //进行精准20帧控制 int elapsed = (int)renderSW.ElapsedMilliseconds; //Console.WriteLine(elapsed); if (elapsed < targetMsPerFrame) { //Console.WriteLine($"主显示线程休眠,休眠时间:{targetMsPerFrame - elapsed}"); Thread.Sleep(targetMsPerFrame - elapsed); } //Thread.Sleep(50); } }); } /// /// 停止更新显示数据线程 /// private void StopUpdataShowDataThread() { IsShow = false; } /// /// 停止PLC数据显示线程 /// public void StopPLCUpdateShowDataThread() { IsPLCShow = false; } /// /// 更新数粒显示数据 /// private void UpdataShuLiShowData() { if (MessageBus.MainThreadS.Count == 0) return; if(MessageBus.NowLoadCameraIndex == -1) return; if (MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].ShuLiState) { Application.Current.Dispatcher.Invoke(() => { ShowMessageBus.ShowBinding.CameraStaticColor = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].CameraRunStatic == true ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red; ShowMessageBus.ShowBinding.CamRunStatic = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].CameraRunStatic == true ? "运行中" : "未运行"; }); } else { Application.Current.Dispatcher.Invoke(() => { ShowMessageBus.ShowBinding.CameraStaticColor = System.Windows.Media.Brushes.Yellow; ShowMessageBus.ShowBinding.CamRunStatic = "视野遮挡"; }); } ShowMessageBus.ShowBinding.AllActiveNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].HistoryActiveNum.ToString(); ShowMessageBus.ShowBinding.AllOkNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].OkHistoryNum.ToString(); ShowMessageBus.ShowBinding.AllNgNum = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].NgHistoryNum.ToString(); ShowMessageBus.ShowBinding.ShuLiSpeed = MessageBus.MainThreadS[MessageBus.NowLoadCameraIndex].GetOneSecondActiveNum().ToString(); } /// /// 更新监控信息 /// private void UpdateMonitorMessage() { ShowMessageBus.ShowBinding.RamMonitor = monitor.GetAvailableMemory() > 1024 ? $"可用内存: {monitor.GetAvailableMemory() / 1024:0.00}GB" : $"可用内存: {monitor.GetAvailableMemory()}MB"; ShowMessageBus.ShowBinding.CPUMonitor = $"CPU: {monitor.GetCpuUsage():0.00}%"; } /// /// 更新故障日志信息 /// private void UpdateFaultLogMessage() { ShowMessageBus.ShowBinding.ErrMessageShowList = FaultLog.GetAllErrMessage(); } // Bitmap 转 BitmapImage 的辅助方法 private BitmapImage ConvertToBitmapImage(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png); memory.Position = 0; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.DecodePixelWidth = 1200; // 设置目标分辨率宽度 bitmapImage.DecodePixelHeight = 600; // 保持宽高比 bitmapImage.StreamSource = memory; bitmapImage.EndInit(); return bitmapImage; } } /// /// 初始化相机选择框 /// private void InitCamComboboxValue() { List CameraInfoList = new List(); MessageBus.CameraClass.GetCameraList(out CameraInfoList); if (CameraInfoList.Count > 0) { ShowMessageBus.ShowBinding.CameraItems.Clear(); ShowMessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem() { Name = "请选择相机", SNValue = "" }); foreach (var item in CameraInfoList) { ShowMessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem() { Name = item.DeviceName + "_" + item.DeviceSN, SNValue = item.DeviceSN }); } } } /// /// FaultLog的报警回调方法 /// /// private void ShowErrorMesPage(ErrorMesDataEventModelClass e) { ShowMessageBus.ShowBinding.ShowErrMessage = e.ErrorMesData.Message; ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative); try { ShowFrame.Navigate(ShowUri); } catch (Exception) { } } /// /// 保存配置 /// private void SaveConfig() { List SaveConfig = new List(); if (MessageBus.MainThreadS.Count <= 0) { return; } foreach (var item in MessageBus.MainThreadS) { SaveConfig.Add(new SaveConfigModel() { CameraConfig = item.cameraConfig, ShuLiConfigClass = item.shuLiConfig, IsFormulation = item.IsLoadFormulation, ConfigName = item.FormulationName }); } if (!Directory.Exists(".\\Config\\")) Directory.CreateDirectory(".\\Config\\"); { XmlStorage.SerializeToXml(SaveConfig, ".\\Config\\CCDCountConfig.xml"); } } /// /// 初始化PLC管理(包括PLC的数据信息更新线程) /// public void InitPlcManger() { PlcSettingMessageBus.pLCManagement = new PLCManagementClass("127.0.0.1"); if(PlcSettingMessageBus.pLCManagement.IsConnect) { IsPLCShow = true; const int targetMsPerFrame = 100; // 20FPS=50ms Stopwatch renderSW = new Stopwatch(); Task.Run(async () => { while (IsPLCShow) { await Task.Run(() => { UpdatePlcState(); }); await Application.Current.Dispatcher.InvokeAsync(() => { }); //进行精准20帧控制 int elapsed = (int)renderSW.ElapsedMilliseconds; //Console.WriteLine(elapsed); if (elapsed < targetMsPerFrame) { //Console.WriteLine($"主显示线程休眠,休眠时间:{targetMsPerFrame - elapsed}"); Thread.Sleep(targetMsPerFrame - elapsed); } //Thread.Sleep(50); } }); } } private void UpdatePlcState() { var plcData = PlcSettingMessageBus.pLCManagement.ReadAllState(); if (plcData == null) return; PlcSettingMessageBus.PlcMessageShowBindage.EnableCompletion = plcData.EnableCompletion; PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZeroCompletion = plcData.ReturnToZeroCompletion; PlcSettingMessageBus.PlcMessageShowBindage.StopCompletion = plcData.StopCompletion; PlcSettingMessageBus.PlcMessageShowBindage.SpeedRunning = plcData.SpeedRunning; PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZero = plcData.ReturnToZero; PlcSettingMessageBus.PlcMessageShowBindage.TransferValveOpenCompletion = plcData.TransferValveOpenCompletion; PlcSettingMessageBus.PlcMessageShowBindage.TransferValveCloseCompletion = plcData.TransferValveCloseCompletion; PlcSettingMessageBus.PlcMessageShowBindage.AllowsDataExchange = plcData.AllowsDataExchange; PlcSettingMessageBus.PlcMessageShowBindage.Enable = plcData.Enable; PlcSettingMessageBus.PlcMessageShowBindage.PauseDataExchange = plcData.PauseDataExchange; PlcSettingMessageBus.PlcMessageShowBindage.CacheCountDelayed = plcData.CacheCountDelayed; } private void UpdatePlcPara() { var ParaValue = PlcSettingMessageBus.pLCManagement.ReadAllPara(); if (ParaValue == null) return; PlcSettingMessageBus.PlcMessageShowBindage.SpeedModeRunningSpeed = ParaValue.SpeedModeRunningSpeed.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.JogSpeed = ParaValue.JogSpeed.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.BottValueSet = ParaValue.BottValueSet; PlcSettingMessageBus.PlcMessageShowBindage.TransferValveOpeningSpeed = ParaValue.TransferValveOpeningSpeed.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.TransferValveOpeningTime = ParaValue.TransferValveOpeningTime; PlcSettingMessageBus.PlcMessageShowBindage.BottingDecelerationValue = ParaValue.BottingDecelerationValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheDecelerationValue = ParaValue.CacheDecelerationValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheCountDelayTiming = ParaValue.CacheCountDelayTiming; PlcSettingMessageBus.PlcMessageShowBindage.CacheShutdownValue = ParaValue.CacheShutdownValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingMaterialCylinderVibrationTableHighSpeedValue = ParaValue.BottingMaterialCylinderVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingFilterVibrationTableHighSpeedValue = ParaValue.BottingFilterVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingCountVibrationTableHighSpeedValue = ParaValue.BottingCountVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingMaterialCylinderVibrationTableDecelerationSpeedValue = ParaValue.BottingMaterialCylinderVibrationTableDecelerationSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingFilterVibrationTableDecelerationSpeedValue = ParaValue.BottingFilterVibrationTableDecelerationSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.BottingCountVibrationTableDecelerationSpeedValue = ParaValue.BottingCountVibrationTableDecelerationSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheMaterialCylinderVibrationTableHighSpeedValue = ParaValue.CacheMaterialCylinderVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheFilterVibrationTableHighSpeedValue = ParaValue.CacheFilterVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheCountVibrationTableHighSpeedValue = ParaValue.CacheCountVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheMaterialCylinderVibrationTableDecelerationSpeedValue = ParaValue.CacheMaterialCylinderVibrationTableDecelerationSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheMaterialCylinderVibrationTableHighSpeedValue = ParaValue.CacheMaterialCylinderVibrationTableHighSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.CacheCountVibrationTableDecelerationSpeedValue = ParaValue.CacheCountVibrationTableDecelerationSpeedValue; PlcSettingMessageBus.PlcMessageShowBindage.GateOpeningDelay = ParaValue.GateOpeningDelay; PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZeroOffsetValue = ParaValue.ReturnToZeroOffsetValue.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.ReturnToZeroOffsetSpeed = ParaValue.ReturnToZeroOffsetSpeed.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.TransferValveClosingSpeed = ParaValue.TransferValveClosingSpeed.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.TransferValveOpenPosition = ParaValue.TransferValveOpenPosition.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.TransferValveClosePosition = ParaValue.TransferValveClosePosition.ToString(); PlcSettingMessageBus.PlcMessageShowBindage.AirValveOpeningDelay = ParaValue.AirValveOpeningDelay; PlcSettingMessageBus.PlcMessageShowBindage.BottlingShutdownValue = ParaValue.BottlingShutdownValue; PlcSettingMessageBus.PlcMessageShowBindage.BottlingShutdownTime = ParaValue.BottlingShutdownTime; } #endregion private void MenuBtn_Click(object sender, RoutedEventArgs e) { HeardPanel.Visibility = HeardPanel.Visibility == Visibility.Visible?Visibility.Hidden:Visibility.Visible; } private void KeyBoardBtn_Click(object sender, RoutedEventArgs e) { OnScreenKeyboard.Show(); } } }