TaskJobService.cs 87 KB

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