TaskJobService.cs 91 KB

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