Management.cs 35 KB

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