TaskJobService.cs 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. using HslCommunication;
  2. using HslCommunication.Profinet.Siemens;
  3. using IMCS.CCS.Common.Redis;
  4. using IMCS.CCS.DeviceProtocol;
  5. using IMCS.CCS.Entitys;
  6. using IMCS.CCS.Models.vo;
  7. using IMCS.CCS.Services;
  8. using IMCS_CCS.Model.vo;
  9. using IMCS_CCS.Utils;
  10. using Microsoft.Extensions.Configuration;
  11. using Newtonsoft.Json;
  12. using S7.Net;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using IMCS.CCS.Models;
  19. using System.Net.NetworkInformation;
  20. using IMCS_CCS.Model;
  21. namespace IMCS.CCS.Service.Impl
  22. {
  23. /// <summary>
  24. /// 任务调度服务
  25. /// </summary>
  26. public class TaskJobService : ITaskJobService
  27. {
  28. private readonly IRedisService _redisService;
  29. private readonly IDeviceService _deviceService;
  30. private readonly IApiRequestService _apiRequestService;
  31. private readonly ITaskCallbackService _taskCallbackService;
  32. private readonly ICcsTagValueService _ccsTagValueService;
  33. private readonly IEquipmentMonitorService _equipmentMonitorService;
  34. private readonly IDictionaryService _dictionaryService;
  35. private readonly ICcsActionAddressService _ccsActionAddressService;
  36. private string ecsUrlContext;
  37. private string ecsRootUrlContext;
  38. private string fanucUrlContext;
  39. private string opcuacUrlContext;
  40. private string hdhUrlContext;
  41. private Dictionary<String, int> syncStatusMap = new Dictionary<String, int>();
  42. private Dictionary<String, String> jcAddressDict = new Dictionary<String, String>();
  43. private Dictionary<String, String> jcIpDict = new Dictionary<String, String>();
  44. private string LOG_TITLE_OPCUA = "OPCUA采集";
  45. private string LOG_TITLE_FUNC = "发那科采集";
  46. private string LOG_TITLE_HEIDEHAIN = "海德汉采集";
  47. private string LOG_TITLE_S7 = "S7采集";
  48. private string LOG_TITLE_CALLBACK = "回调任务";
  49. private string LOG_TITLE_DEVICE = "设备监控";
  50. private string PLC_ALARM_INFO = "PLC有异常";
  51. private string imcs_redis_key = "IMCS_CCS:";
  52. public IConfiguration Configuration { get; }
  53. public TaskJobService(IRedisService redisService,
  54. ITaskCallbackService taskCallbackService,
  55. IDeviceService deviceService,
  56. IApiRequestService apiRequestService,
  57. ICcsTagValueService ccsTagValueService,
  58. IEquipmentMonitorService equipmentMonitorService,
  59. IDictionaryService dictionaryService,
  60. ICcsActionAddressService ccsActionAddressService,
  61. IConfiguration configuration)
  62. {
  63. _redisService = redisService;
  64. _taskCallbackService = taskCallbackService;
  65. _deviceService = deviceService;
  66. _apiRequestService = apiRequestService;
  67. _ccsTagValueService = ccsTagValueService;
  68. _equipmentMonitorService = equipmentMonitorService;
  69. _dictionaryService = dictionaryService;
  70. _ccsActionAddressService = ccsActionAddressService;
  71. Configuration = configuration;
  72. ecsUrlContext = Configuration.GetConnectionString("ecsUrlContext");
  73. fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
  74. opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
  75. hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext");
  76. ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
  77. syncStatusMap.Add("离线", 0);
  78. syncStatusMap.Add("空闲", 1);
  79. syncStatusMap.Add("生产中", 2);
  80. syncStatusMap.Add("报警", 3);
  81. //在线状态默认传参后台空闲状态
  82. syncStatusMap.Add("在线", 1);
  83. syncStatusMap.Add("掉线", -1);
  84. }
  85. /// <summary>
  86. /// 采集数据S7
  87. /// </summary>
  88. /// <returns></returns>
  89. public async Task<string> DataCollectS7Job()
  90. {
  91. try
  92. {
  93. List<Device> deviceList = await getDeviceList();
  94. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()) && x.State).ToList();
  95. foreach (Device device in deviceList)
  96. {
  97. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  98. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  99. var data = await _redisService.Database.StringGetAsync(redis_key);
  100. if (data.IsNullOrEmpty)
  101. {
  102. CcsTagValue tagQuery = new CcsTagValue();
  103. tagQuery.ProtocolType = device.ProtocolType;
  104. tagQuery.Ip = device.Ip;
  105. tagValues = _ccsTagValueService.GetList(tagQuery);
  106. //首次设置redis
  107. if (tagValues != null && tagValues.Count > 0)
  108. {
  109. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  110. }
  111. }
  112. else
  113. {
  114. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  115. }
  116. if (tagValues != null && tagValues.Count > 0)
  117. {
  118. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  119. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  120. //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  121. SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.ServerUrl);
  122. OperateResult ConnectionResult = s7.ConnectServer();
  123. if (!ConnectionResult.IsSuccess)
  124. {
  125. device.State = false;
  126. await _deviceService.UpdateDevice(device);
  127. s7.ConnectClose();
  128. Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>"+ device.ServerUrl, LOG_TITLE_S7);
  129. return "采集失败,plc连不上";
  130. }
  131. else
  132. {
  133. foreach (CcsTagValue tagValueData in tagValues)
  134. {
  135. string operateResult = "";
  136. if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString()))
  137. {
  138. operateResult = s7.ReadBool(tagValueData.Address).Content.ToString();
  139. }
  140. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString()))
  141. {
  142. operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString();
  143. }
  144. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString()))
  145. {
  146. operateResult = s7.ReadString(tagValueData.Address).Content.ToString();
  147. }
  148. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Array.ToString()))
  149. {
  150. operateResult = ToolUtils.ReturnStringByBytes(s7.Read(tagValueData.Address,2048).Content);
  151. }
  152. if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult)
  153. {
  154. tagValueData.TagValue = operateResult.ToString();
  155. tagValueData.UpdateTime = DateTime.Now;
  156. changTagValues.Add(tagValueData);
  157. Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  158. //有变化更新数据库
  159. await _ccsTagValueService.Update(tagValueData);
  160. }
  161. Thread.Sleep(50);
  162. }
  163. s7.ConnectClose();
  164. //值有变化,重新设置一次redis
  165. if (changTagValues != null && changTagValues.Count > 0)
  166. {
  167. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  168. }
  169. //存储采集数据
  170. CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_S7);
  171. }
  172. }
  173. }
  174. return "S7采集成功";
  175. }
  176. catch (Exception ex)
  177. {
  178. Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7);
  179. return "S7采集失败";
  180. }
  181. }
  182. /// <summary>
  183. /// 采集数据HEIDEHAIN
  184. /// </summary>
  185. /// <returns></returns>
  186. public async Task<string> DataCollectHeidehainJob()
  187. {
  188. try
  189. {
  190. List<Device> deviceList = await getDeviceList();
  191. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString()) && x.State).ToList();
  192. foreach (Device device in deviceList)
  193. {
  194. RequestHeidhData hdhReq = new RequestHeidhData();
  195. hdhReq.ServerUrl = device.ServerUrl;
  196. hdhReq.MachineName = device.UserName;
  197. hdhReq.Type = "Collect";
  198. //调用海德汉采集接口
  199. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  200. {
  201. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  202. //采集数据放入缓存
  203. await _redisService.Database.StringSetAsync(redis_key, Result.Message);
  204. //存储采集数据
  205. CollectDataLog.Instance.WriteLogAdd(Result.Message, LOG_TITLE_HEIDEHAIN);
  206. }
  207. }
  208. return "HEIDEHAIN采集成功";
  209. }
  210. catch (Exception ex)
  211. {
  212. Log.Instance.WriteLogAdd("HEIDEHAIN采集异常===>>" + ex.Message, LOG_TITLE_S7);
  213. return "HEIDEHAIN采集失败";
  214. }
  215. }
  216. /// <summary>
  217. /// 上传程序回调任务
  218. /// </summary>
  219. /// <returns></returns>
  220. public async Task<string> CallbackJob1()
  221. {
  222. List<TaskCallback> list = new List<TaskCallback>();
  223. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  224. if (taskCallbackListData.IsNullOrEmpty)
  225. {
  226. list = await _taskCallbackService.GetAllList();
  227. }
  228. else
  229. {
  230. list = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  231. }
  232. TaskCallback task = list.Where(x => x.OperateType.Equals(ActionTypeEnum.UploadFile.ToString())).FirstOrDefault();
  233. if (task == null)
  234. {
  235. return "无回调任务";
  236. }
  237. string message = "";
  238. try
  239. {
  240. DateTime currentTime = DateTime.Now;
  241. if (currentTime.Subtract(task.CreateTime).TotalSeconds > 5)
  242. {
  243. CallBackRequestData requestData = new CallBackRequestData();
  244. requestData.taskId = long.Parse(task.TaskId);
  245. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  246. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  247. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  248. if (result.IsSuccess && responseECSCallback.code == 0)
  249. {
  250. task.State = false;
  251. task.UpdateTime = DateTime.Now;
  252. await _taskCallbackService.CreateOrUpdateAndCache(task);
  253. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  254. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  255. }
  256. else
  257. {
  258. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  259. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  260. }
  261. }
  262. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  263. }
  264. catch (Exception ex)
  265. {
  266. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  267. return "回调异常" + ex.Message;
  268. }
  269. }
  270. /// <summary>
  271. /// 取和放回调任务
  272. /// </summary>
  273. /// <returns></returns>
  274. public async Task<string> CallbackJob2()
  275. {
  276. List<TaskCallback> taskList = new List<TaskCallback>();
  277. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  278. if (taskCallbackListData.IsNullOrEmpty)
  279. {
  280. taskList = await _taskCallbackService.GetAllList();
  281. }
  282. else
  283. {
  284. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  285. }
  286. //在线设备
  287. List<Device> deviceList = await getDeviceList();
  288. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.RobotAction.ToString())).ToList();
  289. taskList = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).ToList();
  290. //TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault() ;
  291. if (taskList == null || taskList.Count == 0)
  292. {
  293. return "无回调任务" ;
  294. }
  295. string message = "";
  296. try
  297. {
  298. foreach(TaskCallback task in taskList)
  299. {
  300. CcsTagValue tagValueQuery = new CcsTagValue();
  301. tagValueQuery.Ip = task.IP;
  302. //tagValueQuery.Address = task.Address;
  303. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  304. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  305. if ((callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue) )
  306. {
  307. //执行位清零
  308. SiemensS7Net s7 = DevicePlcS7.SiemensS7(task.IP);
  309. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  310. if (ConnectionResult.IsSuccess)
  311. {
  312. s7.Write("DB2.10", Convert.ToInt16("0"));
  313. }
  314. s7.ConnectClose();
  315. task.State = false;
  316. task.UpdateTime = DateTime.Now;
  317. await _taskCallbackService.CreateOrUpdateAndCache(task);
  318. /*CallBackRequestData requestData = new CallBackRequestData();
  319. requestData.taskId = long.Parse(task.TaskId);
  320. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  321. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  322. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  323. if (result.IsSuccess && responseECSCallback.code == 0)
  324. {
  325. task.State = false;
  326. task.UpdateTime = DateTime.Now;
  327. await _taskCallbackService.CreateOrUpdateAndCache(task);
  328. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  329. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  330. }
  331. else
  332. {
  333. //ecs返回-5 任务作废
  334. if(result.IsSuccess && responseECSCallback.code == -5)
  335. {
  336. task.State = false;
  337. task.UpdateTime = DateTime.Now;
  338. task.Description = "ecs返回-5,回调任务作废";
  339. await _taskCallbackService.CreateOrUpdateAndCache(task);
  340. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  341. Log.Instance.WriteLogAdd("回调异常,请求接口失败,ecs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  342. }
  343. else
  344. {
  345. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  346. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  347. }
  348. */
  349. }
  350. }
  351. // //回调检测到失败,回调通知ecs
  352. // if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  353. // {
  354. // bool failFalg = false;
  355. // if (!string.IsNullOrEmpty(task.FailAddress))
  356. // {
  357. // List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  358. // if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  359. // {
  360. // failFalg = true;
  361. // }
  362. // }
  363. // if (!string.IsNullOrEmpty(task.FailAddress2))
  364. // {
  365. // List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  366. // if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  367. // {
  368. // failFalg = true;
  369. // }
  370. // }
  371. // if (!string.IsNullOrEmpty(task.FailAddress3))
  372. // {
  373. // List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  374. // if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  375. // {
  376. // failFalg = true;
  377. // }
  378. // }
  379. // if (failFalg)
  380. // {
  381. // CallBackRequestData requestData = new CallBackRequestData();
  382. // requestData.taskId = long.Parse(task.TaskId);
  383. // requestData.taskNodeId = long.Parse(task.TaskNodeId);
  384. // requestData.code = "0";
  385. // requestData.msg = "操作失败";
  386. // var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  387. // if (result.IsSuccess)
  388. // {
  389. // task.State = false;
  390. // task.UpdateTime = DateTime.Now;
  391. // await _taskCallbackService.CreateOrUpdateAndCache(task);
  392. // message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  393. // Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  394. // }
  395. // else
  396. // {
  397. // message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  398. // Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  399. // }
  400. // }
  401. // }
  402. // Thread.Sleep(1000);
  403. //}
  404. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  405. }
  406. catch (Exception ex)
  407. {
  408. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  409. return "回调异常" + ex.Message;
  410. }
  411. }
  412. /// <summary>
  413. /// 读写回调任务
  414. /// </summary>
  415. /// <returns></returns>
  416. public async Task<string> CallbackJob3()
  417. {
  418. List<TaskCallback> taskList = new List<TaskCallback>();
  419. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  420. if (taskCallbackListData.IsNullOrEmpty)
  421. {
  422. taskList = await _taskCallbackService.GetAllList();
  423. }
  424. else
  425. {
  426. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  427. }
  428. List<Device> deviceList = await getDeviceList();
  429. //在线设备
  430. taskList = taskList.Where(x => (x.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString())
  431. || x.OperateType.Equals(ActionTypeEnum.WriteRFID.ToString())) && x.State).ToList();
  432. TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  433. if (task == null)
  434. {
  435. return "无回调任务";
  436. }
  437. string message = "";
  438. try
  439. {
  440. DateTime currentTime = DateTime.Now;
  441. CcsTagValue tagValueQuery = new CcsTagValue();
  442. tagValueQuery.Ip = task.IP;
  443. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  444. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  445. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue )
  446. {
  447. CcsTagValue callBacktagValue2 = null;
  448. if (task.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString())){
  449. callBacktagValue2 = tagValues.Where(o => o.Address == task.Address2).FirstOrDefault();
  450. }
  451. CallBackRequestData requestData = new CallBackRequestData();
  452. requestData.taskId = long.Parse(task.TaskId);
  453. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  454. //读RFID的值返回ecs
  455. if (callBacktagValue2 != null)
  456. {
  457. requestData.content = callBacktagValue2.TagValue;
  458. }
  459. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  460. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  461. if (result.IsSuccess && responseECSCallback.code == 0)
  462. {
  463. task.State = false;
  464. task.UpdateTime = DateTime.Now;
  465. await _taskCallbackService.CreateOrUpdateAndCache(task);
  466. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  467. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  468. }
  469. else
  470. {
  471. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  472. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  473. }
  474. }
  475. //回调检测到失败,回调通知ecs
  476. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  477. {
  478. bool failFalg = false;
  479. if (!string.IsNullOrEmpty(task.FailAddress))
  480. {
  481. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  482. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  483. {
  484. failFalg = true;
  485. }
  486. }
  487. if (!string.IsNullOrEmpty(task.FailAddress2))
  488. {
  489. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  490. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  491. {
  492. failFalg = true;
  493. }
  494. }
  495. if (!string.IsNullOrEmpty(task.FailAddress3))
  496. {
  497. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  498. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  499. {
  500. failFalg = true;
  501. }
  502. }
  503. if (failFalg)
  504. {
  505. CallBackRequestData requestData = new CallBackRequestData();
  506. requestData.taskId = long.Parse(task.TaskId);
  507. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  508. requestData.code = "0";
  509. requestData.msg = "操作失败";
  510. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  511. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  512. if (result.IsSuccess && responseECSCallback.code == 0)
  513. {
  514. task.State = false;
  515. task.UpdateTime = DateTime.Now;
  516. await _taskCallbackService.CreateOrUpdateAndCache(task);
  517. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  518. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  519. }
  520. else
  521. {
  522. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  523. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  524. }
  525. }
  526. }
  527. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  528. }
  529. catch (Exception ex)
  530. {
  531. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  532. return "回调异常" + ex.Message;
  533. }
  534. }
  535. /// <summary>
  536. /// 启动机床程序回调任务
  537. /// </summary>
  538. /// <returns></returns>
  539. public async Task<string> CallbackJob4()
  540. {
  541. List<TaskCallback> taskList = new List<TaskCallback>();
  542. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  543. if (taskCallbackListData.IsNullOrEmpty)
  544. {
  545. taskList = await _taskCallbackService.GetAllList();
  546. }
  547. else
  548. {
  549. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  550. }
  551. List<Device> deviceList = await getDeviceList();
  552. //在线设备
  553. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  554. if (taskList == null || taskList.Count == 0)
  555. {
  556. return "无回调任务";
  557. }
  558. string message = "";
  559. try
  560. {
  561. DateTime currentTime = DateTime.Now;
  562. foreach (TaskCallback task in taskList)
  563. {
  564. CcsTagValue tagValueQuery = new CcsTagValue();
  565. tagValueQuery.Ip = task.IP;
  566. //tagValueQuery.Address = task.Address;
  567. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  568. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address.Trim()).FirstOrDefault();
  569. if (tagValue != null && tagValue.TagValue == task.CallbackValue )
  570. {
  571. CallBackRequestData requestData = new CallBackRequestData();
  572. requestData.taskId = long.Parse(task.TaskId);
  573. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  574. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  575. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  576. if (result.IsSuccess && responseECSCallback.code == 0)
  577. {
  578. task.State = false;
  579. task.UpdateTime = DateTime.Now;
  580. await _taskCallbackService.CreateOrUpdateAndCache(task);
  581. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  582. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  583. }
  584. else
  585. {
  586. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  587. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  588. }
  589. }
  590. //回调检测到失败,回调通知ecs
  591. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  592. {
  593. bool failFalg = false;
  594. if (!string.IsNullOrEmpty(task.FailAddress))
  595. {
  596. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  597. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  598. {
  599. failFalg = true;
  600. }
  601. }
  602. if (!string.IsNullOrEmpty(task.FailAddress2))
  603. {
  604. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  605. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  606. {
  607. failFalg = true;
  608. }
  609. }
  610. if (!string.IsNullOrEmpty(task.FailAddress3))
  611. {
  612. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  613. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  614. {
  615. failFalg = true;
  616. }
  617. }
  618. if (failFalg)
  619. {
  620. CallBackRequestData requestData = new CallBackRequestData();
  621. requestData.taskId = long.Parse(task.TaskId);
  622. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  623. requestData.code = "0";
  624. requestData.msg = "操作失败";
  625. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  626. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  627. if (result.IsSuccess && responseECSCallback.code == 0)
  628. {
  629. task.State = false;
  630. task.UpdateTime = DateTime.Now;
  631. await _taskCallbackService.CreateOrUpdateAndCache(task);
  632. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  633. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  634. }
  635. else
  636. {
  637. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  638. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  639. }
  640. }
  641. }
  642. Thread.Sleep(1000);
  643. }
  644. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  645. }
  646. catch (Exception ex)
  647. {
  648. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  649. return "回调异常" + ex.Message;
  650. }
  651. }
  652. /// <summary>
  653. /// 启动清洗机回调任务
  654. /// </summary>
  655. /// <returns></returns>
  656. public async Task<string> CallbackJob5()
  657. {
  658. List<TaskCallback> taskList = new List<TaskCallback>();
  659. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  660. if (taskCallbackListData.IsNullOrEmpty)
  661. {
  662. taskList = await _taskCallbackService.GetAllList();
  663. }
  664. else
  665. {
  666. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  667. }
  668. List<Device> deviceList = await getDeviceList();
  669. //在线设备
  670. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCleanMachine.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  671. // TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  672. if (taskList == null || taskList.Count == 0)
  673. {
  674. return "无回调任务";
  675. }
  676. string message = "";
  677. try
  678. {
  679. DateTime currentTime = DateTime.Now;
  680. foreach (TaskCallback task in taskList)
  681. {
  682. CcsTagValue tagValueQuery = new CcsTagValue();
  683. tagValueQuery.Ip = task.IP;
  684. //tagValueQuery.Address = task.Address;
  685. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  686. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  687. if (tagValue != null && tagValue.TagValue == task.CallbackValue)
  688. //临时处理以解决ecs配置问题
  689. //if(currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  690. {
  691. CallBackRequestData requestData = new CallBackRequestData();
  692. requestData.taskId = long.Parse(task.TaskId);
  693. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  694. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  695. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  696. if (result.IsSuccess && responseECSCallback.code == 0)
  697. {
  698. task.State = false;
  699. task.UpdateTime = DateTime.Now;
  700. await _taskCallbackService.CreateOrUpdateAndCache(task);
  701. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  702. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  703. }
  704. else
  705. {
  706. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  707. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  708. }
  709. }
  710. //回调检测到失败,回调通知ecs
  711. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  712. {
  713. bool failFalg = false;
  714. if (!string.IsNullOrEmpty(task.FailAddress))
  715. {
  716. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  717. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  718. {
  719. failFalg = true;
  720. }
  721. }
  722. if (!string.IsNullOrEmpty(task.FailAddress2))
  723. {
  724. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  725. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  726. {
  727. failFalg = true;
  728. }
  729. }
  730. if (!string.IsNullOrEmpty(task.FailAddress3))
  731. {
  732. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  733. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  734. {
  735. failFalg = true;
  736. }
  737. }
  738. if (failFalg)
  739. {
  740. CallBackRequestData requestData = new CallBackRequestData();
  741. requestData.taskId = long.Parse(task.TaskId);
  742. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  743. requestData.code = "0";
  744. requestData.msg = "操作失败";
  745. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  746. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  747. if (result.IsSuccess && responseECSCallback.code == 0)
  748. {
  749. task.State = false;
  750. task.UpdateTime = DateTime.Now;
  751. await _taskCallbackService.CreateOrUpdateAndCache(task);
  752. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  753. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  754. }
  755. else
  756. {
  757. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  758. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  759. }
  760. }
  761. }
  762. Thread.Sleep(1000);
  763. }
  764. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  765. }
  766. catch (Exception ex)
  767. {
  768. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  769. return "回调异常" + ex.Message;
  770. }
  771. }
  772. /// <summary>
  773. /// 监控设备状态
  774. /// </summary>
  775. /// <returns></returns>
  776. public async Task<string> MonitorEquipmentStatusJob()
  777. {
  778. try
  779. {
  780. string message = "MonitorEquipmentStatusJob调度成功";
  781. //查询全部使用设备包括不在线和离线
  782. string all_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLDeviceList ;
  783. List<Device> devices = new List<Device>();
  784. var deviceListData = await _redisService.Database.StringGetAsync(all_device_redis_key);
  785. if (deviceListData.IsNullOrEmpty)
  786. {
  787. devices = _deviceService.GetDevices();
  788. await _redisService.Database.StringSetAsync(all_device_redis_key, JsonConvert.SerializeObject(devices));
  789. }
  790. else
  791. {
  792. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  793. }
  794. List<EquipmentMonitor> equipmentMonitors = new List<EquipmentMonitor>();
  795. string equipment_monitors_redis_key = imcs_redis_key + RedisKeyEnum.MonitorEquipmentStatusJob;
  796. var data = await _redisService.Database.StringGetAsync(equipment_monitors_redis_key);
  797. if (data.IsNullOrEmpty)
  798. {
  799. equipmentMonitors = await _equipmentMonitorService.GetList();
  800. //首次设置redis
  801. if (equipmentMonitors != null && equipmentMonitors.Count > 0)
  802. {
  803. await _redisService.Database.StringSetAsync(equipment_monitors_redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  804. }
  805. }
  806. else
  807. {
  808. equipmentMonitors = JsonConvert.DeserializeObject<List<EquipmentMonitor>>(data);
  809. }
  810. //变化的设备
  811. List<EquipmentMonitor> changeEquipmentMonitors = new List<EquipmentMonitor>();
  812. foreach (EquipmentMonitor equipment in equipmentMonitors)
  813. {
  814. Device device = devices.Where(x => x.Ip == equipment.IP).FirstOrDefault();
  815. //缓存取PLC tagvalue 值
  816. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  817. if(device == null)
  818. {
  819. continue;
  820. }
  821. string tag_value_redis_key = imcs_redis_key + device.Ip + ":" + device.ProtocolType;
  822. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  823. if (tagData.IsNullOrEmpty)
  824. {
  825. CcsTagValue tagQuery = new CcsTagValue();
  826. tagQuery.ProtocolType = device.ProtocolType;
  827. tagQuery.Ip = device.Ip;
  828. tagValues = _ccsTagValueService.GetList(tagQuery);
  829. //首次设置redis
  830. if (tagValues != null && tagValues.Count > 0)
  831. {
  832. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  833. }
  834. }
  835. else
  836. {
  837. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  838. }
  839. CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  840. if (device != null && !device.UseState)
  841. {
  842. if (equipment.Status != "离线")
  843. {
  844. equipment.Status = "离线";
  845. changeEquipmentMonitors.Add(equipment);
  846. }
  847. continue;
  848. }
  849. else if(device != null && !device.State)
  850. {
  851. if (equipment.Status != "掉线")
  852. {
  853. equipment.Status = "掉线";
  854. changeEquipmentMonitors.Add(equipment);
  855. }
  856. continue;
  857. }
  858. else if (device != null && device.State && device.UseState && (equipment.Type == "HEIDEHAIN" || equipment.Type == "FANUC"))
  859. {
  860. //通过数组获取机床对应的PLC ip地址
  861. string plcIp = jcIpDict[device.Ip];
  862. string ktRedisKey = imcs_redis_key + plcIp + ":" + ProtocalTypeEnum.S7_1500;
  863. string plcAddress = jcAddressDict[device.Ip];
  864. var ktTagData = await _redisService.Database.StringGetAsync(ktRedisKey);
  865. List<CcsTagValue> ktTagValues = new List<CcsTagValue>();
  866. if (ktTagData.IsNullOrEmpty)
  867. {
  868. CcsTagValue tagQuery = new CcsTagValue();
  869. tagQuery.ProtocolType = ProtocalTypeEnum.S7_1500.ToString();
  870. tagQuery.Ip = plcIp;
  871. ktTagValues = _ccsTagValueService.GetList(tagQuery);
  872. //首次设置redis
  873. if (ktTagValues != null && ktTagValues.Count > 0)
  874. {
  875. await _redisService.Database.StringSetAsync(ktRedisKey, JsonConvert.SerializeObject(ktTagValues));
  876. }
  877. }
  878. else
  879. {
  880. ktTagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(ktTagData);
  881. }
  882. CcsTagValue ktTagValue = ktTagValues.Where(x => x.Ip.Trim() == plcIp && x.Address.Trim() == plcAddress).FirstOrDefault();
  883. if(ktTagValue != null)
  884. {
  885. if (ktTagValue.TagValue == "1")
  886. {
  887. if (equipment.Status != "生产中")
  888. {
  889. equipment.Status = "生产中";
  890. changeEquipmentMonitors.Add(equipment);
  891. }
  892. continue;
  893. }
  894. if (ktTagValue.TagValue == "2")
  895. {
  896. if (equipment.Status != "空闲")
  897. {
  898. equipment.Status = "空闲";
  899. changeEquipmentMonitors.Add(equipment);
  900. }
  901. continue;
  902. }
  903. }
  904. }
  905. else if (device != null && (equipment.Name == "机械手" || equipment.Name == "保障中心_伺服舵机"))
  906. {
  907. ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  908. if (ccsTagValue != null)
  909. {
  910. if (ccsTagValue.TagValue == "3")
  911. {
  912. if (equipment.Status != "报警")
  913. {
  914. equipment.Status = "报警";
  915. changeEquipmentMonitors.Add(equipment);
  916. }
  917. continue;
  918. }
  919. }
  920. CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address2).FirstOrDefault();
  921. if (ccsTagValue2 != null)
  922. {
  923. if (ccsTagValue2.TagValue == "9")
  924. {
  925. if (equipment.Status != "报警")
  926. {
  927. equipment.Status = "报警";
  928. changeEquipmentMonitors.Add(equipment);
  929. }
  930. continue;
  931. }
  932. }
  933. if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8")
  934. {
  935. if (equipment.Status != "空闲")
  936. {
  937. equipment.Status = "空闲";
  938. changeEquipmentMonitors.Add(equipment);
  939. }
  940. continue;
  941. }
  942. if (equipment.Status != "生产中")
  943. {
  944. equipment.Status = "生产中";
  945. changeEquipmentMonitors.Add(equipment);
  946. }
  947. }
  948. else
  949. {
  950. if (equipment.Status != "在线")
  951. {
  952. equipment.Status = "在线";
  953. changeEquipmentMonitors.Add(equipment);
  954. }
  955. }
  956. }
  957. //初始化推送列表
  958. List<ProductionStatus> productionStatusList = new List<ProductionStatus>();
  959. //变化的修改 并且更新缓存
  960. if (changeEquipmentMonitors.Count > 0)
  961. {
  962. foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors)
  963. {
  964. ProductionStatus productionStatus = new ProductionStatus();
  965. productionStatus.id = changeEquipment.Id.ToString();
  966. productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString();
  967. productionStatusList.Add(productionStatus);
  968. }
  969. //修改并重置缓存
  970. await _equipmentMonitorService.UpdateAndCache(equipmentMonitors);
  971. }
  972. //在线设备,报警放入推送数组
  973. List<Device> onlineDeviceList = await getDeviceList();
  974. foreach (Device onlineDevice in onlineDeviceList)
  975. {
  976. EquipmentMonitor alarmEquipment = equipmentMonitors.Where(x => x.IP == onlineDevice.Ip && x.Type == onlineDevice.ProtocolType).FirstOrDefault();
  977. if (alarmEquipment != null && alarmEquipment.Type == "HEIDEHAIN")
  978. {
  979. Thread.Sleep(1000);
  980. RequestHeidhData hdhReq = new RequestHeidhData();
  981. hdhReq.ServerUrl = onlineDevice.ServerUrl;
  982. hdhReq.MachineName = onlineDevice.UserName;
  983. hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString();
  984. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  985. if (Result.IsSuccess)
  986. {
  987. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  988. if (!string.IsNullOrEmpty(responseData.errorsInfo) && !Result.Message.Contains("无报警"))
  989. {
  990. ProductionStatus productionStatus = new ProductionStatus();
  991. productionStatus.id = alarmEquipment.Id.ToString();
  992. productionStatus.ip = onlineDevice.Ip;
  993. productionStatus.alertMsg = responseData.errorsInfo;
  994. productionStatus.alarmState = true;//报警
  995. productionStatus.onlineStatus = "1";
  996. productionStatusList.Add(productionStatus);
  997. }
  998. }
  999. }
  1000. else if (alarmEquipment != null && alarmEquipment.Type == "FANUC")
  1001. {
  1002. Thread.Sleep(1000);
  1003. string Url = fanucUrlContext + "?ip=" + onlineDevice.Ip + "&port=" + onlineDevice.Port;
  1004. //调用发那科接口
  1005. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null);
  1006. if (Result.IsSuccess)
  1007. {
  1008. //ResponseFanucData fncReq = new ResponseFanucData();
  1009. List<AlmInfo> AlmMsg = JsonConvert.DeserializeObject<List<AlmInfo>>(Result.Message);
  1010. //List<AlmInfo> AlmMsg = fncReq.AlmMsg;
  1011. if (AlmMsg != null && AlmMsg.Count > 0)
  1012. {
  1013. var msgs = from o in AlmMsg select o.msg;
  1014. if(msgs != null && !Result.Message.Contains("无报警"))
  1015. {
  1016. ProductionStatus productionStatus = new ProductionStatus();
  1017. productionStatus.id = alarmEquipment.Id.ToString();
  1018. productionStatus.ip = onlineDevice.Ip;
  1019. productionStatus.alertMsg = string.Join(",", msgs.ToArray());
  1020. productionStatus.alarmState = true;//报警
  1021. productionStatus.onlineStatus = "1";
  1022. productionStatusList.Add(productionStatus);
  1023. }
  1024. }
  1025. }
  1026. }
  1027. else if(alarmEquipment != null && onlineDevice.ProtocolType == "S7_1500")
  1028. {
  1029. //缓存取PLCagvalue 值
  1030. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1031. string tag_value_redis_key = imcs_redis_key + onlineDevice.Ip + ":" + onlineDevice.ProtocolType;
  1032. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1033. if (tagData.IsNullOrEmpty)
  1034. {
  1035. CcsTagValue tagQuery = new CcsTagValue();
  1036. tagQuery.ProtocolType = onlineDevice.ProtocolType;
  1037. tagQuery.Ip = onlineDevice.Ip;
  1038. tagValues = _ccsTagValueService.GetList(tagQuery);
  1039. //首次设置redis
  1040. if (tagValues != null && tagValues.Count > 0)
  1041. {
  1042. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  1043. }
  1044. }
  1045. else
  1046. {
  1047. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  1048. }
  1049. //获取机械手报警信息
  1050. CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip == alarmEquipment.IP && x.Address == "DB200.34").FirstOrDefault();
  1051. if (plcWarnValue != null && plcWarnValue.TagValue != "0")
  1052. {
  1053. //从字典中查询具体描述
  1054. List<Dictionary> dictList = new List<Dictionary>() ;
  1055. string dict_value_redis_key = imcs_redis_key + RedisKeyEnum.DictKeyList;
  1056. var dictData = await _redisService.Database.StringGetAsync(dict_value_redis_key);
  1057. if (dictData.IsNullOrEmpty)
  1058. {
  1059. Dictionary ccsDictionary = new Dictionary();
  1060. dictList = await _dictionaryService.GetList(ccsDictionary);
  1061. //首次设置redis
  1062. if (dictList != null && dictList.Count > 0)
  1063. {
  1064. await _redisService.Database.StringSetAsync(dict_value_redis_key, JsonConvert.SerializeObject(dictList));
  1065. }
  1066. }
  1067. else
  1068. {
  1069. dictList = JsonConvert.DeserializeObject<List<Dictionary>>(dictData);
  1070. }
  1071. Dictionary dictObj = dictList.Where(x => x.Type == onlineDevice.Ip && x.Code.ToString() == plcWarnValue.TagValue && x.state).FirstOrDefault();
  1072. if (null != dictObj && !string.IsNullOrEmpty(dictObj.DictValue.Trim()))
  1073. {
  1074. ProductionStatus productionStatus = new ProductionStatus();
  1075. productionStatus.id = alarmEquipment.Id.ToString();
  1076. productionStatus.ip = onlineDevice.Ip;
  1077. productionStatus.alertMsg = dictObj.Description.Trim();
  1078. productionStatus.onlineStatus = "1";
  1079. productionStatus.alarmState = true; //报警
  1080. productionStatusList.Add(productionStatus);
  1081. }
  1082. }
  1083. }
  1084. }
  1085. //推送
  1086. if (productionStatusList != null && productionStatusList.Count > 0)
  1087. {
  1088. //主动推送同步状态数据接口
  1089. RequestSynStatusData requestData = new RequestSynStatusData();
  1090. requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList);
  1091. String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synProductionStatus";
  1092. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null);
  1093. //解析回调数据结果
  1094. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1095. if (responseECSCallback != null && responseECSCallback.code == 0)
  1096. {
  1097. Log.Instance.WriteLogAdd("同步设备状态成功==>" + JsonConvert.SerializeObject(productionStatusList), PLC_ALARM_INFO);
  1098. }
  1099. else
  1100. {
  1101. Log.Instance.WriteLogAdd("同步设备状态操作失败==>:"+JsonConvert.SerializeObject(productionStatusList) + responseECSCallback.msg, PLC_ALARM_INFO);
  1102. }
  1103. }
  1104. return message;
  1105. }
  1106. catch (Exception ex)
  1107. {
  1108. Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, PLC_ALARM_INFO);
  1109. return "MonitorEquipmentStatusJob : " + ex.Message;
  1110. }
  1111. }
  1112. /// <summary>
  1113. /// 监控设备状态
  1114. /// </summary>
  1115. /// <returns></returns>
  1116. public async Task<string> DeviceStatusJob()
  1117. {
  1118. try
  1119. {
  1120. string message = "";
  1121. string all_use_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLUseDeviceList ;
  1122. List<Device> devices = new List<Device>();
  1123. //查询全部使用设备包括在线和不在线
  1124. var deviceListData = await _redisService.Database.StringGetAsync(all_use_device_redis_key);
  1125. if (deviceListData.IsNullOrEmpty)
  1126. {
  1127. devices = _deviceService.GetDeviceAllList();
  1128. await _redisService.Database.StringSetAsync(all_use_device_redis_key, JsonConvert.SerializeObject(devices));
  1129. }
  1130. else
  1131. {
  1132. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1133. }
  1134. //ftp不监控
  1135. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1136. foreach (Device device in devices)
  1137. {
  1138. Ping pingSender = new Ping();
  1139. PingReply reply = pingSender.Send(device.Ip);
  1140. if (reply.Status != IPStatus.Success)
  1141. {
  1142. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1143. if (oldDevice != null && oldDevice.State)
  1144. {
  1145. device.State = false;
  1146. device.DisconnectUpdateTime = DateTime.Now;
  1147. await _deviceService.UpdateAndCache(device);
  1148. }
  1149. Log.Instance.WriteLogAdd(device.Ip + ":" + device.ProtocolType + "连接失败,或已离线", LOG_TITLE_DEVICE);
  1150. message = message + device.Ip + ",连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1151. continue;
  1152. }
  1153. else
  1154. {
  1155. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1156. if (oldDevice != null && !oldDevice.State)
  1157. {
  1158. oldDevice.State = true;
  1159. device.DisconnectUpdateTime = DateTime.Now;
  1160. await _deviceService.UpdateAndCache(oldDevice);
  1161. }
  1162. Log.Instance.WriteLogAdd(device.Ip + ":"+ device.ProtocolType + "连接成功", LOG_TITLE_DEVICE);
  1163. message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1164. continue;
  1165. }
  1166. Thread.Sleep(50);
  1167. }
  1168. return message;
  1169. }
  1170. catch (Exception ex)
  1171. {
  1172. Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE);
  1173. return "设备连接异常,或以离线" + ex.Message;
  1174. }
  1175. }
  1176. /// <summary>
  1177. /// 删除redis
  1178. /// </summary>
  1179. /// <returns></returns>
  1180. public void removeRedis()
  1181. {
  1182. List<Device> devices = _deviceService.GetDeviceAllList();
  1183. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.ALLUseDeviceList);
  1184. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  1185. foreach (Device device in devices)
  1186. {
  1187. _redisService.Database.KeyDelete(imcs_redis_key + device.Ip + ":" + device.ProtocolType);
  1188. }
  1189. }
  1190. /// <summary>
  1191. /// fanuc根据类型获取值
  1192. /// </summary>
  1193. /// <returns></returns>
  1194. private string GetFanucValue(ResponseFanucData fanucData, string address)
  1195. {
  1196. string value = "";
  1197. if (address == FanucAddressEnum.MainProg.ToString())
  1198. {
  1199. value = fanucData.MainProg;
  1200. }
  1201. else if (address == FanucAddressEnum.Status.ToString())
  1202. {
  1203. value = fanucData.Status;
  1204. }
  1205. else if (address == FanucAddressEnum.PowerOnTime.ToString())
  1206. {
  1207. value = fanucData.PowerOnTime;
  1208. }
  1209. else if (address == FanucAddressEnum.ActSpindle.ToString())
  1210. {
  1211. value = fanucData.ActSpindle;
  1212. }
  1213. return value;
  1214. }
  1215. /// <summary>
  1216. /// 数字科学计数法处理
  1217. /// </summary>
  1218. /// <param name="strData"></param>
  1219. /// <returns></returns>
  1220. private Decimal ChangeToDecimal(string strData)
  1221. {
  1222. Decimal dData = 0.0M;
  1223. if (strData.Contains("E"))
  1224. {
  1225. dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float));
  1226. }
  1227. else
  1228. {
  1229. dData = Convert.ToDecimal(strData);
  1230. }
  1231. return dData;
  1232. }
  1233. /// <summary>
  1234. /// 获取redis 设备在线列表
  1235. /// </summary>
  1236. /// <param name="strData"></param>
  1237. /// <returns></returns>
  1238. private async Task<List<Device>> getDeviceList()
  1239. {
  1240. List<Device> deviceList = new List<Device>();
  1241. var deviceListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.DeviceList);
  1242. if (deviceListData.IsNullOrEmpty || deviceListData.Length() == 0)
  1243. {
  1244. deviceList = _deviceService.GetDeviceList();
  1245. await _redisService.Database.StringSetAsync(imcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList));
  1246. }
  1247. else
  1248. {
  1249. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1250. }
  1251. return deviceList;
  1252. }
  1253. }
  1254. }