HttpRequestService.cs 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  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. responseData.resultMsg = Result.Message;
  301. return responseData;
  302. }
  303. }
  304. else if(deviceHeidenhain != null)
  305. {
  306. RequestHeidhData hdhReq = new RequestHeidhData();
  307. hdhReq.ServerUrl = deviceHeidenhain.ServerUrl;
  308. hdhReq.MachineName = deviceHeidenhain.UserName;
  309. hdhReq.Path = req.data.fileName;
  310. hdhReq.Type = OpcUaActionTypeEnum.Upload.ToString();
  311. //远程机床相对路径
  312. hdhReq.Address = req.data.remotePath;
  313. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  314. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  315. if (!Result.IsSuccess || !responseHeidhData.result)
  316. {
  317. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "预上传异常===>>" + JsonConvert.SerializeObject(req),
  318. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  319. responseData.result = "false";
  320. responseData.resultMsg = responseHeidhData.msg;
  321. return responseData;
  322. }
  323. }
  324. //插入回调
  325. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.UploadFile.ToString(),
  326. EnumHelper.GetDescription(ActionTypeEnum.UploadFile), req.taskId, req.taskNodeId);
  327. await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  328. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传成功===>>" + JsonConvert.SerializeObject(req),
  329. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  330. return responseData;
  331. }
  332. catch (Exception ex)
  333. {
  334. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  335. EnumHelper.GetDescription(ActionTypeEnum.UploadFile));
  336. responseData.resultMsg = ActionTypeEnum.UploadFile + "上传异常===>>" + ex.Message + JsonConvert.SerializeObject(req);
  337. responseData.result = "false";
  338. return responseData;
  339. }
  340. }
  341. /// <summary>
  342. /// 启动机床程序
  343. /// </summary>
  344. public async Task<ResponseECSData> StartNCProgram(RequestData<StartNCProgramData> req)
  345. {
  346. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  347. try
  348. {
  349. List<Device> devices = _deviceService.GetDeviceList();
  350. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  351. if (device == null)
  352. {
  353. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  354. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  355. responseData.result = "false";
  356. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  357. return responseData;
  358. }
  359. CcsAction actionQuery = new CcsAction();
  360. actionQuery.OperateType = ActionTypeEnum.StartNCProgram.ToString();
  361. actionQuery.Ip = req.url;
  362. CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  363. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  364. actionAddressQuery.ActionId = actionInfo.Id;
  365. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  366. //opcua启动程序
  367. if (actionInfo.ProtocolType == ProtocalTypeEnum.OPCUA.ToString())
  368. {
  369. //插入回调
  370. //获取启动前放的 工位
  371. TaskCallback queryTaskCallBack = new TaskCallback();
  372. queryTaskCallBack.IP = actionInfo.PlcIp;
  373. queryTaskCallBack.Description = ProtocalTypeEnum.OPCUA.ToString();
  374. TaskCallback TaskBean = await _taskCallbackService.GetRobotActionList(queryTaskCallBack);
  375. TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
  376. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
  377. taskCallbackData = setCallBackValue(CcsActionAddresses, taskCallbackData);
  378. taskCallbackData.Description = ProtocalTypeEnum.OPCUA.ToString();
  379. if(TaskBean != null)
  380. {
  381. taskCallbackData.Data = TaskBean.Data;
  382. }
  383. else
  384. {
  385. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "失败,上一放动作 没有工位信息===>>" + JsonConvert.SerializeObject(req),
  386. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  387. return responseData;
  388. }
  389. await _taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  390. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
  391. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  392. return responseData;
  393. } else if (actionInfo.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  394. {
  395. //调用机器人plc启动海德汉程序
  396. //SiemensS7Net s7 = DevicePlcS7.SiemensS7(actionInfo.PlcIp);
  397. //OperateResult ConnectionResult = s7.ConnectServer();
  398. //if (!ConnectionResult.IsSuccess)
  399. //{
  400. // s7.ConnectClose();
  401. // Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  402. // EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  403. // responseData.result = "false";
  404. // return responseData;
  405. //}
  406. ////查询条件
  407. //List<CcsActionAddress> CcsActionAddressChecks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CHECK.ToString()).ToList();
  408. //foreach (CcsActionAddress actionAddress in CcsActionAddressChecks)
  409. //{
  410. // if (!string.IsNullOrEmpty(actionAddress.Address) && !string.IsNullOrEmpty(actionAddress.Value))
  411. // {
  412. // string operateResult = s7.ReadBool(actionAddress.Address).Content.ToString();
  413. // if (actionAddress.CheckType ? operateResult.Equals(actionAddress.Value) : operateResult != actionAddress.Value)
  414. // {
  415. // s7.ConnectClose();
  416. // Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动程序异常===>>" + "条件不满足" + JsonConvert.SerializeObject(req),
  417. // EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  418. // responseData.result = "false";
  419. // return responseData;
  420. // }
  421. // }
  422. //}
  423. //s7.ConnectClose();
  424. RequestHeidhData hdhReq = new RequestHeidhData();
  425. hdhReq.ServerUrl = device.ServerUrl;
  426. hdhReq.MachineName = device.UserName;
  427. hdhReq.Path = req.data.remotePath;
  428. hdhReq.Type = OpcUaActionTypeEnum.StartNcProgram.ToString();
  429. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  430. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  431. if (!Result.IsSuccess || !responseHeidhData.result)
  432. {
  433. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
  434. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  435. responseData.result = "false";
  436. responseData.resultMsg = responseHeidhData.msg;
  437. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
  438. return responseData;
  439. }
  440. //插入回调
  441. TaskCallback taskCallbackData = new TaskCallback(actionInfo.PlcIp, ActionTypeEnum.StartNCProgram.ToString(),
  442. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram), req.taskId, req.taskNodeId);
  443. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  444. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动成功===>>" + JsonConvert.SerializeObject(req),
  445. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  446. return responseData;
  447. }
  448. else
  449. {
  450. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req),
  451. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  452. responseData.result = "false";
  453. responseData.resultMsg = ActionTypeEnum.StartNCProgram + "启动异常===>>" + JsonConvert.SerializeObject(req);
  454. return responseData;
  455. }
  456. }
  457. catch (Exception ex)
  458. {
  459. Log.Instance.WriteLogAdd(ActionTypeEnum.StartNCProgram + "程序异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  460. EnumHelper.GetDescription(ActionTypeEnum.StartNCProgram));
  461. responseData.result = "false";
  462. return responseData;
  463. }
  464. }
  465. /// <summary>
  466. /// 启动清洗机
  467. /// </summary>
  468. public async Task<ResponseECSData> StartCleanMachine(RequestData<object> req)
  469. {
  470. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  471. try
  472. {
  473. List<Device> devices = _deviceService.GetDeviceList();
  474. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  475. if (device == null)
  476. {
  477. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  478. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  479. responseData.result = "false";
  480. responseData.resultMsg= ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  481. return responseData;
  482. }
  483. CcsAction actionQuery = new CcsAction();
  484. actionQuery.OperateType = ActionTypeEnum.StartCleanMachine.ToString();
  485. actionQuery.Ip = req.url;
  486. CcsAction actionInfo = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  487. SiemensS7Net s7 = DevicePlcS7.SiemensS7(req.url);
  488. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  489. if (!ConnectionResult.IsSuccess)
  490. {
  491. s7.ConnectClose();
  492. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "启动故障===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  493. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  494. responseData.result = "false";
  495. return responseData;
  496. }
  497. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  498. actionAddressQuery.ActionId = actionInfo.Id;
  499. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  500. s7.ConnectClose();
  501. //插入回调
  502. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.StartCleanMachine.ToString(),
  503. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine), req.taskId, req.taskNodeId);
  504. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  505. Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine) + "启动成功===>>" + JsonConvert.SerializeObject(req)
  506. , EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  507. return responseData;
  508. }
  509. catch (Exception ex)
  510. {
  511. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "启动故障===>>" + ex.Message + JsonConvert.SerializeObject(req),
  512. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  513. responseData.result = "false";
  514. return responseData;
  515. }
  516. }
  517. /// <summary>
  518. /// 启动吹干
  519. /// </summary>
  520. public async Task<ResponseECSData> StartDryMachine(RequestData<object> req)
  521. {
  522. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  523. try
  524. {
  525. List<Device> devices = _deviceService.GetDeviceList();
  526. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  527. if (device == null)
  528. {
  529. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  530. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  531. responseData.result = "false";
  532. return responseData;
  533. }
  534. CcsAction actionQuery = new CcsAction();
  535. actionQuery.OperateType = ActionTypeEnum.StartDryMachine.ToString();
  536. actionQuery.Ip = req.url;
  537. CcsAction action = _ccsActionService.GetList(actionQuery).FirstOrDefault();
  538. CcsActionAddress actionAddressQuery = new CcsActionAddress();
  539. actionAddressQuery.ActionId = action.Id;
  540. List<CcsActionAddress> CcsActionAddresses = _ccsActionAddressService.GetList(actionAddressQuery);
  541. SiemensS7Net s7 = DevicePlcS7.SiemensS7(req.url);
  542. HslCommunication.OperateResult ConnectionResult = s7.ConnectServer();
  543. if (!ConnectionResult.IsSuccess)
  544. {
  545. s7.ConnectClose();
  546. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "启动吹干机异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(req),
  547. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  548. responseData.result = "false";
  549. return responseData;
  550. }
  551. s7.ConnectClose();
  552. //插入回调
  553. TaskCallback taskCallbackData = new TaskCallback(req.url, ActionTypeEnum.StartDryMachine.ToString(),
  554. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine), req.taskId, req.taskNodeId);
  555. await _taskCallbackService.CreateOrUpdateAndCache(setCallBackValue(CcsActionAddresses, taskCallbackData));
  556. Log.Instance.WriteLogAdd(EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine) + "启动吹干机成功===>>" + JsonConvert.SerializeObject(req)
  557. , EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  558. return responseData;
  559. }
  560. catch (Exception ex)
  561. {
  562. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "启动吹干机故障===>>" + ex.Message + JsonConvert.SerializeObject(req),
  563. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  564. responseData.result = "false";
  565. return responseData;
  566. }
  567. }
  568. /// <summary>
  569. /// 刀具接口列表
  570. /// </summary>
  571. public async Task<List<ResponseToolData>> GetTools(RequestToolData req)
  572. {
  573. List<Device> devices = _deviceService.GetDeviceList();
  574. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  575. List<ResponseToolData> list = new List<ResponseToolData>();
  576. if (device.ProtocolType == ProtocalTypeEnum.OPCUA.ToString())
  577. {
  578. CcsTagValue tagValueQuery = new CcsTagValue();
  579. tagValueQuery.Ip = req.url;
  580. tagValueQuery.Component = "刀具";
  581. List<CcsTagValue> tagValues = _ccsTagValueService.GetList(tagValueQuery);
  582. List<CcsTagValue> toolNumberList = tagValues.GroupBy(x => x.ComponentNumber)
  583. .Select(group => new CcsTagValue
  584. {
  585. ComponentNumber = group.Key
  586. }).ToList();
  587. foreach (CcsTagValue toolNumber in toolNumberList)
  588. {
  589. ResponseToolData toolData = new ResponseToolData();
  590. foreach (CcsTagValue tagValue in tagValues)
  591. {
  592. if (toolNumber.ComponentNumber == tagValue.ComponentNumber)
  593. {
  594. toolData.number = toolNumber.ComponentNumber;
  595. if (tagValue.Description == "刀具寿命预警")
  596. {
  597. toolData.warnLife = tagValue.TagValue;
  598. }
  599. else if (tagValue.Description == "刀具寿命目标值")
  600. {
  601. toolData.targetLife = tagValue.TagValue;
  602. }
  603. else if (tagValue.Description == "工件数")
  604. {
  605. toolData.workPiece = tagValue.TagValue;
  606. }
  607. else if (tagValue.Description == "工件数预警值")
  608. {
  609. toolData.workPieceWarn = tagValue.TagValue;
  610. }
  611. else if (tagValue.Description == "工件数目标值")
  612. {
  613. toolData.workPieceTarget = tagValue.TagValue;
  614. }
  615. else if (tagValue.Description == "磨损量")
  616. {
  617. toolData.wear = tagValue.TagValue;
  618. }
  619. else if (tagValue.Description == "磨损量预警值")
  620. {
  621. toolData.wearWarn = tagValue.TagValue;
  622. }
  623. else if (tagValue.Description == "磨损量目标值")
  624. {
  625. toolData.wearTarget = tagValue.TagValue;
  626. }
  627. else if (tagValue.Description == "刀具名称")
  628. {
  629. toolData.name = tagValue.TagValue;
  630. }
  631. }
  632. }
  633. list.Add(toolData);
  634. }
  635. }
  636. else if (device.ProtocolType == ProtocalTypeEnum.FANUC.ToString())
  637. {
  638. string Url = fanucUrlContext + "?ip=" + device.Ip + "&port=" + device.Port;
  639. //调用发那科接口
  640. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Get, Url + "&fun=ToolList", null, null);
  641. if (Result.IsSuccess)
  642. {
  643. List<ResponseToolData> responseFanucData = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message);
  644. //list = JsonConvert.DeserializeObject<List<ResponseToolData>>(Result.Message.ToolLife);
  645. //list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseFanucData.ToolLife);
  646. list = responseFanucData;
  647. }
  648. }else if(device.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  649. {
  650. RequestHeidhData hdhReq = new RequestHeidhData();
  651. hdhReq.ServerUrl = device.ServerUrl;
  652. hdhReq.MachineName = device.UserName;
  653. hdhReq.Type = "ToolList";
  654. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  655. if (Result.IsSuccess)
  656. {
  657. ResponseHeidhData responseData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  658. list = JsonConvert.DeserializeObject<List<ResponseToolData>>(responseData.toolsInfo);
  659. }
  660. }
  661. return list;
  662. }
  663. /// <summary>
  664. /// 设备上线离线
  665. /// </summary>
  666. public async Task<ResponseCommonData> UpdateDeviceState(RequestDeviceUpdateData req)
  667. {
  668. ResponseCommonData responseData = new ResponseCommonData();
  669. List<Device> devices = _deviceService.GetDevices();
  670. try
  671. {
  672. Device device = devices.Where(x => x.Ip == req.ip).FirstOrDefault();
  673. if (device == null)
  674. {
  675. responseData.msg = "设备不存在";
  676. responseData.result = "false";
  677. return responseData;
  678. }
  679. device.UseState = req.useState;
  680. device.OfflineUpdateTime = DateTime.Now;
  681. await _deviceService.UpdateAndCache(device);
  682. return responseData;
  683. }
  684. catch (Exception ex)
  685. {
  686. responseData.msg = ex.Message;
  687. responseData.result = "false";
  688. return responseData;
  689. }
  690. }
  691. /// <summary>
  692. /// 获取回调列表
  693. /// </summary>
  694. public async Task<List<TaskCallback>> GetCallBackListByCondition(RequestCallBackData vo)
  695. {
  696. List<TaskCallback> list = new List<TaskCallback>();
  697. try {
  698. TaskCallback taskCallback = new TaskCallback();
  699. if (!string.IsNullOrEmpty(vo.IP))
  700. {
  701. taskCallback.IP = vo.IP;
  702. }
  703. if (!string.IsNullOrEmpty(vo.TaskId))
  704. {
  705. taskCallback.TaskId = vo.TaskId;
  706. }
  707. if (!string.IsNullOrEmpty(vo.TaskNodeId))
  708. {
  709. taskCallback.TaskNodeId = vo.TaskNodeId;
  710. }
  711. list = await _taskCallbackService.GetListByCondition(taskCallback);
  712. }
  713. catch (Exception ex)
  714. {
  715. return list;
  716. }
  717. return list;
  718. }
  719. //设置回调值
  720. private TaskCallback setCallBackValue(List<CcsActionAddress> CcsActionAddresses, TaskCallback taskCallbackData)
  721. {
  722. List<CcsActionAddress> CcsActionAddressCallBacks = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK.ToString()).ToList();
  723. List<CcsActionAddress> CcsActionAddressCallBackFails = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK_FAIL.ToString()).ToList();
  724. List<CcsActionAddress> CcsActionAddressCallBackResets = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.RESET.ToString()).ToList();
  725. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBacks)
  726. {
  727. if (actionAddress.Sort == 1)
  728. {
  729. taskCallbackData.Address = actionAddress.Address;
  730. taskCallbackData.CallbackValue = actionAddress.Value;
  731. }
  732. else if (actionAddress.Sort == 2)
  733. {
  734. taskCallbackData.Address2 = actionAddress.Address;
  735. taskCallbackData.CallbackValue2 = actionAddress.Value;
  736. }
  737. else if (actionAddress.Sort == 3)
  738. {
  739. taskCallbackData.Address3 = actionAddress.Address;
  740. taskCallbackData.CallbackValue3 = actionAddress.Value;
  741. }
  742. }
  743. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBackFails)
  744. {
  745. if (actionAddress.Sort == 1)
  746. {
  747. taskCallbackData.FailAddress = actionAddress.Address;
  748. taskCallbackData.CallbackFailValue = actionAddress.Value;
  749. }
  750. else if (actionAddress.Sort == 2)
  751. {
  752. taskCallbackData.FailAddress2 = actionAddress.Address;
  753. taskCallbackData.CallbackFailValue2 = actionAddress.Value;
  754. }
  755. else if (actionAddress.Sort == 3)
  756. {
  757. taskCallbackData.FailAddress3 = actionAddress.Address;
  758. taskCallbackData.CallbackFailValue3 = actionAddress.Value;
  759. }
  760. }
  761. foreach (CcsActionAddress actionAddress in CcsActionAddressCallBackResets)
  762. {
  763. if (actionAddress.Sort == 1)
  764. {
  765. taskCallbackData.SuccessResetAddress = actionAddress.Address;
  766. taskCallbackData.SuccessResetValue = actionAddress.Value;
  767. }
  768. else if (actionAddress.Sort == 2)
  769. {
  770. taskCallbackData.SuccessResetAddress2 = actionAddress.Address;
  771. taskCallbackData.SuccessResetValue2 = actionAddress.Value;
  772. }
  773. }
  774. return taskCallbackData;
  775. }
  776. public async Task<ResponseECSData> PushPushToMachine(RequestData<CutterTestData> req)
  777. {
  778. Log.Instance.WriteLogAdd("机外对刀仪数据接受===>> "+ JsonConvert.SerializeObject(req),"机外对刀仪");
  779. // 1、根据url查询设备信息 2、调用httpserveer 发送执行消息
  780. ResponseECSData responseData = new ResponseECSData(req.taskId, req.taskNodeId);
  781. try
  782. {
  783. List<Device> devices = _deviceService.GetDeviceList();
  784. Device device = devices.Where(x => x.Ip.Equals(req.url) && x.Port.Equals(req.port)).FirstOrDefault();
  785. if (device == null)
  786. {
  787. Log.Instance.WriteLogAdd(ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req),
  788. EnumHelper.GetDescription(ActionTypeEnum.StartCleanMachine));
  789. responseData.result = "false";
  790. responseData.resultMsg = ActionTypeEnum.StartCleanMachine + "设备已离线===>>" + JsonConvert.SerializeObject(req);
  791. return responseData;
  792. }
  793. if (device.ProtocolType == ProtocalTypeEnum.HEIDEHAIN.ToString())
  794. {
  795. RequestHeidhData hdhReq = new RequestHeidhData();
  796. hdhReq.ServerUrl = device.ServerUrl;
  797. hdhReq.MachineName = device.UserName;
  798. hdhReq.Type = "ReadAndWriteTool";
  799. hdhReq.CutterData = JsonConvert.SerializeObject(req.data);
  800. var Result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, hdhUrlContext, hdhReq, null);
  801. ResponseHeidhData responseHeidhData = JsonConvert.DeserializeObject<ResponseHeidhData>(Result.Message);
  802. if (!Result.IsSuccess || !responseHeidhData.result)
  803. {
  804. Log.Instance.WriteLogAdd(ActionTypeEnum.UploadFile + "机外对刀仪数据上传异常===>>" + JsonConvert.SerializeObject(req)+"======结果数据:"+ Result, "机外对刀仪");
  805. responseData.result = "false";
  806. responseData.resultMsg = Result.Message;
  807. }
  808. else
  809. {
  810. responseData.result = "true";
  811. responseData.resultMsg = "消费成功";
  812. }
  813. }
  814. else {
  815. responseData.result = "false";
  816. responseData.resultMsg = "没找到对应的数类型方法";
  817. }
  818. }
  819. catch (Exception ex) {
  820. Log.Instance.WriteLogAdd(ActionTypeEnum.StartDryMachine + "任务下发异常===>>" + ex.Message + JsonConvert.SerializeObject(req),
  821. EnumHelper.GetDescription(ActionTypeEnum.StartDryMachine));
  822. responseData.result = "false";
  823. responseData.resultMsg = ex.Message;
  824. return responseData;
  825. }
  826. return responseData;
  827. }
  828. }
  829. }