TaskJobService.cs 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547
  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.Services;
  7. using IMCS_CCS.Model.vo;
  8. using IMCS_CCS.Utils;
  9. using IMCS_CCS.Utils.DeviceProtocol;
  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. namespace IMCS.CCS.Service.Impl
  19. {
  20. /// <summary>
  21. /// 任务调度服务
  22. /// </summary>
  23. public class TaskJobService : ITaskJobService
  24. {
  25. private readonly IRedisService _redisService;
  26. private readonly IDeviceService _deviceService;
  27. private readonly IApiRequestService _apiRequestService;
  28. private readonly ITaskCallbackService _taskCallbackService;
  29. private readonly ICcsTagValueService _ccsTagValueService;
  30. private readonly IEquipmentMonitorService _equipmentMonitorService;
  31. private string ecsUrlContext;
  32. private string fanucUrlContext;
  33. private string opcuacUrlContext;
  34. private string hdhUrlContext;
  35. private string LOG_TITLE_OPCUA = "OPCUA采集";
  36. private string LOG_TITLE_S7 = "S7采集";
  37. private string LOG_TITLE_CALLBACK = "回调任务";
  38. private string LOG_TITLE_DEVICE = "设备监控";
  39. private string callback_redis_key = "IMCS_CCS:CallbackTaskList";
  40. private string device_redis_key = "IMCS_CCS:DeviceList";
  41. public IConfiguration Configuration { get; }
  42. public TaskJobService(IRedisService redisService,
  43. ITaskCallbackService taskCallbackService,
  44. IDeviceService deviceService,
  45. IApiRequestService apiRequestService,
  46. ICcsTagValueService ccsTagValueService,
  47. IEquipmentMonitorService equipmentMonitorService,
  48. IConfiguration configuration)
  49. {
  50. _redisService = redisService;
  51. _taskCallbackService = taskCallbackService;
  52. _deviceService = deviceService;
  53. _apiRequestService = apiRequestService;
  54. _ccsTagValueService = ccsTagValueService;
  55. _equipmentMonitorService = equipmentMonitorService;
  56. Configuration = configuration;
  57. ecsUrlContext = Configuration.GetConnectionString("ecsUrlContext");
  58. fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
  59. opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
  60. hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext");
  61. }
  62. /// <summary>
  63. /// 采集数据OPCUA
  64. /// </summary>
  65. /// <returns></returns>
  66. public async Task<string> DataCollectOPCUAJob()
  67. {
  68. try
  69. {
  70. List<Device> deviceList = new List<Device>();
  71. var deviceListData = await _redisService.Database.StringGetAsync(device_redis_key);
  72. if (deviceListData.IsNullOrEmpty)
  73. {
  74. deviceList = _deviceService.GetDeviceList();
  75. await _redisService.Database.StringSetAsync(device_redis_key, JsonConvert.SerializeObject(deviceList));
  76. }
  77. else
  78. {
  79. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  80. }
  81. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString())).ToList();
  82. foreach (Device device in deviceList)
  83. {
  84. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  85. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  86. var data = await _redisService.Database.StringGetAsync(redis_key);
  87. if (data.IsNullOrEmpty)
  88. {
  89. CcsTagValue tagQuery = new CcsTagValue();
  90. tagQuery.ProtocolType = device.ProtocolType;
  91. tagQuery.Ip = device.Ip;
  92. tagValues = _ccsTagValueService.GetList(tagQuery);
  93. //首次设置redis
  94. if (tagValues != null && tagValues.Count > 0)
  95. {
  96. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  97. }
  98. }
  99. else
  100. {
  101. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  102. }
  103. if (tagValues != null && tagValues.Count > 0)
  104. {
  105. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  106. List<string> addresses = new List<string>();
  107. foreach (CcsTagValue tagValue in tagValues)
  108. {
  109. addresses.Add(tagValue.Address);
  110. }
  111. //调用opcua是否连接接口
  112. RequestOpcUaData opcUaReq = new RequestOpcUaData();
  113. opcUaReq.ServerUrl = device.ServerUrl;
  114. opcUaReq.UserName = device.UserName;
  115. opcUaReq.Password = device.Password;
  116. opcUaReq.Type = OpcUaActionTypeEnum.Read.ToString();
  117. opcUaReq.Addresses = addresses;
  118. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  119. ResponseOpcUaData responseOpcUaData = JsonConvert.DeserializeObject<ResponseOpcUaData>(Result.Message);
  120. if (!Result.IsSuccess || !responseOpcUaData.result)
  121. {
  122. device.State = false;
  123. await _deviceService.UpdateDevice(device);
  124. Log.Instance.WriteLogAdd("OpcUA采集异常,连不上设备", LOG_TITLE_OPCUA);
  125. return "采集失败,连不上设备";
  126. }
  127. List<string> values = responseOpcUaData.values;
  128. if (values != null)
  129. {
  130. for (int i = 0; i < tagValues.Count; i++)
  131. {
  132. CcsTagValue tagValueData = (CcsTagValue)tagValues[i];
  133. //科学计数法转换
  134. if (values[i].Contains("E") && tagValueData.Type == TagValueReadTypeEnum.Double.ToString())
  135. {
  136. Decimal d = ChangeToDecimal(values[i]);
  137. values[i] = d.ToString();
  138. }
  139. if (tagValueData.TagValue != values[i])
  140. {
  141. tagValueData.TagValue = values[i];
  142. tagValueData.UpdateTime = DateTime.Now;
  143. changTagValues.Add(tagValueData);
  144. Log.Instance.WriteLogAdd("OpcUA采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_OPCUA);
  145. //有变化更新数据库
  146. await _ccsTagValueService.Update(tagValueData);
  147. }
  148. }
  149. }
  150. //值有变化,重新设置一次redis
  151. if (changTagValues != null && changTagValues.Count > 0)
  152. {
  153. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  154. }
  155. CcsTagValue tagQuery = new CcsTagValue();
  156. tagQuery.ProtocolType = device.ProtocolType;
  157. tagQuery.Ip = device.Ip;
  158. tagValues = _ccsTagValueService.GetList(tagQuery);
  159. //机床复位
  160. CcsTagValue tagValue1 = tagValues.Where(t => t.Address == "ns=2;s=/Plc/M1500.2").FirstOrDefault();
  161. CcsTagValue tagValue2 = tagValues.Where(t => t.Address == "ns=2;s=/Plc/M1500.4").FirstOrDefault();
  162. if (tagValue1.TagValue == "True" && tagValue2.TagValue == "True")
  163. {
  164. opcUaReq.Addresses = new List<string>() { "ns=2;s=/Plc/M1999.1" };
  165. opcUaReq.Values = new List<string>() { "False" };
  166. opcUaReq.Type = OpcUaActionTypeEnum.Write.ToString();
  167. await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  168. }
  169. }
  170. else
  171. {
  172. Log.Instance.WriteLogAdd("OpcUA采集异常,没有采集数据===", LOG_TITLE_OPCUA);
  173. return "没有采集数据";
  174. }
  175. }
  176. return "OpcUA采集成功";
  177. }
  178. catch (Exception ex)
  179. {
  180. Log.Instance.WriteLogAdd("OpcUA采集异常===>>" + ex.Message, LOG_TITLE_OPCUA);
  181. return "OpcUA采集失败";
  182. }
  183. }
  184. /// <summary>
  185. /// 采集数据S7
  186. /// </summary>
  187. /// <returns></returns>
  188. public async Task<string> DataCollectS7Job()
  189. {
  190. try
  191. {
  192. List<Device> deviceList = new List<Device>();
  193. var deviceListData = await _redisService.Database.StringGetAsync(device_redis_key);
  194. if (deviceListData.IsNullOrEmpty)
  195. {
  196. deviceList = _deviceService.GetDeviceList();
  197. await _redisService.Database.StringSetAsync(device_redis_key, JsonConvert.SerializeObject(deviceList));
  198. }
  199. else
  200. {
  201. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  202. }
  203. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString())).ToList();
  204. foreach (Device device in deviceList)
  205. {
  206. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  207. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  208. var data = await _redisService.Database.StringGetAsync(redis_key);
  209. if (data.IsNullOrEmpty)
  210. {
  211. CcsTagValue tagQuery = new CcsTagValue();
  212. tagQuery.ProtocolType = device.ProtocolType;
  213. tagQuery.Ip = device.Ip;
  214. tagValues = _ccsTagValueService.GetList(tagQuery);
  215. //首次设置redis
  216. if (tagValues != null && tagValues.Count > 0)
  217. {
  218. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  219. }
  220. }
  221. else
  222. {
  223. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  224. }
  225. if (tagValues != null && tagValues.Count > 0)
  226. {
  227. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  228. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  229. //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  230. SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.ServerUrl);
  231. OperateResult ConnectionResult = s7.ConnectServer();
  232. if (!ConnectionResult.IsSuccess)
  233. {
  234. device.State = false;
  235. await _deviceService.UpdateDevice(device);
  236. s7.ConnectClose();
  237. Log.Instance.WriteLogAdd("S7采集异常,plc连不上", LOG_TITLE_S7);
  238. return "采集失败,plc连不上";
  239. }
  240. else
  241. {
  242. foreach (CcsTagValue tagValueData in tagValues)
  243. {
  244. //string Address = ToolUtils.AddressConvertDBW(tagValueData.Address);
  245. //var operateResult = ((ushort)s7.Read(Address)).ConvertToShort();
  246. string operateResult = "";
  247. if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString()))
  248. {
  249. operateResult = s7.ReadBool(tagValueData.Address).Content.ToString();
  250. }
  251. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString()))
  252. {
  253. operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString();
  254. }
  255. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString()))
  256. {
  257. operateResult = s7.ReadString(tagValueData.Address).Content.ToString();
  258. }
  259. if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult)
  260. {
  261. tagValueData.TagValue = operateResult.ToString();
  262. tagValueData.UpdateTime = DateTime.Now;
  263. changTagValues.Add(tagValueData);
  264. Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  265. //有变化更新数据库
  266. await _ccsTagValueService.Update(tagValueData);
  267. }
  268. Thread.Sleep(50);
  269. }
  270. s7.ConnectClose();
  271. //值有变化,重新设置一次redis
  272. if (changTagValues != null && changTagValues.Count > 0)
  273. {
  274. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  275. }
  276. }
  277. }
  278. }
  279. return "S7采集成功";
  280. }
  281. catch (Exception ex)
  282. {
  283. Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7);
  284. return "S7采集失败";
  285. }
  286. }
  287. /// <summary>
  288. /// 采集数据FANUC
  289. /// </summary>
  290. /// <returns></returns>
  291. public async Task<string> DataCollectFanucJob()
  292. {
  293. try
  294. {
  295. List<Device> deviceList = new List<Device>();
  296. var deviceListData = await _redisService.Database.StringGetAsync(device_redis_key);
  297. if (deviceListData.IsNullOrEmpty)
  298. {
  299. deviceList = _deviceService.GetDeviceList();
  300. await _redisService.Database.StringSetAsync(device_redis_key, JsonConvert.SerializeObject(deviceList));
  301. }
  302. else
  303. {
  304. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  305. }
  306. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.FANUC.ToString())).ToList();
  307. foreach (Device device in deviceList)
  308. {
  309. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  310. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  311. var data = await _redisService.Database.StringGetAsync(redis_key);
  312. if (data.IsNullOrEmpty)
  313. {
  314. CcsTagValue tagQuery = new CcsTagValue();
  315. tagQuery.ProtocolType = device.ProtocolType;
  316. tagQuery.Ip = device.Ip;
  317. tagValues = _ccsTagValueService.GetList(tagQuery);
  318. //首次设置redis
  319. if (tagValues != null && tagValues.Count > 0)
  320. {
  321. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  322. }
  323. }
  324. else
  325. {
  326. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  327. }
  328. if (tagValues != null && tagValues.Count > 0)
  329. {
  330. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  331. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  332. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  333. //调用发那科是否连接接口
  334. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=Connect", null, null);
  335. if (!Result.IsSuccess || Result.Message != "0")
  336. {
  337. device.State = false;
  338. await _deviceService.UpdateDevice(device);
  339. Log.Instance.WriteLogAdd("FANUC采集异常,FANUC连不上", LOG_TITLE_S7);
  340. return "采集失败,FANUC连不上";
  341. }
  342. else
  343. {
  344. //调用发那科采集接口
  345. Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=All", null, null);
  346. ResponseFanucData fanucData = JsonConvert.DeserializeObject<ResponseFanucData>(Result.Message);
  347. foreach (CcsTagValue tagValueData in tagValues)
  348. {
  349. string operateResult = GetFanucValue(fanucData, tagValueData.Address);
  350. if (tagValueData.TagValue != operateResult)
  351. {
  352. tagValueData.TagValue = operateResult.ToString();
  353. tagValueData.UpdateTime = DateTime.Now;
  354. changTagValues.Add(tagValueData);
  355. Log.Instance.WriteLogAdd("FANUC采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  356. //有变化更新数据库
  357. await _ccsTagValueService.Update(tagValueData);
  358. }
  359. Thread.Sleep(50);
  360. }
  361. //值有变化,重新设置一次redis
  362. if (changTagValues != null && changTagValues.Count > 0)
  363. {
  364. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  365. }
  366. }
  367. }
  368. }
  369. return "FANUC采集成功";
  370. }
  371. catch (Exception ex)
  372. {
  373. Log.Instance.WriteLogAdd("FANUC采集异常===>>" + ex.Message, LOG_TITLE_S7);
  374. return "FANUC采集失败";
  375. }
  376. }
  377. /// <summary>
  378. /// 上传程序回调任务
  379. /// </summary>
  380. /// <returns></returns>
  381. public async Task<string> CallbackJob1()
  382. {
  383. List<TaskCallback> list = new List<TaskCallback>();
  384. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  385. if (taskCallbackListData.IsNullOrEmpty)
  386. {
  387. list = await _taskCallbackService.GetAllList();
  388. }
  389. else
  390. {
  391. list = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  392. }
  393. list = list.Where(x => x.OperateType.Equals(ActionTypeEnum.UploadFile.ToString())).ToList();
  394. string message = "";
  395. try
  396. {
  397. foreach (TaskCallback task in list)
  398. {
  399. DateTime currentTime = DateTime.Now;
  400. if (currentTime.Subtract(task.CreateTime).TotalSeconds > 5)
  401. {
  402. CallBackRequestData requestData = new CallBackRequestData();
  403. requestData.taskId = long.Parse(task.TaskId);
  404. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  405. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  406. if (result.IsSuccess)
  407. {
  408. task.State = false;
  409. task.UpdateTime = DateTime.Now;
  410. await _taskCallbackService.CreateOrUpdateAndCache(task);
  411. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  412. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  413. }
  414. else
  415. {
  416. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  417. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  418. }
  419. }
  420. }
  421. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  422. }
  423. catch (Exception ex)
  424. {
  425. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  426. return "回调异常" + ex.Message;
  427. }
  428. }
  429. /// <summary>
  430. /// 柔性产线,伺服等取和放回调任务
  431. /// </summary>
  432. /// <returns></returns>
  433. public async Task<string> CallbackJob2()
  434. {
  435. List<TaskCallback> taskList = new List<TaskCallback>();
  436. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  437. if (taskCallbackListData.IsNullOrEmpty)
  438. {
  439. taskList = await _taskCallbackService.GetAllList();
  440. }
  441. else
  442. {
  443. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  444. }
  445. //在线设备
  446. List<Device> deviceList = _deviceService.GetDeviceList();
  447. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.GetFlexibleWire.ToString())
  448. || x.OperateType.Equals(ActionTypeEnum.SendFlexibleWire.ToString())
  449. || x.OperateType.Equals(ActionTypeEnum.MoveRobotPosition.ToString())
  450. || x.OperateType.Equals(ActionTypeEnum.GetIntelligenceUnit.ToString())
  451. || x.OperateType.Equals(ActionTypeEnum.SendIntelligenceUnit.ToString())
  452. || x.OperateType.Equals(ActionTypeEnum.GetQualityCenter.ToString())
  453. || x.OperateType.Equals(ActionTypeEnum.SendQualityCenter.ToString())
  454. || x.OperateType.Equals(ActionTypeEnum.GetServoStacker.ToString())
  455. || x.OperateType.Equals(ActionTypeEnum.SendServoStacker.ToString())
  456. || x.OperateType.Equals(ActionTypeEnum.SendLinShift.ToString())
  457. || x.OperateType.Equals(ActionTypeEnum.SendLinShiftFine.ToString())).ToList();
  458. List<TaskCallback> list = new List<TaskCallback>();
  459. foreach (Device device in deviceList)
  460. {
  461. foreach (TaskCallback task in taskList)
  462. {
  463. if (task.IP.Equals(device.Ip))
  464. {
  465. list.Add(task);
  466. }
  467. }
  468. }
  469. string message = "";
  470. try
  471. {
  472. foreach (TaskCallback task in list)
  473. {
  474. DateTime currentTime = DateTime.Now;
  475. CcsTagValue tagValueQuery = new CcsTagValue();
  476. tagValueQuery.Ip = task.IP;
  477. //tagValueQuery.Address = task.Address;
  478. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  479. CcsTagValue callBacktagValue = tagValues.Where(o=>o.Address == task.Address).FirstOrDefault();
  480. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue)
  481. {
  482. CallBackRequestData requestData = new CallBackRequestData();
  483. requestData.taskId = long.Parse(task.TaskId);
  484. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  485. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  486. if (result.IsSuccess)
  487. {
  488. task.State = false;
  489. task.UpdateTime = DateTime.Now;
  490. await _taskCallbackService.CreateOrUpdateAndCache(task);
  491. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  492. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  493. }
  494. else
  495. {
  496. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  497. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  498. }
  499. }
  500. //回调检测到失败,回调通知ecs
  501. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  502. {
  503. bool failFalg = false;
  504. if (!string.IsNullOrEmpty(task.FailAddress))
  505. {
  506. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  507. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  508. {
  509. failFalg = true;
  510. }
  511. }
  512. if (!string.IsNullOrEmpty(task.FailAddress2))
  513. {
  514. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  515. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  516. {
  517. failFalg = true;
  518. }
  519. }
  520. if (!string.IsNullOrEmpty(task.FailAddress3))
  521. {
  522. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  523. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  524. {
  525. failFalg = true;
  526. }
  527. }
  528. if (failFalg)
  529. {
  530. CallBackRequestData requestData = new CallBackRequestData();
  531. requestData.taskId = long.Parse(task.TaskId);
  532. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  533. requestData.code = "0";
  534. requestData.msg = "操作失败";
  535. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  536. if (result.IsSuccess)
  537. {
  538. task.State = false;
  539. task.UpdateTime = DateTime.Now;
  540. await _taskCallbackService.CreateOrUpdateAndCache(task);
  541. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  542. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  543. }
  544. else
  545. {
  546. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  547. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  548. }
  549. }
  550. }
  551. }
  552. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  553. }
  554. catch (Exception ex)
  555. {
  556. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  557. return "回调异常" + ex.Message;
  558. }
  559. }
  560. /// <summary>
  561. /// 打标机回调任务
  562. /// </summary>
  563. /// <returns></returns>
  564. public async Task<string> CallbackJob3()
  565. {
  566. List<TaskCallback> taskList = new List<TaskCallback>();
  567. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  568. if (taskCallbackListData.IsNullOrEmpty)
  569. {
  570. taskList = await _taskCallbackService.GetAllList();
  571. }
  572. else
  573. {
  574. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  575. }
  576. //在线设备
  577. List<Device> deviceList = _deviceService.GetDeviceList();
  578. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartLabelMachine.ToString())).ToList();
  579. List<TaskCallback> list = new List<TaskCallback>();
  580. foreach (Device device in deviceList)
  581. {
  582. foreach (TaskCallback task in taskList)
  583. {
  584. if (task.IP.Equals(device.Ip))
  585. {
  586. list.Add(task);
  587. }
  588. }
  589. }
  590. string message = "";
  591. try
  592. {
  593. foreach (TaskCallback task in list)
  594. {
  595. DateTime currentTime = DateTime.Now;
  596. CcsTagValue tagValueQuery = new CcsTagValue();
  597. tagValueQuery.Ip = task.IP;
  598. //tagValueQuery.Address = task.Address;
  599. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  600. CcsTagValue callBacktagValue = tagValues.Where(o=>o.Address == task.Address).FirstOrDefault();
  601. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue)
  602. {
  603. CallBackRequestData requestData = new CallBackRequestData();
  604. requestData.taskId = long.Parse(task.TaskId);
  605. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  606. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  607. if (result.IsSuccess)
  608. {
  609. if (!string.IsNullOrEmpty(task.SuccessResetAddress))
  610. {
  611. Plc s7 = DevicePlcS7.S7(task.IP, ProtocalTypeEnum.S7_1500.ToString());
  612. if (s7.IsConnected == true)
  613. {
  614. string ResetAddress = ToolUtils.AddressConvertDBW(task.SuccessResetAddress);
  615. //short mc = 0;
  616. short mc = (short)int.Parse(task.SuccessResetValue);
  617. s7.Write(ResetAddress, mc);
  618. s7.Close();
  619. }
  620. }
  621. task.State = false;
  622. task.UpdateTime = DateTime.Now;
  623. await _taskCallbackService.CreateOrUpdateAndCache(task);
  624. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  625. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  626. }
  627. else
  628. {
  629. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  630. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  631. }
  632. }
  633. //回调检测到失败,回调通知ecs
  634. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  635. {
  636. bool failFalg = false;
  637. if (!string.IsNullOrEmpty(task.FailAddress))
  638. {
  639. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  640. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  641. {
  642. failFalg = true;
  643. }
  644. }
  645. if (!string.IsNullOrEmpty(task.FailAddress2))
  646. {
  647. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  648. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  649. {
  650. failFalg = true;
  651. }
  652. }
  653. if (!string.IsNullOrEmpty(task.FailAddress3))
  654. {
  655. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  656. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  657. {
  658. failFalg = true;
  659. }
  660. }
  661. if (failFalg)
  662. {
  663. CallBackRequestData requestData = new CallBackRequestData();
  664. requestData.taskId = long.Parse(task.TaskId);
  665. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  666. requestData.code = "0";
  667. requestData.msg = "操作失败";
  668. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  669. if (result.IsSuccess)
  670. {
  671. task.State = false;
  672. task.UpdateTime = DateTime.Now;
  673. await _taskCallbackService.CreateOrUpdateAndCache(task);
  674. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  675. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  676. }
  677. else
  678. {
  679. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  680. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  681. }
  682. }
  683. }
  684. }
  685. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  686. }
  687. catch (Exception ex)
  688. {
  689. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  690. return "回调异常" + ex.Message;
  691. }
  692. }
  693. /// <summary>
  694. /// 启动机床程序回调任务
  695. /// </summary>
  696. /// <returns></returns>
  697. public async Task<string> CallbackJob4()
  698. {
  699. List<TaskCallback> taskList = new List<TaskCallback>();
  700. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  701. if (taskCallbackListData.IsNullOrEmpty)
  702. {
  703. taskList = await _taskCallbackService.GetAllList();
  704. }
  705. else
  706. {
  707. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  708. }
  709. //在线设备
  710. List<Device> deviceList = _deviceService.GetDeviceList();
  711. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString())).ToList();
  712. List<TaskCallback> list = new List<TaskCallback>();
  713. foreach (Device device in deviceList)
  714. {
  715. foreach (TaskCallback task in taskList)
  716. {
  717. if (task.IP.Equals(device.Ip))
  718. {
  719. list.Add(task);
  720. }
  721. }
  722. }
  723. string message = "";
  724. try
  725. {
  726. foreach (TaskCallback task in list)
  727. {
  728. DateTime currentTime = DateTime.Now;
  729. CcsTagValue tagValueQuery = new CcsTagValue();
  730. tagValueQuery.Ip = task.IP;
  731. //tagValueQuery.Address = task.Address;
  732. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  733. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault() ;
  734. if (tagValue != null && tagValue.TagValue == task.CallbackValue)
  735. {
  736. CallBackRequestData requestData = new CallBackRequestData();
  737. requestData.taskId = long.Parse(task.TaskId);
  738. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  739. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  740. if (result.IsSuccess)
  741. {
  742. task.State = false;
  743. task.UpdateTime = DateTime.Now;
  744. await _taskCallbackService.CreateOrUpdateAndCache(task);
  745. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  746. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  747. }
  748. else
  749. {
  750. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  751. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  752. }
  753. }
  754. //回调检测到失败,回调通知ecs
  755. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  756. {
  757. bool failFalg = false;
  758. if (!string.IsNullOrEmpty(task.FailAddress))
  759. {
  760. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  761. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  762. {
  763. failFalg = true;
  764. }
  765. }
  766. if (!string.IsNullOrEmpty(task.FailAddress2))
  767. {
  768. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  769. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  770. {
  771. failFalg = true;
  772. }
  773. }
  774. if (!string.IsNullOrEmpty(task.FailAddress3))
  775. {
  776. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  777. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  778. {
  779. failFalg = true;
  780. }
  781. }
  782. if (failFalg)
  783. {
  784. CallBackRequestData requestData = new CallBackRequestData();
  785. requestData.taskId = long.Parse(task.TaskId);
  786. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  787. requestData.code = "0";
  788. requestData.msg = "操作失败";
  789. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  790. if (result.IsSuccess)
  791. {
  792. task.State = false;
  793. task.UpdateTime = DateTime.Now;
  794. await _taskCallbackService.CreateOrUpdateAndCache(task);
  795. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  796. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  797. }
  798. else
  799. {
  800. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  801. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  802. }
  803. }
  804. }
  805. }
  806. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  807. }
  808. catch (Exception ex)
  809. {
  810. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  811. return "回调异常" + ex.Message;
  812. }
  813. }
  814. /// <summary>
  815. /// 启动清洗机回调任务
  816. /// </summary>
  817. /// <returns></returns>
  818. public async Task<string> CallbackJob5()
  819. {
  820. List<TaskCallback> taskList = new List<TaskCallback>();
  821. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  822. if (taskCallbackListData.IsNullOrEmpty)
  823. {
  824. taskList = await _taskCallbackService.GetAllList();
  825. }
  826. else
  827. {
  828. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  829. }
  830. //在线设备
  831. List<Device> deviceList = _deviceService.GetDeviceList();
  832. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCleanMachine.ToString())).ToList();
  833. List<TaskCallback> list = new List<TaskCallback>();
  834. foreach (Device device in deviceList)
  835. {
  836. foreach (TaskCallback task in taskList)
  837. {
  838. if (task.IP.Equals(device.Ip))
  839. {
  840. list.Add(task);
  841. }
  842. }
  843. }
  844. string message = "";
  845. try
  846. {
  847. foreach (TaskCallback task in list)
  848. {
  849. DateTime currentTime = DateTime.Now;
  850. CcsTagValue tagValueQuery = new CcsTagValue();
  851. tagValueQuery.Ip = task.IP;
  852. //tagValueQuery.Address = task.Address;
  853. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  854. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  855. if (tagValue != null && tagValue.TagValue == task.CallbackValue)
  856. {
  857. CallBackRequestData requestData = new CallBackRequestData();
  858. requestData.taskId = long.Parse(task.TaskId);
  859. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  860. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  861. if (result.IsSuccess)
  862. {
  863. task.State = false;
  864. task.UpdateTime = DateTime.Now;
  865. await _taskCallbackService.CreateOrUpdateAndCache(task);
  866. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  867. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  868. }
  869. else
  870. {
  871. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  872. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  873. }
  874. }
  875. //回调检测到失败,回调通知ecs
  876. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  877. {
  878. bool failFalg = false;
  879. if (!string.IsNullOrEmpty(task.FailAddress))
  880. {
  881. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  882. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  883. {
  884. failFalg = true;
  885. }
  886. }
  887. if (!string.IsNullOrEmpty(task.FailAddress2))
  888. {
  889. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  890. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  891. {
  892. failFalg = true;
  893. }
  894. }
  895. if (!string.IsNullOrEmpty(task.FailAddress3))
  896. {
  897. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  898. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  899. {
  900. failFalg = true;
  901. }
  902. }
  903. if (failFalg)
  904. {
  905. CallBackRequestData requestData = new CallBackRequestData();
  906. requestData.taskId = long.Parse(task.TaskId);
  907. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  908. requestData.code = "0";
  909. requestData.msg = "操作失败";
  910. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  911. if (result.IsSuccess)
  912. {
  913. task.State = false;
  914. task.UpdateTime = DateTime.Now;
  915. await _taskCallbackService.CreateOrUpdateAndCache(task);
  916. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  917. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  918. }
  919. else
  920. {
  921. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  922. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  923. }
  924. }
  925. }
  926. }
  927. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  928. }
  929. catch (Exception ex)
  930. {
  931. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  932. return "回调异常" + ex.Message;
  933. }
  934. }
  935. /// <summary>
  936. /// 启动三坐标回调任务
  937. /// </summary>
  938. /// <returns></returns>
  939. public async Task<string> CallbackJob6()
  940. {
  941. List<TaskCallback> taskList = new List<TaskCallback>();
  942. var taskCallbackListData = await _redisService.Database.StringGetAsync(callback_redis_key);
  943. if (taskCallbackListData.IsNullOrEmpty)
  944. {
  945. taskList = await _taskCallbackService.GetAllList();
  946. }
  947. else
  948. {
  949. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  950. }
  951. //在线设备
  952. List<Device> deviceList = _deviceService.GetDeviceList();
  953. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCoordinateMeasuringMachine.ToString())).ToList();
  954. List<TaskCallback> list = new List<TaskCallback>();
  955. foreach (Device device in deviceList)
  956. {
  957. foreach (TaskCallback task in taskList)
  958. {
  959. if (task.IP.Equals(device.Ip))
  960. {
  961. list.Add(task);
  962. }
  963. }
  964. }
  965. string message = "";
  966. try
  967. {
  968. foreach (TaskCallback task in list)
  969. {
  970. DateTime currentTime = DateTime.Now;
  971. CcsTagValue tagValueQuery = new CcsTagValue();
  972. tagValueQuery.Ip = task.IP;
  973. //tagValueQuery.Address = task.Address;
  974. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  975. CcsTagValue tagValue = tagValues.Where(o=>o.Address == task.Address).FirstOrDefault();
  976. if (tagValue != null && (tagValue.TagValue == task.CallbackValue || tagValue.TagValue == task.CallbackValue2))
  977. {
  978. CallBackRequestData requestData = new CallBackRequestData();
  979. requestData.taskId = long.Parse(task.TaskId);
  980. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  981. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  982. if (result.IsSuccess)
  983. {
  984. task.State = false;
  985. task.UpdateTime = DateTime.Now;
  986. await _taskCallbackService.CreateOrUpdateAndCache(task);
  987. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  988. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  989. }
  990. else
  991. {
  992. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  993. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  994. }
  995. }
  996. //回调检测到失败,回调通知ecs
  997. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  998. {
  999. bool failFalg = false;
  1000. if (!string.IsNullOrEmpty(task.FailAddress))
  1001. {
  1002. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  1003. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1004. {
  1005. failFalg = true;
  1006. }
  1007. }
  1008. if (!string.IsNullOrEmpty(task.FailAddress2))
  1009. {
  1010. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  1011. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1012. {
  1013. failFalg = true;
  1014. }
  1015. }
  1016. if (!string.IsNullOrEmpty(task.FailAddress3))
  1017. {
  1018. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  1019. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1020. {
  1021. failFalg = true;
  1022. }
  1023. }
  1024. if (failFalg)
  1025. {
  1026. CallBackRequestData requestData = new CallBackRequestData();
  1027. requestData.taskId = long.Parse(task.TaskId);
  1028. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  1029. requestData.code = "0";
  1030. requestData.msg = "操作失败";
  1031. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  1032. if (result.IsSuccess)
  1033. {
  1034. task.State = false;
  1035. task.UpdateTime = DateTime.Now;
  1036. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1037. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  1038. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1039. }
  1040. else
  1041. {
  1042. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1043. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  1044. }
  1045. }
  1046. }
  1047. }
  1048. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  1049. }
  1050. catch (Exception ex)
  1051. {
  1052. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  1053. return "回调异常" + ex.Message;
  1054. }
  1055. }
  1056. /// <summary>
  1057. /// 监控设备状态
  1058. /// </summary>
  1059. /// <returns></returns>
  1060. public async Task<string> MonitorEquipmentStatusJob()
  1061. {
  1062. try
  1063. {
  1064. string message = "MonitorEquipmentStatusJob调度成功";
  1065. List<Device> devices = new List<Device>() ;
  1066. string device_redis_key = "IMCS_CCS:DeviceList";
  1067. var deviceData = await _redisService.Database.StringGetAsync(device_redis_key);
  1068. if (deviceData.IsNullOrEmpty)
  1069. {
  1070. devices = _deviceService.GetDeviceList();
  1071. }
  1072. else
  1073. {
  1074. devices = JsonConvert.DeserializeObject<List<Device>>(deviceData);
  1075. }
  1076. //ftp不监控
  1077. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString()) && x.State).ToList();
  1078. CcsTagValue tagQuery = new CcsTagValue();
  1079. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagQuery);
  1080. List<EquipmentMonitor> equipmentMonitors = new List<EquipmentMonitor>();
  1081. string redis_key = "IMCS_CCS:MonitorEquipmentStatusJob";
  1082. var data = await _redisService.Database.StringGetAsync(redis_key);
  1083. if (data.IsNullOrEmpty)
  1084. {
  1085. equipmentMonitors = await _equipmentMonitorService.GetList();
  1086. //首次设置redis
  1087. if (tagValues != null && tagValues.Count > 0)
  1088. {
  1089. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  1090. }
  1091. }
  1092. else
  1093. {
  1094. equipmentMonitors = JsonConvert.DeserializeObject<List<EquipmentMonitor>>(data);
  1095. }
  1096. //变化的设备
  1097. List<EquipmentMonitor> changeEquipmentMonitors = new List<EquipmentMonitor>();
  1098. foreach (EquipmentMonitor equipment in equipmentMonitors)
  1099. {
  1100. Device device = devices.Where(x => x.Ip.Equals(equipment.IP)).FirstOrDefault();
  1101. if (device == null)
  1102. {
  1103. if(equipment.Status != "离线")
  1104. {
  1105. equipment.Status = "离线";
  1106. changeEquipmentMonitors.Add(equipment);
  1107. }
  1108. continue;
  1109. }
  1110. else if (equipment.Name == "机械手")
  1111. {
  1112. CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address)).FirstOrDefault();
  1113. if (ccsTagValue != null)
  1114. {
  1115. if (ccsTagValue.TagValue == "3")
  1116. {
  1117. if (equipment.Status != "报警")
  1118. {
  1119. equipment.Status = "报警";
  1120. changeEquipmentMonitors.Add(equipment);
  1121. }
  1122. continue;
  1123. }
  1124. }
  1125. CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address2)).FirstOrDefault();
  1126. if (ccsTagValue2 != null)
  1127. {
  1128. if (ccsTagValue2.TagValue == "9")
  1129. {
  1130. if (equipment.Status != "报警")
  1131. {
  1132. equipment.Status = "报警";
  1133. changeEquipmentMonitors.Add(equipment);
  1134. }
  1135. continue;
  1136. }
  1137. }
  1138. if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8")
  1139. {
  1140. if (equipment.Status != "空闲")
  1141. {
  1142. equipment.Status = "空闲";
  1143. changeEquipmentMonitors.Add(equipment);
  1144. }
  1145. continue;
  1146. }
  1147. if (equipment.Status != "生产中")
  1148. {
  1149. equipment.Status = "生产中";
  1150. changeEquipmentMonitors.Add(equipment);
  1151. }
  1152. }
  1153. else
  1154. {
  1155. if (equipment.Status != "在线")
  1156. {
  1157. equipment.Status = "在线";
  1158. changeEquipmentMonitors.Add(equipment);
  1159. }
  1160. }
  1161. }
  1162. //变化的修改 并且更新缓存
  1163. if(changeEquipmentMonitors != null)
  1164. {
  1165. foreach (EquipmentMonitor equipment in changeEquipmentMonitors)
  1166. {
  1167. await _equipmentMonitorService.Update(equipment);
  1168. }
  1169. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  1170. }
  1171. return message;
  1172. }
  1173. catch (Exception ex)
  1174. {
  1175. Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, LOG_TITLE_DEVICE);
  1176. return "MonitorEquipmentStatusJob : " + ex.Message;
  1177. }
  1178. }
  1179. /// <summary>
  1180. /// 监控设备状态
  1181. /// </summary>
  1182. /// <returns></returns>
  1183. public async Task<string> DeviceStatusJob()
  1184. {
  1185. try
  1186. {
  1187. string message = "";
  1188. List<Device> devices = new List<Device>();
  1189. List<Device> changeDevices = new List<Device>();
  1190. string redis_key = "IMCS_CCS:DeviceList";
  1191. var data = await _redisService.Database.StringGetAsync(redis_key);
  1192. if (data.IsNullOrEmpty)
  1193. {
  1194. devices = _deviceService.GetDeviceAllList();
  1195. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(devices));
  1196. }
  1197. else
  1198. {
  1199. devices = JsonConvert.DeserializeObject<List<Device>>(data);
  1200. }
  1201. //ftp不监控
  1202. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1203. foreach (Device device in devices)
  1204. {
  1205. if (device.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()))
  1206. {
  1207. try
  1208. {
  1209. Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  1210. if (s7.IsConnected != true)
  1211. {
  1212. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1213. if (oldDevice.State)
  1214. {
  1215. device.State = false;
  1216. await _deviceService.UpdateDevice(device);
  1217. changeDevices.Add(device);
  1218. }
  1219. s7.Close();
  1220. Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE);
  1221. message = message + ",plc连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1222. continue;
  1223. }
  1224. else
  1225. {
  1226. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1227. if (!oldDevice.State)
  1228. {
  1229. device.State = true;
  1230. await _deviceService.UpdateDevice(device);
  1231. changeDevices.Add(device);
  1232. }
  1233. s7.Close();
  1234. Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE);
  1235. message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1236. continue;
  1237. }
  1238. }
  1239. catch (Exception s7ex)
  1240. {
  1241. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1242. if (oldDevice.State)
  1243. {
  1244. device.State = false;
  1245. await _deviceService.UpdateDevice(device);
  1246. changeDevices.Add(device);
  1247. }
  1248. Log.Instance.WriteLogAdd("plc连接失败,或已离线", LOG_TITLE_DEVICE);
  1249. message = message + ",plc连接失败,plc连不上" + s7ex.Message + ",ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1250. }
  1251. }
  1252. else if (device.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString()))
  1253. {
  1254. try
  1255. {
  1256. //调用opcua是否连接接口
  1257. RequestOpcUaData opcUaReq = new RequestOpcUaData();
  1258. opcUaReq.ServerUrl = device.ServerUrl;
  1259. opcUaReq.UserName = device.UserName;
  1260. opcUaReq.Password = device.Password;
  1261. opcUaReq.Type = OpcUaActionTypeEnum.Connect.ToString();
  1262. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  1263. ResponseOpcUaData responseOpcUaData = JsonConvert.DeserializeObject<ResponseOpcUaData>(Result.Message);
  1264. if (!Result.IsSuccess || !responseOpcUaData.result)
  1265. {
  1266. device.State = false;
  1267. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1268. if (oldDevice.State)
  1269. {
  1270. await _deviceService.UpdateDevice(device);
  1271. changeDevices.Add(device);
  1272. }
  1273. Log.Instance.WriteLogAdd("OPCUA连接异常,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_OPCUA);
  1274. message = message + ",OPCUA连接异常,或以离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; ;
  1275. continue;
  1276. }
  1277. else
  1278. {
  1279. device.State = true;
  1280. await _deviceService.UpdateDevice(device);
  1281. changeDevices.Add(device);
  1282. Log.Instance.WriteLogAdd("OPCUA连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_DEVICE);
  1283. continue;
  1284. }
  1285. }
  1286. catch (Exception opcex)
  1287. {
  1288. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1289. if (oldDevice.State)
  1290. {
  1291. device.State = false;
  1292. await _deviceService.UpdateDevice(device);
  1293. changeDevices.Add(device);
  1294. }
  1295. Log.Instance.WriteLogAdd("OPCUA连接异常,或以离线" + opcex.Message + ",ip:" + device.Ip + ", 协议类型: " + device.ProtocolType, LOG_TITLE_DEVICE);
  1296. continue;
  1297. }
  1298. }
  1299. else if (device.ProtocolType.Equals(ProtocalTypeEnum.FANUC.ToString()))
  1300. {
  1301. try
  1302. {
  1303. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  1304. //调用发那科是否连接接口
  1305. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=Connect", null, null);
  1306. if (Result.IsSuccess && Result.Message == "0")
  1307. {
  1308. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1309. if (!oldDevice.State)
  1310. {
  1311. oldDevice.State = true;
  1312. await _deviceService.UpdateDevice(oldDevice);
  1313. changeDevices.Add(oldDevice);
  1314. }
  1315. Log.Instance.WriteLogAdd("Fanuc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_DEVICE);
  1316. continue;
  1317. }
  1318. else
  1319. {
  1320. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1321. if (oldDevice.State)
  1322. {
  1323. oldDevice.State = false;
  1324. await _deviceService.UpdateDevice(oldDevice);
  1325. changeDevices.Add(oldDevice);
  1326. }
  1327. Log.Instance.WriteLogAdd("Fanuc连接异常,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_OPCUA);
  1328. message = message + ",Fanuc连接异常,或以离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; ;
  1329. continue;
  1330. }
  1331. }
  1332. catch (Exception opcex)
  1333. {
  1334. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1335. if (oldDevice.State)
  1336. {
  1337. oldDevice.State = false;
  1338. await _deviceService.UpdateDevice(oldDevice);
  1339. changeDevices.Add(oldDevice);
  1340. }
  1341. Log.Instance.WriteLogAdd("Fanuc连接异常,或以离线" + opcex.Message + ",ip:" + device.Ip + ", 协议类型: " + device.ProtocolType, LOG_TITLE_DEVICE);
  1342. continue;
  1343. }
  1344. }
  1345. else if (device.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString()))
  1346. {
  1347. try
  1348. {
  1349. RequestHeidhData hdhReq = new RequestHeidhData();
  1350. hdhReq.ServerUrl = device.ServerUrl;
  1351. hdhReq.MachineName = device.UserName;
  1352. hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString();
  1353. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  1354. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  1355. if (!Result.IsSuccess || !responseData.result)
  1356. {
  1357. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1358. if (oldDevice.State)
  1359. {
  1360. oldDevice.State = false;
  1361. await _deviceService.UpdateDevice(oldDevice);
  1362. changeDevices.Add(oldDevice);
  1363. }
  1364. Log.Instance.WriteLogAdd("海德汉连接异常,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_OPCUA);
  1365. message = message + ",海德汉连接异常,或以离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType; ;
  1366. continue;
  1367. }
  1368. else
  1369. {
  1370. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1371. if (!oldDevice.State)
  1372. {
  1373. oldDevice.State = true;
  1374. await _deviceService.UpdateDevice(oldDevice);
  1375. changeDevices.Add(oldDevice);
  1376. }
  1377. Log.Instance.WriteLogAdd("海德汉连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType, LOG_TITLE_DEVICE);
  1378. continue;
  1379. }
  1380. }
  1381. catch (Exception opcex)
  1382. {
  1383. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1384. if (oldDevice.State)
  1385. {
  1386. oldDevice.State = false;
  1387. await _deviceService.UpdateDevice(oldDevice);
  1388. changeDevices.Add(oldDevice);
  1389. }
  1390. Log.Instance.WriteLogAdd("Fanuc连接异常,或以离线" + opcex.Message + ",ip:" + device.Ip + ", 协议类型: " + device.ProtocolType, LOG_TITLE_DEVICE);
  1391. continue;
  1392. }
  1393. }
  1394. }
  1395. if(changeDevices != null)
  1396. {
  1397. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(devices));
  1398. }
  1399. return message;
  1400. }
  1401. catch (Exception ex)
  1402. {
  1403. Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE);
  1404. return "设备连接异常,或以离线" + ex.Message;
  1405. }
  1406. }
  1407. /// <summary>
  1408. /// fanuc根据类型获取值
  1409. /// </summary>
  1410. /// <returns></returns>
  1411. private string GetFanucValue(ResponseFanucData fanucData, string address)
  1412. {
  1413. string value = "";
  1414. if (address == FanucAddressEnum.MainProg.ToString())
  1415. {
  1416. value = fanucData.MainProg;
  1417. }
  1418. else if (address == FanucAddressEnum.Status.ToString())
  1419. {
  1420. value = fanucData.Status;
  1421. }
  1422. else if (address == FanucAddressEnum.PowerOnTime.ToString())
  1423. {
  1424. value = fanucData.PowerOnTime;
  1425. }
  1426. else if (address == FanucAddressEnum.ActSpindle.ToString())
  1427. {
  1428. value = fanucData.ActSpindle;
  1429. }
  1430. return value;
  1431. }
  1432. /// <summary>
  1433. /// 数字科学计数法处理
  1434. /// </summary>
  1435. /// <param name="strData"></param>
  1436. /// <returns></returns>
  1437. private Decimal ChangeToDecimal(string strData)
  1438. {
  1439. Decimal dData = 0.0M;
  1440. if (strData.Contains("E"))
  1441. {
  1442. dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float));
  1443. }
  1444. else
  1445. {
  1446. dData = Convert.ToDecimal(strData);
  1447. }
  1448. return dData;
  1449. }
  1450. }
  1451. }