Management.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. using Cognex.VisionPro;
  2. using Cognex.VisionPro.ToolBlock;
  3. using MathNet.Numerics.LinearAlgebra;
  4. using MathNet.Numerics.RootFinding;
  5. using NPOI.SS.Formula.Functions;
  6. using NPOI.Util;
  7. using Opc.Ua;
  8. using OpenCvSharp;
  9. using OpenCvSharp.Flann;
  10. using Prism.Events;
  11. using Prism.Ioc;
  12. using Prism.Mvvm;
  13. using Prism.Regions;
  14. using Prism.Services.Dialogs;
  15. using System;
  16. using System.Collections;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.ComponentModel;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Net.Sockets;
  23. using System.Reflection.Metadata;
  24. using System.Security.Cryptography;
  25. using System.Text;
  26. using System.Threading;
  27. using System.Threading.Tasks;
  28. using System.Windows;
  29. using System.Windows.Documents;
  30. using System.Windows.Interop;
  31. using System.Windows.Media;
  32. using System.Windows.Media.Media3D;
  33. using Team.FFFeederService;
  34. using Team.FFFeederService.Interfaces;
  35. using TeamAAS_VP;
  36. using TeamAAS_VP.Core.PLCs;
  37. using TeamAAS_VP.Core.Robots;
  38. using TeamAAS_VP.Data;
  39. using TeamAAS_VP.Enums;
  40. using TeamAAS_VP.Events;
  41. using TeamAAS_VP.Interfaces;
  42. using TeamAAS_VP.Models;
  43. using TeamAAS_VP.Models.Calibration;
  44. using TeamAAS_VP.Models.Feeder;
  45. using TeamAAS_VP.Models.Product;
  46. using TeamAAS_VP.Resources.Languages;
  47. using TeamAAS_VP.Services;
  48. using TeamAAS_VP.ViewModels.Home;
  49. using TouchSocket.Core;
  50. using TouchSocket.Sockets;
  51. using static MaterialDesignThemes.Wpf.Theme.ToolBar;
  52. using static Org.BouncyCastle.Math.EC.ECCurve;
  53. namespace TeamAAS_VP.Core
  54. {
  55. public class Management : BindableBase
  56. {
  57. #region 字段
  58. IRegionManager _regionManager;
  59. IEventAggregator _eventAggregator;
  60. IContainerProvider _container;
  61. IConfigService _configService;
  62. IRobotService _robotService;
  63. ICameraService _cameraService;
  64. IFeederService _feederService;
  65. IPlcService _plcService;
  66. IProductService _productService;
  67. ICalibrationService _calibrationService;
  68. IRemoteCommandService _remoteCommandService;
  69. ISystemDatabaseService _systemDatabaseService;
  70. Timer yieldtimer;
  71. private DateTime StartTime = DateTime.Now;
  72. #endregion
  73. #region 属性
  74. private ObservableCollection<ShowRender> _Renders;
  75. /// <summary>
  76. /// 显示界面
  77. /// </summary>
  78. public ObservableCollection<ShowRender> Renders
  79. {
  80. get { return _Renders; }
  81. set { SetProperty(ref _Renders, value); }
  82. }
  83. private Dictionary<Guid, Thread> _plcTrigger = new Dictionary<Guid, Thread>();
  84. /// <summary>
  85. /// 当前plc触发监控
  86. /// </summary>
  87. public Dictionary<Guid, Thread> PlcTrigger { get => _plcTrigger; set => _plcTrigger = value; }
  88. private ProductModel _CurrentProduct;
  89. /// <summary>
  90. /// 当前产品
  91. /// </summary>
  92. public ProductModel CurrentProduct
  93. {
  94. get { return _CurrentProduct; }
  95. set { SetProperty(ref _CurrentProduct, value); }
  96. }
  97. public BgCommunicate BgCommunicate { get; private set; }
  98. public BgModbusTcpCommunicate BgModbusTcpCommunicate { get; private set; }
  99. private ObservableCollection<StatusInfo> _Status = new ObservableCollection<StatusInfo>();
  100. /// <summary>
  101. /// 状态栏集合
  102. /// </summary>
  103. public ObservableCollection<StatusInfo> Status
  104. {
  105. get { return _Status; }
  106. set { SetProperty(ref _Status, value); }
  107. }
  108. private Int64 _TotalQuantity;
  109. /// <summary>
  110. /// 总产量
  111. /// </summary>
  112. public Int64 TotalQuantity
  113. {
  114. get { return _TotalQuantity; }
  115. set { SetProperty(ref _TotalQuantity, value); }
  116. }
  117. private Int64 _TotalQuantityToday;
  118. /// <summary>
  119. /// 当天的总产量
  120. /// </summary>
  121. public Int64 TotalQuantityToday
  122. {
  123. get { return _TotalQuantityToday; }
  124. set { SetProperty(ref _TotalQuantityToday, value); }
  125. }
  126. private Int64 _CurrentUPH;
  127. /// <summary>
  128. /// 当前的UPH
  129. /// </summary>
  130. public Int64 CurrentUPH
  131. {
  132. get { return _CurrentUPH; }
  133. set { SetProperty(ref _CurrentUPH, value); }
  134. }
  135. public Dictionary<string, object> BackupObject { get; set; } = new Dictionary<string, object>();
  136. // tracker for running feeder clear tasks by task id
  137. public Dictionary<Guid, CancellationTokenSource> FeederClearTaskCts { get; } = new Dictionary<Guid, CancellationTokenSource>();
  138. #endregion
  139. #region 命令
  140. #endregion
  141. #region 事件
  142. #endregion
  143. public Management(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IConfigService configService,
  144. IRobotService robotService, ICameraService cameraService, IFeederService feederService, IPlcService plcService, IProductService productService,
  145. ICalibrationService calibrationService, IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService)
  146. {
  147. _regionManager = regionManager;
  148. _eventAggregator = ea;
  149. _container = container;
  150. _configService = configService;
  151. _robotService = robotService;
  152. _cameraService = cameraService;
  153. _feederService = feederService;
  154. _plcService = plcService;
  155. _calibrationService = calibrationService;
  156. yieldtimer = new Timer(DoYieldTime, null, 10000, 1000);
  157. Renders = new ObservableCollection<ShowRender>();
  158. _configService = configService;
  159. _productService = productService;
  160. _remoteCommandService = remoteCommandService;
  161. _systemDatabaseService = systemDatabaseService;
  162. }
  163. #region 初始化硬件模块
  164. /// <summary>
  165. /// 初始化Feeder
  166. /// </summary>
  167. /// <returns></returns>
  168. public async Task<(bool IsSucceed, string Msg)> InitFeeders()
  169. {
  170. var feeders = _configService.GetAllFeeders();
  171. StringBuilder sb = new StringBuilder();
  172. foreach (var item in feeders)
  173. {
  174. _feederService.CreateFeeder(item.Id, item.FeederNo, item.FeederName, item.IP, item.Port, item.FeederBrand);
  175. var feeder = _feederService.GetFeeder(item.Id);
  176. Status.Add(new StatusInfo(item.Id, item.FeederName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  177. try
  178. {
  179. feeder.FeederConnectionStatusChanged += Management_FeederConnectionStatusChanged;
  180. await feeder.ConnectAsync(); //连接Feeder
  181. //SendTaskMessage($"{item.FeederName}已连接!", MessageLevel.Debug);
  182. }
  183. catch (Exception ex)
  184. {
  185. sb.AppendLine($"{item.FeederName}:{Lang.断开连接}![{ex.Message}]");
  186. SendTaskMessage($"{item.FeederName}{Lang.断开连接}!", MessageLevel.Alarm);
  187. }
  188. }
  189. if (sb.Length == 0)
  190. {
  191. return (true, "");
  192. }
  193. else
  194. {
  195. return (false, sb.ToString());
  196. }
  197. }
  198. /// <summary>
  199. /// 初始化机器人
  200. /// </summary>
  201. /// <returns></returns>
  202. public async Task<(bool IsSucceed, string Msg)> InitRobots()
  203. {
  204. var robots = _configService.GetAllRobots();
  205. StringBuilder sb = new StringBuilder();
  206. foreach (var item in robots)
  207. {
  208. _robotService.CreateRobot(item.Id, item);
  209. try
  210. {
  211. Status.Add(new StatusInfo(item.Id, item.RobotName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  212. var robot = _robotService.GetRobot(item.Id);
  213. robot.ReceivedEvent += Management_ReceivedEvent;
  214. robot.SendEvent += Management_SendEvent;
  215. robot.ConnectedEvent += Management_ConnectedEvent;
  216. robot.DisconnectedEvent += Management_DisconnectedEvent;
  217. await robot.ConnectAsync(); //连接Robot
  218. SendTaskMessage($"{item.RobotName}{Lang.已连接}!", MessageLevel.Debug);
  219. }
  220. catch (Exception ex)
  221. {
  222. sb.AppendLine($"{item.RobotName}:{Lang.断开连接}![{ex.Message}]");
  223. SendTaskMessage($"{item.RobotName}{Lang.断开连接}!", MessageLevel.Alarm);
  224. }
  225. }
  226. if (sb.Length == 0)
  227. {
  228. return (true, "");
  229. }
  230. else
  231. {
  232. return (false, sb.ToString());
  233. }
  234. }
  235. /// <summary>
  236. /// 初始化PLC
  237. /// </summary>
  238. /// <returns></returns>
  239. public async Task<(bool IsSucceed, string Msg)> InitPlc()
  240. {
  241. var plcs = _configService.GetAllPlcs();
  242. StringBuilder sb = new StringBuilder();
  243. foreach (var item in plcs)
  244. {
  245. try
  246. {
  247. _plcService.CreatePlc(item.Id, item);
  248. var plc = _plcService.GetPlc(item.Id);
  249. Status.Add(new StatusInfo(item.Id, item.Name + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  250. plc.ConnectChangedEvent += Management_PlcConnectChangedEvent;
  251. await plc.ConnectAsync(); //连接PLC
  252. //SendTaskMessage($"{item.Name}{Lang.已连接}!", MessageLevel.Debug);
  253. }
  254. catch (Exception ex)
  255. {
  256. sb.AppendLine($"{item.Name}:{Lang.断开连接}![{ex.Message}]");
  257. SendTaskMessage($"{item.Name}{Lang.断开连接}!", MessageLevel.Alarm);
  258. }
  259. }
  260. if (sb.Length == 0)
  261. {
  262. return (true, "");
  263. }
  264. else
  265. {
  266. return (false, sb.ToString());
  267. }
  268. }
  269. /// <summary>
  270. /// 初始化相机
  271. /// </summary>
  272. /// <returns></returns>
  273. public async Task<(bool IsSucceed, string Msg)> InitCameras()
  274. {
  275. var cameras = _configService.GetAllCameras();
  276. StringBuilder sb = new StringBuilder();
  277. foreach (var item in cameras)
  278. {
  279. try
  280. {
  281. Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
  282. _cameraService.CreateCamera(item.Id, item);
  283. var camera = _cameraService.GetCamera(item.Id);
  284. Status.Add(new StatusInfo(item.Id, item.CameraName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  285. camera.CameraConnectChangedEvent += Management_CameraConnectChangedEvent;
  286. try
  287. {
  288. if (await camera.OpenDeviceAsync())
  289. {
  290. SendTaskMessage($"{item.CameraName}{Lang.已连接}!", MessageLevel.Debug);
  291. }
  292. else
  293. {
  294. SendTaskMessage($"{item.CameraName}{Lang.连接失败}!", MessageLevel.Alarm);
  295. sb.AppendLine($"{item.CameraName}:{Lang.连接失败}!");
  296. }
  297. }
  298. catch (Exception ex)
  299. {
  300. SendTaskMessage($"{item.CameraName}{ex.Message}!", MessageLevel.Alarm);
  301. sb.AppendLine($"{item.CameraName}:{ex.Message}!");
  302. }
  303. }
  304. catch (Exception ex)
  305. {
  306. SendTaskMessage($"{item.CameraName}{Lang.连接失败}!", MessageLevel.Alarm);
  307. sb.AppendLine($"{item.CameraName}:{Lang.连接失败}!:{ex.Message}");
  308. }
  309. }
  310. _container.Resolve<ShowVisionRenderViewModel>().Renders = Renders;
  311. if (sb.Length == 0)
  312. {
  313. return (true, "");
  314. }
  315. else
  316. {
  317. return (false, sb.ToString());
  318. }
  319. }
  320. /// <summary>
  321. /// 初始化后台TCP服务器通讯
  322. /// </summary>
  323. public void InitBgTcp()
  324. {
  325. var config = _configService.GetBgTcp();
  326. try
  327. {
  328. BgCommunicate = new BgCommunicate(config);
  329. BgCommunicate.ConnectedEvent += BgCommunicate_ConnectedEvent;
  330. BgCommunicate.DisconnectedEvent += BgCommunicate_DisconnectedEvent;
  331. BgCommunicate.ReceivedEvent += BgCommunicate_ReceivedEvent;
  332. BgCommunicate.SendEvent += BgCommunicate_SendEvent;
  333. BgCommunicate.StartListening();
  334. SendTaskMessage($"{Lang.已开启监听端口}:{config.Port}", MessageLevel.Debug);
  335. }
  336. catch (Exception ex)
  337. {
  338. SendTaskMessage($"{Lang.未开启监听端口}:{config.Port}", MessageLevel.Error);
  339. LogHelper.WriteLogError("开启后台服务器通讯时出错!", ex);
  340. }
  341. }
  342. /// <summary>
  343. /// 初始化后台ModbusTCP从站
  344. /// </summary>
  345. public void InitModbusTcp()
  346. {
  347. try
  348. {
  349. var config = _configService.GetBgModbusTcp();
  350. BgModbusTcpCommunicate = new BgModbusTcpCommunicate(config);
  351. if (config.IsEnabled)
  352. {
  353. BgModbusTcpCommunicate.Listen();
  354. SendTaskMessage($"Start Modbus Tcp Slave:{BgModbusTcpCommunicate.IP}:{BgModbusTcpCommunicate.Port}:{BgModbusTcpCommunicate.SlaveID}", MessageLevel.Debug);
  355. }
  356. }
  357. catch (Exception ex)
  358. {
  359. SendTaskMessage($"No Start Modbus Tcp Slave:{ex.Message}", MessageLevel.Alarm);
  360. LogHelper.WriteLogError("开启后台Modbus TCP通讯时出错!", ex);
  361. }
  362. }
  363. /// <summary>
  364. /// 初始化后台脚本
  365. /// </summary>
  366. public void InitBackgroundcript()
  367. {
  368. try
  369. {
  370. if (!Directory.Exists(FilePath.BackgroundScriptPath))
  371. {
  372. Directory.CreateDirectory(FilePath.BackgroundScriptPath);
  373. }
  374. try
  375. {
  376. string[] files = Directory.GetFiles(FilePath.BackgroundScriptPath);
  377. List<string> ScriptFilesCollection = new List<string>();
  378. foreach (string file in files)
  379. {
  380. string fileName = Path.GetFileName(file);
  381. string fileExtension = Path.GetExtension(file);
  382. if (fileExtension == ".cs")
  383. {
  384. ScriptFilesCollection.Add(file);
  385. }
  386. }
  387. foreach (var item in ScriptFilesCollection)
  388. {
  389. try
  390. {
  391. string script = FileHelper.ReadFile(item);
  392. SendTaskMessage($"{Lang.执行脚本}:{item}", MessageLevel.Info);
  393. Task.Factory.StartNew(() =>
  394. {
  395. ScriptHelper.ExecuteScriptingAsync(script, _regionManager, _eventAggregator, _container, rst =>
  396. {
  397. if (!rst.Item1)
  398. {
  399. foreach (var err in rst.Item2)
  400. {
  401. SendTaskMessage($"{Lang.后台脚本出错}:{err}", MessageLevel.Error);
  402. }
  403. }
  404. });
  405. });
  406. }
  407. catch (Exception ex)
  408. {
  409. LogHelper.WriteLogError($"开启脚本时出错:{item}", ex);
  410. }
  411. }
  412. }
  413. catch (Exception ex)
  414. {
  415. LogHelper.WriteLogError("读取本地脚本文件列表时出错", ex);
  416. }
  417. }
  418. catch (Exception ex)
  419. {
  420. LogHelper.WriteLogError("开启后台脚本时出错!", ex);
  421. }
  422. }
  423. #endregion
  424. #region 机器人指令执行
  425. public Dictionary<Guid, CancellationTokenSource> RobotTCPCollection = new Dictionary<Guid, CancellationTokenSource>();
  426. /// <summary>
  427. /// 机器人TCP接收
  428. /// </summary>
  429. /// <param name="arg1"></param>
  430. /// <param name="arg2"></param>
  431. /// <param name="arg3"></param>
  432. private async void Management_ReceivedEvent(Guid robotid, object arg2, TouchSocket.Sockets.ReceivedDataEventArgs e)
  433. {
  434. try
  435. {
  436. if (!RobotTCPCollection.ContainsKey(robotid))
  437. RobotTCPCollection.Add(robotid, new CancellationTokenSource());
  438. else
  439. {
  440. if (RobotTCPCollection[robotid].IsCancellationRequested)
  441. {
  442. RobotTCPCollection[robotid] = new CancellationTokenSource();
  443. }
  444. }
  445. var robot = await _robotService.GetRobotAsync(robotid);
  446. //从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。
  447. var buffer = e.ByteBlock.Span.ToString(robot.GetEncoding());
  448. SendTaskMessage($"{robot.Name}Received:{buffer}", MessageLevel.Info);
  449. var _ = _remoteCommandService.ExecuteAsync(buffer, RobotTCPCollection[robotid].Token, async msg =>
  450. {
  451. try
  452. {
  453. if (robot.ConnectType == TCPConnectType.Client)
  454. {
  455. if (robot.IsConnected)
  456. {
  457. await robot.SendAsync($"{msg}");
  458. }
  459. }
  460. else
  461. {
  462. var cient = (ITcpSessionClient)arg2;
  463. if (cient.Online)
  464. {
  465. await robot.SendAsync(cient, $"{msg}");
  466. }
  467. }
  468. }
  469. catch (Exception ex)
  470. {
  471. LogHelper.WriteLogError("TCP发送数据时出错!", ex);
  472. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  473. }
  474. });
  475. }
  476. catch (Exception ex)
  477. {
  478. LogHelper.WriteLogError("处理机器人接收的命令时出错!", ex);
  479. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  480. }
  481. }
  482. #endregion
  483. #region 机器人&Feeder&相机连接状态事件
  484. /// <summary>
  485. /// 机器人发送事件
  486. /// </summary>
  487. /// <param name="arg1"></param>
  488. /// <param name="arg2"></param>
  489. /// <param name="arg3"></param>
  490. /// <exception cref="NotImplementedException"></exception>
  491. private void Management_SendEvent(Guid robotid, object arg2, string arg3)
  492. {
  493. var r = _robotService.GetRobot(robotid);
  494. SendTaskMessage($"{r.Name}Send:{arg3}", MessageLevel.Info);
  495. }
  496. /// <summary>
  497. /// 机器人断开连接时
  498. /// </summary>
  499. /// <param name="arg1"></param>
  500. /// <param name="arg2"></param>
  501. /// <param name="arg3"></param>
  502. /// <exception cref="NotImplementedException"></exception>
  503. private void Management_DisconnectedEvent(Guid robotid, object arg2, ClosedEventArgs arg3)
  504. {
  505. if (RobotTCPCollection.ContainsKey(robotid))
  506. {
  507. RobotTCPCollection[robotid].Cancel();
  508. }
  509. var r = _configService.GetRobot(robotid);
  510. if (r.ConnectType == TCPConnectType.Server)
  511. {
  512. ITcpSessionClient socketClient = arg2 as ITcpSessionClient;
  513. SendTaskMessage($"{r.RobotName}[{socketClient.Id}:{socketClient.IP}]{Lang.断开连接}!", MessageLevel.Error);
  514. var robot = _robotService.GetRobot(robotid);
  515. if (robot.TcpService.Count < 1)
  516. {
  517. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  518. App.Current.Dispatcher.Invoke(new
  519. Action(() =>
  520. {
  521. sta.Message = $"{r.RobotName}{Lang.未连接}";
  522. sta.Background = new SolidColorBrush(Colors.Red);
  523. }));
  524. }
  525. }
  526. else
  527. {
  528. SendTaskMessage($"{r.RobotName}{Lang.断开连接}!", MessageLevel.Error);
  529. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  530. App.Current.Dispatcher.Invoke(new
  531. Action(() =>
  532. {
  533. sta.Message = $"{r.RobotName}{Lang.断开连接}";
  534. sta.Background = new SolidColorBrush(Colors.Red);
  535. }));
  536. }
  537. }
  538. /// <summary>
  539. /// 机器人连接成功时
  540. /// </summary>
  541. /// <param name="arg1"></param>
  542. /// <param name="arg2"></param>
  543. /// <param name="arg3"></param>
  544. /// <exception cref="NotImplementedException"></exception>
  545. private void Management_ConnectedEvent(Guid robotid, object arg2, ConnectedEventArgs arg3)
  546. {
  547. var r = _configService.GetRobot(robotid);
  548. if (r.ConnectType == TCPConnectType.Server)
  549. {
  550. ITcpSessionClient socketClient = arg2 as ITcpSessionClient;
  551. SendTaskMessage($"{r.RobotName}[{socketClient.Id}:{socketClient.IP}]{Lang.已连接}!", MessageLevel.Debug);
  552. var robot = _robotService.GetRobot(robotid);
  553. if (robot.TcpService.Count > 0)
  554. {
  555. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  556. App.Current.Dispatcher.Invoke(new
  557. Action(() =>
  558. {
  559. sta.Message = $"{r.RobotName}{Lang.已连接}";
  560. sta.Background = new SolidColorBrush(Colors.Green);
  561. }));
  562. }
  563. }
  564. else
  565. {
  566. SendTaskMessage($"{r.RobotName}{Lang.已连接}!", MessageLevel.Debug);
  567. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  568. App.Current.Dispatcher.Invoke(new
  569. Action(() =>
  570. {
  571. sta.Message = $"{r.RobotName}{Lang.已连接}";
  572. sta.Background = new SolidColorBrush(Colors.Green);
  573. }));
  574. }
  575. }
  576. /// <summary>
  577. /// Feeder连接状态改变时
  578. /// </summary>
  579. /// <param name="sender"></param>
  580. /// <param name="state"></param>
  581. private void Management_FeederConnectionStatusChanged(object sender, bool state)
  582. {
  583. IFeeder feeder = sender as IFeeder;
  584. var sta = Status.FirstOrDefault(s => s.ID == feeder.Id);
  585. if (state)
  586. {
  587. App.Current.Dispatcher.Invoke(new
  588. Action(() =>
  589. {
  590. sta.Message = $"{feeder.Name}{Lang.已连接}";
  591. sta.Background = new SolidColorBrush(Colors.Green);
  592. }));
  593. SendTaskMessage($"{feeder.Name}{Lang.已连接}!", MessageLevel.Debug);
  594. }
  595. else
  596. {
  597. App.Current.Dispatcher.Invoke(new
  598. Action(() =>
  599. {
  600. sta.Message = $"{feeder.Name}{Lang.未连接}";
  601. sta.Background = new SolidColorBrush(Colors.Red);
  602. }));
  603. SendTaskMessage($"{feeder.Name}{Lang.断开连接}!", MessageLevel.Error);
  604. }
  605. }
  606. /// <summary>
  607. /// 相机连接或者断开时
  608. /// </summary>
  609. /// <param name="id"></param>
  610. /// <param name="state"></param>
  611. private void Management_CameraConnectChangedEvent(Guid id, bool state)
  612. {
  613. var sta = Status.FirstOrDefault(s => s.ID == id);
  614. var camera = _configService.GetCamera(id);
  615. if (sta != null && camera != null)
  616. {
  617. if (state)
  618. {
  619. App.Current.Dispatcher.Invoke(new Action(() =>
  620. {
  621. sta.Message = $"{camera.CameraName}{Lang.已连接}";
  622. sta.Background = new SolidColorBrush(Colors.Green);
  623. }));
  624. }
  625. else
  626. {
  627. App.Current.Dispatcher.Invoke(new Action(() =>
  628. {
  629. sta.Message = $"{camera.CameraName}{Lang.断开连接}";
  630. sta.Background = new SolidColorBrush(Colors.Red);
  631. }));
  632. }
  633. }
  634. }
  635. /// <summary>
  636. /// PLC连接状态改变事件
  637. /// </summary>
  638. /// <param name="plc"></param>
  639. /// <param name="isconnected"></param>
  640. private void Management_PlcConnectChangedEvent(object sender, bool isconnected)
  641. {
  642. IPlc plc = sender as IPlc;
  643. var sta = Status.FirstOrDefault(s => s.ID == plc.Id);
  644. if (plc.IsConnected)
  645. {
  646. SendTaskMessage($"{plc.Name}{Lang.已连接}!", MessageLevel.Debug);
  647. if (sta == null) return;
  648. App.Current.Dispatcher.Invoke(new
  649. Action(() =>
  650. {
  651. sta.Message = $"{plc.Name}{Lang.已连接}";
  652. sta.Background = new SolidColorBrush(Colors.Green);
  653. }));
  654. }
  655. else
  656. {
  657. SendTaskMessage($"{plc.Name}{Lang.断开连接}!", MessageLevel.Error);
  658. if (sta == null) return;
  659. App.Current.Dispatcher.Invoke(new
  660. Action(() =>
  661. {
  662. sta.Message = $"{plc.Name}{Lang.未连接}";
  663. sta.Background = new SolidColorBrush(Colors.Red);
  664. }));
  665. }
  666. }
  667. #endregion
  668. #region 后台服务器通讯事件
  669. private void BgCommunicate_SendEvent(ITcpSessionClient client, string msg)
  670. {
  671. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}] Send To {Lang.客户端}[{client.Id}:{client.IP}]:{msg}", MessageLevel.Info);
  672. }
  673. public Dictionary<string, CancellationTokenSource> BgCommunicateollection = new Dictionary<string, CancellationTokenSource>();
  674. private async void BgCommunicate_ReceivedEvent(ITcpSessionClient client, string msg)
  675. {
  676. try
  677. {
  678. if (!BgCommunicateollection.ContainsKey(client.Id))
  679. {
  680. BgCommunicateollection.Add(client.Id, new CancellationTokenSource());
  681. }
  682. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]ReceiveFor{Lang.客户端}[{client.Id}:{client.IP}]:{msg}", MessageLevel.Info);
  683. var _ = _remoteCommandService.ExecuteAsync(msg, BgCommunicateollection[client.Id].Token, async response =>
  684. {
  685. try
  686. {
  687. if (!client.Online)
  688. {
  689. return;
  690. }
  691. await BgCommunicate.SendAsync(client, $"{response}");
  692. }
  693. catch (Exception ex)
  694. {
  695. LogHelper.WriteLogError("后台TCP发送数据时出错!", ex);
  696. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  697. }
  698. });
  699. }
  700. catch (Exception ex)
  701. {
  702. LogHelper.WriteLogError("处理后台服务器接收的命令时出错!", ex);
  703. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  704. }
  705. }
  706. private void BgCommunicate_DisconnectedEvent(ITcpSessionClient client, ClosedEventArgs e)
  707. {
  708. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]{Lang.客户端}[{client.Id}:{client.IP}]{Lang.断开连接}!", MessageLevel.Alarm);
  709. if (BgCommunicateollection.ContainsKey(client.Id))
  710. {
  711. BgCommunicateollection[client.Id].Cancel();
  712. }
  713. }
  714. private void BgCommunicate_ConnectedEvent(ITcpSessionClient client, ConnectedEventArgs e)
  715. {
  716. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]{Lang.客户端}[{client.Id}:{client.IP}]{Lang.连接成功}!", MessageLevel.Debug);
  717. }
  718. #endregion
  719. #region 方法
  720. private void SendTaskMessage(string msg, MessageLevel level)
  721. {
  722. _eventAggregator.GetEvent<TaskMessageNotification>().Publish(new Models.MessageStruct() { Message = msg, level = level });
  723. }
  724. private async void DoYieldTime(object state)
  725. {
  726. try
  727. {
  728. if (CurrentProduct == null) return;
  729. //获取当前产品
  730. var currentproduct = _productService.GetCurrentProduct();
  731. TotalQuantity = await _systemDatabaseService.GetOverallProductionAsync(CurrentProduct.Name);
  732. TotalQuantityToday = await _systemDatabaseService.GetTodayProductionAsync(CurrentProduct.Name);
  733. CurrentUPH = await _systemDatabaseService.GetLastHourProductionAsync(CurrentProduct.Name);
  734. }
  735. catch (Exception)
  736. {
  737. }
  738. }
  739. #region vm启动检测
  740. /// <summary>
  741. /// 杀死所有VM有关进程
  742. /// </summary>
  743. public void KillVMProcess()
  744. {
  745. KillProcess("VisionMasterServerApp");
  746. KillProcess("VisionMaster");
  747. KillProcess("VmModuleProxy.exe");
  748. KillProcess("vServerApp.exe");
  749. }
  750. /// <summary>
  751. /// 杀死指定进程名的进程
  752. /// </summary>
  753. /// <param name="strKillName"></param>
  754. public void KillProcess(string strKillName)
  755. {
  756. foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
  757. {
  758. if (p.ProcessName.Contains(strKillName))
  759. {
  760. try
  761. {
  762. p.Kill();
  763. p.WaitForExit();
  764. }
  765. catch (Exception ex)
  766. {
  767. LogHelper.WriteLogError($"杀死进程:{strKillName}时失败!", ex);
  768. }
  769. }
  770. }
  771. }
  772. #endregion
  773. #endregion
  774. }
  775. }