TaskJobService.cs 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923
  1. using HslCommunication;
  2. using HslCommunication.Profinet.Siemens;
  3. using IMCS.CCS.Common.Redis;
  4. using IMCS.CCS.DeviceProtocol;
  5. using IMCS.CCS.Entitys;
  6. using IMCS.CCS.Models.vo;
  7. using IMCS.CCS.Services;
  8. using IMCS_CCS.Model.vo;
  9. using IMCS_CCS.Utils;
  10. using Microsoft.Extensions.Configuration;
  11. using Newtonsoft.Json;
  12. using S7.Net;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using IMCS.CCS.Models;
  19. using System.Net.NetworkInformation;
  20. using IMCS_CCS.Model;
  21. namespace IMCS.CCS.Service.Impl
  22. {
  23. /// <summary>
  24. /// 任务调度服务
  25. /// </summary>
  26. public class TaskJobService : ITaskJobService
  27. {
  28. private readonly IRedisService _redisService;
  29. private readonly IDeviceService _deviceService;
  30. private readonly IApiRequestService _apiRequestService;
  31. private readonly ITaskCallbackService _taskCallbackService;
  32. private readonly ICcsTagValueService _ccsTagValueService;
  33. private readonly IEquipmentMonitorService _equipmentMonitorService;
  34. private readonly IDictionaryService _dictionaryService;
  35. private readonly ICcsActionAddressService _ccsActionAddressService;
  36. private string ecsUrlContext;
  37. private string ecsRootUrlContext;
  38. private string fanucUrlContext;
  39. private string opcuacUrlContext;
  40. private string hdhUrlContext;
  41. private Dictionary<String, int> syncStatusMap = new Dictionary<String, int>();
  42. private Dictionary<String, String> jcAddressDict = new Dictionary<String, String>();
  43. private Dictionary<String, String> jcIpDict = new Dictionary<String, String>();
  44. private string LOG_TITLE_OPCUA = "OPCUA采集";
  45. private string LOG_TITLE_FUNC = "发那科采集";
  46. private string LOG_TITLE_HEIDEHAIN = "海德汉采集";
  47. private string LOG_TITLE_S7 = "S7采集";
  48. private string LOG_TITLE_CALLBACK = "回调任务";
  49. private string LOG_TITLE_DEVICE = "设备监控";
  50. private string PLC_ALARM_INFO = "PLC有异常";
  51. private string imcs_redis_key = "IMCS_CCS:";
  52. public IConfiguration Configuration { get; }
  53. public TaskJobService(IRedisService redisService,
  54. ITaskCallbackService taskCallbackService,
  55. IDeviceService deviceService,
  56. IApiRequestService apiRequestService,
  57. ICcsTagValueService ccsTagValueService,
  58. IEquipmentMonitorService equipmentMonitorService,
  59. IDictionaryService dictionaryService,
  60. ICcsActionAddressService ccsActionAddressService,
  61. IConfiguration configuration)
  62. {
  63. _redisService = redisService;
  64. _taskCallbackService = taskCallbackService;
  65. _deviceService = deviceService;
  66. _apiRequestService = apiRequestService;
  67. _ccsTagValueService = ccsTagValueService;
  68. _equipmentMonitorService = equipmentMonitorService;
  69. _dictionaryService = dictionaryService;
  70. _ccsActionAddressService = ccsActionAddressService;
  71. Configuration = configuration;
  72. ecsUrlContext = Configuration.GetConnectionString("ecsUrlContext");
  73. fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
  74. opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
  75. hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext");
  76. ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
  77. syncStatusMap.Add("离线", 0);
  78. syncStatusMap.Add("空闲", 1);
  79. syncStatusMap.Add("生产中", 2);
  80. syncStatusMap.Add("报警", 3);
  81. //在线状态默认传参后台空闲状态
  82. syncStatusMap.Add("在线", 1);
  83. syncStatusMap.Add("掉线", -1);
  84. }
  85. /// <summary>
  86. /// 采集数据OPCUA
  87. /// </summary>
  88. /// <returns></returns>
  89. public async Task<string> DataCollectOPCUAJob()
  90. {
  91. try
  92. {
  93. List<Device> deviceList = await getDeviceList();
  94. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString()) && x.State).ToList();
  95. foreach (Device device in deviceList)
  96. {
  97. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  98. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  99. var data = await _redisService.Database.StringGetAsync(redis_key);
  100. if (data.IsNullOrEmpty)
  101. {
  102. CcsTagValue tagQuery = new CcsTagValue();
  103. tagQuery.ProtocolType = device.ProtocolType;
  104. tagQuery.Ip = device.Ip;
  105. tagValues = _ccsTagValueService.GetList(tagQuery);
  106. //首次设置redis
  107. if (tagValues != null && tagValues.Count > 0)
  108. {
  109. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  110. }
  111. }
  112. else
  113. {
  114. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  115. }
  116. if (tagValues != null && tagValues.Count > 0)
  117. {
  118. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  119. List<string> addresses = new List<string>();
  120. foreach (CcsTagValue tagValue in tagValues)
  121. {
  122. addresses.Add(tagValue.Address);
  123. }
  124. //调用opcua是否连接接口
  125. RequestOpcUaData opcUaReq = new RequestOpcUaData();
  126. opcUaReq.ServerUrl = device.ServerUrl;
  127. opcUaReq.UserName = device.UserName;
  128. opcUaReq.Password = device.Password;
  129. opcUaReq.Type = OpcUaActionTypeEnum.Read.ToString();
  130. opcUaReq.Addresses = addresses;
  131. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  132. ResponseOpcUaData responseOpcUaData = JsonConvert.DeserializeObject<ResponseOpcUaData>(Result.Message);
  133. if (!Result.IsSuccess || !responseOpcUaData.result)
  134. {
  135. device.State = false;
  136. await _deviceService.UpdateDevice(device);
  137. Log.Instance.WriteLogAdd("OpcUA采集异常,连不上设备", LOG_TITLE_OPCUA);
  138. return "采集失败,连不上设备";
  139. }
  140. List<string> values = responseOpcUaData.values;
  141. if (values != null)
  142. {
  143. for (int i = 0; i < tagValues.Count; i++)
  144. {
  145. CcsTagValue tagValueData = (CcsTagValue)tagValues[i];
  146. //科学计数法转换
  147. if (values[i].Contains("E") && tagValueData.Type == TagValueReadTypeEnum.Double.ToString())
  148. {
  149. Decimal d = ChangeToDecimal(values[i]);
  150. values[i] = d.ToString();
  151. }
  152. if (tagValueData.TagValue != values[i])
  153. {
  154. tagValueData.TagValue = values[i];
  155. tagValueData.UpdateTime = DateTime.Now;
  156. changTagValues.Add(tagValueData);
  157. Log.Instance.WriteLogAdd("OpcUA采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_OPCUA);
  158. //有变化更新数据库
  159. await _ccsTagValueService.Update(tagValueData);
  160. }
  161. }
  162. }
  163. //值有变化,重新设置一次redis
  164. if (changTagValues != null && changTagValues.Count > 0)
  165. {
  166. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  167. }
  168. CcsTagValue tagQuery = new CcsTagValue();
  169. tagQuery.ProtocolType = device.ProtocolType;
  170. tagQuery.Ip = device.Ip;
  171. tagValues = _ccsTagValueService.GetList(tagQuery);
  172. //机床复位
  173. CcsTagValue tagValue1 = tagValues.Where(t => t.Address == "ns=2;s=/Plc/M1500.2").FirstOrDefault();
  174. CcsTagValue tagValue2 = tagValues.Where(t => t.Address == "ns=2;s=/Plc/M1500.4").FirstOrDefault();
  175. if (tagValue1.TagValue == "True" && tagValue2.TagValue == "True")
  176. {
  177. opcUaReq.Addresses = new List<string>() { "ns=2;s=/Plc/M1999.1" };
  178. opcUaReq.Values = new List<string>() { "False" };
  179. opcUaReq.Type = OpcUaActionTypeEnum.Write.ToString();
  180. await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  181. }
  182. //存储采集数据
  183. CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_OPCUA);
  184. }
  185. else
  186. {
  187. Log.Instance.WriteLogAdd("OpcUA采集异常,没有采集数据===", LOG_TITLE_OPCUA);
  188. return "没有采集数据";
  189. }
  190. }
  191. return "OpcUA采集成功";
  192. }
  193. catch (Exception ex)
  194. {
  195. Log.Instance.WriteLogAdd("OpcUA采集异常===>>" + ex.Message, LOG_TITLE_OPCUA);
  196. return "OpcUA采集失败";
  197. }
  198. }
  199. /// <summary>
  200. /// 采集数据S7
  201. /// </summary>
  202. /// <returns></returns>
  203. public async Task<string> DataCollectS7Job()
  204. {
  205. try
  206. {
  207. List<Device> deviceList = await getDeviceList();
  208. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()) && x.State).ToList();
  209. if (deviceList == null || deviceList.Count == 0) {
  210. return "无在线设备";
  211. }
  212. foreach (Device device in deviceList)
  213. {
  214. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  215. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  216. var data = await _redisService.Database.StringGetAsync(redis_key);
  217. if (data.IsNullOrEmpty)
  218. {
  219. CcsTagValue tagQuery = new CcsTagValue();
  220. tagQuery.ProtocolType = device.ProtocolType;
  221. tagQuery.Ip = device.Ip;
  222. tagValues = _ccsTagValueService.GetList(tagQuery);
  223. //首次吧tagValues需要才接的db块偏移量设置到redis
  224. if (tagValues != null && tagValues.Count > 0)
  225. {
  226. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  227. }
  228. }
  229. else
  230. {
  231. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  232. }
  233. if (tagValues != null && tagValues.Count > 0)
  234. {
  235. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(data);
  236. List<CcsTagValue> changTagValues = new List<CcsTagValue>();
  237. //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  238. SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.ServerUrl);
  239. OperateResult ConnectionResult = s7.ConnectServer();
  240. if (!ConnectionResult.IsSuccess)
  241. {
  242. device.State = false;
  243. await _deviceService.UpdateDevice(device);
  244. s7.ConnectClose();
  245. Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>"+ device.ServerUrl, LOG_TITLE_S7);
  246. return "采集失败,创建与plc连接失败,未连接上PLC";
  247. }
  248. else
  249. {
  250. foreach (CcsTagValue tagValueData in tagValues)
  251. {
  252. string operateResult = "";
  253. if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString()))
  254. {
  255. operateResult = s7.ReadBool(tagValueData.Address).Content.ToString();
  256. }
  257. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString()))
  258. {
  259. operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString();
  260. }
  261. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString()))
  262. {
  263. operateResult = s7.ReadString(tagValueData.Address).Content.ToString();
  264. } else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Byte.ToString())) {
  265. operateResult = s7.ReadByte(tagValueData.Address).Content.ToString();
  266. }
  267. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Array.ToString()))
  268. {
  269. // 判断是否启动分类读取数据
  270. if (tagValueData.SplitEnable == 1)
  271. {
  272. var aa = s7.Read(tagValueData.Address, 286);
  273. }
  274. else {
  275. operateResult = ToolUtils.ReturnStringByBytes(s7.Read(tagValueData.Address, 40).Content);
  276. }
  277. }
  278. if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult)
  279. {
  280. tagValueData.TagValue = operateResult.ToString();
  281. tagValueData.UpdateTime = DateTime.Now;
  282. changTagValues.Add(tagValueData);
  283. Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  284. //有变化更新数据库
  285. await _ccsTagValueService.Update(tagValueData);
  286. }
  287. Thread.Sleep(50);
  288. }
  289. s7.ConnectClose();
  290. //值有变化,重新设置一次redis
  291. if (changTagValues != null && changTagValues.Count > 0)
  292. {
  293. await _redisService.Database.StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  294. }
  295. //存储采集数据
  296. CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_S7);
  297. }
  298. }
  299. }
  300. return "S7采集成功";
  301. }
  302. catch (Exception ex)
  303. {
  304. Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7);
  305. return "S7采集失败" + ex.Message;
  306. }
  307. }
  308. /// <summary>
  309. /// 采集数据FANUC
  310. /// </summary>
  311. /// <returns></returns>
  312. public async Task<string> DataCollectFanucJob()
  313. {
  314. try
  315. {
  316. List<Device> deviceList = await getDeviceList();
  317. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.FANUC.ToString()) && x.State).ToList();
  318. foreach (Device device in deviceList)
  319. {
  320. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  321. //调用发那科接口
  322. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=All", null, null);
  323. if (Result.IsSuccess)
  324. {
  325. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  326. //采集数据放入缓存
  327. await _redisService.Database.StringSetAsync(redis_key, Result.Message);
  328. //存储采集数据
  329. CollectDataLog.Instance.WriteLogAdd(Result.Message, LOG_TITLE_FUNC);
  330. }
  331. }
  332. return "FANUC采集成功";
  333. }
  334. catch (Exception ex)
  335. {
  336. Log.Instance.WriteLogAdd("FANUC采集异常===>>" + ex.Message, LOG_TITLE_S7);
  337. return "FANUC采集失败";
  338. }
  339. }
  340. /// <summary>
  341. /// 采集数据HEIDEHAIN
  342. /// </summary>
  343. /// <returns></returns>
  344. public async Task<string> DataCollectHeidehainJob()
  345. {
  346. try
  347. {
  348. List<Device> deviceList = _deviceService.GetDeviceAllList();
  349. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString()) && x.State).ToList();
  350. if (deviceList == null || deviceList.Count <= 0)
  351. {
  352. Log.Instance.WriteLogAdd("数据采集===>>HEIDEHAIN设备无在线");
  353. //Console.WriteLine("数据采集===>>HEIDEHAIN设备无在线");
  354. return "HEIDEHAIN设备无在线";
  355. }
  356. foreach (Device device in deviceList)
  357. {
  358. RequestHeidhData hdhReq = new RequestHeidhData();
  359. hdhReq.ServerUrl = device.ServerUrl;
  360. hdhReq.MachineName = device.UserName;
  361. hdhReq.Type = "Collect";
  362. //调用海德汉采集接口
  363. Log.Instance.WriteLogAdd("海得汉采集调用地址-->" + hdhUrlContext + " 调用参数->" + hdhReq);
  364. //Console.WriteLine("海得汉采集调用地址-->" + hdhUrlContext + " 调用参数->" + hdhReq);
  365. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  366. {
  367. Log.Instance.WriteLogAdd("采集得数据-->" + Result);
  368. string redis_key = "IMCS_CCS:" + device.Ip + ":" + device.ProtocolType;
  369. //采集数据放入缓存
  370. await _redisService.Database.StringSetAsync(redis_key, Result.Message);
  371. //存储采集数据
  372. CollectDataLog.Instance.WriteLogAdd(Result.Message, LOG_TITLE_HEIDEHAIN);
  373. }
  374. }
  375. return "HEIDEHAIN采集成功";
  376. }
  377. catch (Exception ex)
  378. {
  379. Log.Instance.WriteLogAdd("HEIDEHAIN采集异常===>>" + ex.Message, LOG_TITLE_S7);
  380. return "HEIDEHAIN采集失败";
  381. }
  382. }
  383. /// <summary>
  384. /// 上传程序回调任务
  385. /// </summary>
  386. /// <returns></returns>
  387. public async Task<string> CallbackJob1()
  388. {
  389. List<TaskCallback> list = new List<TaskCallback>();
  390. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  391. if (taskCallbackListData.IsNullOrEmpty)
  392. {
  393. list = await _taskCallbackService.GetAllList();
  394. }
  395. else
  396. {
  397. list = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  398. }
  399. TaskCallback task = list.Where(x => x.OperateType.Equals(ActionTypeEnum.UploadFile.ToString())).FirstOrDefault();
  400. if (task == null)
  401. {
  402. return "无回调任务";
  403. }
  404. string message = "";
  405. try
  406. {
  407. DateTime currentTime = DateTime.Now;
  408. if (currentTime.Subtract(task.CreateTime).TotalSeconds > 5)
  409. {
  410. CallBackRequestData requestData = new CallBackRequestData();
  411. requestData.taskId = long.Parse(task.TaskId);
  412. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  413. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  414. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  415. if (result.IsSuccess && responseECSCallback.code == 0)
  416. {
  417. task.State = false;
  418. task.UpdateTime = DateTime.Now;
  419. task.Description = result.Message;
  420. await _taskCallbackService.CreateOrUpdateAndCache(task);
  421. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  422. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  423. }
  424. else
  425. {
  426. task.UpdateTime = DateTime.Now;
  427. task.Description = result.Message;
  428. await _taskCallbackService.CreateOrUpdateAndCache(task);
  429. message = message + JsonConvert.SerializeObject(task) + ",上传请求失败! WebApi 返回结果" + ";";
  430. Log.Instance.WriteLogAdd("上传回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  431. }
  432. }
  433. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  434. }
  435. catch (Exception ex)
  436. {
  437. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  438. return "回调异常" + ex.Message;
  439. }
  440. }
  441. /// <summary>
  442. /// 柔性产线,伺服等取和放回调任务
  443. /// </summary>
  444. /// <returns></returns>
  445. public async Task<string> CallbackJob2()
  446. {
  447. List<TaskCallback> taskList = new List<TaskCallback>();
  448. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  449. // 判断redis是否有数据,没有则查询表中是否有没有完成任务
  450. if (taskCallbackListData.IsNullOrEmpty)
  451. {
  452. taskList = await _taskCallbackService.GetAllList();
  453. }
  454. else
  455. {
  456. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  457. }
  458. //在线设备
  459. List<Device> deviceList = await getDeviceList();
  460. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.RobotAction.ToString())).ToList();
  461. taskList = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).ToList();
  462. //TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault() ;
  463. if (taskList == null || taskList.Count == 0)
  464. {
  465. return "无回调任务" ;
  466. }
  467. string message = "";
  468. try
  469. {
  470. foreach(TaskCallback task in taskList)
  471. {
  472. CcsTagValue tagValueQuery = new CcsTagValue();
  473. tagValueQuery.Ip = task.IP;
  474. // 查询出采集的数据
  475. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  476. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  477. // ①比较采集的数据值与回调的值是否相等,
  478. // ②并且比较完成的时间与数据创建的时间是否大于10秒,因为机器人运动远大与十秒,小于十秒说明数据采集有问题,
  479. DateTime currentTime = DateTime.Now ;
  480. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue && currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  481. {
  482. CallBackRequestData requestData = new CallBackRequestData();
  483. requestData.taskId = long.Parse(task.TaskId);
  484. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  485. // 调用接口回传给imcs
  486. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  487. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  488. if (result.IsSuccess && responseECSCallback.code == 0)
  489. {
  490. //请求成功,任务状态改成结束
  491. task.State = false;
  492. task.UpdateTime = DateTime.Now;
  493. task.Description = result.Message;
  494. await _taskCallbackService.CreateOrUpdateAndCache(task);
  495. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  496. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  497. }
  498. else
  499. {
  500. //ecs返回-5 任务作废
  501. if(result.IsSuccess && responseECSCallback.code == -5)
  502. {
  503. task.State = false;
  504. task.UpdateTime = DateTime.Now;
  505. task.Description = "ecs返回-5,回调任务作废";
  506. await _taskCallbackService.CreateOrUpdateAndCache(task);
  507. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  508. Log.Instance.WriteLogAdd("回调异常,请求接口失败,ecs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  509. }
  510. else
  511. {
  512. task.UpdateTime = DateTime.Now;
  513. task.Description = result.Message;
  514. await _taskCallbackService.CreateOrUpdateAndCache(task);
  515. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  516. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  517. }
  518. }
  519. }
  520. //回调检测到失败,回调通知ecs
  521. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  522. {
  523. bool failFalg = false;
  524. if (!string.IsNullOrEmpty(task.FailAddress))
  525. {
  526. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  527. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  528. {
  529. failFalg = true;
  530. }
  531. }
  532. if (!string.IsNullOrEmpty(task.FailAddress2))
  533. {
  534. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  535. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  536. {
  537. failFalg = true;
  538. }
  539. }
  540. if (!string.IsNullOrEmpty(task.FailAddress3))
  541. {
  542. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  543. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  544. {
  545. failFalg = true;
  546. }
  547. }
  548. if (failFalg)
  549. {
  550. CallBackRequestData requestData = new CallBackRequestData();
  551. requestData.taskId = long.Parse(task.TaskId);
  552. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  553. requestData.code = "0";
  554. requestData.msg = "操作失败";
  555. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  556. if (result.IsSuccess)
  557. {
  558. task.State = false;
  559. task.UpdateTime = DateTime.Now;
  560. task.Description = result.Message;
  561. await _taskCallbackService.CreateOrUpdateAndCache(task);
  562. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",回调失败结果:" + result.Message + ";";
  563. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  564. }
  565. else
  566. {
  567. task.UpdateTime = DateTime.Now;
  568. task.Description = result.Message;
  569. await _taskCallbackService.CreateOrUpdateAndCache(task);
  570. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  571. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  572. }
  573. }
  574. }
  575. Thread.Sleep(1000);
  576. }
  577. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  578. }
  579. catch (Exception ex)
  580. {
  581. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  582. return "回调异常" + ex.Message;
  583. }
  584. }
  585. /// <summary>
  586. /// 吹干机回调任务
  587. /// </summary>
  588. /// <returns></returns>
  589. public async Task<string> CallbackJob3()
  590. {
  591. List<TaskCallback> taskList = new List<TaskCallback>();
  592. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  593. if (taskCallbackListData.IsNullOrEmpty)
  594. {
  595. taskList = await _taskCallbackService.GetAllList();
  596. }
  597. else
  598. {
  599. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  600. }
  601. List<Device> deviceList = await getDeviceList();
  602. //在线设备
  603. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartDryMachine.ToString()) && x.State).ToList();
  604. TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  605. if (task == null)
  606. {
  607. return "无回调任务";
  608. }
  609. string message = "";
  610. try
  611. {
  612. DateTime currentTime = DateTime.Now;
  613. CcsTagValue tagValueQuery = new CcsTagValue();
  614. tagValueQuery.Ip = task.IP;
  615. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  616. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  617. //CcsTagValue callBacktagValue2 = tagValues.Where(o => o.Address == task.Address2).FirstOrDefault();
  618. //if (callBacktagValue != null && callBacktagValue2 != null && callBacktagValue.TagValue == task.CallbackValue && callBacktagValue2.TagValue == task.CallbackValue2)
  619. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue)
  620. {
  621. CallBackRequestData requestData = new CallBackRequestData();
  622. requestData.taskId = long.Parse(task.TaskId);
  623. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  624. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  625. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  626. if (result.IsSuccess && responseECSCallback.code == 0)
  627. {
  628. /*if (!string.IsNullOrEmpty(task.SuccessResetAddress))
  629. {
  630. Plc s7 = DevicePlcS7.S7(task.IP, ProtocalTypeEnum.S7_1500.ToString());
  631. if (s7.IsConnected == true)
  632. {
  633. string ResetAddress = ToolUtils.AddressConvertDBW(task.SuccessResetAddress);
  634. //short mc = 0;
  635. short mc = (short)int.Parse(task.SuccessResetValue);
  636. s7.Write(ResetAddress, mc);
  637. s7.Close();
  638. }
  639. }*/
  640. task.State = false;
  641. task.UpdateTime = DateTime.Now;
  642. await _taskCallbackService.CreateOrUpdateAndCache(task);
  643. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  644. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  645. }
  646. else
  647. {
  648. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  649. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  650. }
  651. }
  652. //回调检测到失败,回调通知ecs
  653. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  654. {
  655. bool failFalg = false;
  656. if (!string.IsNullOrEmpty(task.FailAddress))
  657. {
  658. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  659. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  660. {
  661. failFalg = true;
  662. }
  663. }
  664. if (!string.IsNullOrEmpty(task.FailAddress2))
  665. {
  666. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  667. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  668. {
  669. failFalg = true;
  670. }
  671. }
  672. if (!string.IsNullOrEmpty(task.FailAddress3))
  673. {
  674. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  675. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  676. {
  677. failFalg = true;
  678. }
  679. }
  680. if (failFalg)
  681. {
  682. CallBackRequestData requestData = new CallBackRequestData();
  683. requestData.taskId = long.Parse(task.TaskId);
  684. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  685. requestData.code = "0";
  686. requestData.msg = "操作失败";
  687. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  688. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  689. if (result.IsSuccess && responseECSCallback.code == 0)
  690. {
  691. task.State = false;
  692. task.UpdateTime = DateTime.Now;
  693. await _taskCallbackService.CreateOrUpdateAndCache(task);
  694. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  695. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  696. }
  697. else
  698. {
  699. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  700. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  701. }
  702. }
  703. }
  704. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  705. }
  706. catch (Exception ex)
  707. {
  708. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  709. return "回调异常" + ex.Message;
  710. }
  711. }
  712. /// <summary>
  713. /// 启动机床程序回调任务
  714. /// </summary>
  715. /// <returns></returns>
  716. public async Task<string> CallbackJob4()
  717. {
  718. List<TaskCallback> taskList = new List<TaskCallback>();
  719. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  720. if (taskCallbackListData.IsNullOrEmpty)
  721. {
  722. taskList = await _taskCallbackService.GetAllList();
  723. }
  724. else
  725. {
  726. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  727. }
  728. List<Device> deviceList = await getDeviceList();
  729. //在线设备
  730. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartNCProgram.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  731. if (taskList == null || taskList.Count == 0)
  732. {
  733. return "无回调任务";
  734. }
  735. string message = "";
  736. try
  737. {
  738. DateTime currentTime = DateTime.Now;
  739. foreach (TaskCallback task in taskList)
  740. {
  741. CcsTagValue tagValueQuery = new CcsTagValue();
  742. tagValueQuery.Ip = task.IP;
  743. //tagValueQuery.Address = task.Address;
  744. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  745. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address.Trim()).FirstOrDefault();
  746. if (tagValue != null && tagValue.TagValue == task.CallbackValue && currentTime.Subtract(task.CreateTime).TotalSeconds > 5)
  747. {
  748. CallBackRequestData requestData = new CallBackRequestData();
  749. requestData.taskId = long.Parse(task.TaskId);
  750. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  751. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  752. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  753. if (result.IsSuccess && responseECSCallback.code == 0)
  754. {
  755. task.State = false;
  756. task.UpdateTime = DateTime.Now;
  757. task.Description = result.Message;
  758. await _taskCallbackService.CreateOrUpdateAndCache(task);
  759. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  760. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  761. }
  762. else
  763. {
  764. task.UpdateTime = DateTime.Now;
  765. task.Description = result.Message;
  766. await _taskCallbackService.CreateOrUpdateAndCache(task);
  767. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  768. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  769. }
  770. }
  771. //回调检测到失败,回调通知ecs
  772. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  773. {
  774. bool failFalg = false;
  775. if (!string.IsNullOrEmpty(task.FailAddress))
  776. {
  777. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  778. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  779. {
  780. failFalg = true;
  781. }
  782. }
  783. if (!string.IsNullOrEmpty(task.FailAddress2))
  784. {
  785. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  786. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  787. {
  788. failFalg = true;
  789. }
  790. }
  791. if (!string.IsNullOrEmpty(task.FailAddress3))
  792. {
  793. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  794. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  795. {
  796. failFalg = true;
  797. }
  798. }
  799. if (failFalg)
  800. {
  801. CallBackRequestData requestData = new CallBackRequestData();
  802. requestData.taskId = long.Parse(task.TaskId);
  803. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  804. requestData.code = "0";
  805. requestData.msg = "操作失败";
  806. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  807. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  808. if (result.IsSuccess && responseECSCallback.code == 0)
  809. {
  810. task.State = false;
  811. task.UpdateTime = DateTime.Now;
  812. task.Description = result.Message;
  813. await _taskCallbackService.CreateOrUpdateAndCache(task);
  814. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  815. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  816. }
  817. else
  818. {
  819. task.UpdateTime = DateTime.Now;
  820. task.Description = result.Message;
  821. await _taskCallbackService.CreateOrUpdateAndCache(task);
  822. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  823. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  824. }
  825. }
  826. }
  827. Thread.Sleep(1000);
  828. }
  829. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  830. }
  831. catch (Exception ex)
  832. {
  833. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  834. return "回调异常" + ex.Message;
  835. }
  836. }
  837. /// <summary>
  838. /// 启动清洗机回调任务
  839. /// </summary>
  840. /// <returns></returns>
  841. public async Task<string> CallbackJob5()
  842. {
  843. List<TaskCallback> taskList = new List<TaskCallback>();
  844. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  845. if (taskCallbackListData.IsNullOrEmpty)
  846. {
  847. taskList = await _taskCallbackService.GetAllList();
  848. }
  849. else
  850. {
  851. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  852. }
  853. List<Device> deviceList = await getDeviceList();
  854. //在线设备
  855. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.StartCleanMachine.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  856. // TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault();
  857. if (taskList == null || taskList.Count == 0)
  858. {
  859. return "无回调任务";
  860. }
  861. string message = "";
  862. try
  863. {
  864. DateTime currentTime = DateTime.Now;
  865. foreach (TaskCallback task in taskList)
  866. {
  867. CcsTagValue tagValueQuery = new CcsTagValue();
  868. tagValueQuery.Ip = task.IP;
  869. //tagValueQuery.Address = task.Address;
  870. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  871. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  872. if (tagValue != null && tagValue.TagValue == task.CallbackValue)
  873. //临时处理以解决ecs配置问题
  874. //if(currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  875. {
  876. CallBackRequestData requestData = new CallBackRequestData();
  877. requestData.taskId = long.Parse(task.TaskId);
  878. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  879. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  880. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  881. if (result.IsSuccess && responseECSCallback.code == 0)
  882. {
  883. task.State = false;
  884. task.UpdateTime = DateTime.Now;
  885. await _taskCallbackService.CreateOrUpdateAndCache(task);
  886. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  887. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  888. }
  889. else
  890. {
  891. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  892. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  893. }
  894. }
  895. //回调检测到失败,回调通知ecs
  896. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  897. {
  898. bool failFalg = false;
  899. if (!string.IsNullOrEmpty(task.FailAddress))
  900. {
  901. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  902. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  903. {
  904. failFalg = true;
  905. }
  906. }
  907. if (!string.IsNullOrEmpty(task.FailAddress2))
  908. {
  909. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  910. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  911. {
  912. failFalg = true;
  913. }
  914. }
  915. if (!string.IsNullOrEmpty(task.FailAddress3))
  916. {
  917. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  918. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  919. {
  920. failFalg = true;
  921. }
  922. }
  923. if (failFalg)
  924. {
  925. CallBackRequestData requestData = new CallBackRequestData();
  926. requestData.taskId = long.Parse(task.TaskId);
  927. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  928. requestData.code = "0";
  929. requestData.msg = "操作失败";
  930. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  931. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  932. if (result.IsSuccess && responseECSCallback.code == 0)
  933. {
  934. task.State = false;
  935. task.UpdateTime = DateTime.Now;
  936. await _taskCallbackService.CreateOrUpdateAndCache(task);
  937. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  938. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  939. }
  940. else
  941. {
  942. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  943. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  944. }
  945. }
  946. }
  947. Thread.Sleep(1000);
  948. }
  949. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  950. }
  951. catch (Exception ex)
  952. {
  953. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  954. return "回调异常" + ex.Message;
  955. }
  956. }
  957. /// <summary>
  958. /// 三坐标回调任务
  959. /// </summary>
  960. /// <returns></returns>
  961. public async Task<string> CallbackJob6()
  962. {
  963. List<TaskCallback> taskList = new List<TaskCallback>();
  964. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  965. if (taskCallbackListData.IsNullOrEmpty)
  966. {
  967. taskList = await _taskCallbackService.GetAllList();
  968. }
  969. else
  970. {
  971. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  972. }
  973. List<Device> deviceList = await getDeviceList();
  974. //在线设备
  975. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.ThreeDimensionalRun.ToString()) && x.State && deviceList.Any(device => device.Ip == x.IP)).ToList();
  976. if (taskList == null || taskList.Count == 0)
  977. {
  978. return "无回调任务";
  979. }
  980. string message = "";
  981. try
  982. {
  983. foreach (TaskCallback task in taskList)
  984. {
  985. CcsTagValue tagValueQuery = new CcsTagValue();
  986. tagValueQuery.Ip = task.IP;
  987. //tagValueQuery.Address = task.Address;
  988. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  989. CcsTagValue tagValue = tagValues.Where(o => o.Address == task.Address.Trim()).FirstOrDefault();
  990. // ① 比较采集的数据值与回调设置的值是否一致
  991. // ② 因为采集的值会出现时间间隔问题,所以进行与当前时间判断,如果时间过短说明上一次的状态没进行重置
  992. DateTime currentTime = DateTime.Now;
  993. if (tagValue != null && tagValue.TagValue == task.CallbackValue && currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  994. {
  995. CallBackRequestData requestData = new CallBackRequestData();
  996. requestData.taskId = long.Parse(task.TaskId);
  997. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  998. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  999. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1000. if (result.IsSuccess && responseECSCallback.code == 0)
  1001. {
  1002. task.State = false;
  1003. task.UpdateTime = DateTime.Now;
  1004. task.Description = result.Message;
  1005. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1006. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  1007. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1008. }
  1009. else
  1010. {
  1011. task.UpdateTime = DateTime.Now;
  1012. task.Description = result.Message;
  1013. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1014. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1015. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  1016. }
  1017. }
  1018. //回调检测到失败,回调通知ecs
  1019. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  1020. {
  1021. bool failFalg = false;
  1022. if (!string.IsNullOrEmpty(task.FailAddress))
  1023. {
  1024. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  1025. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1026. {
  1027. failFalg = true;
  1028. }
  1029. }
  1030. if (!string.IsNullOrEmpty(task.FailAddress2))
  1031. {
  1032. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  1033. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1034. {
  1035. failFalg = true;
  1036. }
  1037. }
  1038. if (!string.IsNullOrEmpty(task.FailAddress3))
  1039. {
  1040. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  1041. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1042. {
  1043. failFalg = true;
  1044. }
  1045. }
  1046. if (failFalg)
  1047. {
  1048. CallBackRequestData requestData = new CallBackRequestData();
  1049. requestData.taskId = long.Parse(task.TaskId);
  1050. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  1051. requestData.code = "0";
  1052. requestData.msg = "操作失败";
  1053. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  1054. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1055. if (result.IsSuccess && responseECSCallback.code == 0)
  1056. {
  1057. task.State = false;
  1058. task.UpdateTime = DateTime.Now;
  1059. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1060. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  1061. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1062. }
  1063. else
  1064. {
  1065. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1066. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  1067. }
  1068. }
  1069. }
  1070. Thread.Sleep(100);
  1071. }
  1072. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  1073. }
  1074. catch (Exception ex)
  1075. {
  1076. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  1077. return "回调异常" + ex.Message;
  1078. }
  1079. }
  1080. /// <summary>
  1081. /// 监控设备状态
  1082. /// </summary>
  1083. /// <returns></returns>
  1084. public async Task<string> MonitorEquipmentStatusJob()
  1085. {
  1086. try
  1087. {
  1088. string message = "MonitorEquipmentStatusJob调度成功";
  1089. //查询全部使用设备包括不在线和离线
  1090. string all_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLDeviceList ;
  1091. List<Device> devices = new List<Device>();
  1092. var deviceListData = await _redisService.Database.StringGetAsync(all_device_redis_key);
  1093. if (deviceListData.IsNullOrEmpty)
  1094. {
  1095. devices = _deviceService.GetDevices();
  1096. await _redisService.Database.StringSetAsync(all_device_redis_key, JsonConvert.SerializeObject(devices));
  1097. }
  1098. else
  1099. {
  1100. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1101. }
  1102. List<EquipmentMonitor> equipmentMonitors = new List<EquipmentMonitor>();
  1103. string equipment_monitors_redis_key = imcs_redis_key + RedisKeyEnum.MonitorEquipmentStatusJob;
  1104. var data = await _redisService.Database.StringGetAsync(equipment_monitors_redis_key);
  1105. if (data.IsNullOrEmpty)
  1106. {
  1107. equipmentMonitors = await _equipmentMonitorService.GetList();
  1108. //首次设置redis
  1109. if (equipmentMonitors != null && equipmentMonitors.Count > 0)
  1110. {
  1111. await _redisService.Database.StringSetAsync(equipment_monitors_redis_key, JsonConvert.SerializeObject(equipmentMonitors));
  1112. }
  1113. }
  1114. else
  1115. {
  1116. equipmentMonitors = JsonConvert.DeserializeObject<List<EquipmentMonitor>>(data);
  1117. }
  1118. //变化的设备
  1119. List<EquipmentMonitor> changeEquipmentMonitors = new List<EquipmentMonitor>();
  1120. foreach (EquipmentMonitor equipment in equipmentMonitors)
  1121. {
  1122. Device device = devices.Where(x => x.Ip == equipment.IP).FirstOrDefault();
  1123. //缓存取PLC tagvalue 值
  1124. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1125. if(device == null)
  1126. {
  1127. continue;
  1128. }
  1129. string tag_value_redis_key = imcs_redis_key + device.Ip + ":" + device.ProtocolType;
  1130. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1131. if (tagData.IsNullOrEmpty)
  1132. {
  1133. CcsTagValue tagQuery = new CcsTagValue();
  1134. tagQuery.ProtocolType = device.ProtocolType;
  1135. tagQuery.Ip = device.Ip;
  1136. tagValues = _ccsTagValueService.GetList(tagQuery);
  1137. //首次设置redis
  1138. if (tagValues != null && tagValues.Count > 0)
  1139. {
  1140. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  1141. }
  1142. }
  1143. else
  1144. {
  1145. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  1146. }
  1147. CcsTagValue ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  1148. if (device != null && !device.UseState)
  1149. {
  1150. if (equipment.Status != "离线")
  1151. {
  1152. equipment.Status = "离线";
  1153. changeEquipmentMonitors.Add(equipment);
  1154. }
  1155. continue;
  1156. }
  1157. else if(device != null && !device.State)
  1158. {
  1159. if (equipment.Status != "掉线")
  1160. {
  1161. equipment.Status = "掉线";
  1162. changeEquipmentMonitors.Add(equipment);
  1163. }
  1164. continue;
  1165. }
  1166. else if (device != null && device.State && device.UseState && (equipment.Type == "HEIDEHAIN" || equipment.Type == "FANUC"))
  1167. {
  1168. //通过数组获取机床对应的PLC ip地址
  1169. string plcIp = jcIpDict[device.Ip];
  1170. string ktRedisKey = imcs_redis_key + plcIp + ":" + ProtocalTypeEnum.S7_1500;
  1171. string plcAddress = jcAddressDict[device.Ip];
  1172. var ktTagData = await _redisService.Database.StringGetAsync(ktRedisKey);
  1173. List<CcsTagValue> ktTagValues = new List<CcsTagValue>();
  1174. if (ktTagData.IsNullOrEmpty)
  1175. {
  1176. CcsTagValue tagQuery = new CcsTagValue();
  1177. tagQuery.ProtocolType = ProtocalTypeEnum.S7_1500.ToString();
  1178. tagQuery.Ip = plcIp;
  1179. ktTagValues = _ccsTagValueService.GetList(tagQuery);
  1180. //首次设置redis
  1181. if (ktTagValues != null && ktTagValues.Count > 0)
  1182. {
  1183. await _redisService.Database.StringSetAsync(ktRedisKey, JsonConvert.SerializeObject(ktTagValues));
  1184. }
  1185. }
  1186. else
  1187. {
  1188. ktTagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(ktTagData);
  1189. }
  1190. CcsTagValue ktTagValue = ktTagValues.Where(x => x.Ip.Trim() == plcIp && x.Address.Trim() == plcAddress).FirstOrDefault();
  1191. if(ktTagValue != null)
  1192. {
  1193. if (ktTagValue.TagValue == "1")
  1194. {
  1195. if (equipment.Status != "生产中")
  1196. {
  1197. equipment.Status = "生产中";
  1198. changeEquipmentMonitors.Add(equipment);
  1199. }
  1200. continue;
  1201. }
  1202. if (ktTagValue.TagValue == "2")
  1203. {
  1204. if (equipment.Status != "空闲")
  1205. {
  1206. equipment.Status = "空闲";
  1207. changeEquipmentMonitors.Add(equipment);
  1208. }
  1209. continue;
  1210. }
  1211. }
  1212. }
  1213. else if (device != null && (equipment.Name == "机械手" || equipment.Name == "保障中心_伺服舵机"))
  1214. {
  1215. ccsTagValue = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address).FirstOrDefault();
  1216. if (ccsTagValue != null)
  1217. {
  1218. if (ccsTagValue.TagValue == "3")
  1219. {
  1220. if (equipment.Status != "报警")
  1221. {
  1222. equipment.Status = "报警";
  1223. changeEquipmentMonitors.Add(equipment);
  1224. }
  1225. continue;
  1226. }
  1227. }
  1228. CcsTagValue ccsTagValue2 = tagValues.Where(x => x.Ip == equipment.IP && x.Address == equipment.Address2).FirstOrDefault();
  1229. if (ccsTagValue2 != null)
  1230. {
  1231. if (ccsTagValue2.TagValue == "9")
  1232. {
  1233. if (equipment.Status != "报警")
  1234. {
  1235. equipment.Status = "报警";
  1236. changeEquipmentMonitors.Add(equipment);
  1237. }
  1238. continue;
  1239. }
  1240. }
  1241. if (ccsTagValue2.TagValue == "0" || ccsTagValue2.TagValue == "3" || ccsTagValue2.TagValue == "6" || ccsTagValue2.TagValue == "8")
  1242. {
  1243. if (equipment.Status != "空闲")
  1244. {
  1245. equipment.Status = "空闲";
  1246. changeEquipmentMonitors.Add(equipment);
  1247. }
  1248. continue;
  1249. }
  1250. if (equipment.Status != "生产中")
  1251. {
  1252. equipment.Status = "生产中";
  1253. changeEquipmentMonitors.Add(equipment);
  1254. }
  1255. }
  1256. else
  1257. {
  1258. if (equipment.Status != "在线")
  1259. {
  1260. equipment.Status = "在线";
  1261. changeEquipmentMonitors.Add(equipment);
  1262. }
  1263. }
  1264. }
  1265. //初始化推送列表
  1266. List<ProductionStatus> productionStatusList = new List<ProductionStatus>();
  1267. //变化的修改 并且更新缓存
  1268. if (changeEquipmentMonitors.Count > 0)
  1269. {
  1270. foreach (EquipmentMonitor changeEquipment in changeEquipmentMonitors)
  1271. {
  1272. ProductionStatus productionStatus = new ProductionStatus();
  1273. productionStatus.id = changeEquipment.Id.ToString();
  1274. productionStatus.onlineStatus = syncStatusMap[changeEquipment.Status].ToString();
  1275. productionStatusList.Add(productionStatus);
  1276. }
  1277. //修改并重置缓存
  1278. await _equipmentMonitorService.UpdateAndCache(equipmentMonitors);
  1279. }
  1280. //在线设备,报警放入推送数组
  1281. List<Device> onlineDeviceList = await getDeviceList();
  1282. foreach (Device onlineDevice in onlineDeviceList)
  1283. {
  1284. EquipmentMonitor alarmEquipment = equipmentMonitors.Where(x => x.IP == onlineDevice.Ip && x.Type == onlineDevice.ProtocolType).FirstOrDefault();
  1285. if (alarmEquipment != null && alarmEquipment.Type == "HEIDEHAIN")
  1286. {
  1287. Thread.Sleep(1000);
  1288. RequestHeidhData hdhReq = new RequestHeidhData();
  1289. hdhReq.ServerUrl = onlineDevice.ServerUrl;
  1290. hdhReq.MachineName = onlineDevice.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) && !Result.Message.Contains("无报警"))
  1297. {
  1298. ProductionStatus productionStatus = new ProductionStatus();
  1299. productionStatus.id = alarmEquipment.Id.ToString();
  1300. productionStatus.ip = onlineDevice.Ip;
  1301. productionStatus.alertMsg = responseData.errorsInfo;
  1302. productionStatus.alarmState = true;//报警
  1303. productionStatus.onlineStatus = "1";
  1304. productionStatusList.Add(productionStatus);
  1305. }
  1306. }
  1307. }
  1308. else if (alarmEquipment != null && alarmEquipment.Type == "FANUC")
  1309. {
  1310. Thread.Sleep(1000);
  1311. string Url = fanucUrlContext + "?ip=" + onlineDevice.Ip + "&port=" + onlineDevice.Port;
  1312. //调用发那科接口
  1313. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=AlmInfo", null, null);
  1314. if (Result.IsSuccess)
  1315. {
  1316. //ResponseFanucData fncReq = new ResponseFanucData();
  1317. List<AlmInfo> AlmMsg = JsonConvert.DeserializeObject<List<AlmInfo>>(Result.Message);
  1318. //List<AlmInfo> AlmMsg = fncReq.AlmMsg;
  1319. if (AlmMsg != null && AlmMsg.Count > 0)
  1320. {
  1321. var msgs = from o in AlmMsg select o.msg;
  1322. if(msgs != null && !Result.Message.Contains("无报警"))
  1323. {
  1324. ProductionStatus productionStatus = new ProductionStatus();
  1325. productionStatus.id = alarmEquipment.Id.ToString();
  1326. productionStatus.ip = onlineDevice.Ip;
  1327. productionStatus.alertMsg = string.Join(",", msgs.ToArray());
  1328. productionStatus.alarmState = true;//报警
  1329. productionStatus.onlineStatus = "1";
  1330. productionStatusList.Add(productionStatus);
  1331. }
  1332. }
  1333. }
  1334. }
  1335. else if(alarmEquipment != null && onlineDevice.ProtocolType == "S7_1500")
  1336. {
  1337. //缓存取PLCagvalue 值
  1338. List<CcsTagValue> tagValues = new List<CcsTagValue>();
  1339. string tag_value_redis_key = imcs_redis_key + onlineDevice.Ip + ":" + onlineDevice.ProtocolType;
  1340. var tagData = await _redisService.Database.StringGetAsync(tag_value_redis_key);
  1341. if (tagData.IsNullOrEmpty)
  1342. {
  1343. CcsTagValue tagQuery = new CcsTagValue();
  1344. tagQuery.ProtocolType = onlineDevice.ProtocolType;
  1345. tagQuery.Ip = onlineDevice.Ip;
  1346. tagValues = _ccsTagValueService.GetList(tagQuery);
  1347. //首次设置redis
  1348. if (tagValues != null && tagValues.Count > 0)
  1349. {
  1350. await _redisService.Database.StringSetAsync(tag_value_redis_key, JsonConvert.SerializeObject(tagValues));
  1351. }
  1352. }
  1353. else
  1354. {
  1355. tagValues = JsonConvert.DeserializeObject<List<CcsTagValue>>(tagData);
  1356. }
  1357. //获取机械手报警信息
  1358. CcsTagValue plcWarnValue = tagValues.Where(x => x.Ip == alarmEquipment.IP && x.Address == "DB200.34").FirstOrDefault();
  1359. if (plcWarnValue != null && plcWarnValue.TagValue != "0")
  1360. {
  1361. //从字典中查询具体描述
  1362. List<Dictionary> dictList = new List<Dictionary>() ;
  1363. string dict_value_redis_key = imcs_redis_key + RedisKeyEnum.DictKeyList;
  1364. var dictData = await _redisService.Database.StringGetAsync(dict_value_redis_key);
  1365. if (dictData.IsNullOrEmpty)
  1366. {
  1367. Dictionary ccsDictionary = new Dictionary();
  1368. dictList = await _dictionaryService.GetList(ccsDictionary);
  1369. //首次设置redis
  1370. if (dictList != null && dictList.Count > 0)
  1371. {
  1372. await _redisService.Database.StringSetAsync(dict_value_redis_key, JsonConvert.SerializeObject(dictList));
  1373. }
  1374. }
  1375. else
  1376. {
  1377. dictList = JsonConvert.DeserializeObject<List<Dictionary>>(dictData);
  1378. }
  1379. Dictionary dictObj = dictList.Where(x => x.Type == onlineDevice.Ip && x.Code.ToString() == plcWarnValue.TagValue && x.state).FirstOrDefault();
  1380. if (null != dictObj && !string.IsNullOrEmpty(dictObj.DictValue.Trim()))
  1381. {
  1382. ProductionStatus productionStatus = new ProductionStatus();
  1383. productionStatus.id = alarmEquipment.Id.ToString();
  1384. productionStatus.ip = onlineDevice.Ip;
  1385. productionStatus.alertMsg = dictObj.Description.Trim();
  1386. productionStatus.onlineStatus = "1";
  1387. productionStatus.alarmState = true; //报警
  1388. productionStatusList.Add(productionStatus);
  1389. }
  1390. }
  1391. }
  1392. }
  1393. //推送
  1394. if (productionStatusList != null && productionStatusList.Count > 0)
  1395. {
  1396. //主动推送同步状态数据接口
  1397. RequestSynStatusData requestData = new RequestSynStatusData();
  1398. requestData.productionStatus = JsonConvert.SerializeObject(productionStatusList);
  1399. String synStatusUrl = ecsRootUrlContext + "/api/authority/synStatus/synProductionStatus";
  1400. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, synStatusUrl, requestData, null);
  1401. //解析回调数据结果
  1402. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1403. if (responseECSCallback != null && responseECSCallback.code == 0)
  1404. {
  1405. Log.Instance.WriteLogAdd("同步设备状态成功==>" + JsonConvert.SerializeObject(productionStatusList), PLC_ALARM_INFO);
  1406. }
  1407. else
  1408. {
  1409. Log.Instance.WriteLogAdd("同步设备状态操作失败==>:"+JsonConvert.SerializeObject(productionStatusList) + responseECSCallback.msg, PLC_ALARM_INFO);
  1410. }
  1411. }
  1412. return message;
  1413. }
  1414. catch (Exception ex)
  1415. {
  1416. Log.Instance.WriteLogAdd("MonitorEquipmentStatusJob:" + ex.Message, PLC_ALARM_INFO);
  1417. return "MonitorEquipmentStatusJob : " + ex.Message;
  1418. }
  1419. }
  1420. /// <summary>
  1421. /// 监控设备状态
  1422. /// </summary>
  1423. /// <returns></returns>
  1424. public async Task<string> DeviceStatusJob()
  1425. {
  1426. try
  1427. {
  1428. string message = "";
  1429. //redis存放设备的key声明
  1430. string all_use_device_redis_key = imcs_redis_key + RedisKeyEnum.ALLUseDeviceList ;
  1431. List<Device> devices = new List<Device>();
  1432. //查询全部使用设备包括在线和不在线
  1433. var deviceListData = await _redisService.Database.StringGetAsync(all_use_device_redis_key);
  1434. if (deviceListData.IsNullOrEmpty)
  1435. {
  1436. // 查询所有设备,并去除不使用的设备
  1437. devices = _deviceService.GetDeviceAllList();
  1438. await _redisService.Database.StringSetAsync(all_use_device_redis_key, JsonConvert.SerializeObject(devices));
  1439. }
  1440. else
  1441. {
  1442. devices = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1443. }
  1444. //根据类型去除不需要监控的设备,ftp不监控
  1445. devices = devices.Where(x => !x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).ToList();
  1446. foreach (Device device in devices)
  1447. {
  1448. Ping pingSender = new Ping();
  1449. // 通过ping的方式测试网络是否联通
  1450. PingReply reply = pingSender.Send(device.Ip, 1000);
  1451. if (reply.Status != IPStatus.Success)
  1452. {
  1453. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1454. if (oldDevice != null && oldDevice.State)
  1455. {
  1456. device.State = false;
  1457. device.DisconnectUpdateTime = DateTime.Now;
  1458. device.errorMessage = "使用ping方式没用联通ip";
  1459. await _deviceService.UpdateAndCache(device);
  1460. }
  1461. Log.Instance.WriteLogAdd(device.Ip + ":" + device.ProtocolType + "连接失败,或已离线", LOG_TITLE_DEVICE);
  1462. message = message+ "======ip:" + device.Ip + "设备连接失败,或已离线,协议类型:" + device.ProtocolType;
  1463. continue;
  1464. }
  1465. else
  1466. {
  1467. Device oldDevice = await _deviceService.GetDeviceById(device.Id);
  1468. if (oldDevice != null && !oldDevice.State)
  1469. {
  1470. oldDevice.State = true;
  1471. device.DisconnectUpdateTime = DateTime.Now;
  1472. await _deviceService.UpdateAndCache(oldDevice);
  1473. }
  1474. Log.Instance.WriteLogAdd(device.Ip + ":"+ device.ProtocolType + "连接成功", LOG_TITLE_DEVICE);
  1475. message = message + "======ip:" + device.Ip + "连接成功,协议类型:" + device.ProtocolType;
  1476. continue;
  1477. }
  1478. Thread.Sleep(50);
  1479. }
  1480. return message;
  1481. }
  1482. catch (Exception ex)
  1483. {
  1484. Log.Instance.WriteLogAdd("设备连接异常,或以离线" + ex.Message, LOG_TITLE_DEVICE);
  1485. return "设备连接异常,或以离线" + ex.Message;
  1486. }
  1487. }
  1488. /// <summary>
  1489. /// 删除redis
  1490. /// </summary>
  1491. /// <returns></returns>
  1492. public void removeRedis()
  1493. {
  1494. List<Device> devices = _deviceService.GetDeviceAllList();
  1495. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.ALLUseDeviceList);
  1496. _redisService.Database.KeyDelete(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  1497. foreach (Device device in devices)
  1498. {
  1499. _redisService.Database.KeyDelete(imcs_redis_key + device.Ip + ":" + device.ProtocolType);
  1500. }
  1501. }
  1502. /// <summary>
  1503. /// fanuc根据类型获取值
  1504. /// </summary>
  1505. /// <returns></returns>
  1506. private string GetFanucValue(ResponseFanucData fanucData, string address)
  1507. {
  1508. string value = "";
  1509. if (address == FanucAddressEnum.MainProg.ToString())
  1510. {
  1511. value = fanucData.MainProg;
  1512. }
  1513. else if (address == FanucAddressEnum.Status.ToString())
  1514. {
  1515. value = fanucData.Status;
  1516. }
  1517. else if (address == FanucAddressEnum.PowerOnTime.ToString())
  1518. {
  1519. value = fanucData.PowerOnTime;
  1520. }
  1521. else if (address == FanucAddressEnum.ActSpindle.ToString())
  1522. {
  1523. value = fanucData.ActSpindle;
  1524. }
  1525. return value;
  1526. }
  1527. /// <summary>
  1528. /// 数字科学计数法处理
  1529. /// </summary>
  1530. /// <param name="strData"></param>
  1531. /// <returns></returns>
  1532. private Decimal ChangeToDecimal(string strData)
  1533. {
  1534. Decimal dData = 0.0M;
  1535. if (strData.Contains("E"))
  1536. {
  1537. dData = Convert.ToDecimal(Decimal.Parse(strData.ToString(), System.Globalization.NumberStyles.Float));
  1538. }
  1539. else
  1540. {
  1541. dData = Convert.ToDecimal(strData);
  1542. }
  1543. return dData;
  1544. }
  1545. /// <summary>
  1546. /// 获取redis 设备在线列表
  1547. /// </summary>
  1548. /// <param name="strData"></param>
  1549. /// <returns></returns>
  1550. private async Task<List<Device>> getDeviceList()
  1551. {
  1552. List<Device> deviceList = new List<Device>();
  1553. var deviceListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.DeviceList);
  1554. // 会出现redis没有值读取的数据默认带括号导致判断不通过
  1555. if (!deviceListData.IsNullOrEmpty && deviceListData.Length() > 0) {
  1556. deviceList = JsonConvert.DeserializeObject<List<Device>>(deviceListData);
  1557. }
  1558. if (deviceList==null || deviceList.Count == 0) {
  1559. deviceList = _deviceService.GetDeviceList();
  1560. await _redisService.Database.StringSetAsync(imcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList));
  1561. }
  1562. return deviceList;
  1563. }
  1564. public async Task<string> CallbackJob7()
  1565. {
  1566. List<TaskCallback> list = new List<TaskCallback>();
  1567. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  1568. if (taskCallbackListData.IsNullOrEmpty)
  1569. {
  1570. list = await _taskCallbackService.GetAllList();
  1571. }
  1572. else
  1573. {
  1574. list = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  1575. }
  1576. TaskCallback task = list.Where(x => x.OperateType.Equals(ActionTypeEnum.WriteDeviationValue.ToString())).FirstOrDefault();
  1577. if (task == null)
  1578. {
  1579. return "无回调任务";
  1580. }
  1581. string message = "";
  1582. try
  1583. {
  1584. DateTime currentTime = DateTime.Now;
  1585. if (currentTime.Subtract(task.CreateTime).TotalSeconds > 5)
  1586. {
  1587. CallBackRequestData requestData = new CallBackRequestData();
  1588. requestData.taskId = long.Parse(task.TaskId);
  1589. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  1590. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  1591. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1592. if (result.IsSuccess && responseECSCallback.code == 0)
  1593. {
  1594. task.State = false;
  1595. task.UpdateTime = DateTime.Now;
  1596. task.Description = result.Message;
  1597. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1598. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  1599. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1600. }
  1601. else
  1602. {
  1603. task.UpdateTime = DateTime.Now;
  1604. task.Description = result.Message;
  1605. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1606. message = message + JsonConvert.SerializeObject(task) + ",坐标系偏差值请求失败! WebApi 返回结果" + ";";
  1607. Log.Instance.WriteLogAdd("坐标系偏差值回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  1608. }
  1609. }
  1610. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  1611. }
  1612. catch (Exception ex)
  1613. {
  1614. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  1615. return "回调异常" + ex.Message;
  1616. }
  1617. }
  1618. /// <summary>
  1619. /// 刀具伺服机回调
  1620. /// </summary>
  1621. /// <returns></returns>
  1622. public async Task<string> CallbackJob8()
  1623. {
  1624. List<TaskCallback> taskList = new List<TaskCallback>();
  1625. var taskCallbackListData = await _redisService.Database.StringGetAsync(imcs_redis_key + RedisKeyEnum.CallbackTaskList);
  1626. // 判断redis是否有数据,没有则查询表中是否有没有完成任务
  1627. if (taskCallbackListData.IsNullOrEmpty)
  1628. {
  1629. taskList = await _taskCallbackService.GetAllList();
  1630. }
  1631. else
  1632. {
  1633. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  1634. }
  1635. //在线设备
  1636. List<Device> deviceList = await getDeviceList();
  1637. taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.CutterRobotAction.ToString())).ToList();
  1638. taskList = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).ToList();
  1639. //TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault() ;
  1640. if (taskList == null || taskList.Count == 0)
  1641. {
  1642. return "无回调任务";
  1643. }
  1644. string message = "";
  1645. try
  1646. {
  1647. foreach (TaskCallback task in taskList)
  1648. {
  1649. CcsTagValue tagValueQuery = new CcsTagValue();
  1650. tagValueQuery.Ip = task.IP;
  1651. // 查询出采集的数据
  1652. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery).ToList();
  1653. CcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  1654. // ①比较采集的数据值与回调的值是否相等,
  1655. // ②并且比较完成的时间与数据创建的时间是否大于10秒,因为机器人运动远大与十秒,小于十秒说明数据采集有问题,
  1656. DateTime currentTime = DateTime.Now;
  1657. if (callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue && currentTime.Subtract(task.CreateTime).TotalSeconds > 10)
  1658. {
  1659. CallBackRequestData requestData = new CallBackRequestData();
  1660. requestData.taskId = long.Parse(task.TaskId);
  1661. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  1662. // 调用接口回传给imcs
  1663. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  1664. ResponseECSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseECSCallbackData>(result.Message);
  1665. if (result.IsSuccess && responseECSCallback.code == 0)
  1666. {
  1667. //请求成功,任务状态改成结束
  1668. task.State = false;
  1669. task.UpdateTime = DateTime.Now;
  1670. task.Description = result.Message;
  1671. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1672. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  1673. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1674. }
  1675. else
  1676. {
  1677. //ecs返回-5 任务作废
  1678. if (result.IsSuccess && responseECSCallback.code == -5)
  1679. {
  1680. task.State = false;
  1681. task.UpdateTime = DateTime.Now;
  1682. task.Description = "ecs返回-5,回调任务作废";
  1683. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1684. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1685. Log.Instance.WriteLogAdd("回调异常,请求接口失败,ecs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  1686. }
  1687. else
  1688. {
  1689. task.UpdateTime = DateTime.Now;
  1690. task.Description = result.Message;
  1691. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1692. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1693. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  1694. }
  1695. }
  1696. }
  1697. //回调检测到失败,回调通知ecs
  1698. if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  1699. {
  1700. bool failFalg = false;
  1701. if (!string.IsNullOrEmpty(task.FailAddress))
  1702. {
  1703. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  1704. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1705. {
  1706. failFalg = true;
  1707. }
  1708. }
  1709. if (!string.IsNullOrEmpty(task.FailAddress2))
  1710. {
  1711. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  1712. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1713. {
  1714. failFalg = true;
  1715. }
  1716. }
  1717. if (!string.IsNullOrEmpty(task.FailAddress3))
  1718. {
  1719. List<CcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  1720. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  1721. {
  1722. failFalg = true;
  1723. }
  1724. }
  1725. if (failFalg)
  1726. {
  1727. CallBackRequestData requestData = new CallBackRequestData();
  1728. requestData.taskId = long.Parse(task.TaskId);
  1729. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  1730. requestData.code = "0";
  1731. requestData.msg = "操作失败";
  1732. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, ecsUrlContext, requestData, null);
  1733. if (result.IsSuccess)
  1734. {
  1735. task.State = false;
  1736. task.UpdateTime = DateTime.Now;
  1737. task.Description = result.Message;
  1738. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1739. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",回调失败结果:" + result.Message + ";";
  1740. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  1741. }
  1742. else
  1743. {
  1744. task.UpdateTime = DateTime.Now;
  1745. task.Description = result.Message;
  1746. await _taskCallbackService.CreateOrUpdateAndCache(task);
  1747. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  1748. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  1749. }
  1750. }
  1751. }
  1752. Thread.Sleep(1000);
  1753. }
  1754. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  1755. }
  1756. catch (Exception ex)
  1757. {
  1758. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  1759. return "回调异常" + ex.Message;
  1760. }
  1761. }
  1762. }
  1763. }