TaskJobService.cs 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  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. CallBackRequestData requestData = new CallBackRequestData();
  308. requestData.taskId = long.Parse(task.TaskId);
  309. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  310. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  311. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  312. if (result.IsSuccess && responseECSCallback.code == 0)
  313. {
  314. task.State = false;
  315. task.UpdateTime = DateTime.Now;
  316. await _taskCallbackService.CreateOrUpdateAndCache(task);
  317. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  318. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  319. }
  320. else
  321. {
  322. //ecs返回-5 任务作废
  323. if(result.IsSuccess && responseECSCallback.code == -5)
  324. {
  325. task.State = false;
  326. task.UpdateTime = DateTime.Now;
  327. task.Description = "ecs返回-5,回调任务作废";
  328. await _taskCallbackService.CreateOrUpdateAndCache(task);
  329. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  330. Log.Instance.WriteLogAdd("回调异常,请求接口失败,ecs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  331. }
  332. else
  333. {
  334. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  335. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  336. }
  337. }
  338. //执行位清零
  339. SiemensS7Net s7 = DevicePlcS7.SiemensS7(task.IP);
  340. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  341. if (ConnectionResult.IsSuccess)
  342. {
  343. s7.Write("DB2.10", Convert.ToInt16("0"));
  344. }
  345. s7.ConnectClose();
  346. }
  347. //回调检测到失败,回调通知ecs
  348. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  349. {
  350. bool failFalg = false;
  351. if (!string.IsNullOrEmpty(task.FailAddress))
  352. {
  353. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  354. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  355. {
  356. failFalg = true;
  357. }
  358. }
  359. if (!string.IsNullOrEmpty(task.FailAddress2))
  360. {
  361. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  362. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  363. {
  364. failFalg = true;
  365. }
  366. }
  367. if (!string.IsNullOrEmpty(task.FailAddress3))
  368. {
  369. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  370. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  371. {
  372. failFalg = true;
  373. }
  374. }
  375. if (failFalg)
  376. {
  377. CallBackRequestData requestData = new CallBackRequestData();
  378. requestData.taskId = long.Parse(task.TaskId);
  379. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  380. requestData.code = "0";
  381. requestData.msg = "操作失败";
  382. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  383. if (result.IsSuccess)
  384. {
  385. task.State = false;
  386. task.UpdateTime = DateTime.Now;
  387. await _taskCallbackService.CreateOrUpdateAndCache(task);
  388. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  389. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  390. }
  391. else
  392. {
  393. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  394. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  395. }
  396. }
  397. }
  398. Thread.Sleep(1000);
  399. }
  400. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  401. }
  402. catch (Exception ex)
  403. {
  404. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  405. return "回调异常" + ex.Message;
  406. }
  407. }
  408. /// <summary>
  409. /// 读写回调任务
  410. /// </summary>
  411. /// <returns></returns>
  412. public async Task<string> CallbackJob3()
  413. {
  414. List<TaskCallback> taskList = new List<TaskCallback>();
  415. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  416. if (taskCallbackListData.IsNullOrEmpty)
  417. {
  418. taskList = await _taskCallbackService.GetAllList();
  419. }
  420. else
  421. {
  422. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  423. }
  424. List<Device> deviceList = await getDeviceList();
  425. //在线设备
  426. taskList = taskList.Where(x => (x.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString())
  427. || x.OperateType.Equals(ActionTypeEnum.WriteRFID.ToString())) && x.State).ToList();
  428. TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  429. if (task == null)
  430. {
  431. return "无回调任务";
  432. }
  433. string message = "";
  434. try
  435. {
  436. DateTime currentTime = DateTime.Now;
  437. CcsTagValue tagValueQuery = new CcsTagValue();
  438. tagValueQuery.Ip = task.IP;
  439. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  440. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  441. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue )
  442. {
  443. CcsTagValue callBacktagValue2 = null;
  444. if (task.OperateType.Equals(ActionTypeEnum.ReadRFID.ToString())){
  445. callBacktagValue2 = tagValues.Where(o => o.Address == task.Address2).FirstOrDefault();
  446. }
  447. CallBackRequestData requestData = new CallBackRequestData();
  448. requestData.taskId = long.Parse(task.TaskId);
  449. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  450. //读RFID的值返回ecs
  451. if (callBacktagValue2 != null)
  452. {
  453. requestData.content = callBacktagValue2.TagValue;
  454. }
  455. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  456. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  457. if (result.IsSuccess && responseECSCallback.code == 0)
  458. {
  459. task.State = false;
  460. task.UpdateTime = DateTime.Now;
  461. await _taskCallbackService.CreateOrUpdateAndCache(task);
  462. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  463. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  464. }
  465. else
  466. {
  467. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  468. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  469. }
  470. }
  471. //回调检测到失败,回调通知ecs
  472. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  473. {
  474. bool failFalg = false;
  475. if (!string.IsNullOrEmpty(task.FailAddress))
  476. {
  477. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  478. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  479. {
  480. failFalg = true;
  481. }
  482. }
  483. if (!string.IsNullOrEmpty(task.FailAddress2))
  484. {
  485. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  486. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  487. {
  488. failFalg = true;
  489. }
  490. }
  491. if (!string.IsNullOrEmpty(task.FailAddress3))
  492. {
  493. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  494. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  495. {
  496. failFalg = true;
  497. }
  498. }
  499. if (failFalg)
  500. {
  501. CallBackRequestData requestData = new CallBackRequestData();
  502. requestData.taskId = long.Parse(task.TaskId);
  503. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  504. requestData.code = "0";
  505. requestData.msg = "操作失败";
  506. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  507. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  508. if (result.IsSuccess && responseECSCallback.code == 0)
  509. {
  510. task.State = false;
  511. task.UpdateTime = DateTime.Now;
  512. await _taskCallbackService.CreateOrUpdateAndCache(task);
  513. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  514. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  515. }
  516. else
  517. {
  518. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  519. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  520. }
  521. }
  522. }
  523. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  524. }
  525. catch (Exception ex)
  526. {
  527. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  528. return "回调异常" + ex.Message;
  529. }
  530. }
  531. /// <summary>
  532. /// 启动机床程序回调任务
  533. /// </summary>
  534. /// <returns></returns>
  535. public async Task<string> CallbackJob4()
  536. {
  537. List<TaskCallback> taskList = new List<TaskCallback>();
  538. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  539. if (taskCallbackListData.IsNullOrEmpty)
  540. {
  541. taskList = await _taskCallbackService.GetAllList();
  542. }
  543. else
  544. {
  545. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  546. }
  547. List<Device> deviceList = await getDeviceList();
  548. //在线设备
  549. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  550. if (taskList == null || taskList.Count == 0)
  551. {
  552. return "无回调任务";
  553. }
  554. string message = "";
  555. try
  556. {
  557. DateTime currentTime = DateTime.Now;
  558. foreach (TaskCallback task in taskList)
  559. {
  560. CcsTagValue tagValueQuery = new CcsTagValue();
  561. tagValueQuery.Ip = task.IP;
  562. //tagValueQuery.Address = task.Address;
  563. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  564. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address.Trim()).FirstOrDefault();
  565. if (tagValue != null && tagValue.TagValue == task.CallbackValue )
  566. {
  567. CallBackRequestData requestData = new CallBackRequestData();
  568. requestData.taskId = long.Parse(task.TaskId);
  569. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  570. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  571. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  572. if (result.IsSuccess && responseECSCallback.code == 0)
  573. {
  574. task.State = false;
  575. task.UpdateTime = DateTime.Now;
  576. await _taskCallbackService.CreateOrUpdateAndCache(task);
  577. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  578. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  579. }
  580. else
  581. {
  582. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  583. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  584. }
  585. }
  586. //回调检测到失败,回调通知ecs
  587. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  588. {
  589. bool failFalg = false;
  590. if (!string.IsNullOrEmpty(task.FailAddress))
  591. {
  592. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  593. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  594. {
  595. failFalg = true;
  596. }
  597. }
  598. if (!string.IsNullOrEmpty(task.FailAddress2))
  599. {
  600. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  601. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  602. {
  603. failFalg = true;
  604. }
  605. }
  606. if (!string.IsNullOrEmpty(task.FailAddress3))
  607. {
  608. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  609. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  610. {
  611. failFalg = true;
  612. }
  613. }
  614. if (failFalg)
  615. {
  616. CallBackRequestData requestData = new CallBackRequestData();
  617. requestData.taskId = long.Parse(task.TaskId);
  618. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  619. requestData.code = "0";
  620. requestData.msg = "操作失败";
  621. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  622. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  623. if (result.IsSuccess && responseECSCallback.code == 0)
  624. {
  625. task.State = false;
  626. task.UpdateTime = DateTime.Now;
  627. await _taskCallbackService.CreateOrUpdateAndCache(task);
  628. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  629. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  630. }
  631. else
  632. {
  633. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  634. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  635. }
  636. }
  637. }
  638. Thread.Sleep(1000);
  639. }
  640. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  641. }
  642. catch (Exception ex)
  643. {
  644. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  645. return "回调异常" + ex.Message;
  646. }
  647. }
  648. /// <summary>
  649. /// 启动清洗机回调任务
  650. /// </summary>
  651. /// <returns></returns>
  652. public async Task<string> CallbackJob5()
  653. {
  654. List<TaskCallback> taskList = new List<TaskCallback>();
  655. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  656. if (taskCallbackListData.IsNullOrEmpty)
  657. {
  658. taskList = await _taskCallbackService.GetAllList();
  659. }
  660. else
  661. {
  662. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  663. }
  664. List<Device> deviceList = await getDeviceList();
  665. //在线设备
  666. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCleanMachine.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  667. // TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  668. if (taskList == null || taskList.Count == 0)
  669. {
  670. return "无回调任务";
  671. }
  672. string message = "";
  673. try
  674. {
  675. DateTime currentTime = DateTime.Now;
  676. foreach (TaskCallback task in taskList)
  677. {
  678. CcsTagValue tagValueQuery = new CcsTagValue();
  679. tagValueQuery.Ip = task.IP;
  680. //tagValueQuery.Address = task.Address;
  681. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  682. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  683. if (tagValue != null && tagValue.TagValue == task.CallbackValue)
  684. //临时处理以解决ecs配置问题
  685. //if(currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  686. {
  687. CallBackRequestData requestData = new CallBackRequestData();
  688. requestData.taskId = long.Parse(task.TaskId);
  689. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  690. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  691. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  692. if (result.IsSuccess && responseECSCallback.code == 0)
  693. {
  694. task.State = false;
  695. task.UpdateTime = DateTime.Now;
  696. await _taskCallbackService.CreateOrUpdateAndCache(task);
  697. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  698. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  699. }
  700. else
  701. {
  702. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  703. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  704. }
  705. }
  706. //回调检测到失败,回调通知ecs
  707. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  708. {
  709. bool failFalg = false;
  710. if (!string.IsNullOrEmpty(task.FailAddress))
  711. {
  712. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  713. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  714. {
  715. failFalg = true;
  716. }
  717. }
  718. if (!string.IsNullOrEmpty(task.FailAddress2))
  719. {
  720. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  721. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  722. {
  723. failFalg = true;
  724. }
  725. }
  726. if (!string.IsNullOrEmpty(task.FailAddress3))
  727. {
  728. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  729. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  730. {
  731. failFalg = true;
  732. }
  733. }
  734. if (failFalg)
  735. {
  736. CallBackRequestData requestData = new CallBackRequestData();
  737. requestData.taskId = long.Parse(task.TaskId);
  738. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  739. requestData.code = "0";
  740. requestData.msg = "操作失败";
  741. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  742. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  743. if (result.IsSuccess && responseECSCallback.code == 0)
  744. {
  745. task.State = false;
  746. task.UpdateTime = DateTime.Now;
  747. await _taskCallbackService.CreateOrUpdateAndCache(task);
  748. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  749. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  750. }
  751. else
  752. {
  753. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  754. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  755. }
  756. }
  757. }
  758. Thread.Sleep(1000);
  759. }
  760. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  761. }
  762. catch (Exception ex)
  763. {
  764. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  765. return "回调异常" + ex.Message;
  766. }
  767. }
  768. /// <summary>
  769. /// 监控设备状态
  770. /// </summary>
  771. /// <returns></returns>
  772. public async Task<string> MonitorEquipmentStatusJob()
  773. {
  774. try
  775. {
  776. string message = "MonitorEquipmentStatusJob调度成功";
  777. //查询全部使用设备包括不在线和离线
  778. string all_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLDeviceList ;
  779. List<Device> devices = new List<Device>();
  780. var deviceListData = await _redisService.Database.StringGetAsync(all_device_redis_key);
  781. if (deviceListData.IsNullOrEmpty)
  782. {
  783. devices = _deviceService.GetDevices();
  784. await _redisService.Database.StringSetAsync(all_device_redis_key, JsonConvert.SerializeObject(devices));
  785. }
  786. else
  787. {
  788. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  789. }
  790. List<EquipmentMonitor> equipmentMonitors = new List<EquipmentMonitor>();
  791. string equipment_monitors_redis_key = imcs_redis_key + RedisKeyEnum.MonitorEquipmentStatusJob;
  792. var data = await _redisService.Database.StringGetAsync(equipment_monitors_redis_key);
  793. if (data.IsNullOrEmpty)
  794. {
  795. equipmentMonitors = await _equipmentMonitorService.GetList();
  796. //首次设置redis
  797. if (equipmentMonitors != null && equipmentMonitors.Count > 0)
  798. {
  799. await _redisService.Database.StringSetAsync(equipment_monitors_redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  800. }
  801. }
  802. else
  803. {
  804. equipmentMonitors = JsonConvert.DeserializeObject<List<EquipmentMonitor>>(data);
  805. }
  806. //变化的设备
  807. List<EquipmentMonitor> changeEquipmentMonitors = new List<EquipmentMonitor>();
  808. foreach (EquipmentMonitor equipment in equipmentMonitors)
  809. {
  810. Device device = devices.Where(x => x.Ip == equipment.IP).FirstOrDefault();
  811. //缓存取PLC tagvalue 值
  812. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  813. if(device == null)
  814. {
  815. continue;
  816. }
  817. string tag_value_redis_key = imcs_redis_key + device.Ip + ":" + device.ProtocolType;
  818. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  819. if (tagData.IsNullOrEmpty)
  820. {
  821. CcsTagValue tagQuery = new CcsTagValue();
  822. tagQuery.ProtocolType = device.ProtocolType;
  823. tagQuery.Ip = device.Ip;
  824. tagValues = _ccsTagValueService.GetList(tagQuery);
  825. //首次设置redis
  826. if (tagValues != null && tagValues.Count > 0)
  827. {
  828. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  829. }
  830. }
  831. else
  832. {
  833. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  834. }
  835. CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  836. if (device != null && !device.UseState)
  837. {
  838. if (equipment.Status != "离线")
  839. {
  840. equipment.Status = "离线";
  841. changeEquipmentMonitors.Add(equipment);
  842. }
  843. continue;
  844. }
  845. else if(device != null && !device.State)
  846. {
  847. if (equipment.Status != "掉线")
  848. {
  849. equipment.Status = "掉线";
  850. changeEquipmentMonitors.Add(equipment);
  851. }
  852. continue;
  853. }
  854. else if (device != null && device.State && device.UseState && (equipment.Type == "HEIDEHAIN" || equipment.Type == "FANUC"))
  855. {
  856. //通过数组获取机床对应的PLC ip地址
  857. string plcIp = jcIpDict[device.Ip];
  858. string ktRedisKey = imcs_redis_key + plcIp + ":" + ProtocalTypeEnum.S7_1500;
  859. string plcAddress = jcAddressDict[device.Ip];
  860. var ktTagData = await _redisService.Database.StringGetAsync(ktRedisKey);
  861. List<CcsTagValue> ktTagValues = new List<CcsTagValue>();
  862. if (ktTagData.IsNullOrEmpty)
  863. {
  864. CcsTagValue tagQuery = new CcsTagValue();
  865. tagQuery.ProtocolType = ProtocalTypeEnum.S7_1500.ToString();
  866. tagQuery.Ip = plcIp;
  867. ktTagValues = _ccsTagValueService.GetList(tagQuery);
  868. //首次设置redis
  869. if (ktTagValues != null && ktTagValues.Count > 0)
  870. {
  871. await _redisService.Database.StringSetAsync(ktRedisKey, JsonConvert.SerializeObject(ktTagValues));
  872. }
  873. }
  874. else
  875. {
  876. ktTagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(ktTagData);
  877. }
  878. CcsTagValue ktTagValue = ktTagValues.Where(x => x.Ip.Trim() == plcIp && x.Address.Trim() == plcAddress).FirstOrDefault();
  879. if(ktTagValue != null)
  880. {
  881. if (ktTagValue.TagValue == "1")
  882. {
  883. if (equipment.Status != "生产中")
  884. {
  885. equipment.Status = "生产中";
  886. changeEquipmentMonitors.Add(equipment);
  887. }
  888. continue;
  889. }
  890. if (ktTagValue.TagValue == "2")
  891. {
  892. if (equipment.Status != "空闲")
  893. {
  894. equipment.Status = "空闲";
  895. changeEquipmentMonitors.Add(equipment);
  896. }
  897. continue;
  898. }
  899. }
  900. }
  901. else if (device != null && (equipment.Name == "机械手" || equipment.Name == "保障中心_伺服舵机"))
  902. {
  903. ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  904. if (ccsTagValue != null)
  905. {
  906. if (ccsTagValue.TagValue == "3")
  907. {
  908. if (equipment.Status != "报警")
  909. {
  910. equipment.Status = "报警";
  911. changeEquipmentMonitors.Add(equipment);
  912. }
  913. continue;
  914. }
  915. }
  916. CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address2).FirstOrDefault();
  917. if (ccsTagValue2 != null)
  918. {
  919. if (ccsTagValue2.TagValue == "9")
  920. {
  921. if (equipment.Status != "报警")
  922. {
  923. equipment.Status = "报警";
  924. changeEquipmentMonitors.Add(equipment);
  925. }
  926. continue;
  927. }
  928. }
  929. if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8")
  930. {
  931. if (equipment.Status != "空闲")
  932. {
  933. equipment.Status = "空闲";
  934. changeEquipmentMonitors.Add(equipment);
  935. }
  936. continue;
  937. }
  938. if (equipment.Status != "生产中")
  939. {
  940. equipment.Status = "生产中";
  941. changeEquipmentMonitors.Add(equipment);
  942. }
  943. }
  944. else
  945. {
  946. if (equipment.Status != "在线")
  947. {
  948. equipment.Status = "在线";
  949. changeEquipmentMonitors.Add(equipment);
  950. }
  951. }
  952. }
  953. //初始化推送列表
  954. List<ProductionStatus> productionStatusList = new List<ProductionStatus>();
  955. //变化的修改 并且更新缓存
  956. if (changeEquipmentMonitors.Count > 0)
  957. {
  958. foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors)
  959. {
  960. ProductionStatus productionStatus = new ProductionStatus();
  961. productionStatus.id = changeEquipment.Id.ToString();
  962. productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString();
  963. productionStatusList.Add(productionStatus);
  964. }
  965. //修改并重置缓存
  966. await _equipmentMonitorService.UpdateAndCache(equipmentMonitors);
  967. }
  968. //在线设备,报警放入推送数组
  969. List<Device> onlineDeviceList = await getDeviceList();
  970. foreach (Device onlineDevice in onlineDeviceList)
  971. {
  972. EquipmentMonitor alarmEquipment = equipmentMonitors.Where(x => x.IP == onlineDevice.Ip && x.Type == onlineDevice.ProtocolType).FirstOrDefault();
  973. if (alarmEquipment != null && alarmEquipment.Type == "HEIDEHAIN")
  974. {
  975. Thread.Sleep(1000);
  976. RequestHeidhData hdhReq = new RequestHeidhData();
  977. hdhReq.ServerUrl = onlineDevice.ServerUrl;
  978. hdhReq.MachineName = onlineDevice.UserName;
  979. hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString();
  980. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  981. if (Result.IsSuccess)
  982. {
  983. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  984. if (!string.IsNullOrEmpty(responseData.errorsInfo) && !Result.Message.Contains("无报警"))
  985. {
  986. ProductionStatus productionStatus = new ProductionStatus();
  987. productionStatus.id = alarmEquipment.Id.ToString();
  988. productionStatus.ip = onlineDevice.Ip;
  989. productionStatus.alertMsg = responseData.errorsInfo;
  990. productionStatus.alarmState = true;//报警
  991. productionStatus.onlineStatus = "1";
  992. productionStatusList.Add(productionStatus);
  993. }
  994. }
  995. }
  996. else if (alarmEquipment != null && alarmEquipment.Type == "FANUC")
  997. {
  998. Thread.Sleep(1000);
  999. string Url = fanucUrlContext + "?ip=" + onlineDevice.Ip + "&port=" + onlineDevice.Port;
  1000. //调用发那科接口
  1001. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null);
  1002. if (Result.IsSuccess)
  1003. {
  1004. //ResponseFanucData fncReq = new ResponseFanucData();
  1005. List<AlmInfo> AlmMsg = JsonConvert.DeserializeObject<List<AlmInfo>>(Result.Message);
  1006. //List<AlmInfo> AlmMsg = fncReq.AlmMsg;
  1007. if (AlmMsg != null && AlmMsg.Count > 0)
  1008. {
  1009. var msgs = from o in AlmMsg select o.msg;
  1010. if(msgs != null && !Result.Message.Contains("无报警"))
  1011. {
  1012. ProductionStatus productionStatus = new ProductionStatus();
  1013. productionStatus.id = alarmEquipment.Id.ToString();
  1014. productionStatus.ip = onlineDevice.Ip;
  1015. productionStatus.alertMsg = string.Join(",", msgs.ToArray());
  1016. productionStatus.alarmState = true;//报警
  1017. productionStatus.onlineStatus = "1";
  1018. productionStatusList.Add(productionStatus);
  1019. }
  1020. }
  1021. }
  1022. }
  1023. else if(alarmEquipment != null && onlineDevice.ProtocolType == "S7_1500")
  1024. {
  1025. //缓存取PLCagvalue 值
  1026. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1027. string tag_value_redis_key = imcs_redis_key + onlineDevice.Ip + ":" + onlineDevice.ProtocolType;
  1028. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1029. if (tagData.IsNullOrEmpty)
  1030. {
  1031. CcsTagValue tagQuery = new CcsTagValue();
  1032. tagQuery.ProtocolType = onlineDevice.ProtocolType;
  1033. tagQuery.Ip = onlineDevice.Ip;
  1034. tagValues = _ccsTagValueService.GetList(tagQuery);
  1035. //首次设置redis
  1036. if (tagValues != null && tagValues.Count > 0)
  1037. {
  1038. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  1039. }
  1040. }
  1041. else
  1042. {
  1043. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  1044. }
  1045. //获取机械手报警信息
  1046. CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip == alarmEquipment.IP && x.Address == "DB200.34").FirstOrDefault();
  1047. if (plcWarnValue != null && plcWarnValue.TagValue != "0")
  1048. {
  1049. //从字典中查询具体描述
  1050. List<Dictionary> dictList = new List<Dictionary>() ;
  1051. string dict_value_redis_key = imcs_redis_key + RedisKeyEnum.DictKeyList;
  1052. var dictData = await _redisService.Database.StringGetAsync(dict_value_redis_key);
  1053. if (dictData.IsNullOrEmpty)
  1054. {
  1055. Dictionary ccsDictionary = new Dictionary();
  1056. dictList = await _dictionaryService.GetList(ccsDictionary);
  1057. //首次设置redis
  1058. if (dictList != null && dictList.Count > 0)
  1059. {
  1060. await _redisService.Database.StringSetAsync(dict_value_redis_key, JsonConvert.SerializeObject(dictList));
  1061. }
  1062. }
  1063. else
  1064. {
  1065. dictList = JsonConvert.DeserializeObject<List<Dictionary>>(dictData);
  1066. }
  1067. Dictionary dictObj = dictList.Where(x => x.Type == onlineDevice.Ip && x.Code.ToString() == plcWarnValue.TagValue && x.state).FirstOrDefault();
  1068. if (null != dictObj && !string.IsNullOrEmpty(dictObj.DictValue.Trim()))
  1069. {
  1070. ProductionStatus productionStatus = new ProductionStatus();
  1071. productionStatus.id = alarmEquipment.Id.ToString();
  1072. productionStatus.ip = onlineDevice.Ip;
  1073. productionStatus.alertMsg = dictObj.Description.Trim();
  1074. productionStatus.onlineStatus = "1";
  1075. productionStatus.alarmState = true; //报警
  1076. productionStatusList.Add(productionStatus);
  1077. }
  1078. }
  1079. }
  1080. }
  1081. //推送
  1082. if (productionStatusList != null && productionStatusList.Count > 0)
  1083. {
  1084. //主动推送同步状态数据接口
  1085. RequestSynStatusData requestData = new RequestSynStatusData();
  1086. requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList);
  1087. String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synProductionStatus";
  1088. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null);
  1089. //解析回调数据结果
  1090. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1091. if (responseECSCallback != null && responseECSCallback.code == 0)
  1092. {
  1093. Log.Instance.WriteLogAdd("同步设备状态成功==>" + JsonConvert.SerializeObject(productionStatusList), PLC_ALARM_INFO);
  1094. }
  1095. else
  1096. {
  1097. Log.Instance.WriteLogAdd("同步设备状态操作失败==>:"+JsonConvert.SerializeObject(productionStatusList) + responseECSCallback.msg, PLC_ALARM_INFO);
  1098. }
  1099. }
  1100. return message;
  1101. }
  1102. catch (Exception ex)
  1103. {
  1104. Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, PLC_ALARM_INFO);
  1105. return "MonitorEquipmentStatusJob : " + ex.Message;
  1106. }
  1107. }
  1108. /// <summary>
  1109. /// 监控设备状态
  1110. /// </summary>
  1111. /// <returns></returns>
  1112. public async Task<string> DeviceStatusJob()
  1113. {
  1114. try
  1115. {
  1116. string message = "";
  1117. string all_use_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLUseDeviceList ;
  1118. List<Device> devices = new List<Device>();
  1119. //查询全部使用设备包括在线和不在线
  1120. var deviceListData = await _redisService.Database.StringGetAsync(all_use_device_redis_key);
  1121. if (deviceListData.IsNullOrEmpty)
  1122. {
  1123. devices = _deviceService.GetDeviceAllList();
  1124. await _redisService.Database.StringSetAsync(all_use_device_redis_key, JsonConvert.SerializeObject(devices));
  1125. }
  1126. else
  1127. {
  1128. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1129. }
  1130. //ftp不监控
  1131. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1132. foreach (Device device in devices)
  1133. {
  1134. Ping pingSender = new Ping();
  1135. PingReply reply = pingSender.Send(device.Ip);
  1136. if (reply.Status != IPStatus.Success)
  1137. {
  1138. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1139. if (oldDevice != null && oldDevice.State)
  1140. {
  1141. device.State = false;
  1142. device.DisconnectUpdateTime = DateTime.Now;
  1143. await _deviceService.UpdateAndCache(device);
  1144. }
  1145. Log.Instance.WriteLogAdd(device.Ip + ":" + device.ProtocolType + "连接失败,或已离线", LOG_TITLE_DEVICE);
  1146. message = message + device.Ip + ",连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1147. continue;
  1148. }
  1149. else
  1150. {
  1151. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1152. if (oldDevice != null && !oldDevice.State)
  1153. {
  1154. oldDevice.State = true;
  1155. device.DisconnectUpdateTime = DateTime.Now;
  1156. await _deviceService.UpdateAndCache(oldDevice);
  1157. }
  1158. Log.Instance.WriteLogAdd(device.Ip + ":"+ device.ProtocolType + "连接成功", LOG_TITLE_DEVICE);
  1159. message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1160. continue;
  1161. }
  1162. Thread.Sleep(50);
  1163. }
  1164. return message;
  1165. }
  1166. catch (Exception ex)
  1167. {
  1168. Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE);
  1169. return "设备连接异常,或以离线" + ex.Message;
  1170. }
  1171. }
  1172. /// <summary>
  1173. /// 删除redis
  1174. /// </summary>
  1175. /// <returns></returns>
  1176. public void removeRedis()
  1177. {
  1178. List<Device> devices = _deviceService.GetDeviceAllList();
  1179. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.ALLUseDeviceList);
  1180. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  1181. foreach (Device device in devices)
  1182. {
  1183. _redisService.Database.KeyDelete(imcs_redis_key + device.Ip + ":" + device.ProtocolType);
  1184. }
  1185. }
  1186. /// <summary>
  1187. /// fanuc根据类型获取值
  1188. /// </summary>
  1189. /// <returns></returns>
  1190. private string GetFanucValue(ResponseFanucData fanucData, string address)
  1191. {
  1192. string value = "";
  1193. if (address == FanucAddressEnum.MainProg.ToString())
  1194. {
  1195. value = fanucData.MainProg;
  1196. }
  1197. else if (address == FanucAddressEnum.Status.ToString())
  1198. {
  1199. value = fanucData.Status;
  1200. }
  1201. else if (address == FanucAddressEnum.PowerOnTime.ToString())
  1202. {
  1203. value = fanucData.PowerOnTime;
  1204. }
  1205. else if (address == FanucAddressEnum.ActSpindle.ToString())
  1206. {
  1207. value = fanucData.ActSpindle;
  1208. }
  1209. return value;
  1210. }
  1211. /// <summary>
  1212. /// 数字科学计数法处理
  1213. /// </summary>
  1214. /// <param name="strData"></param>
  1215. /// <returns></returns>
  1216. private Decimal ChangeToDecimal(string strData)
  1217. {
  1218. Decimal dData = 0.0M;
  1219. if (strData.Contains("E"))
  1220. {
  1221. dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float));
  1222. }
  1223. else
  1224. {
  1225. dData = Convert.ToDecimal(strData);
  1226. }
  1227. return dData;
  1228. }
  1229. /// <summary>
  1230. /// 获取redis 设备在线列表
  1231. /// </summary>
  1232. /// <param name="strData"></param>
  1233. /// <returns></returns>
  1234. private async Task<List<Device>> getDeviceList()
  1235. {
  1236. List<Device> deviceList = new List<Device>();
  1237. var deviceListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.DeviceList);
  1238. if (deviceListData.IsNullOrEmpty || deviceListData.Length() == 0)
  1239. {
  1240. deviceList = _deviceService.GetDeviceList();
  1241. await _redisService.Database.StringSetAsync(imcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList));
  1242. }
  1243. else
  1244. {
  1245. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1246. }
  1247. return deviceList;
  1248. }
  1249. }
  1250. }