HttpRequestService.cs 44 KB

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