Management.cs 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761
  1. using Basler.Pylon;
  2. using Cognex.VisionPro;
  3. using Cognex.VisionPro.ToolBlock;
  4. using CSScripting;
  5. using MathNet.Numerics.Distributions;
  6. using MathNet.Numerics.LinearAlgebra;
  7. using MathNet.Numerics.RootFinding;
  8. using NPOI.SS.Formula.Functions;
  9. using NPOI.Util;
  10. using Opc.Ua;
  11. using OpenCvSharp;
  12. using OpenCvSharp.Flann;
  13. using Prism.Events;
  14. using Prism.Ioc;
  15. using Prism.Mvvm;
  16. using Prism.Regions;
  17. using Prism.Services.Dialogs;
  18. using System;
  19. using System.Collections;
  20. using System.Collections.Generic;
  21. using System.Collections.ObjectModel;
  22. using System.ComponentModel;
  23. using System.Drawing;
  24. using System.IO;
  25. using System.Linq;
  26. using System.Net.Sockets;
  27. using System.Reflection.Metadata;
  28. using System.Security.Cryptography;
  29. using System.Text;
  30. using System.Threading;
  31. using System.Threading.Tasks;
  32. using System.Windows;
  33. using System.Windows.Documents;
  34. using System.Windows.Forms;
  35. using System.Windows.Interop;
  36. using System.Windows.Media;
  37. using System.Windows.Media.Media3D;
  38. using Team.FFFeederService;
  39. using Team.FFFeederService.Interfaces;
  40. using TeamAAS_VP;
  41. using TeamAAS_VP.Core.PLCs;
  42. using TeamAAS_VP.Core.Robots;
  43. using TeamAAS_VP.Core.ScrewDriver;
  44. using TeamAAS_VP.Data;
  45. using TeamAAS_VP.Enums;
  46. using TeamAAS_VP.Events;
  47. using TeamAAS_VP.Interfaces;
  48. using TeamAAS_VP.Models;
  49. using TeamAAS_VP.Models.Calibration;
  50. using TeamAAS_VP.Models.Feeder;
  51. using TeamAAS_VP.Models.Product;
  52. using TeamAAS_VP.Resources.Languages;
  53. using TeamAAS_VP.Services;
  54. using TeamAAS_VP.ViewModels.Home;
  55. using TouchSocket.Core;
  56. using TouchSocket.SerialPorts;
  57. using TouchSocket.Sockets;
  58. using static MaterialDesignThemes.Wpf.Theme.ToolBar;
  59. using static Org.BouncyCastle.Math.EC.ECCurve;
  60. using static System.Windows.Forms.AxHost;
  61. using Timer = System.Threading.Timer;
  62. namespace TeamAAS_VP.Core
  63. {
  64. public class Management : BindableBase
  65. {
  66. #region 字段
  67. IRegionManager _regionManager;
  68. IEventAggregator _eventAggregator;
  69. IContainerProvider _container;
  70. IConfigService _configService;
  71. IRobotService _robotService;
  72. ICameraService _cameraService;
  73. IFeederService _feederService;
  74. IPlcService _plcService;
  75. ILightManagerService _lightManagerService;
  76. IProductService _productService;
  77. ICalibrationService _calibrationService;
  78. IRemoteCommandService _remoteCommandService;
  79. ISystemDatabaseService _systemDatabaseService;
  80. Timer yieldtimer;
  81. private DateTime StartTime = DateTime.Now;
  82. SerialPortClient client;
  83. #endregion
  84. #region 属性
  85. private ObservableCollection<ShowRender> _Renders;
  86. /// <summary>
  87. /// 显示界面
  88. /// </summary>
  89. public ObservableCollection<ShowRender> Renders
  90. {
  91. get { return _Renders; }
  92. set { SetProperty(ref _Renders, value); }
  93. }
  94. private ProductModel _CurrentProduct;
  95. /// <summary>
  96. /// 当前产品
  97. /// </summary>
  98. public ProductModel CurrentProduct
  99. {
  100. get { return _CurrentProduct; }
  101. set { SetProperty(ref _CurrentProduct, value); }
  102. }
  103. public BgCommunicate BgCommunicate { get; private set; }
  104. public BgModbusTcpCommunicate BgModbusTcpCommunicate { get; private set; }
  105. private ObservableCollection<StatusInfo> _Status = new ObservableCollection<StatusInfo>();
  106. /// <summary>
  107. /// 状态栏集合
  108. /// </summary>
  109. public ObservableCollection<StatusInfo> Status
  110. {
  111. get { return _Status; }
  112. set { SetProperty(ref _Status, value); }
  113. }
  114. private Int64 _TotalQuantity;
  115. /// <summary>
  116. /// 总产量
  117. /// </summary>
  118. public Int64 TotalQuantity
  119. {
  120. get { return _TotalQuantity; }
  121. set { SetProperty(ref _TotalQuantity, value); }
  122. }
  123. private Int64 _TotalQuantityToday;
  124. /// <summary>
  125. /// 当天的总产量
  126. /// </summary>
  127. public Int64 TotalQuantityToday
  128. {
  129. get { return _TotalQuantityToday; }
  130. set { SetProperty(ref _TotalQuantityToday, value); }
  131. }
  132. private Int64 _CurrentUPH;
  133. /// <summary>
  134. /// 当前的UPH
  135. /// </summary>
  136. public Int64 CurrentUPH
  137. {
  138. get { return _CurrentUPH; }
  139. set { SetProperty(ref _CurrentUPH, value); }
  140. }
  141. private XYD_ScrewDriver _ScrewDriver;
  142. public XYD_ScrewDriver ScrewDriver
  143. {
  144. get { return _ScrewDriver; }
  145. set { SetProperty(ref _ScrewDriver, value); }
  146. }
  147. public Dictionary<string, object> BackupObject { get; set; } = new Dictionary<string, object>();
  148. private string _COM;
  149. /// <summary>
  150. /// 扭力测量仪COM
  151. /// </summary>
  152. public string COM
  153. {
  154. get { return _COM; }
  155. set { SetProperty(ref _COM, value); }
  156. }
  157. private string _SignalValue;
  158. /// <summary>
  159. /// 扭力测量仪获取的最大值
  160. /// </summary>
  161. public string SignalValue
  162. {
  163. get { return _SignalValue; }
  164. set { SetProperty(ref _SignalValue, value); }
  165. }
  166. private double _Value;
  167. /// <summary>
  168. /// 电批扭力值
  169. /// </summary>
  170. public double Value
  171. {
  172. get { return _Value; }
  173. set { SetProperty(ref _Value, value); }
  174. }
  175. private NumberStatistics _NumStatistics;
  176. /// <summary>
  177. /// 数量(批头、吸嘴、供料器)
  178. /// </summary>
  179. public NumberStatistics NumStatistics
  180. {
  181. get { return _NumStatistics; }
  182. set { SetProperty(ref _NumStatistics, value); }
  183. }
  184. #endregion
  185. #region 命令
  186. #endregion
  187. #region 事件
  188. #endregion
  189. public Management(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IConfigService configService,
  190. IRobotService robotService, ICameraService cameraService, IFeederService feederService, IPlcService plcService, IProductService productService,
  191. ICalibrationService calibrationService, IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService, ILightManagerService lightManagerService)
  192. {
  193. _regionManager = regionManager;
  194. _eventAggregator = ea;
  195. _container = container;
  196. _configService = configService;
  197. _robotService = robotService;
  198. _cameraService = cameraService;
  199. _feederService = feederService;
  200. _plcService = plcService;
  201. _calibrationService = calibrationService;
  202. yieldtimer = new Timer(DoYieldTime, null, 10000, 1000);
  203. Renders = new ObservableCollection<ShowRender>();
  204. _productService = productService;
  205. _remoteCommandService = remoteCommandService;
  206. _systemDatabaseService = systemDatabaseService;
  207. _lightManagerService = lightManagerService;
  208. }
  209. #region 读取配置参数
  210. public void ReadConfig()
  211. {
  212. ReadNumber();
  213. }
  214. /// <summary>
  215. /// 读取数量配置
  216. /// </summary>
  217. public void ReadNumber()
  218. {
  219. try
  220. {
  221. if (File.Exists(FilePath.NumberStatisticsPath))
  222. {
  223. NumStatistics = FileHelper.ReadJsonFile<NumberStatistics>(FilePath.NumberStatisticsPath);
  224. }
  225. else
  226. {
  227. NumStatistics = new NumberStatistics();
  228. FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
  229. }
  230. }
  231. catch (Exception ex)
  232. {
  233. NumStatistics = new NumberStatistics();
  234. LogHelper.WriteLogError("加载数量配置文件时出错!", ex);
  235. }
  236. }
  237. #endregion
  238. #region 初始化硬件模块
  239. /// <summary>
  240. /// 初始化Feeder
  241. /// </summary>
  242. /// <returns></returns>
  243. public async Task<(bool IsSucceed, string Msg)> InitFeeders()
  244. {
  245. var feeders = _configService.GetAllFeeders();
  246. StringBuilder sb = new StringBuilder();
  247. foreach (var item in feeders)
  248. {
  249. _feederService.CreateFeeder(item.Id, item.FeederNo, item.FeederName, item.IP, item.Port, item.FeederBrand);
  250. var feeder = _feederService.GetFeeder(item.Id);
  251. Status.Add(new StatusInfo(item.Id, item.FeederName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  252. try
  253. {
  254. feeder.FeederConnectionStatusChanged += Management_FeederConnectionStatusChanged;
  255. await feeder.ConnectAsync(); //连接Feeder
  256. //SendTaskMessage($"{item.FeederName}已连接!", MessageLevel.Debug);
  257. }
  258. catch (Exception ex)
  259. {
  260. sb.AppendLine($"{item.FeederName}:{Lang.断开连接}![{ex.Message}]");
  261. SendTaskMessage($"{item.FeederName}{Lang.断开连接}!", MessageLevel.Alarm);
  262. }
  263. }
  264. if (sb.Length == 0)
  265. {
  266. return (true, "");
  267. }
  268. else
  269. {
  270. return (false, sb.ToString());
  271. }
  272. }
  273. /// <summary>
  274. /// 初始化机器人
  275. /// </summary>
  276. /// <returns></returns>
  277. public async Task<(bool IsSucceed, string Msg)> InitRobots()
  278. {
  279. var robots = _configService.GetAllRobots();
  280. StringBuilder sb = new StringBuilder();
  281. foreach (var item in robots)
  282. {
  283. _robotService.CreateRobot(item.Id, item);
  284. try
  285. {
  286. Status.Add(new StatusInfo(item.Id, item.RobotName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  287. var robot = _robotService.GetRobot(item.Id);
  288. robot.ReceivedEvent += Management_ReceivedEvent;
  289. robot.SendEvent += Management_SendEvent;
  290. robot.ConnectedEvent += Management_ConnectedEvent;
  291. robot.DisconnectedEvent += Management_DisconnectedEvent;
  292. await robot.ConnectAsync(); //连接Robot
  293. SendTaskMessage($"{item.RobotName}{Lang.已连接}!", MessageLevel.Debug);
  294. }
  295. catch (Exception ex)
  296. {
  297. sb.AppendLine($"{item.RobotName}:{Lang.断开连接}![{ex.Message}]");
  298. SendTaskMessage($"{item.RobotName}{Lang.断开连接}!", MessageLevel.Alarm);
  299. }
  300. }
  301. if (sb.Length == 0)
  302. {
  303. return (true, "");
  304. }
  305. else
  306. {
  307. return (false, sb.ToString());
  308. }
  309. }
  310. /// <summary>
  311. /// 初始化PLC
  312. /// </summary>
  313. /// <returns></returns>
  314. public async Task<(bool IsSucceed, string Msg)> InitPlc()
  315. {
  316. var plcs = _configService.GetAllPlcs();
  317. StringBuilder sb = new StringBuilder();
  318. foreach (var item in plcs)
  319. {
  320. try
  321. {
  322. _plcService.CreatePlc(item.Id, item);
  323. var plc = _plcService.GetPlc(item.Id);
  324. Status.Add(new StatusInfo(item.Id, item.Name + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  325. plc.ConnectChangedEvent += Management_PlcConnectChangedEvent;
  326. await plc.ConnectAsync(); //连接PLC
  327. //SendTaskMessage($"{item.Name}{Lang.已连接}!", MessageLevel.Debug);
  328. }
  329. catch (Exception ex)
  330. {
  331. sb.AppendLine($"{item.Name}:{Lang.断开连接}![{ex.Message}]");
  332. SendTaskMessage($"{item.Name}{Lang.断开连接}!", MessageLevel.Alarm);
  333. }
  334. }
  335. try
  336. {
  337. await WriteSystemParameterToPlcAsync(_configService.GetSystemConfiguration());
  338. RegisterPlcMonitorAddress();
  339. }
  340. catch (Exception ex)
  341. {
  342. LogHelper.WriteLogError("为PLC写入系统参数和订阅变量时出错", ex);
  343. }
  344. if (sb.Length == 0)
  345. {
  346. return (true, "");
  347. }
  348. else
  349. {
  350. return (false, sb.ToString());
  351. }
  352. }
  353. /// <summary>
  354. /// 初始化相机
  355. /// </summary>
  356. /// <returns></returns>
  357. public async Task<(bool IsSucceed, string Msg)> InitCameras()
  358. {
  359. var cameras = _configService.GetAllCameras();
  360. StringBuilder sb = new StringBuilder();
  361. foreach (var item in cameras)
  362. {
  363. try
  364. {
  365. Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
  366. _cameraService.CreateCamera(item.Id, item);
  367. var camera = _cameraService.GetCamera(item.Id);
  368. Status.Add(new StatusInfo(item.Id, item.CameraName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
  369. camera.CameraConnectChangedEvent += Management_CameraConnectChangedEvent;
  370. try
  371. {
  372. if (await camera.OpenDeviceAsync())
  373. {
  374. SendTaskMessage($"{item.CameraName}{Lang.已连接}!", MessageLevel.Debug);
  375. }
  376. else
  377. {
  378. SendTaskMessage($"{item.CameraName}{Lang.连接失败}!", MessageLevel.Alarm);
  379. sb.AppendLine($"{item.CameraName}:{Lang.连接失败}!");
  380. }
  381. }
  382. catch (Exception ex)
  383. {
  384. SendTaskMessage($"{item.CameraName}{ex.Message}!", MessageLevel.Alarm);
  385. sb.AppendLine($"{item.CameraName}:{ex.Message}!");
  386. }
  387. }
  388. catch (Exception ex)
  389. {
  390. SendTaskMessage($"{item.CameraName}{Lang.连接失败}!", MessageLevel.Alarm);
  391. sb.AppendLine($"{item.CameraName}:{Lang.连接失败}!:{ex.Message}");
  392. }
  393. }
  394. _container.Resolve<ShowVisionRenderViewModel>().Renders = Renders;
  395. if (sb.Length == 0)
  396. {
  397. return (true, "");
  398. }
  399. else
  400. {
  401. return (false, sb.ToString());
  402. }
  403. }
  404. /// <summary>
  405. /// 初始化光源控制器
  406. /// </summary>
  407. /// <returns></returns>
  408. public async Task<(bool IsSucceed, string Msg)> InitLightControllers()
  409. {
  410. var lightcontrollers = _configService.GetAllLightControllers();
  411. StringBuilder sb = new StringBuilder();
  412. foreach (var item in lightcontrollers)
  413. {
  414. try
  415. {
  416. var lishtCtr = await _lightManagerService.RegisterControllerAsync(item.Id, item);
  417. //var lightcontroller = _cameraService.GetLightController(item.Id);
  418. //await lightcontroller.ConnectAsync(); //连接光源控制器
  419. //SendTaskMessage($"{item.LightControllerName}{Lang.已连接}!", MessageLevel.Debug);
  420. }
  421. catch (Exception ex)
  422. {
  423. //sb.AppendLine($"{item.LightControllerName}:{Lang.断开连接}![{ex.Message}]");
  424. //SendTaskMessage($"{item.LightControllerName}{Lang.断开连接}!", MessageLevel.Alarm);
  425. }
  426. }
  427. if (lightcontrollers.Count > 0)
  428. {
  429. var result = await _lightManagerService.ConnectAllAsync();
  430. if (result)
  431. {
  432. return (true, "");
  433. }
  434. else
  435. {
  436. return (false, "Light Controller Connect Failed!");
  437. }
  438. }
  439. return (true, "");
  440. //if (sb.Length == 0)
  441. //{
  442. // return (true, "");
  443. //}
  444. //else
  445. //{
  446. // return (false, sb.ToString());
  447. //}
  448. }
  449. /// <summary>
  450. /// 初始化后台TCP服务器通讯
  451. /// </summary>
  452. public void InitBgTcp()
  453. {
  454. var config = _configService.GetBgTcp();
  455. try
  456. {
  457. BgCommunicate = new BgCommunicate(config);
  458. BgCommunicate.ConnectedEvent += BgCommunicate_ConnectedEvent;
  459. BgCommunicate.DisconnectedEvent += BgCommunicate_DisconnectedEvent;
  460. BgCommunicate.ReceivedEvent += BgCommunicate_ReceivedEvent;
  461. BgCommunicate.SendEvent += BgCommunicate_SendEvent;
  462. BgCommunicate.StartListening();
  463. SendTaskMessage($"{Lang.已开启监听端口}:{config.Port}", MessageLevel.Debug);
  464. }
  465. catch (Exception ex)
  466. {
  467. SendTaskMessage($"{Lang.未开启监听端口}:{config.Port}", MessageLevel.Error);
  468. LogHelper.WriteLogError("开启后台服务器通讯时出错!", ex);
  469. }
  470. }
  471. /// <summary>
  472. /// 初始化后台ModbusTCP从站
  473. /// </summary>
  474. public void InitModbusTcp()
  475. {
  476. try
  477. {
  478. var config = _configService.GetBgModbusTcp();
  479. BgModbusTcpCommunicate = new BgModbusTcpCommunicate(config);
  480. if (config.IsEnabled)
  481. {
  482. BgModbusTcpCommunicate.Listen();
  483. SendTaskMessage($"Start Modbus Tcp Slave:{BgModbusTcpCommunicate.IP}:{BgModbusTcpCommunicate.Port}:{BgModbusTcpCommunicate.SlaveID}", MessageLevel.Debug);
  484. }
  485. }
  486. catch (Exception ex)
  487. {
  488. SendTaskMessage($"No Start Modbus Tcp Slave:{ex.Message}", MessageLevel.Alarm);
  489. LogHelper.WriteLogError("开启后台Modbus TCP通讯时出错!", ex);
  490. }
  491. }
  492. /// <summary>
  493. /// 初始化后台脚本
  494. /// </summary>
  495. public void InitBackgroundcript()
  496. {
  497. try
  498. {
  499. if (!Directory.Exists(FilePath.BackgroundScriptPath))
  500. {
  501. Directory.CreateDirectory(FilePath.BackgroundScriptPath);
  502. }
  503. try
  504. {
  505. string[] files = Directory.GetFiles(FilePath.BackgroundScriptPath);
  506. List<string> ScriptFilesCollection = new List<string>();
  507. foreach (string file in files)
  508. {
  509. string fileName = Path.GetFileName(file);
  510. string fileExtension = Path.GetExtension(file);
  511. if (fileExtension == ".cs")
  512. {
  513. ScriptFilesCollection.Add(file);
  514. }
  515. }
  516. foreach (var item in ScriptFilesCollection)
  517. {
  518. try
  519. {
  520. string script = FileHelper.ReadFile(item);
  521. SendTaskMessage($"{Lang.执行脚本}:{item}", MessageLevel.Info);
  522. Task.Factory.StartNew(() =>
  523. {
  524. ScriptHelper.ExecuteScriptingAsync(script, _regionManager, _eventAggregator, _container, rst =>
  525. {
  526. if (!rst.Item1)
  527. {
  528. foreach (var err in rst.Item2)
  529. {
  530. SendTaskMessage($"{Lang.后台脚本出错}:{err}", MessageLevel.Error);
  531. }
  532. }
  533. });
  534. });
  535. }
  536. catch (Exception ex)
  537. {
  538. LogHelper.WriteLogError($"开启脚本时出错:{item}", ex);
  539. }
  540. }
  541. }
  542. catch (Exception ex)
  543. {
  544. LogHelper.WriteLogError("读取本地脚本文件列表时出错", ex);
  545. }
  546. }
  547. catch (Exception ex)
  548. {
  549. LogHelper.WriteLogError("开启后台脚本时出错!", ex);
  550. }
  551. }
  552. /// <summary>
  553. /// 初始化电批
  554. /// </summary>
  555. /// <returns></returns>
  556. public async Task InitScrewDriver()
  557. {
  558. try
  559. {
  560. var screwDriverConfig = _configService.GetScrewDriverConfig();
  561. ScrewDriver = new XYD_ScrewDriver(screwDriverConfig.IPAdress, screwDriverConfig.Port);
  562. Status.Add(new StatusInfo(ScrewDriver.Id, "电批未连接", new SolidColorBrush(Colors.Red)));
  563. ScrewDriver.ConnectStateChangedEvent += ScrewDriver_ConnectStateChangedEvent;
  564. ScrewDriver.SendTimeout = screwDriverConfig.SendTimeout;
  565. screwDriverConfig.ReceiveTimeout = screwDriverConfig.ReceiveTimeout;
  566. var isConnected = await ScrewDriver.ConnectAsync();
  567. if (isConnected)
  568. {
  569. SendTaskMessage($"电批已连接", MessageLevel.Debug);
  570. }
  571. else
  572. {
  573. SendTaskMessage($"电批连接失败", MessageLevel.Error);
  574. }
  575. }
  576. catch (Exception ex)
  577. {
  578. SendTaskMessage($"电批连接失败:{ex.Message}", MessageLevel.Alarm);
  579. LogHelper.WriteLogError("连接电批时出错!", ex);
  580. }
  581. }
  582. /// <summary>
  583. /// 初始化扭力测量仪
  584. /// </summary>
  585. /// <returns></returns>
  586. public async Task InitSignal()
  587. {
  588. if (File.Exists(FilePath.SignalConfigPath))
  589. {
  590. try
  591. {
  592. var port = FileHelper.ReadJsonFile<string>(FilePath.SignalConfigPath);
  593. if (port != null)
  594. {
  595. client = new TouchSocket.SerialPorts.SerialPortClient();
  596. client.Connecting = (client1, e) => { return EasyTask.CompletedTask; };//即将连接到端口
  597. client.Connected = (client1, e) => { return EasyTask.CompletedTask; };//成功连接到端口
  598. client.Closing = (client1, e) => { return EasyTask.CompletedTask; };//即将从端口断开连接。此处仅主动断开才有效。
  599. client.Closed = (client1, e) => { return EasyTask.CompletedTask; };//从端口断开连接,当连接不成功时不会触发。
  600. client.Received = async (c, e) =>
  601. {
  602. //await Console.Out.WriteLineAsync(Encoding.UTF8.GetString(e.ByteBlock.Buffer));
  603. await Console.Out.WriteLineAsync(e.ByteBlock.Span.ToString(Encoding.ASCII));
  604. };
  605. client.Received = Sp_DataReceived;
  606. await client.SetupAsync(new TouchSocketConfig()
  607. .SetSerialPortOption(new SerialPortOption()
  608. {
  609. BaudRate = 115200,//波特率
  610. DataBits = 8,//数据位
  611. Parity = System.IO.Ports.Parity.None,//校验位
  612. PortName = port,//COM
  613. StopBits = System.IO.Ports.StopBits.One//停止位
  614. })
  615. .SetSerialDataHandlingAdapter(() => new PeriodPackageAdapter() { CacheTimeout = TimeSpan.FromMilliseconds(100) })
  616. );
  617. await client.ConnectAsync();
  618. }
  619. }
  620. catch (Exception ex)
  621. {
  622. LogHelper.WriteLogError("初始化扭力测量仪时出错!", ex);
  623. SendTaskMessage("初始化扭力测量仪时出错!"+ex.Message, MessageLevel.Error);
  624. }
  625. }
  626. else
  627. {
  628. COM = "COM1";
  629. FileHelper.WriteJsonFile(COM, FilePath.SignalConfigPath);
  630. }
  631. }
  632. #endregion
  633. #region 机器人指令执行
  634. public Dictionary<Guid, CancellationTokenSource> RobotTCPCollection = new Dictionary<Guid, CancellationTokenSource>();
  635. /// <summary>
  636. /// 机器人TCP接收
  637. /// </summary>
  638. /// <param name="arg1"></param>
  639. /// <param name="arg2"></param>
  640. /// <param name="arg3"></param>
  641. private async void Management_ReceivedEvent(Guid robotid, object arg2, TouchSocket.Sockets.ReceivedDataEventArgs e)
  642. {
  643. try
  644. {
  645. if (!RobotTCPCollection.ContainsKey(robotid))
  646. RobotTCPCollection.Add(robotid, new CancellationTokenSource());
  647. else
  648. {
  649. if (RobotTCPCollection[robotid].IsCancellationRequested)
  650. {
  651. RobotTCPCollection[robotid] = new CancellationTokenSource();
  652. }
  653. }
  654. var robot = await _robotService.GetRobotAsync(robotid);
  655. //从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。
  656. var buffer = e.ByteBlock.Span.ToString(robot.GetEncoding());
  657. SendTaskMessage($"{robot.Name}Received:{buffer}", MessageLevel.Info);
  658. var _ = _remoteCommandService.ExecuteAsync(buffer, RobotTCPCollection[robotid].Token, async msg =>
  659. {
  660. try
  661. {
  662. if (robot.ConnectType == TCPConnectType.Client)
  663. {
  664. if (robot.IsConnected)
  665. {
  666. await robot.SendAsync($"{msg}");
  667. }
  668. }
  669. else
  670. {
  671. var cient = (ITcpSessionClient)arg2;
  672. if (cient.Online)
  673. {
  674. await robot.SendAsync(cient, $"{msg}");
  675. }
  676. }
  677. }
  678. catch (Exception ex)
  679. {
  680. LogHelper.WriteLogError("TCP发送数据时出错!", ex);
  681. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  682. }
  683. });
  684. }
  685. catch (Exception ex)
  686. {
  687. LogHelper.WriteLogError("处理机器人接收的命令时出错!", ex);
  688. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  689. }
  690. }
  691. #endregion
  692. #region 机器人&Feeder&相机连接状态事件
  693. /// <summary>
  694. /// 机器人发送事件
  695. /// </summary>
  696. /// <param name="arg1"></param>
  697. /// <param name="arg2"></param>
  698. /// <param name="arg3"></param>
  699. /// <exception cref="NotImplementedException"></exception>
  700. private void Management_SendEvent(Guid robotid, object arg2, string arg3)
  701. {
  702. var r = _robotService.GetRobot(robotid);
  703. SendTaskMessage($"{r.Name}Send:{arg3}", MessageLevel.Info);
  704. }
  705. /// <summary>
  706. /// 机器人断开连接时
  707. /// </summary>
  708. /// <param name="arg1"></param>
  709. /// <param name="arg2"></param>
  710. /// <param name="arg3"></param>
  711. /// <exception cref="NotImplementedException"></exception>
  712. private void Management_DisconnectedEvent(Guid robotid, object arg2, ClosedEventArgs arg3)
  713. {
  714. if (RobotTCPCollection.ContainsKey(robotid))
  715. {
  716. RobotTCPCollection[robotid].Cancel();
  717. }
  718. var r = _configService.GetRobot(robotid);
  719. if (r.ConnectType == TCPConnectType.Server)
  720. {
  721. ITcpSessionClient socketClient = arg2 as ITcpSessionClient;
  722. SendTaskMessage($"{r.RobotName}[{socketClient.Id}:{socketClient.IP}]{Lang.断开连接}!", MessageLevel.Error);
  723. var robot = _robotService.GetRobot(robotid);
  724. if (robot.TcpService.Count < 1)
  725. {
  726. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  727. App.Current.Dispatcher.Invoke(new
  728. Action(() =>
  729. {
  730. sta.Message = $"{r.RobotName}{Lang.未连接}";
  731. sta.Background = new SolidColorBrush(Colors.Red);
  732. }));
  733. }
  734. }
  735. else
  736. {
  737. SendTaskMessage($"{r.RobotName}{Lang.断开连接}!", MessageLevel.Error);
  738. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  739. App.Current.Dispatcher.Invoke(new
  740. Action(() =>
  741. {
  742. sta.Message = $"{r.RobotName}{Lang.断开连接}";
  743. sta.Background = new SolidColorBrush(Colors.Red);
  744. }));
  745. }
  746. }
  747. /// <summary>
  748. /// 机器人连接成功时
  749. /// </summary>
  750. /// <param name="arg1"></param>
  751. /// <param name="arg2"></param>
  752. /// <param name="arg3"></param>
  753. /// <exception cref="NotImplementedException"></exception>
  754. private void Management_ConnectedEvent(Guid robotid, object arg2, ConnectedEventArgs arg3)
  755. {
  756. var r = _configService.GetRobot(robotid);
  757. if (r.ConnectType == TCPConnectType.Server)
  758. {
  759. ITcpSessionClient socketClient = arg2 as ITcpSessionClient;
  760. SendTaskMessage($"{r.RobotName}[{socketClient.Id}:{socketClient.IP}]{Lang.已连接}!", MessageLevel.Debug);
  761. var robot = _robotService.GetRobot(robotid);
  762. if (robot.TcpService.Count > 0)
  763. {
  764. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  765. App.Current.Dispatcher.Invoke(new
  766. Action(() =>
  767. {
  768. sta.Message = $"{r.RobotName}{Lang.已连接}";
  769. sta.Background = new SolidColorBrush(Colors.Green);
  770. }));
  771. }
  772. }
  773. else
  774. {
  775. SendTaskMessage($"{r.RobotName}{Lang.已连接}!", MessageLevel.Debug);
  776. var sta = Status.FirstOrDefault(s => s.ID == robotid);
  777. App.Current.Dispatcher.Invoke(new
  778. Action(() =>
  779. {
  780. sta.Message = $"{r.RobotName}{Lang.已连接}";
  781. sta.Background = new SolidColorBrush(Colors.Green);
  782. }));
  783. }
  784. }
  785. /// <summary>
  786. /// Feeder连接状态改变时
  787. /// </summary>
  788. /// <param name="sender"></param>
  789. /// <param name="state"></param>
  790. private void Management_FeederConnectionStatusChanged(object sender, bool state)
  791. {
  792. IFeeder feeder = sender as IFeeder;
  793. var sta = Status.FirstOrDefault(s => s.ID == feeder.Id);
  794. if (state)
  795. {
  796. App.Current.Dispatcher.Invoke(new
  797. Action(() =>
  798. {
  799. sta.Message = $"{feeder.Name}{Lang.已连接}";
  800. sta.Background = new SolidColorBrush(Colors.Green);
  801. }));
  802. SendTaskMessage($"{feeder.Name}{Lang.已连接}!", MessageLevel.Debug);
  803. }
  804. else
  805. {
  806. App.Current.Dispatcher.Invoke(new
  807. Action(() =>
  808. {
  809. sta.Message = $"{feeder.Name}{Lang.未连接}";
  810. sta.Background = new SolidColorBrush(Colors.Red);
  811. }));
  812. SendTaskMessage($"{feeder.Name}{Lang.断开连接}!", MessageLevel.Error);
  813. }
  814. }
  815. /// <summary>
  816. /// 相机连接或者断开时
  817. /// </summary>
  818. /// <param name="id"></param>
  819. /// <param name="state"></param>
  820. private void Management_CameraConnectChangedEvent(Guid id, bool state)
  821. {
  822. var sta = Status.FirstOrDefault(s => s.ID == id);
  823. var camera = _configService.GetCamera(id);
  824. if (sta != null && camera != null)
  825. {
  826. if (state)
  827. {
  828. App.Current.Dispatcher.Invoke(new Action(() =>
  829. {
  830. sta.Message = $"{camera.CameraName}{Lang.已连接}";
  831. sta.Background = new SolidColorBrush(Colors.Green);
  832. }));
  833. }
  834. else
  835. {
  836. App.Current.Dispatcher.Invoke(new Action(() =>
  837. {
  838. sta.Message = $"{camera.CameraName}{Lang.断开连接}";
  839. sta.Background = new SolidColorBrush(Colors.Red);
  840. }));
  841. }
  842. }
  843. }
  844. /// <summary>
  845. /// PLC连接状态改变事件
  846. /// </summary>
  847. /// <param name="plc"></param>
  848. /// <param name="isconnected"></param>
  849. private void Management_PlcConnectChangedEvent(object sender, bool isconnected)
  850. {
  851. IPlc plc = sender as IPlc;
  852. var sta = Status.FirstOrDefault(s => s.ID == plc.Id);
  853. if (plc.IsConnected)
  854. {
  855. SendTaskMessage($"{plc.Name}{Lang.已连接}!", MessageLevel.Debug);
  856. if (sta == null) return;
  857. App.Current.Dispatcher.Invoke(new
  858. Action(() =>
  859. {
  860. sta.Message = $"{plc.Name}{Lang.已连接}";
  861. sta.Background = new SolidColorBrush(Colors.Green);
  862. }));
  863. }
  864. else
  865. {
  866. SendTaskMessage($"{plc.Name}{Lang.断开连接}!", MessageLevel.Error);
  867. if (sta == null) return;
  868. App.Current.Dispatcher.Invoke(new
  869. Action(() =>
  870. {
  871. sta.Message = $"{plc.Name}{Lang.未连接}";
  872. sta.Background = new SolidColorBrush(Colors.Red);
  873. }));
  874. }
  875. }
  876. /// <summary>
  877. /// 电批连接状态改变时
  878. /// </summary>
  879. /// <param name="screwDevice"></param>
  880. /// <param name="state"></param>
  881. private void ScrewDriver_ConnectStateChangedEvent(object screwDevice, bool state)
  882. {
  883. try
  884. {
  885. XYD_ScrewDriver screwDriver = screwDevice as XYD_ScrewDriver;
  886. if (state)
  887. {
  888. SendTaskMessage($"电批{Lang.已连接}!", MessageLevel.Debug);
  889. var sta = Status.FirstOrDefault(s => s.ID == screwDriver.Id);
  890. App.Current.Dispatcher.Invoke(new
  891. Action(() =>
  892. {
  893. sta.Message = $"电批{Lang.已连接}";
  894. sta.Background = new SolidColorBrush(Colors.Green);
  895. }));
  896. }
  897. else
  898. {
  899. SendTaskMessage($"电批{Lang.未连接}!", MessageLevel.Error);
  900. var sta = Status.FirstOrDefault(s => s.ID == screwDriver.Id);
  901. App.Current.Dispatcher.Invoke(new
  902. Action(() =>
  903. {
  904. sta.Message = $"电批{Lang.未连接}";
  905. sta.Background = new SolidColorBrush(Colors.Red);
  906. }));
  907. }
  908. }
  909. catch (Exception ex)
  910. {
  911. LogHelper.WriteLogError("电批连接状态改变时出错了", ex);
  912. }
  913. }
  914. #endregion
  915. #region 后台服务器通讯事件
  916. private void BgCommunicate_SendEvent(ITcpSessionClient client, string msg)
  917. {
  918. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}] Send To {Lang.客户端}[{client.Id}:{client.IP}]:{msg}", MessageLevel.Info);
  919. }
  920. public Dictionary<string, CancellationTokenSource> BgCommunicateollection = new Dictionary<string, CancellationTokenSource>();
  921. private async void BgCommunicate_ReceivedEvent(ITcpSessionClient client, string msg)
  922. {
  923. try
  924. {
  925. if (!BgCommunicateollection.ContainsKey(client.Id))
  926. {
  927. BgCommunicateollection.Add(client.Id, new CancellationTokenSource());
  928. }
  929. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]ReceiveFor{Lang.客户端}[{client.Id}:{client.IP}]:{msg}", MessageLevel.Info);
  930. var _ = _remoteCommandService.ExecuteAsync(msg, BgCommunicateollection[client.Id].Token, async response =>
  931. {
  932. try
  933. {
  934. if (!client.Online)
  935. {
  936. return;
  937. }
  938. await BgCommunicate.SendAsync(client, $"{response}");
  939. }
  940. catch (Exception ex)
  941. {
  942. LogHelper.WriteLogError("后台TCP发送数据时出错!", ex);
  943. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  944. }
  945. });
  946. }
  947. catch (Exception ex)
  948. {
  949. LogHelper.WriteLogError("处理后台服务器接收的命令时出错!", ex);
  950. SendTaskMessage(ex.Message, MessageLevel.Alarm);
  951. }
  952. }
  953. private void BgCommunicate_DisconnectedEvent(ITcpSessionClient client, ClosedEventArgs e)
  954. {
  955. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]{Lang.客户端}[{client.Id}:{client.IP}]{Lang.断开连接}!", MessageLevel.Alarm);
  956. if (BgCommunicateollection.ContainsKey(client.Id))
  957. {
  958. BgCommunicateollection[client.Id].Cancel();
  959. }
  960. }
  961. private void BgCommunicate_ConnectedEvent(ITcpSessionClient client, ConnectedEventArgs e)
  962. {
  963. SendTaskMessage($"{Lang.服务器}[{client.ServicePort}]{Lang.客户端}[{client.Id}:{client.IP}]{Lang.连接成功}!", MessageLevel.Debug);
  964. }
  965. /// <summary>
  966. /// 扭力测量仪接收信息
  967. /// </summary>
  968. /// <param name="client"></param>
  969. /// <param name="e"></param>
  970. /// <returns></returns>
  971. private async Task Sp_DataReceived(ISerialPortClient client, ReceivedDataEventArgs e)
  972. {
  973. try
  974. {
  975. string poname = client.MainSerialPort.PortName;
  976. string data = e.ByteBlock.Span.ToString(Encoding.ASCII);
  977. await Console.Out.WriteLineAsync(data);
  978. string response = data.Split('\r')[0];
  979. SendTaskMessage($"{poname}Receive:{response}", MessageLevel.Info);
  980. SignalValue = response;
  981. }
  982. catch (Exception ex)
  983. {
  984. LogHelper.WriteLogError("扭力测量仪接收信息时出错!", ex);
  985. SendTaskMessage("扭力测量仪接收信息时出错!" + ex.Message, MessageLevel.Error);
  986. Thread.Sleep(50);
  987. }
  988. }
  989. #endregion
  990. #region PLC
  991. /// <summary>
  992. /// 将系统参数写入PLC
  993. /// </summary>
  994. /// <param name="systemConfiguration"></param>
  995. /// <returns></returns>
  996. public async Task WriteSystemParameterToPlcAsync(SystemConfiguration systemConfiguration)
  997. {
  998. var addressConfig = _configService.GetPlcAddresses();
  999. var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
  1000. if (plc == null || !plc.IsConnected) return;
  1001. Dictionary<string, object> nodeValues = new Dictionary<string, object>();
  1002. nodeValues.Add(addressConfig.Out_WorkMode.Address, (Int16)systemConfiguration.WorkMode);
  1003. nodeValues.Add(addressConfig.Out_PickPointNum.Address, (Int16)systemConfiguration.PickPointNum);
  1004. nodeValues.Add(addressConfig.Out_DowmCameraNum.Address, (Int16)systemConfiguration.DowmCameraNum);
  1005. nodeValues.Add(addressConfig.Out_UpCameraPickNum.Address, (Int16)systemConfiguration.UpCameraPickNum);
  1006. nodeValues.Add(addressConfig.Out_UpCameraPutNum.Address, (Int16)systemConfiguration.UpCameraPutNum);
  1007. nodeValues.Add(addressConfig.Out_UPCameracheckNum.Address, (Int16)systemConfiguration.UPCameracheckNum);
  1008. nodeValues.Add(addressConfig.Out_FixedCameraPickNum.Address, (Int16)systemConfiguration.FixedCameraPickNum);
  1009. nodeValues.Add(addressConfig.Out_FixedCameraPutNum.Address, (Int16)systemConfiguration.FixedCameraPutNum);
  1010. nodeValues.Add(addressConfig.Out_FixedCameracheckNum.Address, (Int16)systemConfiguration.FixedCameracheckNum);
  1011. nodeValues.Add(addressConfig.Out_ScrewTeachNum.Address, (Int16)systemConfiguration.ScrewTeachNum);
  1012. var res = await plc.WriteNodesAsync(nodeValues);
  1013. }
  1014. /// <summary>
  1015. /// 注册需要监控的PLC地址
  1016. /// </summary>
  1017. public void RegisterPlcMonitorAddress()
  1018. {
  1019. var addressConfig = _configService.GetPlcAddresses();
  1020. var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
  1021. if (plc == null || !plc.IsConnected) return;
  1022. //PLC地址数组
  1023. List<string> monitorNodeIds = new List<string>()
  1024. {
  1025. addressConfig.In_DowmCameraExe.Address,
  1026. addressConfig.In_UpCameraPickExe.Address,
  1027. addressConfig.In_UpCameraPutExe.Address,
  1028. addressConfig.In_UPCameracheckExe.Address,
  1029. addressConfig.In_FixedCameraPickExe.Address,
  1030. addressConfig.In_FixedCameraPutExe.Address,
  1031. addressConfig.In_FixedCameracheckExe.Address,
  1032. addressConfig.In_WorkStart.Address,
  1033. addressConfig.In_WorkDone.Address,
  1034. addressConfig.In_MesCheck.Address,
  1035. addressConfig.In_RequestPosition.Address,
  1036. addressConfig.In_ScrewTeachExe.Address,
  1037. addressConfig.In_PickINC.Address,
  1038. };
  1039. //订阅PLC地址变化
  1040. plc.SubscribeNodes("AutoSensor", monitorNodeIds, PlcCommandTrigger);
  1041. }
  1042. /// <summary>
  1043. /// 写入点位信息给PLC
  1044. /// </summary>
  1045. /// <returns></returns>
  1046. public async Task WritePositionToPlcAsync()
  1047. {
  1048. var addressConfig = _configService.GetPlcAddresses();
  1049. var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
  1050. if (plc == null || !plc.IsConnected) return;
  1051. var current = _productService.GetCurrentProduct();
  1052. if (current == null) return;
  1053. if (current.PickCameraPoints != null && current.PickCameraPoints.Count > 0)
  1054. {
  1055. foreach (var item in current.PickCameraPoints)
  1056. {
  1057. await item.WriteToPlcAddress(addressConfig.Out_PickCamera, plc);
  1058. }
  1059. }
  1060. if (current.PickPoints != null && current.PickPoints.Count > 0)
  1061. {
  1062. foreach (var item in current.PickPoints)
  1063. {
  1064. await item.WriteToPlcAddress(addressConfig.Out_Pick, plc);
  1065. }
  1066. }
  1067. if (current.SecPosCameraPoints != null && current.SecPosCameraPoints.Count > 0)
  1068. {
  1069. foreach (var item in current.SecPosCameraPoints)
  1070. {
  1071. await item.WriteToPlcAddress(addressConfig.Out_SecPosCamera, plc);
  1072. }
  1073. }
  1074. if (current.ScrewCameraPoints != null && current.ScrewCameraPoints.Count > 0)
  1075. {
  1076. foreach (var item in current.ScrewCameraPoints)
  1077. {
  1078. await item.WriteToPlcAddress(addressConfig.Out_ScrewCamera, plc);
  1079. }
  1080. }
  1081. if (current.ScrewPoints != null && current.ScrewPoints.Count > 0)
  1082. {
  1083. foreach (var item in current.ScrewPoints)
  1084. {
  1085. await item.WriteToPlcAddressEx(addressConfig.Out_Screw, plc);
  1086. }
  1087. await plc.WriteNodeAsync(addressConfig.Out_WorkNum.Address, (Int16)current.ScrewPoints.Count);
  1088. }
  1089. if (current.CheckCameraPoints != null && current.CheckCameraPoints.Count > 0)
  1090. {
  1091. foreach (var item in current.CheckCameraPoints)
  1092. {
  1093. await item.WriteToPlcAddress(addressConfig.Out_CheckCamera, plc);
  1094. }
  1095. }
  1096. }
  1097. PointF[] DowmCameraResults = new PointF[10];
  1098. PointF[] UpCameraPutResults = new PointF[10];
  1099. /// <summary>
  1100. /// PLC命令触发时
  1101. /// </summary>
  1102. /// <param name="tuple"></param>
  1103. private async void PlcCommandTrigger((string key, string nodeId, object value) tuple)
  1104. {
  1105. try
  1106. {
  1107. if (tuple.key != "AutoSensor")
  1108. {
  1109. return;
  1110. }
  1111. var addressConfig = _configService.GetPlcAddresses();
  1112. var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
  1113. if (plc == null || !plc.IsConnected) return;
  1114. // 获取当前产品
  1115. var currentProduct = _productService.GetCurrentProduct();
  1116. if (currentProduct == null)
  1117. {
  1118. return;
  1119. }
  1120. //获取产品编码
  1121. _productService.CurrentProductCode = plc.ReadNode<string>(addressConfig.In_Code.Address);
  1122. //如果产品编码为空,则以当前的时间戳作为编码
  1123. if (string.IsNullOrEmpty(_productService.CurrentProductCode))
  1124. {
  1125. _productService.CurrentProductCode = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  1126. }
  1127. // 触发下相机拍照
  1128. if (addressConfig.In_DowmCameraExe.Address.Contains(tuple.nodeId))
  1129. {
  1130. if (tuple.value is bool state)
  1131. {
  1132. if (state)
  1133. {
  1134. SendTaskMessage($"触发下相机拍照...", MessageLevel.Debug);
  1135. //相机的编号
  1136. Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_DowmCameraNum.Address);
  1137. SendTaskMessage($"编号:{cameraIndex}", MessageLevel.Info);
  1138. // 获取流程
  1139. var process = _productService.GetCurrentProductProcedureModelById(currentProduct.FixedUpCamera1ProcedureId);
  1140. if (process == null)
  1141. {
  1142. SendTaskMessage($"固定向上相机1视觉流程,流程ID:{currentProduct.FixedUpCamera1ProcedureId}", MessageLevel.Alarm);
  1143. await plc.WriteNodeAsync(addressConfig.Out_DownCameraStatus.Address, (Int16)2);
  1144. return;
  1145. }
  1146. // 获取机器人当前坐标
  1147. var robot = _robotService.GetAllRobots().FirstOrDefault();
  1148. if (robot == null)
  1149. {
  1150. SendTaskMessage($"未找到机器人,无法执行上相机锁附/组装拍照视觉任务", MessageLevel.Alarm);
  1151. await plc.WriteNodeAsync(addressConfig.Out_DownCameraStatus.Address, (Int16)2);
  1152. return;
  1153. }
  1154. var currentPosition = robot.GetRobotPos();
  1155. // 执行视觉任务
  1156. var _cts = new CancellationTokenSource();
  1157. var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(process, null, null, _cts.Token);
  1158. if (visionResult.IsSucceed)
  1159. {
  1160. //披头偏差
  1161. float offsetX = (float)(visionResult.X - currentPosition.X);
  1162. float offsetY = (float)(visionResult.Y - currentPosition.Y);
  1163. DowmCameraResults[cameraIndex] = new PointF(offsetX, offsetY);
  1164. await plc.WriteNodeAsync(addressConfig.Out_DownCameraStatus.Address, (Int16)1);
  1165. return;
  1166. }
  1167. else
  1168. {
  1169. await plc.WriteNodeAsync(addressConfig.Out_DownCameraStatus.Address, (Int16)2);
  1170. return;
  1171. }
  1172. }
  1173. else
  1174. {
  1175. SendTaskMessage($"触发下相机拍照信号已关闭", MessageLevel.Alarm);
  1176. await plc.WriteNodeAsync(addressConfig.Out_DownCameraStatus.Address, (Int16)0);
  1177. }
  1178. }
  1179. }
  1180. // 触发下相机拍照披头
  1181. if (addressConfig.In_ScrewTeachExe.Address.Contains(tuple.nodeId))
  1182. {
  1183. if (tuple.value is bool state)
  1184. {
  1185. if (state)
  1186. {
  1187. SendTaskMessage($"触发下相机拍照...", MessageLevel.Debug);
  1188. //相机的编号
  1189. Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_DowmCameraNum.Address);
  1190. SendTaskMessage($"编号:{cameraIndex}", MessageLevel.Info);
  1191. // 获取流程
  1192. var process = _productService.GetCurrentProductProcedureModelById(currentProduct.FixedUpCamera1ProcedureId);
  1193. if (process == null)
  1194. {
  1195. SendTaskMessage($"固定向上相机1视觉流程,流程ID:{currentProduct.FixedUpCamera1ProcedureId}", MessageLevel.Alarm);
  1196. await plc.WriteNodeAsync(addressConfig.Out_ScrewTeachOk.Address, (Int16)2);
  1197. return;
  1198. }
  1199. // 获取机器人当前坐标
  1200. var robot = _robotService.GetAllRobots().FirstOrDefault();
  1201. if (robot == null)
  1202. {
  1203. SendTaskMessage($"未找到机器人,无法执行上相机锁附/组装拍照视觉任务", MessageLevel.Alarm);
  1204. await plc.WriteNodeAsync(addressConfig.Out_ScrewTeachOk.Address, (Int16)2);
  1205. return;
  1206. }
  1207. var currentPosition = robot.GetRobotPos();
  1208. // 执行视觉任务
  1209. var _cts = new CancellationTokenSource();
  1210. var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(process, null, null, _cts.Token);
  1211. if (visionResult.IsSucceed)
  1212. {
  1213. //披头偏差
  1214. float offsetX = (float)(visionResult.X - currentPosition.X);
  1215. float offsetY = (float)(visionResult.Y - currentPosition.Y);
  1216. DowmCameraResults[cameraIndex] = new PointF(offsetX, offsetY);
  1217. await plc.WriteNodeAsync(addressConfig.Out_ScrewTeachOk.Address, (Int16)1);
  1218. return;
  1219. }
  1220. else
  1221. {
  1222. await plc.WriteNodeAsync(addressConfig.Out_ScrewTeachOk.Address, (Int16)2);
  1223. return;
  1224. }
  1225. }
  1226. else
  1227. {
  1228. SendTaskMessage($"触发下相机拍照信号已关闭", MessageLevel.Alarm);
  1229. await plc.WriteNodeAsync(addressConfig.Out_ScrewTeachOk.Address, (Int16)0);
  1230. }
  1231. }
  1232. }
  1233. // 触发上相机取料拍照
  1234. else if (addressConfig.In_UpCameraPickExe.Address.Contains(tuple.nodeId))
  1235. {
  1236. if (tuple.value is bool state)
  1237. {
  1238. if (state)
  1239. {
  1240. SendTaskMessage($"触发上相机取料拍照...", MessageLevel.Debug);
  1241. //相机的编号
  1242. //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_UpCameraPickNum.Address);
  1243. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPickStatus.Address, (Int16)1);
  1244. }
  1245. else
  1246. {
  1247. SendTaskMessage($"触发上相机取料拍照信号已关闭", MessageLevel.Alarm);
  1248. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPickStatus.Address, (Int16)0);
  1249. }
  1250. }
  1251. }
  1252. // 上相机锁附/组装拍照
  1253. else if (addressConfig.In_UpCameraPutExe.Address.Contains(tuple.nodeId))
  1254. {
  1255. if (tuple.value is bool state)
  1256. {
  1257. if (state)
  1258. {
  1259. SendTaskMessage($"触发上相机锁附/组装拍照...", MessageLevel.Debug);
  1260. //相机的编号
  1261. Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_UpCameraPutNum.Address);
  1262. SendTaskMessage($"编号:{cameraIndex}", MessageLevel.Info);
  1263. // 获取流程
  1264. var process = _productService.GetCurrentProductProcedureModelById(currentProduct.MoveDownCameraLockPhotoProcedureId);
  1265. if (process == null)
  1266. {
  1267. SendTaskMessage($"未找到上相机锁附/组装拍照对应的视觉流程,流程ID:{currentProduct.MoveDownCameraLockPhotoProcedureId}", MessageLevel.Alarm);
  1268. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)2);
  1269. return;
  1270. }
  1271. // 获取机器人当前坐标
  1272. var robot = _robotService.GetAllRobots().FirstOrDefault();
  1273. if (robot == null)
  1274. {
  1275. SendTaskMessage($"未找到机器人,无法执行上相机锁附/组装拍照视觉任务", MessageLevel.Alarm);
  1276. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)2);
  1277. return;
  1278. }
  1279. var currentPosition = robot.GetRobotPos();
  1280. // 执行视觉任务
  1281. var _cts = new CancellationTokenSource();
  1282. var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(process, null, new double[] { currentPosition.X, currentPosition.Y, currentPosition.U }, _cts.Token);
  1283. if (visionResult.IsSucceed)
  1284. {
  1285. UpCameraPutResults[cameraIndex] = new PointF((float)visionResult.X, (float)visionResult.Y);
  1286. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)1);
  1287. }
  1288. else
  1289. {
  1290. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)2);
  1291. }
  1292. }
  1293. else
  1294. {
  1295. SendTaskMessage($"触发上相机锁附/组装拍照信号已关闭", MessageLevel.Alarm);
  1296. await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)0);
  1297. }
  1298. }
  1299. }
  1300. // 上相机检测拍照
  1301. else if (addressConfig.In_UPCameracheckExe.Address.Contains(tuple.nodeId))
  1302. {
  1303. if (tuple.value is bool state)
  1304. {
  1305. if (state)
  1306. {
  1307. SendTaskMessage($"触发上相机检测拍照...", MessageLevel.Debug);
  1308. //相机的编号
  1309. //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.Out_UPCameracheckNum.Address);
  1310. await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)1);
  1311. }
  1312. else
  1313. {
  1314. SendTaskMessage($"触发上相机检测拍照信号已关闭", MessageLevel.Alarm);
  1315. await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)0);
  1316. }
  1317. }
  1318. }
  1319. // 固定相机取料拍照
  1320. else if (addressConfig.In_FixedCameraPickExe.Address.Contains(tuple.nodeId))
  1321. {
  1322. if (tuple.value is bool state)
  1323. {
  1324. if (state)
  1325. {
  1326. SendTaskMessage($"触发固定相机取料拍照...", MessageLevel.Debug);
  1327. //相机的编号
  1328. //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameraPickNum.Address);
  1329. await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)1);
  1330. }
  1331. else
  1332. {
  1333. SendTaskMessage($"触发固定相机取料拍照信号已关闭", MessageLevel.Alarm);
  1334. await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)0);
  1335. }
  1336. }
  1337. }
  1338. // 固定相机锁附/组装拍照
  1339. else if (addressConfig.In_FixedCameraPutExe.Address.Contains(tuple.nodeId))
  1340. {
  1341. if (tuple.value is bool state)
  1342. {
  1343. if (state)
  1344. {
  1345. SendTaskMessage($"触发固定相机锁附/组装拍照...", MessageLevel.Debug);
  1346. //相机的编号
  1347. //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameraPutNum.Address);
  1348. await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPutStatus.Address, (Int16)1);
  1349. }
  1350. else
  1351. {
  1352. SendTaskMessage($"触发固定相机锁附/组装拍照信号已关闭", MessageLevel.Alarm);
  1353. await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPutStatus.Address, (Int16)0);
  1354. }
  1355. }
  1356. }
  1357. // 固定相机检测拍照
  1358. else if (addressConfig.In_FixedCameracheckExe.Address.Contains(tuple.nodeId))
  1359. {
  1360. if (tuple.value is bool state)
  1361. {
  1362. if (state)
  1363. {
  1364. SendTaskMessage($"触发固定相机检测拍照...", MessageLevel.Debug);
  1365. //相机的编号
  1366. //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
  1367. await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
  1368. }
  1369. else
  1370. {
  1371. SendTaskMessage($"触发固定相机检测拍照信号已关闭", MessageLevel.Alarm);
  1372. await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)0);
  1373. }
  1374. }
  1375. }
  1376. // 开始锁付
  1377. else if (addressConfig.In_WorkStart.Address.Contains(tuple.nodeId))
  1378. {
  1379. if (tuple.value is Int16 state)
  1380. {
  1381. if (state == 1)
  1382. {
  1383. SendTaskMessage($"收到开始锁付信号...", MessageLevel.Debug);
  1384. //位置编号
  1385. Int16 positionIndex = plc.ReadNode<Int16>(addressConfig.In_ProductNum.Address);
  1386. SendTaskMessage($"编号:{positionIndex}", MessageLevel.Info);
  1387. }
  1388. else
  1389. {
  1390. SendTaskMessage($"开始锁付信号已关闭", MessageLevel.Alarm);
  1391. // 关闭时的处理(如需)可放在这里
  1392. }
  1393. }
  1394. }
  1395. // 停止锁付
  1396. else if (addressConfig.In_WorkDone.Address.Contains(tuple.nodeId))
  1397. {
  1398. if (tuple.value is Int16 state)
  1399. {
  1400. if (state == 1 || state == 2)
  1401. {
  1402. SendTaskMessage($"收到停止锁付信号...", MessageLevel.Debug);
  1403. //位置编号
  1404. Int16 positionIndex = plc.ReadNode<Int16>(addressConfig.In_ProductNum.Address);
  1405. SendTaskMessage($"编号:{positionIndex}", MessageLevel.Info);
  1406. //获取当前锁付点
  1407. var screwPoint = currentProduct.ScrewPoints.FirstOrDefault(p => p.Number == positionIndex);
  1408. //获取当前的机器人点位
  1409. var robot = _robotService.GetAllRobots().FirstOrDefault();
  1410. var currentPosition = robot.GetRobotPos();
  1411. //读取压力值
  1412. float pressure = plc.ReadNode<float>(addressConfig.In_PressureValue.Address);
  1413. await Task.Delay(60);
  1414. //获取电批结果
  1415. bool isSucced = ScrewDriver.GetData();
  1416. LockResult lockResult = new LockResult();
  1417. lockResult.ScrewdriverGetDataSucceed = isSucced;
  1418. lockResult.Number = positionIndex;
  1419. lockResult.LockPassed = ScrewDriver.Success;
  1420. lockResult.ProductNumber = _productService.CurrentProductCode;
  1421. lockResult.LockTurns = (float)ScrewDriver.Truns;
  1422. lockResult.LockTorque = (float)ScrewDriver.TorqueValue;
  1423. lockResult.LockDuration = (float)ScrewDriver.FinalTime;
  1424. lockResult.ScrewdriverProgramNumber = ScrewDriver.ProgramNumber;
  1425. lockResult.ResultDetails = ScrewDriver.ErrorInfo;
  1426. lockResult.Pressure = pressure;
  1427. lockResult.TargetTorque = ScrewDriver.TargetTorque;
  1428. lockResult.TargetTurnsUpperLimit = ScrewDriver.TargetTurnsUpperLimit;
  1429. lockResult.TargetTurnsLowerLimit = ScrewDriver.TargetTurnsLowerLimit;
  1430. lockResult.TargetLockSpeed = ScrewDriver.TargetLockSpeed;
  1431. lockResult.StartPositionX = currentPosition.X;
  1432. lockResult.StartPositionY = currentPosition.Y;
  1433. lockResult.StartPositionZ = screwPoint.Z_Position_Start;
  1434. lockResult.EndPositionZ = currentPosition.Z;
  1435. lockResult.LockDescentSpeed = screwPoint.Z_Velocity_Stop;
  1436. lockResult.FeederNumber = screwPoint != null ? screwPoint.Feeder : 0;
  1437. lockResult.NozzleNumber = "";
  1438. lockResult.OperatorName = _systemDatabaseService.GetCurrentUser().UserName;
  1439. lockResult.ProductImagePath = "";
  1440. lockResult.WaveDatas = ScrewDriver.WaveDatas;
  1441. App.Current.Dispatcher.Invoke(() =>
  1442. {
  1443. _eventAggregator.GetEvent<LockFinishNotification>().Publish(lockResult);
  1444. });
  1445. await _systemDatabaseService.RecordLockResultAsync(lockResult);
  1446. await plc.WriteNodeAsync(addressConfig.In_WorkDone.Address, (Int16)0);
  1447. Value = lockResult.LockTorque;
  1448. //电批吸嘴报警
  1449. NumStatistics.HeaderNum++;//批头数量
  1450. NumStatistics.NozzleNum++;//吸嘴数量
  1451. FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
  1452. if (NumStatistics.HeaderNum < NumStatistics.HeaderAlarmValue)
  1453. {
  1454. System.Windows.MessageBox.Show("Electric Screwdriver Alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
  1455. }
  1456. if (NumStatistics.NozzleNum < NumStatistics.NozzleAlarmValue)
  1457. {
  1458. System.Windows.MessageBox.Show("Nozzle Alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
  1459. }
  1460. }
  1461. else
  1462. {
  1463. SendTaskMessage($"停止锁付信号已关闭", MessageLevel.Alarm);
  1464. }
  1465. }
  1466. }
  1467. // 多相机坐标合并
  1468. else if (addressConfig.In_RequestPosition.Address.Contains(tuple.nodeId))
  1469. {
  1470. if (tuple.value is Int16 state)
  1471. {
  1472. if (state == 1)
  1473. {
  1474. SendTaskMessage($"收到多相机坐标合并请求,开始合并...", MessageLevel.Debug);
  1475. //是拍一个锁一个还是拍两个点锁所有
  1476. var systemConfig = _configService.GetSystemConfiguration();
  1477. //拍1打1
  1478. if (systemConfig.WorkMode == 1)
  1479. {
  1480. currentProduct.ScrewPoints[0].X_Position = UpCameraPutResults[1].X + DowmCameraResults[0].X;
  1481. currentProduct.ScrewPoints[0].Y_Position = UpCameraPutResults[1].Y + DowmCameraResults[0].Y;
  1482. await currentProduct.ScrewPoints[0].WriteToPlcAddress(addressConfig.Out_Screw, plc);
  1483. }
  1484. //拍1打所有
  1485. else if (systemConfig.WorkMode == 2)
  1486. {
  1487. //根据UpCameraPutResults[]中的索引1、2,和拍照点对应的Local下的坐标,从创建Local坐标系
  1488. PointF worldP1 = new PointF(UpCameraPutResults[1].X, UpCameraPutResults[1].Y);
  1489. PointF worldP2 = new PointF(UpCameraPutResults[2].X, UpCameraPutResults[2].Y);
  1490. PointF localP1 = new PointF(currentProduct.ScrewCameraLocalPos1.X_Position, currentProduct.ScrewCameraLocalPos1.Y_Position);
  1491. PointF localP2 = new PointF(currentProduct.ScrewCameraLocalPos2.X_Position, currentProduct.ScrewCameraLocalPos2.Y_Position);
  1492. CoordinateTransformer local = new CoordinateTransformer(worldP1, worldP2, localP1, localP2);
  1493. for (int i = 0; i < currentProduct.ScrewPoints.Count; i++)
  1494. {
  1495. var localPoint = new PointF(currentProduct.ScrewPoints[i].X_Position, currentProduct.ScrewPoints[i].Y_Position);
  1496. var worldPoint = local.ToOldCoord(localPoint.X, localPoint.Y);
  1497. var point = currentProduct.ScrewPoints[i].Clone();
  1498. point.X_Position = (float)worldPoint[0];
  1499. point.Y_Position = (float)worldPoint[1];
  1500. SendTaskMessage($"点:{i},{point.X_Position:F3},{point.Y_Position:F4}", MessageLevel.Info);
  1501. await point.WriteToPlcAddress(addressConfig.Out_Screw, plc);
  1502. }
  1503. await plc.WriteNodeAsync(addressConfig.Out_WorkNum.Address, (Int16)currentProduct.ScrewPoints.Count);
  1504. }
  1505. await plc.WriteNodeAsync(addressConfig.Out_CameraDone.Address, (Int16)1);
  1506. }
  1507. else
  1508. {
  1509. SendTaskMessage($"多相机坐标合并请求已结束或被取消,state={state}", MessageLevel.Alarm);
  1510. await plc.WriteNodeAsync(addressConfig.Out_CameraDone.Address, (Int16)0);
  1511. }
  1512. }
  1513. }
  1514. // 过站检查
  1515. else if (addressConfig.In_MesCheck.Address.Contains(tuple.nodeId))
  1516. {
  1517. if (tuple.value is Int16 state)
  1518. {
  1519. if (state == 1)
  1520. {
  1521. SendTaskMessage($"收到过站检查请求(当站是否生产)...", MessageLevel.Debug);
  1522. //产品发生改变并且供料器发生了变化时,需要通知PLC进行取料更改
  1523. await plc.WriteNodeAsync(addressConfig.Out_ScrewFeederIsChanged.Address, (Int16)1); //不发生改变
  1524. await plc.WriteNodeAsync(addressConfig.Out_MesStatus.Address, (Int16)1);
  1525. }
  1526. // 上传本站数据
  1527. else if (state == 2)
  1528. {
  1529. SendTaskMessage($"收到上传本站数据请求...", MessageLevel.Debug);
  1530. await plc.WriteNodeAsync(addressConfig.Out_MesStatus.Address, (Int16)3);
  1531. }
  1532. else
  1533. {
  1534. SendTaskMessage($"过站检查信号:state={state},处理为默认状态", MessageLevel.Alarm);
  1535. await plc.WriteNodeAsync(addressConfig.Out_MesStatus.Address, (Int16)0);
  1536. }
  1537. }
  1538. }
  1539. // 螺丝供料器螺丝递减
  1540. else if (addressConfig.In_PickINC.Address.Contains(tuple.nodeId))
  1541. {
  1542. if (tuple.value is Int16 state)
  1543. {
  1544. if (state != 0)
  1545. {
  1546. SendTaskMessage($"螺丝供料器...", MessageLevel.Info);
  1547. await plc.WriteNodeAsync(addressConfig.In_PickINC.Address, (Int16)0);
  1548. var feeders = _configService.GetRemainingCountByFeederNumber(state);
  1549. if (state == 1)
  1550. {
  1551. NumStatistics.Feeder1Num = feeders;
  1552. }
  1553. else if (state == 2)
  1554. {
  1555. NumStatistics.Feeder2Num = feeders;
  1556. }
  1557. FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
  1558. var res = _configService.CheckAlarm(state);
  1559. if (res)
  1560. {
  1561. System.Windows.MessageBox.Show("Screw feeder alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
  1562. }
  1563. }
  1564. }
  1565. }
  1566. }
  1567. catch (Exception ex)
  1568. {
  1569. SendTaskMessage(ex.Message, MessageLevel.Error);
  1570. }
  1571. }
  1572. #endregion
  1573. #region 方法
  1574. private void SendTaskMessage(string msg, MessageLevel level)
  1575. {
  1576. App.Current.Dispatcher.Invoke(() =>
  1577. {
  1578. _eventAggregator.GetEvent<TaskMessageNotification>().Publish(new Models.MessageStruct() { Message = msg, level = level });
  1579. });
  1580. }
  1581. private async void DoYieldTime(object state)
  1582. {
  1583. try
  1584. {
  1585. if (CurrentProduct == null) return;
  1586. //获取当前产品
  1587. var currentproduct = _productService.GetCurrentProduct();
  1588. TotalQuantity = await _systemDatabaseService.GetOverallProductionAsync(CurrentProduct.Name);
  1589. TotalQuantityToday = await _systemDatabaseService.GetTodayProductionAsync(CurrentProduct.Name);
  1590. CurrentUPH = await _systemDatabaseService.GetLastHourProductionAsync(CurrentProduct.Name);
  1591. }
  1592. catch (Exception)
  1593. {
  1594. }
  1595. }
  1596. #region vm启动检测
  1597. /// <summary>
  1598. /// 杀死所有VM有关进程
  1599. /// </summary>
  1600. public void KillVMProcess()
  1601. {
  1602. KillProcess("VisionMasterServerApp");
  1603. KillProcess("VisionMaster");
  1604. KillProcess("VmModuleProxy.exe");
  1605. KillProcess("vServerApp.exe");
  1606. }
  1607. /// <summary>
  1608. /// 杀死指定进程名的进程
  1609. /// </summary>
  1610. /// <param name="strKillName"></param>
  1611. public void KillProcess(string strKillName)
  1612. {
  1613. foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
  1614. {
  1615. if (p.ProcessName.Contains(strKillName))
  1616. {
  1617. try
  1618. {
  1619. p.Kill();
  1620. p.WaitForExit();
  1621. }
  1622. catch (Exception ex)
  1623. {
  1624. LogHelper.WriteLogError($"杀死进程:{strKillName}时失败!", ex);
  1625. }
  1626. }
  1627. }
  1628. }
  1629. #endregion
  1630. #endregion
  1631. }
  1632. }