MainWindow.xaml.cs 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. using CCDCount.DLL;
  2. using CCDCount.DLL.AlarmTools;
  3. using CCDCount.DLL.Tools;
  4. using CCDCount.MODEL.CameraClass;
  5. using CCDCount.MODEL.ConfigModel;
  6. using CCDCount.MODEL.PlcModel;
  7. using CCDCountWpf.Language;
  8. using CCDCountWpf.WpfPage;
  9. using LogClass;
  10. using MvCameraControl;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Diagnostics;
  14. using System.Drawing;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19. using System.Windows;
  20. using System.Windows.Controls;
  21. using System.Windows.Media.Imaging;
  22. namespace CCDCountWpf
  23. {
  24. /// <summary>
  25. /// MainWindow.xaml 的交互逻辑
  26. /// </summary>
  27. public partial class MainWindow : Window
  28. {
  29. #region 变量与实例
  30. //Uri ShowUri = null;
  31. bool IsShow = false;
  32. SystemMonitor monitor = new SystemMonitor();
  33. Stopwatch SystemRunTime = new Stopwatch();
  34. ConfigManager configManager = ConfigManager.Instance;
  35. long InitRunTime;
  36. #endregion
  37. #region 窗体事件
  38. /// <summary>
  39. /// 主窗体构造函数
  40. /// </summary>
  41. public MainWindow()
  42. {
  43. Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
  44. LOG.log("程序正在加载主界面", 6);
  45. InitializeComponent();
  46. //LOG.log("正在开启系统运行时间程序", 6);
  47. //StartSystemRunTime();
  48. SetupFullScreen();
  49. LOG.log("绑定界面数据中", 6);
  50. DataContext = ShowMessageBus.ShowBinding;
  51. LOG.log("加载配置参数中", 6);
  52. configManager.LoadConfigs();
  53. LOG.log("初始化引用库", 6);
  54. SDKSystem.Initialize();
  55. LOG.log("初始化相机中", 6);
  56. InitCameraIdentify();
  57. LOG.log("初始化PLC参数管理功能", 6);
  58. InitPlcManger();
  59. LOG.log("启动界面更新线程中", 6);
  60. StartUpdataShowDataThread();
  61. LOG.log("相机列表显示", 6);
  62. InitCamComboboxValue();
  63. //LOG.log("更新数据界面参数展示", 6);
  64. //UpdatePlcPara();
  65. }
  66. private void Window_Loaded(object sender, RoutedEventArgs e)
  67. {
  68. LOG.log("开启生产界面",6);
  69. MainPageBtn_Click(null, null);
  70. LOG.log("生产界面开启完成", 6);
  71. }
  72. /// <summary>
  73. /// 退出按钮点击事件
  74. /// </summary>
  75. /// <param name="sender"></param>
  76. /// <param name="e"></param>
  77. private void ExitBtn_Click(object sender, RoutedEventArgs e)
  78. {
  79. if (MessageBox.Show("Do you want to exit the program?", "Exit confirmation", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  80. {
  81. this.Close();
  82. }
  83. else
  84. {
  85. return;
  86. }
  87. }
  88. /// <summary>
  89. /// 主界面按钮点击事件
  90. /// </summary>
  91. /// <param name="sender"></param>
  92. /// <param name="e"></param>
  93. private void MainPageBtn_Click(object sender, RoutedEventArgs e)
  94. {
  95. MainWindowsShowPage("Main");
  96. //ShowUri = new Uri("WpfPage\\MainPage.xaml", UriKind.Relative);
  97. //ShowFrame.Navigate(ShowUri);
  98. }
  99. /// <summary>
  100. /// 主界面按钮触屏按下事件
  101. /// </summary>
  102. /// <param name="sender"></param>
  103. /// <param name="e"></param>
  104. private void MainPageBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  105. {
  106. e.Handled = true;
  107. MainWindowsShowPage("Main");
  108. }
  109. private void SettingBtn_Click(object sender, RoutedEventArgs e)
  110. {
  111. MainWindowsShowPage("Camera");
  112. //ShowUri = new Uri("WpfPage\\SettingPage.xaml", UriKind.Relative);
  113. //ShowFrame.Navigate(ShowUri);
  114. }
  115. private void SettingBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  116. {
  117. e.Handled = true;
  118. MainWindowsShowPage("Camera");
  119. }
  120. private void ErrorMessageShowBtn_Click(object sender, RoutedEventArgs e)
  121. {
  122. MainWindowsShowPage("Error");
  123. //ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative);
  124. //ShowFrame.Navigate(ShowUri);
  125. }
  126. private void ErrorMessageShowBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  127. {
  128. e.Handled = true;
  129. MainWindowsShowPage("Error");
  130. }
  131. private void PlcSettingBtn_Click(object sender, RoutedEventArgs e)
  132. {
  133. MainWindowsShowPage("PLC");
  134. //if(SystemAlarm.CheckAlarmStatic(AlarmMessageList.PLC连接中))
  135. //{
  136. // MessageBox.Show("PLC Connecting,Please Wait");
  137. // return;
  138. //}
  139. //if(PlcSettingMessageBus.pLCManagement!=null && PlcSettingMessageBus.pLCManagement.IsConnect)
  140. //{
  141. // ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative);
  142. // ShowFrame.Navigate(ShowUri);
  143. //}
  144. //else
  145. //{
  146. // var MessageResult = MessageBox.Show("尚未连接PLC,是否重连","重连确认",MessageBoxButton.YesNo);
  147. // if(MessageResult == MessageBoxResult.Yes)
  148. // {
  149. // InitPlcManger();
  150. // if (PlcSettingMessageBus.pLCManagement != null && PlcSettingMessageBus.pLCManagement.IsConnect)
  151. // {
  152. // ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative);
  153. // ShowFrame.Navigate(ShowUri);
  154. // }
  155. // }
  156. //}
  157. }
  158. private void PlcSettingBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  159. {
  160. e.Handled = true;
  161. MainWindowsShowPage("PLC");
  162. }
  163. private void HistoryDataBtn_Click(object sender, RoutedEventArgs e)
  164. {
  165. MainWindowsShowPage("History");
  166. //ShowUri = new Uri("WpfPage\\HistoryDataPage.xaml", UriKind.Relative);
  167. //ShowFrame.Navigate(ShowUri);
  168. }
  169. private void HistoryDataBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  170. {
  171. e.Handled = true;
  172. MainWindowsShowPage("History");
  173. }
  174. private void UserMessageBtn_Click(object sender, RoutedEventArgs e)
  175. {
  176. MainWindowsShowPage("User");
  177. }
  178. private void UserMessageBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  179. {
  180. e.Handled = true;
  181. MainWindowsShowPage("User");
  182. }
  183. /// <summary>
  184. /// 窗体关闭事件
  185. /// </summary>
  186. /// <param name="sender"></param>
  187. /// <param name="e"></param>
  188. private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  189. {
  190. StopSystemRunTime();
  191. configManager.SaveConfigs(ShowMessageBus.ShowBinding.FormulationName);
  192. SDKSystem.Finalize();
  193. if (MessageBus.NowSettingLoadMainThread != null)
  194. {
  195. MessageBus.NowSettingLoadMainThread.DisposeCamera();
  196. }
  197. StopUpdataShowDataThread();
  198. Environment.Exit(0);
  199. }
  200. private void MenuBtn_Click(object sender, RoutedEventArgs e)
  201. {
  202. HeardPanel.Visibility = HeardPanel.Visibility == Visibility.Visible ? Visibility.Hidden : Visibility.Visible;
  203. }
  204. private void KeyBoardBtn_Click(object sender, RoutedEventArgs e)
  205. {
  206. OnScreenKeyboard.KeyBoardShow();
  207. }
  208. private void AuditTrailShowBtn_Click(object sender, RoutedEventArgs e)
  209. {
  210. MainWindowsShowPage("Audit");
  211. //ShowUri = new Uri("WpfPage\\AuditTrailPage.xaml", UriKind.Relative);
  212. //ShowFrame.Navigate(ShowUri);
  213. }
  214. private void AuditTrailShowBtn_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
  215. {
  216. e.Handled = true;
  217. MainWindowsShowPage("Audit");
  218. }
  219. private void SwitchLanguageBtn_Click(object sender, RoutedEventArgs e)
  220. {
  221. MessageBus.LanguageIndex++;
  222. LanguageManager.ChangeLanguage(LanguageManager.LanguageList[MessageBus.LanguageIndex % LanguageManager.LanguageList.Count]);
  223. }
  224. #endregion
  225. #region 私有方法
  226. private void InitCameraIdentify()
  227. {
  228. LOG.log("判断ConFig数量", 6);
  229. if(configManager.SaveConfigModel == null)
  230. {
  231. MessageBox.Show("Camera has not been added yet. Please proceed to the configuration page to set up the camera");
  232. //return;
  233. }
  234. LOG.log("判断当前主线程是否运行", 6);
  235. if (MessageBus.NowSettingLoadMainThread != null)
  236. {
  237. MessageBus.NowSettingLoadMainThread.StopMianThread();
  238. }
  239. LOG.log("重新加载MainThread", 6);
  240. MessageBus.NowSettingLoadMainThread = (new MainThreadClass(configManager.SaveConfigModel.ShuLiConfigClass, configManager.SaveConfigModel.CameraConfig));
  241. MessageBus.NowSettingLoadMainThread.FormulationName = configManager.SaveConfigModel.ConfigName;
  242. MessageBus.NowSettingLoadMainThread.IsLoadFormulation = configManager.SaveConfigModel.IsFormulation;
  243. LOG.log("尝试通讯连接", 6);
  244. //MessageBus.NowSettingLoadMainThread.ConnectModbus("127.0.0.1");
  245. //MessageBus.NowSettingLoadMainThread.ConnectModbus("192.168.1.88");
  246. LOG.log("加载相机", 6);
  247. MessageBus.NowSettingLoadMainThread.LoadCamera();
  248. }
  249. /// <summary>
  250. /// 启动更新显示数据线程
  251. /// </summary>
  252. private void StartUpdataShowDataThread()
  253. {
  254. IsShow = true;
  255. BitmapImage ThumbnailImage1 = null;
  256. const int targetMsPerFrame = 100; // 20FPS=50ms
  257. Stopwatch renderSW = new Stopwatch();
  258. Stopwatch HeartSW = new Stopwatch();
  259. Task.Run(async () =>
  260. {
  261. while (IsShow)
  262. {
  263. renderSW.Restart();
  264. try
  265. {
  266. await Task.Run(() =>
  267. {
  268. UpdataShuLiShowData();
  269. UpdateMonitorMessage();
  270. UpdateFaultLogMessage();
  271. UpdateFaultErrorMessage();
  272. });
  273. await Application.Current.Dispatcher.InvokeAsync(() =>
  274. {
  275. if (MessageBus.NowSettingLoadMainThread == null)
  276. {
  277. LOG.log(string.Format("{0}:当前未加载识别流程", "IdentifyCameraForm-StartShowImageThread"));
  278. Thread.Sleep(100);
  279. return;
  280. }
  281. else
  282. {
  283. //MessageBus.NowSettingLoadMainThread.GetShowImage(1000, out Bitmap image1);
  284. MessageBus.NowSettingLoadMainThread.GetShowImage(1000, configManager.SaveConfigModel.CameraConfig.Width, out Bitmap image1);
  285. if (image1 == null)
  286. {
  287. //LOG.log(string.Format("{0}:相机一获取图片为空", "IdentifyCameraForm-StartShowImageThread"));
  288. return;
  289. }
  290. ThumbnailImage1 = ConvertToBitmapImage(image1);
  291. ShowMessageBus.ShowBinding.BitmapImage = ThumbnailImage1;
  292. }
  293. if (MessageBus.NowSettingLoadMainThread != null)
  294. {
  295. if (MessageBus.NowSettingLoadMainThread.IsDebug)
  296. {
  297. Bitmap Splicebitmap = MessageBus.NowSettingLoadMainThread.GetCamImageOnce();
  298. if (Splicebitmap != null)
  299. {
  300. ShowMessageBus.ShowBinding.DebugImage = ConvertToBitmapImage(Splicebitmap);
  301. }
  302. }
  303. else
  304. {
  305. if (ThumbnailImage1 != null)
  306. {
  307. ShowMessageBus.ShowBinding.DebugImage = ThumbnailImage1;
  308. }
  309. }
  310. }
  311. });
  312. }
  313. catch (Exception ex)
  314. {
  315. LOG.error("MainWindow-StartUpdataShowDataThread:" + ex.Message);
  316. }
  317. //进行精准20帧控制
  318. int elapsed = (int)renderSW.ElapsedMilliseconds;
  319. //Console.WriteLine(elapsed);
  320. if (elapsed < targetMsPerFrame)
  321. {
  322. //Console.WriteLine($"主显示线程休眠,休眠时间:{targetMsPerFrame - elapsed}");
  323. Thread.Sleep(targetMsPerFrame - elapsed);
  324. }
  325. //Thread.Sleep(50);
  326. }
  327. });
  328. Task.Run(async () =>
  329. {
  330. while (true)
  331. {
  332. HeartSW.Restart();
  333. if (PlcSettingMessageBus.pLCManagement!=null)
  334. {
  335. if(!PlcSettingMessageBus.pLCManagement.HeartMessage())
  336. {
  337. SystemAlarm.AlarmAlert(AlarmMessageList.心跳异常,
  338. "Heart Error",
  339. "心跳异常",
  340. "MainWindows-StartUpdataShowDataThread");
  341. SystemAlarm.AlarmAlert(AlarmMessageList.PLC通讯连接失败,
  342. "PLC communication connection failed",
  343. "PLC通讯连接失败",
  344. "MainWindows-StartUpdataShowDataThread");
  345. }
  346. else
  347. {
  348. SystemAlarm.AlarmCancel(AlarmMessageList.心跳异常);
  349. SystemAlarm.AlarmCancel(AlarmMessageList.PLC通讯连接失败);
  350. }
  351. }
  352. UpdatePlcAlarmMessage();
  353. HeartSW.Stop();
  354. int elapsed = (int)HeartSW.ElapsedMilliseconds;
  355. if (elapsed < targetMsPerFrame)
  356. {
  357. await Task.Delay(500 - elapsed);
  358. }
  359. }
  360. });
  361. }
  362. /// <summary>
  363. /// 停止更新显示数据线程
  364. /// </summary>
  365. private void StopUpdataShowDataThread()
  366. {
  367. IsShow = false;
  368. }
  369. /// <summary>
  370. /// 更新数粒显示数据
  371. /// </summary>
  372. private void UpdataShuLiShowData()
  373. {
  374. ushort BottingCount = 0;
  375. if (MessageBus.NowSettingLoadMainThread == null) return;
  376. if (MessageBus.NowSettingLoadMainThread.ShuLiState)
  377. {
  378. Application.Current.Dispatcher.Invoke(() =>
  379. {
  380. ShowMessageBus.ShowBinding.CameraStaticColor = MessageBus.NowSettingLoadMainThread.CameraRunStatic == true
  381. ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red;
  382. ShowMessageBus.ShowBinding.CamRunStatic = MessageBus.NowSettingLoadMainThread.CameraRunStatic == true
  383. ? "Run" : "Stop";
  384. });
  385. }
  386. else
  387. {
  388. Application.Current.Dispatcher.Invoke(() =>
  389. {
  390. ShowMessageBus.ShowBinding.CameraStaticColor = System.Windows.Media.Brushes.Yellow;
  391. ShowMessageBus.ShowBinding.CamRunStatic = "Vision obstruction";
  392. });
  393. }
  394. ShowMessageBus.ShowBinding.AllActiveNum = MessageBus.NowSettingLoadMainThread.HistoryActiveNum.ToString();
  395. ShowMessageBus.ShowBinding.AllOkNum = MessageBus.NowSettingLoadMainThread.OkHistoryNum.ToString();
  396. ShowMessageBus.ShowBinding.AllNgNum = MessageBus.NowSettingLoadMainThread.NgHistoryNum.ToString();
  397. ShowMessageBus.ShowBinding.ShuLiSpeed = MessageBus.NowSettingLoadMainThread.GetOneSecondActiveNum().ToString();
  398. if(PlcSettingMessageBus.pLCManagement != null && PlcSettingMessageBus.pLCManagement.IsConnect)
  399. {
  400. PlcSettingMessageBus.pLCManagement.ReadBottingCount(out BottingCount);
  401. ShowMessageBus.ShowBinding.BottingCountSpeed = PlcSettingMessageBus.pLCManagement.BottingSpeed.ToString();
  402. }
  403. ShowMessageBus.ShowBinding.BottingCount = BottingCount;
  404. }
  405. /// <summary>
  406. /// 更新监控信息
  407. /// </summary>
  408. private void UpdateMonitorMessage()
  409. {
  410. ShowMessageBus.ShowBinding.RamMonitor = monitor.GetAvailableMemory() > 1024 ? $"可用内存: {monitor.GetAvailableMemory() / 1024:0.00}GB" : $"可用内存: {monitor.GetAvailableMemory()}MB";
  411. ShowMessageBus.ShowBinding.CPUMonitor = $"CPU: {monitor.GetCpuUsage():0.00}%";
  412. }
  413. /// <summary>
  414. /// 更新故障日志信息
  415. /// </summary>
  416. private void UpdateFaultLogMessage()
  417. {
  418. ShowMessageBus.ShowBinding.ErrMessageShowList = FaultLog.GetAllErrMessage().OrderByDescending(o=>o.DateTime).Take(1000).ToList();
  419. }
  420. private void UpdateFaultErrorMessage()
  421. {
  422. SystemAlarm.AllVisionAlarmCancel(30000);
  423. ShowMessageBus.ShowBinding.AlarmMessShowList = SystemAlarm.GetAlarm();
  424. }
  425. private void UpdatePlcAlarmMessage()
  426. {
  427. if(PlcSettingMessageBus.pLCManagement==null) return;
  428. PlcAlarmModelClass alarm = PlcSettingMessageBus.pLCManagement.ReadAllAlarm();
  429. if (alarm != null)
  430. {
  431. if (alarm.PressSwitch)
  432. {
  433. SystemAlarm.AlarmAlert(AlarmMessageList.气压压力检测开关报警,
  434. "PressSwitch",
  435. "气压压力检测开关报警",
  436. "MainWindow-UpdatePlcAlarmMessage");
  437. }
  438. else
  439. {
  440. SystemAlarm.AlarmCancel(AlarmMessageList.气压压力检测开关报警);
  441. }
  442. if (alarm.E_Stop)
  443. {
  444. SystemAlarm.AlarmAlert(AlarmMessageList.急停开关按下报警,
  445. "E_Stop",
  446. "急停开关按下报警",
  447. "MainWindow-UpdatePlcAlarmMessage");
  448. }
  449. else
  450. {
  451. SystemAlarm.AlarmCancel(AlarmMessageList.急停开关按下报警);
  452. }
  453. if (alarm.MachineUpLimit)
  454. {
  455. SystemAlarm.AlarmAlert(AlarmMessageList.触发上限位报警,
  456. "MachineUpLimit",
  457. "触发上限位报警",
  458. "MainWindow-UpdatePlcAlarmMessage");
  459. }
  460. else
  461. {
  462. SystemAlarm.AlarmCancel(AlarmMessageList.触发上限位报警);
  463. }
  464. if (alarm.MachineDownLimit)
  465. {
  466. SystemAlarm.AlarmAlert(AlarmMessageList.触发下限位报警,
  467. "MachineDownLimit",
  468. "触发下限位报警",
  469. "MainWindow-UpdatePlcAlarmMessage");
  470. }
  471. else
  472. {
  473. SystemAlarm.AlarmCancel(AlarmMessageList.触发下限位报警);
  474. }
  475. if (alarm.MachineInverterError)
  476. {
  477. SystemAlarm.AlarmAlert(AlarmMessageList.升降变频器报警,
  478. "MachineInverterError",
  479. "升降变频器报警",
  480. "MainWindow-UpdatePlcAlarmMessage");
  481. }
  482. else
  483. {
  484. SystemAlarm.AlarmCancel(AlarmMessageList.升降变频器报警);
  485. }
  486. if (alarm.BeltsInverterError)
  487. {
  488. SystemAlarm.AlarmAlert(AlarmMessageList.传送带变频器报警,
  489. "BeltsInverterError",
  490. "传送带变频器报警",
  491. "MainWindow-UpdatePlcAlarmMessage");
  492. }
  493. else
  494. {
  495. SystemAlarm.AlarmCancel(AlarmMessageList.传送带变频器报警);
  496. }
  497. if(alarm.WaitingForReset)
  498. {
  499. SystemAlarm.AlarmAlert(AlarmMessageList.等待复位,
  500. "WaitingForReset",
  501. "等待复位",
  502. "MainWindow-UpdatePlcAlarmMessage");
  503. }
  504. else
  505. {
  506. SystemAlarm.AlarmCancel(AlarmMessageList.等待复位);
  507. }
  508. if (alarm.DoorOpenAlarm)
  509. {
  510. SystemAlarm.AlarmAlert(AlarmMessageList.门开报警,
  511. "DoorOpenAlarm",
  512. "门开报警",
  513. "MainWindow-UpdatePlcAlarmMessage");
  514. }
  515. else
  516. {
  517. SystemAlarm.AlarmCancel(AlarmMessageList.门开报警);
  518. }
  519. if (alarm.FillingValveMotorl)
  520. {
  521. SystemAlarm.AlarmAlert(AlarmMessageList.罐装阀伺服报警,
  522. "FillingValveMotorl",
  523. "罐装阀伺服报警",
  524. "MainWindow-UpdatePlcAlarmMessage");
  525. }
  526. else
  527. {
  528. SystemAlarm.AlarmCancel(AlarmMessageList.罐装阀伺服报警);
  529. }
  530. if (alarm.MaterialShortageShutdown)
  531. {
  532. SystemAlarm.AlarmAlert(AlarmMessageList.设备缺料停机,
  533. "MaterialShortageShutdown",
  534. "设备缺料停机",
  535. "MainWindow-UpdatePlcAlarmMessage");
  536. }
  537. else
  538. {
  539. SystemAlarm.AlarmCancel(AlarmMessageList.设备缺料停机);
  540. }
  541. if (alarm.InBottleScrewMotorlError)
  542. {
  543. SystemAlarm.AlarmAlert(AlarmMessageList.传动轴伺服报警,
  544. "InBottleScrewMotorlError",
  545. "传动轴伺服报警",
  546. "MainWindow-UpdatePlcAlarmMessage");
  547. }
  548. else
  549. {
  550. SystemAlarm.AlarmCancel(AlarmMessageList.传动轴伺服报警);
  551. }
  552. if (alarm.BottleJamSignal)
  553. {
  554. SystemAlarm.AlarmAlert(AlarmMessageList.堵瓶停机,
  555. "BottleJamSignal",
  556. "堵瓶停机",
  557. "MainWindow-UpdatePlcAlarmMessage");
  558. }
  559. else
  560. {
  561. SystemAlarm.AlarmCancel(AlarmMessageList.堵瓶停机);
  562. }
  563. if (alarm.MissingBottleSignal)
  564. {
  565. SystemAlarm.AlarmAlert(AlarmMessageList.缺瓶停机,
  566. "MissingBottleSignal",
  567. "缺瓶停机",
  568. "MainWindow-UpdatePlcAlarmMessage");
  569. }
  570. else
  571. {
  572. SystemAlarm.AlarmCancel(AlarmMessageList.缺瓶停机);
  573. }
  574. if (alarm.PLCCameraHeartErrorSignal)
  575. {
  576. SystemAlarm.AlarmAlert(AlarmMessageList.心跳异常,
  577. "Heart Error",
  578. "心跳异常",
  579. "MainWindow-UpdatePlcAlarmMessage");
  580. }
  581. else
  582. {
  583. SystemAlarm.AlarmCancel(AlarmMessageList.心跳异常);
  584. }
  585. if (alarm.CameraNotRunSignal)
  586. {
  587. SystemAlarm.AlarmAlert(AlarmMessageList.视觉未启动,
  588. "VisionNotRunSignal",
  589. "视觉未启动",
  590. "MainWindow-UpdatePlcAlarmMessage");
  591. }
  592. else
  593. {
  594. SystemAlarm.AlarmCancel(AlarmMessageList.视觉未启动);
  595. }
  596. if (alarm.ParticleCacheOverflowSignal)
  597. {
  598. SystemAlarm.AlarmAlert(AlarmMessageList.颗粒缓存超限,
  599. "ParticleCacheOverflow",
  600. "颗粒缓存超限",
  601. "MainWindow-UpdatePlcAlarmMessage");
  602. }
  603. else
  604. {
  605. SystemAlarm.AlarmCancel(AlarmMessageList.颗粒缓存超限);
  606. }
  607. }
  608. }
  609. // Bitmap 转 BitmapImage 的辅助方法
  610. private BitmapImage ConvertToBitmapImage(Bitmap bitmap)
  611. {
  612. using (MemoryStream memory = new MemoryStream())
  613. {
  614. bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
  615. memory.Position = 0;
  616. var bitmapImage = new BitmapImage();
  617. bitmapImage.BeginInit();
  618. bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
  619. bitmapImage.DecodePixelWidth = 1200; // 设置目标分辨率宽度
  620. bitmapImage.DecodePixelHeight = 600; // 保持宽高比
  621. bitmapImage.StreamSource = memory;
  622. bitmapImage.EndInit();
  623. return bitmapImage;
  624. }
  625. }
  626. /// <summary>
  627. /// 初始化相机选择框
  628. /// </summary>
  629. private void InitCamComboboxValue()
  630. {
  631. MessageBus.CameraClass.GetCameraList(out List<CameraInfoClass> CameraInfoList);
  632. if (CameraInfoList.Count > 0)
  633. {
  634. ShowMessageBus.ShowBinding.CameraItems.Clear();
  635. ShowMessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem() { Name = "请选择相机", SNValue = "" });
  636. foreach (var item in CameraInfoList)
  637. {
  638. ShowMessageBus.ShowBinding.CameraItems.Add(new CameraCoboxItem()
  639. {
  640. Name = item.DeviceName + "_" + item.DeviceSN,
  641. SNValue = item.DeviceSN
  642. });
  643. }
  644. }
  645. }
  646. /// <summary>
  647. /// 初始化PLC管理(包括PLC的数据信息更新线程)
  648. /// </summary>
  649. public async void InitPlcManger()
  650. {
  651. await Task.Run(() => {
  652. //string ipAddress = "192.168.1.88";
  653. string ipAddress = "127.0.0.1";
  654. SystemAlarm.AlarmAlert(AlarmMessageList.PLC连接中,
  655. $"PLC Connecting, target IP:{ipAddress}",
  656. $"PLC连接中, IP地址:{ipAddress}",
  657. "DLL:MainThreadClass-InitPlcManger");
  658. PlcSettingMessageBus.pLCManagement = new PLCManagementClass(ipAddress);
  659. SystemAlarm.AlarmCancel(AlarmMessageList.PLC连接中);
  660. UpdatePlcPara();
  661. UpdateCameraState();
  662. });
  663. }
  664. public void UpdateCameraState()
  665. {
  666. if(PlcSettingMessageBus.pLCManagement!=null&&PlcSettingMessageBus.pLCManagement.IsConnect)
  667. {
  668. PlcSettingMessageBus.pLCManagement.WriteCameraRunState(0);
  669. }
  670. }
  671. private void UpdatePlcPara()
  672. {
  673. var ParaValue = PlcSettingMessageBus.pLCManagement.ReadAllPara();
  674. if (ParaValue == null) return;
  675. //PlcSettingMessageBus.PlcMessageShowBindage.FillingModel =
  676. // ParaValue.FillingMode;
  677. PlcSettingMessageBus.PlcMessageShowBindage.BeltsSpeed =
  678. ParaValue.BeltsSpeed;
  679. PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1H_FillingSpeed =
  680. ParaValue.ShakeTable1H_FillingSpeed;
  681. PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2H_FillingSpeed =
  682. ParaValue.ShakeTable2H_FillingSpeed;
  683. PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3H_FillingSpeed =
  684. ParaValue.ShakeTable3H_FillingSpeed;
  685. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1M_FillingSpeed =
  686. // ParaValue.ShakeTable1M_FillingSpeed;
  687. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2M_FillingSpeed =
  688. // ParaValue.ShakeTable2M_FillingSpeed;
  689. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3M_FillingSpeed =
  690. // ParaValue.ShakeTable3M_FillingSpeed;
  691. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1L_FillingSpeed =
  692. // ParaValue.ShakeTable1L_FillingSpeed;
  693. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2L_FillingSpeed =
  694. // ParaValue.ShakeTable2L_FillingSpeed;
  695. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3L_FillingSpeed =
  696. // ParaValue.ShakeTable3L_FillingSpeed;
  697. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1H_CacheSpeed =
  698. // ParaValue.ShakeTable1H_CacheSpeed;
  699. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2H_CacheSpeed =
  700. // ParaValue.ShakeTable2H_CacheSpeed;
  701. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3H_CacheSpeed =
  702. // ParaValue.ShakeTable3H_CacheSpeed;
  703. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1M_CacheSpeed =
  704. // ParaValue.ShakeTable1M_CacheSpeed;
  705. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2M_CacheSpeed =
  706. // ParaValue.ShakeTable2M_CacheSpeed;
  707. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3M_CacheSpeed =
  708. // ParaValue.ShakeTable3M_CacheSpeed;
  709. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1L_CacheSpeed =
  710. // ParaValue.ShakeTable1L_CacheSpeed;
  711. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2L_CacheSpeed =
  712. // ParaValue.ShakeTable2L_CacheSpeed;
  713. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3L_CacheSpeed =
  714. // ParaValue.ShakeTable3L_CacheSpeed;
  715. //PlcSettingMessageBus.PlcMessageShowBindage.FillingH_SpeedRatio =
  716. // ParaValue.FillingH_SpeedRatio;
  717. //PlcSettingMessageBus.PlcMessageShowBindage.FillingM_SpeedRatio =
  718. // ParaValue.FillingM_SpeedRatio;
  719. //PlcSettingMessageBus.PlcMessageShowBindage.FillingL_SpeedRatio =
  720. // ParaValue.FillingL_SpeedRatio;
  721. //PlcSettingMessageBus.PlcMessageShowBindage.CacheH_SpeedRatio =
  722. // ParaValue.CacheH_SpeedRatio;
  723. //PlcSettingMessageBus.PlcMessageShowBindage.CacheM_SpeedRatio =
  724. // ParaValue.CacheM_SpeedRatio;
  725. //PlcSettingMessageBus.PlcMessageShowBindage.CacheL_SpeedRatio =
  726. // ParaValue.CacheL_SpeedRatio;
  727. PlcSettingMessageBus.PlcMessageShowBindage.ScrewJogSpeed =
  728. ParaValue.ScrewJogSpeed.ToString();
  729. PlcSettingMessageBus.PlcMessageShowBindage.InBottleSpeed =
  730. ParaValue.InBottleSpeed.ToString();
  731. PlcSettingMessageBus.PlcMessageShowBindage.BottlePosSpeed =
  732. ParaValue.BottlePosSpeed.ToString();
  733. PlcSettingMessageBus.PlcMessageShowBindage.BottlePosPosition =
  734. ParaValue.BottlePosPosition.ToString();
  735. PlcSettingMessageBus.PlcMessageShowBindage.FillingValveOpenSpeed =
  736. ParaValue.FillingValveOpenSpeed.ToString();
  737. PlcSettingMessageBus.PlcMessageShowBindage.FillingValveOpenPosition =
  738. ParaValue.FillingValveOpenPosition.ToString();
  739. PlcSettingMessageBus.PlcMessageShowBindage.FillingValveCloseSpeed =
  740. ParaValue.FillingValveCloseSpeed.ToString();
  741. PlcSettingMessageBus.PlcMessageShowBindage.FillingValveClosePosition =
  742. ParaValue.FillingValveClosePosition.ToString();
  743. //PlcSettingMessageBus.PlcMessageShowBindage.FillingValveCacheSpeed =
  744. // ParaValue.FillingValveCacheSpeed.ToString();
  745. //PlcSettingMessageBus.PlcMessageShowBindage.FillingValveCachePosition =
  746. // ParaValue.FillingValueCachePosition.ToString();
  747. PlcSettingMessageBus.PlcMessageShowBindage.FillingValveJogSpeed =
  748. ParaValue.FillingValueJogSpeed.ToString();
  749. PlcSettingMessageBus.PlcMessageShowBindage.MachineDelayFunneDownTime =
  750. ParaValue.MachineDelayFunneDownTime;
  751. PlcSettingMessageBus.PlcMessageShowBindage.MachineDelayFunneUpTime =
  752. ParaValue.MachineDelayFunneUpTime;
  753. PlcSettingMessageBus.PlcMessageShowBindage.MachineDelayFillingValveOpenTime =
  754. ParaValue.MachineDelayFillingValveOpenTime;
  755. PlcSettingMessageBus.PlcMessageShowBindage.MachineDelayFillingValveCloseTime =
  756. ParaValue.MachineDelayFillingValveCloseTime;
  757. PlcSettingMessageBus.PlcMessageShowBindage.MachineDelayInBottleTime =
  758. ParaValue.MachineDelayInBottleTime;
  759. PlcSettingMessageBus.PlcMessageShowBindage.BottValueSet =
  760. ParaValue.BottValueSet;
  761. PlcSettingMessageBus.PlcMessageShowBindage.ValveDelytime =
  762. ParaValue.ValveDelytime;
  763. PlcSettingMessageBus.PlcMessageShowBindage.CacheShutdownValue =
  764. ParaValue.CacheShutdownValue;
  765. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable1_TestSpeed =
  766. // ParaValue.ShakeTable1_TestSpeed;
  767. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable2_TestSpeed =
  768. // ParaValue.ShakeTable2_TestSpeed;
  769. //PlcSettingMessageBus.PlcMessageShowBindage.ShakeTable3_TestSpeed =
  770. // ParaValue.ShakeTable3_TestSpeed;
  771. PlcSettingMessageBus.PlcMessageShowBindage.MissingDelaytime =
  772. ParaValue.MissingDelaytime;
  773. PlcSettingMessageBus.PlcMessageShowBindage.BottleJamDelaytime =
  774. ParaValue.BottleJamDelaytime;
  775. PlcSettingMessageBus.PlcMessageShowBindage.EliminateCylinderDelayTime =
  776. ParaValue.EliminateCylinderDelayTime;
  777. PlcSettingMessageBus.PlcMessageShowBindage.EliminateCylinderHoldingTime =
  778. ParaValue.EliminateCylinderHoldingTime;
  779. PlcSettingMessageBus.PlcMessageShowBindage.MaterialShortageStoppageDelayTime =
  780. ParaValue.MaterialShortageStoppageDelayTime;
  781. PlcSettingMessageBus.PlcMessageShowBindage.MissBottleRestart =
  782. ParaValue.MissBottleReSestart;
  783. PlcSettingMessageBus.PlcMessageShowBindage.BottleStopPassTime =
  784. ParaValue.BottleStopPassTime;
  785. PlcSettingMessageBus.PlcMessageShowBindage.BuzzerTime =
  786. ParaValue.BuzzerTime;
  787. PlcSettingMessageBus.PlcMessageShowBindage.CacheDecelerateProportion =
  788. ParaValue.CacheDecelerateProportion;
  789. }
  790. private void StartSystemRunTime()
  791. {
  792. string localDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
  793. string systemRunTimePath = Path.Combine(localDataPath, "CCDCount\\SystemRunTime.XML");
  794. if (File.Exists(systemRunTimePath))
  795. {
  796. var systemMessage = XmlStorage.DeserializeFromXml<SystemMessageConfigModel>(systemRunTimePath);
  797. InitRunTime = systemMessage.SystemRunTime;
  798. TimeSpan timeSpan = TimeSpan.FromTicks(InitRunTime);
  799. }
  800. SystemRunTime.Start();
  801. }
  802. private void StopSystemRunTime()
  803. {
  804. string localDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
  805. string systemruntimefoundPath = Path.Combine(localDataPath, "CCDCount");
  806. if (!Directory.Exists(systemruntimefoundPath))
  807. {
  808. Directory.CreateDirectory(systemruntimefoundPath);
  809. }
  810. string systemRunTimePath = Path.Combine(systemruntimefoundPath, "SystemRunTime.XML");
  811. SystemRunTime.Stop();
  812. long ticks = SystemRunTime.ElapsedTicks;
  813. XmlStorage.SerializeToXml(new SystemMessageConfigModel()
  814. {
  815. SystemRunTime = ticks + InitRunTime
  816. }, systemRunTimePath);
  817. }
  818. private void SetupFullScreen()
  819. {
  820. // 隐藏标题栏和边框
  821. this.WindowStyle = WindowStyle.None;
  822. // 禁止调整大小
  823. this.ResizeMode = ResizeMode.NoResize;
  824. // 设置为最顶层窗口
  825. //this.Topmost = true;
  826. // 最大化窗口
  827. this.WindowState = WindowState.Maximized;
  828. // 隐藏任务栏(可选)
  829. this.Top = 0;
  830. this.Left = 0;
  831. this.Width = SystemParameters.PrimaryScreenWidth;
  832. this.Height = SystemParameters.PrimaryScreenHeight;
  833. }
  834. private void MainWindowsShowPage(string PageName)
  835. {
  836. Page pageToNavigate = null;
  837. switch (PageName)
  838. {
  839. case "Main":
  840. pageToNavigate = new MainPage(); // 替换为你实际的页面类名
  841. break;
  842. case "History":
  843. pageToNavigate = new HistoryDataPage();
  844. break;
  845. case "Camera":
  846. pageToNavigate = new SettingPage();
  847. break;
  848. case "PLC":
  849. if (SystemAlarm.CheckAlarmStatic(AlarmMessageList.PLC连接中))
  850. {
  851. MessageBox.Show("PLC Connecting,Please Wait");
  852. return;
  853. }
  854. if (PlcSettingMessageBus.pLCManagement != null && PlcSettingMessageBus.pLCManagement.IsConnect)
  855. {
  856. pageToNavigate = new PlcSettingPage();
  857. //ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative);
  858. //ShowFrame.Navigate(ShowUri);
  859. }
  860. else
  861. {
  862. var MessageResult = MessageBox.Show("尚未连接PLC,是否重连", "重连确认", MessageBoxButton.YesNo);
  863. if (MessageResult == MessageBoxResult.Yes)
  864. {
  865. InitPlcManger();
  866. if (PlcSettingMessageBus.pLCManagement != null && PlcSettingMessageBus.pLCManagement.IsConnect)
  867. {
  868. pageToNavigate = new PlcSettingPage();
  869. //ShowUri = new Uri("WpfPage\\PlcSettingPage.xaml", UriKind.Relative);
  870. //ShowFrame.Navigate(ShowUri);
  871. }
  872. }
  873. }
  874. break;
  875. case "Error":
  876. pageToNavigate = new MessagePage();
  877. break;
  878. case "Audit":
  879. pageToNavigate = new AuditTrailPage();
  880. break;
  881. case "User":
  882. if (MessageBus.NowLoginUserMessage != null)
  883. {
  884. if (!MessageBus.NowLoginUserMessage.IsAdmin)
  885. {
  886. MessageBox.Show("权限不足");
  887. }
  888. else
  889. {
  890. pageToNavigate = new UserManagementPage();
  891. //ShowUri = new Uri("WpfPage\\UserManagementPage.xaml", UriKind.Relative);
  892. //ShowFrame.Navigate(ShowUri);
  893. }
  894. }
  895. else
  896. {
  897. MessageBox.Show("请先登录");
  898. }
  899. break;
  900. }
  901. if (pageToNavigate != null)
  902. {
  903. // 确保在主线程执行导航
  904. Dispatcher.Invoke(() =>
  905. {
  906. ShowFrame.Navigate(pageToNavigate);
  907. });
  908. }
  909. }
  910. #endregion
  911. }
  912. }