TaskJobService.cs 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650
  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. namespace IMCS.CCS.Service.Impl
  21. {
  22. /// <summary>
  23. /// 任务调度服务
  24. /// </summary>
  25. public class TaskJobService : ITaskJobService
  26. {
  27. private readonly IRedisService _redisService;
  28. private readonly IDeviceService _deviceService;
  29. private readonly IApiRequestService _apiRequestService;
  30. private readonly ITaskCallbackService _taskCallbackService;
  31. private readonly ICcsTagValueService _ccsTagValueService;
  32. private readonly IEquipmentMonitorService _equipmentMonitorService;
  33. private readonly IDictionaryService _dictionaryService;
  34. private readonly ICcsActionAddressService _ccsActionAddressService;
  35. private string ecsUrlContext;
  36. private string ecsRootUrlContext;
  37. private string fanucUrlContext;
  38. private string opcuacUrlContext;
  39. private string hdhUrlContext;
  40. private Dictionary<String, int> syncStatusMap = new Dictionary<String, int>();
  41. private string LOG_TITLE_OPCUA = "OPCUA采集";
  42. private string LOG_TITLE_S7 = "S7采集";
  43. private string LOG_TITLE_CALLBACK = "回调任务";
  44. private string LOG_TITLE_DEVICE = "设备监控";
  45. private string callback_redis_key = "IMCS_CCS:CallbackTaskList";
  46. private string device_redis_key = "IMCS_CCS:DeviceList";
  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(callback_redis_key);
  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(callback_redis_key);
  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(callback_redis_key);
  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(callback_redis_key);
  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(callback_redis_key);
  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(callback_redis_key);
  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. List<Device> devices = await getDeviceList();
  1150. //在线设备
  1151. //ftp不监控
  1152. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1153. List<EquipmentMonitor> equipmentMonitors = new List<EquipmentMonitor>();
  1154. string redis_key = "IMCS_CCS:MonitorEquipmentStatusJob";
  1155. var data = await _redisService.Database.StringGetAsync(redis_key);
  1156. if (data.IsNullOrEmpty)
  1157. {
  1158. equipmentMonitors = await _equipmentMonitorService.GetList();
  1159. //首次设置redis
  1160. if (equipmentMonitors != null && equipmentMonitors.Count > 0)
  1161. {
  1162. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  1163. }
  1164. }
  1165. else
  1166. {
  1167. equipmentMonitors = JsonConvert.DeserializeObject<List<EquipmentMonitor>>(data);
  1168. }
  1169. //变化的设备
  1170. List<EquipmentMonitor> changeEquipmentMonitors = new List<EquipmentMonitor>();
  1171. foreach (EquipmentMonitor equipment in equipmentMonitors)
  1172. {
  1173. Device device = devices.Where(x => x.Ip.Equals(equipment.IP)).FirstOrDefault();
  1174. if (device != null && !device.State)
  1175. {
  1176. if (equipment.Status != "掉线")
  1177. {
  1178. equipment.Status = "掉线";
  1179. changeEquipmentMonitors.Add(equipment);
  1180. }
  1181. continue;
  1182. }
  1183. else if (device != null && device.State && !device.UseState)
  1184. {
  1185. if (equipment.Status != "离线")
  1186. {
  1187. equipment.Status = "离线";
  1188. changeEquipmentMonitors.Add(equipment);
  1189. }
  1190. continue;
  1191. }
  1192. else if (device != null && equipment.Name == "机械手")
  1193. {
  1194. //缓存取PLCagvalue 值
  1195. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1196. string tag_value_redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  1197. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1198. if (data.IsNullOrEmpty)
  1199. {
  1200. CcsTagValue tagQuery = new CcsTagValue();
  1201. tagQuery.ProtocolType = device.ProtocolType;
  1202. tagQuery.Ip = device.Ip;
  1203. tagValues = _ccsTagValueService.GetList(tagQuery);
  1204. //首次设置redis
  1205. if (tagValues != null && tagValues.Count > 0)
  1206. {
  1207. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  1208. }
  1209. }
  1210. else
  1211. {
  1212. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  1213. }
  1214. CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address)).FirstOrDefault();
  1215. if (ccsTagValue != null)
  1216. {
  1217. if (ccsTagValue.TagValue == "3")
  1218. {
  1219. if (equipment.Status != "报警")
  1220. {
  1221. equipment.Status = "报警";
  1222. changeEquipmentMonitors.Add(equipment);
  1223. }
  1224. continue;
  1225. }
  1226. }
  1227. CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip.Equals(equipment.IP) && x.Address.Equals(equipment.Address2)).FirstOrDefault();
  1228. if (ccsTagValue2 != null)
  1229. {
  1230. if (ccsTagValue2.TagValue == "9")
  1231. {
  1232. if (equipment.Status != "报警")
  1233. {
  1234. equipment.Status = "报警";
  1235. changeEquipmentMonitors.Add(equipment);
  1236. }
  1237. continue;
  1238. }
  1239. }
  1240. if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8")
  1241. {
  1242. if (equipment.Status != "空闲")
  1243. {
  1244. equipment.Status = "空闲";
  1245. changeEquipmentMonitors.Add(equipment);
  1246. }
  1247. continue;
  1248. }
  1249. if (equipment.Status != "生产中")
  1250. {
  1251. equipment.Status = "生产中";
  1252. changeEquipmentMonitors.Add(equipment);
  1253. }
  1254. }
  1255. else
  1256. {
  1257. if (equipment.Status != "在线")
  1258. {
  1259. equipment.Status = "在线";
  1260. changeEquipmentMonitors.Add(equipment);
  1261. }
  1262. }
  1263. }
  1264. List<ProductionStatus> productionStatusList = new List<ProductionStatus>();
  1265. //变化的修改 并且更新缓存
  1266. if (changeEquipmentMonitors.Count > 0)
  1267. {
  1268. foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors)
  1269. {
  1270. ProductionStatus productionStatus = new ProductionStatus();
  1271. productionStatus.id = changeEquipment.Id.ToString();
  1272. productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString();
  1273. //equipment.Status == "离线" ? "0" : "1";
  1274. //productionStatus.alertMsg = equipment.AlertMsg;
  1275. productionStatusList.Add(productionStatus);
  1276. }
  1277. //修改并重置缓存
  1278. await _equipmentMonitorService.UpdateAndCache(equipmentMonitors);
  1279. }
  1280. //报警放入推送数组
  1281. foreach (Device device in devices)
  1282. {
  1283. EquipmentMonitor alarmEquipment = equipmentMonitors.Where(x => x.IP == device.Ip && x.Type == device.ProtocolType).FirstOrDefault();
  1284. ProductionStatus productionStatus = new ProductionStatus();
  1285. productionStatus.id = alarmEquipment.Id.ToString();
  1286. if (alarmEquipment.Type == "HEIDEHAIN")
  1287. {
  1288. RequestHeidhData hdhReq = new RequestHeidhData();
  1289. hdhReq.ServerUrl = device.ServerUrl;
  1290. hdhReq.MachineName = device.UserName;
  1291. hdhReq.Type = OpcUaActionTypeEnum.Connect.ToString();
  1292. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  1293. if (Result.IsSuccess)
  1294. {
  1295. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  1296. if (!string.IsNullOrEmpty(responseData.errorsInfo))
  1297. {
  1298. productionStatus.alertMsg = responseData.errorsInfo;
  1299. productionStatusList.Add(productionStatus);
  1300. }
  1301. }
  1302. }
  1303. else if (alarmEquipment.Type == "FANUC")
  1304. {
  1305. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  1306. //调用发那科接口
  1307. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null);
  1308. if (Result.IsSuccess)
  1309. {
  1310. //ResponseFanucData fncReq = new ResponseFanucData();
  1311. List<AlmInfo> AlmMsg = JsonConvert.DeserializeObject<List<AlmInfo>>(Result.Message);
  1312. //List<AlmInfo> AlmMsg = fncReq.AlmMsg;
  1313. if (AlmMsg != null && AlmMsg.Count > 0)
  1314. {
  1315. var msgs = from o in AlmMsg select o.msg;
  1316. productionStatus.alertMsg = string.Join(",", msgs.ToArray());
  1317. productionStatusList.Add(productionStatus);
  1318. }
  1319. }
  1320. }
  1321. else
  1322. {
  1323. //缓存取PLCagvalue 值
  1324. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1325. string tag_value_redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  1326. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1327. if (data.IsNullOrEmpty)
  1328. {
  1329. CcsTagValue tagQuery = new CcsTagValue();
  1330. tagQuery.ProtocolType = device.ProtocolType;
  1331. tagQuery.Ip = device.Ip;
  1332. tagValues = _ccsTagValueService.GetList(tagQuery);
  1333. //首次设置redis
  1334. if (tagValues != null && tagValues.Count > 0)
  1335. {
  1336. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  1337. }
  1338. }
  1339. else
  1340. {
  1341. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  1342. }
  1343. //获取机械手报警信息
  1344. CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip == alarmEquipment.IP && x.Address == "DB200.34").FirstOrDefault();
  1345. if (plcWarnValue != null)
  1346. {
  1347. ToolDto ccsDictionary = new ToolDto();
  1348. ccsDictionary.Type = "PlcWarnInfo";
  1349. List<ToolDto> dictList = await _dictionaryService.GetList(ccsDictionary);
  1350. if (dictList.Count > 0 && dictList[0] != null)
  1351. {
  1352. ToolDto dictObj = dictList.Where(x => x.Code.Equals(plcWarnValue.TagValue) && x.state).FirstOrDefault();
  1353. if (null != dictObj && !string.IsNullOrEmpty(dictObj.DictValue.Trim()))
  1354. {
  1355. productionStatus.alertMsg = dictObj.DictValue.Trim();
  1356. }
  1357. productionStatusList.Add(productionStatus);
  1358. }
  1359. }
  1360. }
  1361. }
  1362. //推送
  1363. if (productionStatusList != null && productionStatusList.Count > 0)
  1364. {
  1365. //主动推送同步状态数据接口
  1366. RequestSynStatusData requestData = new RequestSynStatusData();
  1367. requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList);
  1368. String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synProductionStatus";
  1369. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null);
  1370. //解析回调数据结果
  1371. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1372. if (responseECSCallback != null && responseECSCallback.code == 0)
  1373. {
  1374. Log.Instance.WriteLogAdd("同步设备状态成功", LOG_TITLE_CALLBACK);
  1375. }
  1376. else
  1377. {
  1378. Log.Instance.WriteLogAdd("同步设备状态操作失败:" + responseECSCallback.msg, LOG_TITLE_CALLBACK);
  1379. }
  1380. }
  1381. return message;
  1382. }
  1383. catch (Exception ex)
  1384. {
  1385. Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, LOG_TITLE_DEVICE);
  1386. return "MonitorEquipmentStatusJob : " + ex.Message;
  1387. }
  1388. }
  1389. /// <summary>
  1390. /// 监控设备状态
  1391. /// </summary>
  1392. /// <returns></returns>
  1393. public async Task<string> DeviceStatusJob()
  1394. {
  1395. try
  1396. {
  1397. string message = "";
  1398. string all_device_redis_key = "IMCS_CCS:ALLDeviceList";
  1399. List<Device> devices = new List<Device>();
  1400. //查询全部设备包括在线和不在线
  1401. var deviceListData = await _redisService.Database.StringGetAsync(all_device_redis_key);
  1402. if (deviceListData.IsNullOrEmpty)
  1403. {
  1404. devices = _deviceService.GetDevices();
  1405. await _redisService.Database.StringSetAsync(device_redis_key, JsonConvert.SerializeObject(devices));
  1406. }
  1407. else
  1408. {
  1409. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1410. }
  1411. //ftp不监控
  1412. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1413. foreach (Device device in devices)
  1414. {
  1415. Ping pingSender = new Ping();
  1416. PingReply reply = pingSender.Send(device.Ip);
  1417. if (reply.Status != IPStatus.Success)
  1418. {
  1419. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1420. if (oldDevice != null && oldDevice.State)
  1421. {
  1422. device.State = false;
  1423. await _deviceService.UpdateAndCache(device);
  1424. }
  1425. Log.Instance.WriteLogAdd(device.Ip + ":" + device.ProtocolType + "连接失败,或已离线", LOG_TITLE_DEVICE);
  1426. message = message + device.Ip + ",连接失败,或已离线,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1427. continue;
  1428. }
  1429. else
  1430. {
  1431. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1432. if (oldDevice != null && !oldDevice.State)
  1433. {
  1434. oldDevice.State = true;
  1435. await _deviceService.UpdateAndCache(oldDevice);
  1436. }
  1437. Log.Instance.WriteLogAdd(device.Ip + ":"+ device.ProtocolType + "连接成功", LOG_TITLE_DEVICE);
  1438. message = message + ",plc连接成功,ip:" + device.Ip + ",协议类型:" + device.ProtocolType;
  1439. continue;
  1440. }
  1441. Thread.Sleep(50);
  1442. }
  1443. return message;
  1444. }
  1445. catch (Exception ex)
  1446. {
  1447. Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE);
  1448. return "设备连接异常,或以离线" + ex.Message;
  1449. }
  1450. }
  1451. /// <summary>
  1452. /// 删除redis
  1453. /// </summary>
  1454. /// <returns></returns>
  1455. public void removeRedis()
  1456. {
  1457. List<Device> devices = _deviceService.GetDeviceAllList();
  1458. string redis_key = "IMCS_CCS:";
  1459. _redisService.Database.KeyDelete(device_redis_key);
  1460. _redisService.Database.KeyDelete(callback_redis_key);
  1461. foreach (Device device in devices)
  1462. {
  1463. _redisService.Database.KeyDelete(redis_key + device.Ip + ":" + device.ProtocolType);
  1464. }
  1465. }
  1466. /// <summary>
  1467. /// fanuc根据类型获取值
  1468. /// </summary>
  1469. /// <returns></returns>
  1470. private string GetFanucValue(ResponseFanucData fanucData, string address)
  1471. {
  1472. string value = "";
  1473. if (address == FanucAddressEnum.MainProg.ToString())
  1474. {
  1475. value = fanucData.MainProg;
  1476. }
  1477. else if (address == FanucAddressEnum.Status.ToString())
  1478. {
  1479. value = fanucData.Status;
  1480. }
  1481. else if (address == FanucAddressEnum.PowerOnTime.ToString())
  1482. {
  1483. value = fanucData.PowerOnTime;
  1484. }
  1485. else if (address == FanucAddressEnum.ActSpindle.ToString())
  1486. {
  1487. value = fanucData.ActSpindle;
  1488. }
  1489. return value;
  1490. }
  1491. /// <summary>
  1492. /// 数字科学计数法处理
  1493. /// </summary>
  1494. /// <param name="strData"></param>
  1495. /// <returns></returns>
  1496. private Decimal ChangeToDecimal(string strData)
  1497. {
  1498. Decimal dData = 0.0M;
  1499. if (strData.Contains("E"))
  1500. {
  1501. dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float));
  1502. }
  1503. else
  1504. {
  1505. dData = Convert.ToDecimal(strData);
  1506. }
  1507. return dData;
  1508. }
  1509. /// <summary>
  1510. /// 获取redis 设备列表
  1511. /// </summary>
  1512. /// <param name="strData"></param>
  1513. /// <returns></returns>
  1514. private async Task<List<Device>> getDeviceList()
  1515. {
  1516. List<Device> deviceList = new List<Device>();
  1517. var deviceListData = await _redisService.Database.StringGetAsync(device_redis_key);
  1518. if (deviceListData.IsNullOrEmpty)
  1519. {
  1520. deviceList = _deviceService.GetDeviceAllList();
  1521. await _redisService.Database.StringSetAsync(device_redis_key, JsonConvert.SerializeObject(deviceList));
  1522. }
  1523. else
  1524. {
  1525. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1526. }
  1527. return deviceList;
  1528. }
  1529. }
  1530. }