HttpRequestService.cs 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using System.Threading;
  5. using IMCS.CCS.Entitys;
  6. using IMCS.CCS.Models.vo;
  7. using IMCS.CCS.Models;
  8. using IMCS.CCS.DeviceProtocol;
  9. using System;
  10. using S7.Net;
  11. using IMCS_CCS.Utils;
  12. using Newtonsoft.Json;
  13. using IMCS_CCS.Utils.DeviceProtocol;
  14. using HslCommunication.Profinet.Siemens;
  15. using Microsoft.Extensions.Configuration;
  16. using IMCS.CCS.Service;
  17. using IMCS_CCS.Model.vo;
  18. using FTP;
  19. using HslCommunication;
  20. using System.Text.RegularExpressions;
  21. using System.IO;
  22. using Org.BouncyCastle.Ocsp;
  23. using MySqlX.XDevAPI.Common;
  24. namespace IMCS.CCS.Services
  25. {
  26. public class HttpRequestService : IHttpRequestService
  27. {
  28. private readonly IDeviceService _deviceService;
  29. private readonly ITaskCallbackService _taskCallbackService;
  30. private readonly ICcsActionService _ccsActionService;
  31. private readonly ICcsTagValueService _ccsTagValueService;
  32. private readonly IEquipmentMonitorService _equipmentMonitorService;
  33. private readonly ICcsActionAddressService _ccsActionAddressService;
  34. private readonly ITaskJobService _taskJobService;
  35. private int SLEEP_TIME = 1000;
  36. string LocalPath = "D:\\PROG";
  37. private string fanucUrlContext;
  38. private string opcuacUrlContext;
  39. private string hdhUrlContext;
  40. private string ecsRootUrlContext;
  41. public IConfiguration Configuration { get; }
  42. private readonly IApiRequestService _apiRequestService;
  43. public HttpRequestService(IDeviceService deviceService, ITaskCallbackService taskCallbackService,
  44. ICcsActionService ccsActionService, ICcsTagValueService ccsTagValueService,
  45. IEquipmentMonitorService equipmentMonitorService, ICcsActionAddressService ccsActionAddressService,
  46. IApiRequestService apiRequestService, ITaskJobService taskJobService,
  47. IConfiguration configuration)
  48. {
  49. _deviceService = deviceService;
  50. _taskCallbackService = taskCallbackService;
  51. _ccsActionService = ccsActionService;
  52. _ccsTagValueService = ccsTagValueService;
  53. _equipmentMonitorService = equipmentMonitorService;
  54. _ccsActionAddressService = ccsActionAddressService;
  55. _apiRequestService = apiRequestService;
  56. _taskJobService = taskJobService;
  57. Configuration = configuration;
  58. fanucUrlContext = Configuration.GetConnectionString("fanucUrlContext");
  59. opcuacUrlContext = Configuration.GetConnectionString("opcuacUrlContext");
  60. hdhUrlContext = Configuration.GetConnectionString("hdhUrlContext");
  61. ecsRootUrlContext = Configuration.GetConnectionString("ecsRootUrlContext");
  62. }
  63. /// <summary>
  64. /// 获取状态当前值
  65. /// </summary>
  66. public string GetTagValue(RequestTagValueData req)
  67. {
  68. CcsTagValue queryParam = new CcsTagValue();
  69. queryParam.Ip = req.ip;
  70. queryParam.Address = req.tagname;
  71. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(queryParam);
  72. string tagValue = "0";
  73. if (tagValues != null && tagValues.Count > 0)
  74. {
  75. tagValue = tagValues[0].TagValue;
  76. }
  77. return tagValue;
  78. }
  79. /// <summary>
  80. /// 益模调用接口,显示3D
  81. /// </summary>
  82. public async Task<List<ResponseDigitalTwinsData>> GetDigitalTwins()
  83. {
  84. List<Device> devices = _deviceService.GetDeviceList();
  85. List<ResponseDigitalTwinsData> list = new List<ResponseDigitalTwinsData>();
  86. String query3dUrl = ecsRootUrlContext + "/api/authority/agv/agvCallbackService/query3dResouceDataInfo";
  87. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, query3dUrl, new Object(), null);
  88. ResponsePageData<ResponseDigitalTwinsData> responseData = JsonConvert.DeserializeObject<ResponsePageData<ResponseDigitalTwinsData>>(result.Message);
  89. list = responseData.Data;
  90. foreach(ResponseDigitalTwinsData responseDigitalTwinsData in list)
  91. {
  92. EquipmentMonitor equipmentMonitor = await _equipmentMonitorService.GetById(long.Parse(responseDigitalTwinsData.resourceId));
  93. if (equipmentMonitor==null || equipmentMonitor.IP == null)
  94. {
  95. continue;
  96. }
  97. Device device = devices.Where(x => x.Ip.Equals(equipmentMonitor.IP)).FirstOrDefault();
  98. if (null!=device && equipmentMonitor.Type == "HEIDEHAIN")
  99. {
  100. RequestHeidhData hdhReq = new RequestHeidhData();
  101. hdhReq.ServerUrl = device.ServerUrl;
  102. hdhReq.MachineName = device.UserName;
  103. hdhReq.Type = "Collect";
  104. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  105. if (Result.IsSuccess)
  106. {
  107. ResponseHeidhData retData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  108. if (!string.IsNullOrEmpty(retData.runDatasInfo.Trim()))
  109. {
  110. ResponseDigitalTwinsData twinsData = JsonConvert.DeserializeObject<ResponseDigitalTwinsData>(retData.runDatasInfo);
  111. responseDigitalTwinsData.feedRate = !string.IsNullOrEmpty(twinsData.feedRate)? twinsData.feedRate : "0";
  112. responseDigitalTwinsData.spindleMagnification = !string.IsNullOrEmpty(twinsData.spindleMagnification)? twinsData.spindleMagnification:"0";
  113. responseDigitalTwinsData.spindleSpeed = !string.IsNullOrEmpty(twinsData.spindleSpeed) ? twinsData.spindleSpeed + "00" : "0";
  114. responseDigitalTwinsData.spindleLoad = !string.IsNullOrEmpty(twinsData.spindleLoad) ? twinsData.spindleMagnification : "-";
  115. }
  116. }
  117. }
  118. else if(null != device && equipmentMonitor.Type == "FANUC")
  119. {
  120. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  121. //调用发那科接口
  122. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=All", null, null);
  123. if (Result.IsSuccess)
  124. {
  125. ResponseFanucData responseFanucData = JsonConvert.DeserializeObject<ResponseFanucData>(Result.Message);
  126. responseDigitalTwinsData.feedRate = !string.IsNullOrEmpty(responseFanucData.ActFeed)? responseFanucData.ActFeed:"0";
  127. responseDigitalTwinsData.spindleMagnification = !string.IsNullOrEmpty(responseFanucData.SpindleMagnification)? responseFanucData.SpindleMagnification:"0";
  128. responseDigitalTwinsData.spindleSpeed = !string.IsNullOrEmpty(responseFanucData.ActSpindle)? responseFanucData.ActSpindle : "0";
  129. responseDigitalTwinsData.spindleLoad = !string.IsNullOrEmpty(responseFanucData.SpindleLoad)? responseFanucData.SpindleLoad : "-";
  130. }
  131. }
  132. }
  133. return list;
  134. }
  135. /// <summary>
  136. /// 查询设备状态
  137. /// </summary>
  138. public async Task<List<EquipmentMonitor>> GetEquipMent()
  139. {
  140. return await _equipmentMonitorService.GetList();
  141. }
  142. /// <summary>
  143. /// 机器人取放动作
  144. /// </summary>
  145. public async Task<ResponseECSData> RobotAction(RequestData<LocationData> req)
  146. {
  147. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId,"执行成功");
  148. SiemensS7Net s7 = null;
  149. try
  150. {
  151. // 获取所有在线的设备
  152. List<Device> devices = _deviceService.GetDeviceList();
  153. // 比较在线设备是否在其中
  154. Device device = devices.Where(x => x.Ip == req.url && x.Port == req.port).FirstOrDefault();
  155. if (device == null)
  156. {
  157. Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  158. EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
  159. responseData.result = "false";
  160. responseData.resultMsg = "设备已离线:"+ req.url;
  161. return responseData;
  162. }
  163. // 根据ip查询设备
  164. CcsAction actionQuery = new CcsAction();
  165. actionQuery.OperateType = ActionTypeEnum.RobotAction.ToString();
  166. actionQuery.Ip = req.url;
  167. CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  168. // 进行plc的连接
  169. s7 = DevicePlcS7.SiemensS7(actionInfo.Ip);
  170. OperateResult ConnectionResult = s7.ConnectServer();
  171. if (!ConnectionResult.IsSuccess)
  172. {
  173. s7.ConnectClose();
  174. Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  175. EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
  176. responseData.result = "false";
  177. responseData.resultMsg = ActionTypeEnum.RobotAction + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req);
  178. return responseData;
  179. }
  180. // 查询需要操作的plc的db块
  181. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  182. actionAddressQuery.ActionId = actionInfo.Id;
  183. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  184. //查询出需要检查的地址列表
  185. List<CcsActionAddress> CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
  186. foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
  187. {
  188. if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
  189. {
  190. string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
  191. if (actionAddress.CheckType ? operateResult != actionAddress.Value : operateResult == actionAddress.Value)
  192. {
  193. s7.ConnectClose();
  194. Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "====实际为:" + operateResult + JsonConvert.SerializeObject(req),
  195. EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
  196. responseData.result = "false";
  197. responseData.resultMsg = "异常===>>" + "条件不满足" + actionAddress.Address + "值应为:" + actionAddress.Value + "==实际为:" + operateResult;
  198. return responseData;
  199. }
  200. }
  201. }
  202. //查询需要写入地址列表
  203. List<CcsActionAddress> CcsActionAddressWrites = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString()).ToList();
  204. foreach (CcsActionAddress actionAddress in CcsActionAddressWrites)
  205. {
  206. if (!string.IsNullOrEmpty(actionAddress.Address))
  207. {
  208. string parValue = "";
  209. // 写入取放点位、需要进行点位拼接
  210. if (actionAddress.Sort == 1)
  211. {
  212. //区域块为七位,点位为三位
  213. parValue = req.data.LocationArea.PadRight(7,'0')+ req.data.Location.PadLeft(3, '0') + req.data.DestLocationArea.PadRight(7, '0') + req.data.DestLocation.PadLeft(3, '0');
  214. s7.Write(actionAddress.Address, Convert.ToString(parValue));
  215. }
  216. else if (actionAddress.Sort == 2)
  217. {
  218. // 需要写入启动状态
  219. parValue = actionAddress.Value;
  220. s7.Write(actionAddress.Address, Convert.ToBoolean(parValue));
  221. }
  222. // 同步TagValue数据状态
  223. CcsTagValue tagValueQuery = new CcsTagValue();
  224. tagValueQuery.Ip = req.url;
  225. tagValueQuery.Address = actionAddress.Address;
  226. CcsTagValue tagValue = _ccsTagValueService.GetList(tagValueQuery).ToList().FirstOrDefault();
  227. if (tagValue != null)
  228. {
  229. tagValue.TagValue = parValue;
  230. await _ccsTagValueService.Update(tagValue);
  231. }
  232. Thread.Sleep(SLEEP_TIME);
  233. }
  234. }
  235. s7.ConnectClose();
  236. //插入回调
  237. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.RobotAction.ToString(),
  238. EnumHelper.GetDescription(ActionTypeEnum.RobotAction), req.taskId, req.taskNodeId);
  239. taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
  240. // 保存数据
  241. await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  242. Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.RobotAction) + "取成功===>>" + JsonConvert.SerializeObject(req)
  243. , EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
  244. return responseData;
  245. }
  246. catch (Exception ex)
  247. {
  248. // 记录日志
  249. Log.Instance.WriteLogAdd(ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  250. EnumHelper.GetDescription(ActionTypeEnum.RobotAction));
  251. responseData.resultMsg = ActionTypeEnum.RobotAction + "取放异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
  252. responseData.result = "false";
  253. // 关闭plc连接
  254. if (s7 != null)
  255. {
  256. s7.ConnectClose();
  257. }
  258. return responseData;
  259. }
  260. }
  261. /// <summary>
  262. /// 上传文件
  263. /// </summary>
  264. public async Task<ResponseECSData> UploadFile(RequestData<UploadFileData> req)
  265. {
  266. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  267. try
  268. {
  269. List<Device> devices = _deviceService.GetDeviceList();
  270. Device deviceFtp = devices.Where(x => x.Ip.Equals(req.url)
  271. && x.ProtocolType.Equals(ProtocalTypeEnum.FTP.ToString())).FirstOrDefault();
  272. Device deviceOpcUa = devices.Where(x => x.Ip.Equals(req.url)
  273. && x.ProtocolType.Equals(ProtocalTypeEnum.OPCUA.ToString())).FirstOrDefault();
  274. Device deviceHeidenhain = devices.Where(x => x.Ip.Equals(req.url)
  275. && x.ProtocolType.Equals(ProtocalTypeEnum.HEIDEHAIN.ToString())).FirstOrDefault();
  276. if (deviceOpcUa == null && deviceHeidenhain == null)
  277. {
  278. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  279. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  280. responseData.result = "false";
  281. responseData.resultMsg = ActionTypeEnum.UploadFile + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  282. return responseData;
  283. }
  284. //西门子系统上传
  285. if (deviceOpcUa != null)
  286. {
  287. RequestOpcUaData opcUaReq = new RequestOpcUaData();
  288. opcUaReq.ServerUrl = deviceOpcUa.ServerUrl;
  289. opcUaReq.UserName = deviceOpcUa.UserName;
  290. opcUaReq.Password = deviceOpcUa.Password;
  291. opcUaReq.Path = req.data.fileName;
  292. opcUaReq.Type = OpcUaActionTypeEnum.Upload.ToString();
  293. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, opcuacUrlContext, opcUaReq, null);
  294. ResponseOpcUaData responseOpcUaData = JsonConvert.DeserializeObject<ResponseOpcUaData>(Result.Message);
  295. if (!Result.IsSuccess || !responseOpcUaData.result)
  296. {
  297. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传异常===>>" + JsonConvert.SerializeObject(req),
  298. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  299. responseData.result = "false";
  300. return responseData;
  301. }
  302. }
  303. else if(deviceHeidenhain != null)
  304. {
  305. RequestHeidhData hdhReq = new RequestHeidhData();
  306. hdhReq.ServerUrl = deviceHeidenhain.ServerUrl;
  307. hdhReq.MachineName = deviceHeidenhain.UserName;
  308. hdhReq.Path = req.data.fileName;
  309. hdhReq.Type = OpcUaActionTypeEnum.Upload.ToString();
  310. //远程机床相对路径
  311. hdhReq.Address = req.data.remotePath;
  312. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  313. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  314. if (!Result.IsSuccess || !responseHeidhData.result)
  315. {
  316. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "预上传异常===>>" + JsonConvert.SerializeObject(req),
  317. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  318. responseData.result = "false";
  319. return responseData;
  320. }
  321. }
  322. //插入回调
  323. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.UploadFile.ToString(),
  324. EnumHelper.GetDescription(ActionTypeEnum.UploadFile), req.taskId, req.taskNodeId);
  325. await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  326. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传成功===>>" + JsonConvert.SerializeObject(req),
  327. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  328. return responseData;
  329. }
  330. catch (Exception ex)
  331. {
  332. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  333. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  334. responseData.resultMsg = ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
  335. responseData.result = "false";
  336. return responseData;
  337. }
  338. }
  339. /// <summary>
  340. /// 启动机床程序
  341. /// </summary>
  342. public async Task<ResponseECSData> StartNCProgram(RequestData<StartNCProgramData> req)
  343. {
  344. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  345. try
  346. {
  347. List<Device> devices = _deviceService.GetDeviceList();
  348. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  349. if (device == null)
  350. {
  351. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  352. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  353. responseData.result = "false";
  354. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  355. return responseData;
  356. }
  357. CcsAction actionQuery = new CcsAction();
  358. actionQuery.OperateType = ActionTypeEnum.StartNCProgram.ToString();
  359. actionQuery.Ip = req.url;
  360. CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  361. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  362. actionAddressQuery.ActionId = actionInfo.Id;
  363. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  364. //opcua启动程序
  365. if (actionInfo.ProtocolType == ProtocalTypeEnum.OPCUA.ToString())
  366. {
  367. //插入回调
  368. //获取启动前放的 工位
  369. TaskCallback queryTaskCallBack = new TaskCallback();
  370. queryTaskCallBack.IP = actionInfo.PlcIp;
  371. queryTaskCallBack.Description = ProtocalTypeEnum.OPCUA.ToString();
  372. TaskCallback TaskBean = await _taskCallbackService.GetRobotActionList(queryTaskCallBack);
  373. TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
  374. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
  375. taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
  376. taskCallbackData.Description = ProtocalTypeEnum.OPCUA.ToString();
  377. if(TaskBean != null)
  378. {
  379. taskCallbackData.Data = TaskBean.Data;
  380. }
  381. else
  382. {
  383. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "失败,上一放动作 没有工位信息===>>" + JsonConvert.SerializeObject(req),
  384. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  385. return responseData;
  386. }
  387. await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  388. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
  389. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  390. return responseData;
  391. } else if (actionInfo.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  392. {
  393. //调用机器人plc启动海德汉程序
  394. //SiemensS7Net s7 = DevicePlcS7.SiemensS7(actionInfo.PlcIp);
  395. //OperateResult ConnectionResult = s7.ConnectServer();
  396. //if (!ConnectionResult.IsSuccess)
  397. //{
  398. // s7.ConnectClose();
  399. // Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  400. // EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  401. // responseData.result = "false";
  402. // return responseData;
  403. //}
  404. ////查询条件
  405. //List<CcsActionAddress> CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
  406. //foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
  407. //{
  408. // if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
  409. // {
  410. // string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
  411. // if (actionAddress.CheckType ? operateResult.Equals(actionAddress.Value) : operateResult != actionAddress.Value)
  412. // {
  413. // s7.ConnectClose();
  414. // Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "条件不满足" + JsonConvert.SerializeObject(req),
  415. // EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  416. // responseData.result = "false";
  417. // return responseData;
  418. // }
  419. // }
  420. //}
  421. //s7.ConnectClose();
  422. RequestHeidhData hdhReq = new RequestHeidhData();
  423. hdhReq.ServerUrl = device.ServerUrl;
  424. hdhReq.MachineName = device.UserName;
  425. hdhReq.Path = req.data.remotePath;
  426. hdhReq.Type = OpcUaActionTypeEnum.StartNcProgram.ToString();
  427. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  428. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  429. if (!Result.IsSuccess || !responseHeidhData.result)
  430. {
  431. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
  432. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  433. responseData.result = "false";
  434. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
  435. return responseData;
  436. }
  437. //插入回调
  438. TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
  439. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
  440. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  441. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
  442. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  443. return responseData;
  444. }
  445. else
  446. {
  447. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
  448. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  449. responseData.result = "false";
  450. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
  451. return responseData;
  452. }
  453. }
  454. catch (Exception ex)
  455. {
  456. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "程序异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  457. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  458. responseData.result = "false";
  459. return responseData;
  460. }
  461. }
  462. /// <summary>
  463. /// 启动清洗机
  464. /// </summary>
  465. public async Task<ResponseECSData> StartCleanMachine(RequestData<object> req)
  466. {
  467. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  468. try
  469. {
  470. List<Device> devices = _deviceService.GetDeviceList();
  471. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  472. if (device == null)
  473. {
  474. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  475. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  476. responseData.result = "false";
  477. responseData.resultMsg= ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  478. return responseData;
  479. }
  480. CcsAction actionQuery = new CcsAction();
  481. actionQuery.OperateType = ActionTypeEnum.StartCleanMachine.ToString();
  482. actionQuery.Ip = req.url;
  483. CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  484. SiemensS7Net s7 = DevicePlcS7.SiemensS7(req.url);
  485. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  486. if (!ConnectionResult.IsSuccess)
  487. {
  488. s7.ConnectClose();
  489. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "启动故障===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  490. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  491. responseData.result = "false";
  492. return responseData;
  493. }
  494. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  495. actionAddressQuery.ActionId = actionInfo.Id;
  496. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  497. s7.ConnectClose();
  498. //插入回调
  499. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.StartCleanMachine.ToString(),
  500. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine), req.taskId, req.taskNodeId);
  501. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  502. Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine) + "启动成功===>>" + JsonConvert.SerializeObject(req)
  503. , EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  504. return responseData;
  505. }
  506. catch (Exception ex)
  507. {
  508. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "启动故障===>>" + ex.Message + JsonConvert.SerializeObject(req),
  509. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  510. responseData.result = "false";
  511. return responseData;
  512. }
  513. }
  514. /// <summary>
  515. /// 启动吹干
  516. /// </summary>
  517. public async Task<ResponseECSData> StartDryMachine(RequestData<object> req)
  518. {
  519. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  520. try
  521. {
  522. List<Device> devices = _deviceService.GetDeviceList();
  523. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  524. if (device == null)
  525. {
  526. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  527. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  528. responseData.result = "false";
  529. return responseData;
  530. }
  531. CcsAction actionQuery = new CcsAction();
  532. actionQuery.OperateType = ActionTypeEnum.StartDryMachine.ToString();
  533. actionQuery.Ip = req.url;
  534. CcsAction action = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  535. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  536. actionAddressQuery.ActionId = action.Id;
  537. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  538. SiemensS7Net s7 = DevicePlcS7.SiemensS7(req.url);
  539. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  540. if (!ConnectionResult.IsSuccess)
  541. {
  542. s7.ConnectClose();
  543. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "启动吹干机异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  544. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  545. responseData.result = "false";
  546. return responseData;
  547. }
  548. s7.ConnectClose();
  549. //插入回调
  550. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.StartDryMachine.ToString(),
  551. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine), req.taskId, req.taskNodeId);
  552. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  553. Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine) + "启动吹干机成功===>>" + JsonConvert.SerializeObject(req)
  554. , EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  555. return responseData;
  556. }
  557. catch (Exception ex)
  558. {
  559. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "启动吹干机故障===>>" + ex.Message + JsonConvert.SerializeObject(req),
  560. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  561. responseData.result = "false";
  562. return responseData;
  563. }
  564. }
  565. /// <summary>
  566. /// 刀具接口列表
  567. /// </summary>
  568. public async Task<List<ResponseToolData>> GetTools(RequestToolData req)
  569. {
  570. List<Device> devices = _deviceService.GetDeviceList();
  571. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  572. List<ResponseToolData> list = new List<ResponseToolData>();
  573. if (device.ProtocolType == ProtocalTypeEnum.OPCUA.ToString())
  574. {
  575. CcsTagValue tagValueQuery = new CcsTagValue();
  576. tagValueQuery.Ip = req.url;
  577. tagValueQuery.Component = "刀具";
  578. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  579. List<CcsTagValue> toolNumberList = tagValues.GroupBy(x => x.ComponentNumber)
  580. .Select(group => new CcsTagValue
  581. {
  582. ComponentNumber = group.Key
  583. }).ToList();
  584. foreach (CcsTagValue toolNumber in toolNumberList)
  585. {
  586. ResponseToolData toolData = new ResponseToolData();
  587. foreach (CcsTagValue tagValue in tagValues)
  588. {
  589. if (toolNumber.ComponentNumber == tagValue.ComponentNumber)
  590. {
  591. toolData.number = toolNumber.ComponentNumber;
  592. if (tagValue.Description == "刀具寿命预警")
  593. {
  594. toolData.warnLife = tagValue.TagValue;
  595. }
  596. else if (tagValue.Description == "刀具寿命目标值")
  597. {
  598. toolData.targetLife = tagValue.TagValue;
  599. }
  600. else if (tagValue.Description == "工件数")
  601. {
  602. toolData.workPiece = tagValue.TagValue;
  603. }
  604. else if (tagValue.Description == "工件数预警值")
  605. {
  606. toolData.workPieceWarn = tagValue.TagValue;
  607. }
  608. else if (tagValue.Description == "工件数目标值")
  609. {
  610. toolData.workPieceTarget = tagValue.TagValue;
  611. }
  612. else if (tagValue.Description == "磨损量")
  613. {
  614. toolData.wear = tagValue.TagValue;
  615. }
  616. else if (tagValue.Description == "磨损量预警值")
  617. {
  618. toolData.wearWarn = tagValue.TagValue;
  619. }
  620. else if (tagValue.Description == "磨损量目标值")
  621. {
  622. toolData.wearTarget = tagValue.TagValue;
  623. }
  624. else if (tagValue.Description == "刀具名称")
  625. {
  626. toolData.name = tagValue.TagValue;
  627. }
  628. }
  629. }
  630. list.Add(toolData);
  631. }
  632. }
  633. else if (device.ProtocolType == ProtocalTypeEnum.FANUC.ToString())
  634. {
  635. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  636. //调用发那科接口
  637. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=ToolList", null, null);
  638. if (Result.IsSuccess)
  639. {
  640. List<ResponseToolData> responseFanucData = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message);
  641. //list = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message.ToolLife);
  642. //list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseFanucData.ToolLife);
  643. list = responseFanucData;
  644. }
  645. }else if(device.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  646. {
  647. RequestHeidhData hdhReq = new RequestHeidhData();
  648. hdhReq.ServerUrl = device.ServerUrl;
  649. hdhReq.MachineName = device.UserName;
  650. hdhReq.Type = "ToolList";
  651. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  652. if (Result.IsSuccess)
  653. {
  654. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  655. list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseData.toolsInfo);
  656. }
  657. }
  658. return list;
  659. }
  660. /// <summary>
  661. /// 设备上线离线
  662. /// </summary>
  663. public async Task<ResponseCommonData> UpdateDeviceState(RequestDeviceUpdateData req)
  664. {
  665. ResponseCommonData responseData = new ResponseCommonData();
  666. List<Device> devices = _deviceService.GetDevices();
  667. try
  668. {
  669. Device device = devices.Where(x => x.Ip == req.ip).FirstOrDefault();
  670. if (device == null)
  671. {
  672. responseData.msg = "设备不存在";
  673. responseData.result = "false";
  674. return responseData;
  675. }
  676. device.UseState = req.useState;
  677. device.OfflineUpdateTime = DateTime.Now;
  678. await _deviceService.UpdateAndCache(device);
  679. return responseData;
  680. }
  681. catch (Exception ex)
  682. {
  683. responseData.msg = ex.Message;
  684. responseData.result = "false";
  685. return responseData;
  686. }
  687. }
  688. /// <summary>
  689. /// 获取回调列表
  690. /// </summary>
  691. public async Task<List<TaskCallback>> GetCallBackListByCondition(RequestCallBackData vo)
  692. {
  693. List<TaskCallback> list = new List<TaskCallback>();
  694. try {
  695. TaskCallback taskCallback = new TaskCallback();
  696. if (!string.IsNullOrEmpty(vo.IP))
  697. {
  698. taskCallback.IP = vo.IP;
  699. }
  700. if (!string.IsNullOrEmpty(vo.TaskId))
  701. {
  702. taskCallback.TaskId = vo.TaskId;
  703. }
  704. if (!string.IsNullOrEmpty(vo.TaskNodeId))
  705. {
  706. taskCallback.TaskNodeId = vo.TaskNodeId;
  707. }
  708. list = await _taskCallbackService.GetListByCondition(taskCallback);
  709. }
  710. catch (Exception ex)
  711. {
  712. return list;
  713. }
  714. return list;
  715. }
  716. //设置回调值
  717. private TaskCallback setCallBackValue(List<CcsActionAddress> CcsActionAddresses, TaskCallback taskCallbackData)
  718. {
  719. List<CcsActionAddress> CcsActionAddressCallBacks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK.ToString()).ToList();
  720. List<CcsActionAddress> CcsActionAddressCallBackFails = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK_FAIL.ToString()).ToList();
  721. List<CcsActionAddress> CcsActionAddressCallBackResets = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.RESET.ToString()).ToList();
  722. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBacks)
  723. {
  724. if (actionAddress.Sort == 1)
  725. {
  726. taskCallbackData.Address = actionAddress.Address;
  727. taskCallbackData.CallbackValue = actionAddress.Value;
  728. }
  729. else if (actionAddress.Sort == 2)
  730. {
  731. taskCallbackData.Address2 = actionAddress.Address;
  732. taskCallbackData.CallbackValue2 = actionAddress.Value;
  733. }
  734. else if (actionAddress.Sort == 3)
  735. {
  736. taskCallbackData.Address3 = actionAddress.Address;
  737. taskCallbackData.CallbackValue3 = actionAddress.Value;
  738. }
  739. }
  740. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBackFails)
  741. {
  742. if (actionAddress.Sort == 1)
  743. {
  744. taskCallbackData.FailAddress = actionAddress.Address;
  745. taskCallbackData.CallbackFailValue = actionAddress.Value;
  746. }
  747. else if (actionAddress.Sort == 2)
  748. {
  749. taskCallbackData.FailAddress2 = actionAddress.Address;
  750. taskCallbackData.CallbackFailValue2 = actionAddress.Value;
  751. }
  752. else if (actionAddress.Sort == 3)
  753. {
  754. taskCallbackData.FailAddress3 = actionAddress.Address;
  755. taskCallbackData.CallbackFailValue3 = actionAddress.Value;
  756. }
  757. }
  758. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBackResets)
  759. {
  760. if (actionAddress.Sort == 1)
  761. {
  762. taskCallbackData.SuccessResetAddress = actionAddress.Address;
  763. taskCallbackData.SuccessResetValue = actionAddress.Value;
  764. }
  765. else if (actionAddress.Sort == 2)
  766. {
  767. taskCallbackData.SuccessResetAddress2 = actionAddress.Address;
  768. taskCallbackData.SuccessResetValue2 = actionAddress.Value;
  769. }
  770. }
  771. return taskCallbackData;
  772. }
  773. public async Task<ResponseECSData> PushPushToMachine(RequestData<CutterTestData> req)
  774. {
  775. Log.Instance.WriteLogAdd("机外对刀仪数据接受===>> "+ JsonConvert.SerializeObject(req),"机外对刀仪");
  776. // 1、根据url查询设备信息 2、调用httpserveer 发送执行消息
  777. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  778. try
  779. {
  780. List<Device> devices = _deviceService.GetDeviceList();
  781. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  782. if (device == null)
  783. {
  784. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  785. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  786. responseData.result = "false";
  787. responseData.resultMsg = ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  788. return responseData;
  789. }
  790. if (device.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  791. {
  792. RequestHeidhData hdhReq = new RequestHeidhData();
  793. hdhReq.ServerUrl = device.ServerUrl;
  794. hdhReq.MachineName = device.UserName;
  795. hdhReq.Type = "ReadAndWriteTool";
  796. hdhReq.CutterData = JsonConvert.SerializeObject(req.data);
  797. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  798. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  799. if (!Result.IsSuccess || !responseHeidhData.result)
  800. {
  801. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "机外对刀仪数据上传异常===>>" + JsonConvert.SerializeObject(req)+"======结果数据:"+ Result, "机外对刀仪");
  802. responseData.result = "false";
  803. responseData.resultMsg = Result.Message;
  804. }
  805. else
  806. {
  807. responseData.result = "true";
  808. responseData.resultMsg = "消费成功";
  809. }
  810. }
  811. else {
  812. responseData.result = "false";
  813. responseData.resultMsg = "没找到对应的数类型方法";
  814. }
  815. }
  816. catch (Exception ex) {
  817. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "任务下发异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  818. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  819. responseData.result = "false";
  820. responseData.resultMsg = ex.Message;
  821. return responseData;
  822. }
  823. return responseData;
  824. }
  825. }
  826. }