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();
}
}
}