TaskService.cs 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436
  1. using WCS.DeviceProtocol;
  2. using WCS.Repository;
  3. using Microsoft.EntityFrameworkCore;
  4. using Newtonsoft.Json;
  5. using WCS.Common;
  6. using WCS.Entitys;
  7. using WCS.Model;
  8. using WCS.Services;
  9. using HslCommunication.Profinet.Siemens;
  10. using HslCommunication;
  11. using WCS.Utils;
  12. using IMCS.CCS.Services;
  13. using StackExchange.Redis;
  14. using WCS.Models;
  15. using fanuc采集;
  16. using HeidenhainDNCLib;
  17. using IMCS.Device;
  18. using HttpServer;
  19. using YG.Device;
  20. using static HttpServer.ConDevice2;
  21. using FANUC;
  22. using SinumerikOpcUaAPI;
  23. using static SinumerikOpcUaAPI.Server;
  24. using System.Net.NetworkInformation;
  25. using System.Reflection.Emit;
  26. using Opc.Ua;
  27. using System.Runtime.Serialization.Formatters.Binary;
  28. using System.Runtime.Serialization;
  29. using static System.Runtime.InteropServices.JavaScript.JSType;
  30. using WinSCP;
  31. using System.Runtime.InteropServices;
  32. namespace WCS.Service.Impl
  33. {
  34. public class TaskService : ITaskService
  35. {
  36. private readonly IDeviceRepository deviceRepository;
  37. private readonly IWcsActionService wcsActionService;
  38. private readonly IWcsActionAddressService wcsActionAddressService;
  39. private readonly ITaskCallbackService taskCallbackService;
  40. private readonly IConnectionMultiplexer _redis;
  41. private readonly IDeviceService _deviceService;
  42. private readonly IWcsTagValueService _wcsTagValueService;
  43. private readonly IApiRequestService _apiRequestService;
  44. private string wcs_callback_url;
  45. private string wcs_redis_key = "WCS:";
  46. private string LOG_TITLE_S7 = "S7采集";
  47. private string LOG_TITLE_CALLBACK = "回调任务";
  48. private static readonly string FANUC = "fanuc";
  49. private static readonly string OPCUA = "opcua";
  50. private static readonly string HEIDENHAIN = "heidenhain";
  51. public Dictionary<string, DNC_STATE> deviceList { get; set; } = new Dictionary<string, DNC_STATE>();
  52. public Dictionary<string, JHMachineInProcess> machineList { get; set; } = new Dictionary<string, JHMachineInProcess>();
  53. public string UPLOAD_NC_PATH = "Sinumerik/FileSystem/NCExtend/wks.dir/nc_program/";
  54. private string RemotePath = "TNC:\\nc_prog\\ATUO";//ConfigurationManager.AppSettings["RemotePath"];
  55. private uint currentToolArea = 1;
  56. private DNC_STATE m_ControlState;
  57. private int iChannel = 0;
  58. // 作为长连接进行bean的存储, key使用ip,
  59. Dictionary<string, Server> opcServerMap = new Dictionary<string, Server>();
  60. public IConfiguration Configuration { get; }
  61. public TaskService(IDeviceRepository deviceRepository,
  62. IWcsActionService wcsActionService,
  63. IWcsTagValueService wcsTagValueService,
  64. IWcsActionAddressService wcsActionAddressService,
  65. ITaskCallbackService taskCallbackService,
  66. IConnectionMultiplexer redisService,
  67. IDeviceService deviceService,
  68. IApiRequestService _apiRequestService,
  69. IConfiguration configuration
  70. )
  71. {
  72. this.deviceRepository = deviceRepository;
  73. this.wcsActionService = wcsActionService;
  74. this.wcsActionAddressService = wcsActionAddressService;
  75. this.taskCallbackService = taskCallbackService;
  76. this._redis = redisService;
  77. this._deviceService = deviceService;
  78. this._wcsTagValueService = wcsTagValueService;
  79. this._apiRequestService = _apiRequestService;
  80. wcs_callback_url = Configuration.GetConnectionString("wcsCallbackUrl");
  81. }
  82. public async Task<ResponseData> ExcuteTask(RequestData<LocationData> data)
  83. {
  84. ResponseData responseData = new ResponseData();
  85. try
  86. {
  87. List<WcsDevice> devices = deviceRepository.GetDeviceList();
  88. WcsDevice? wcsDevice = devices.FirstOrDefault(x => x.Ip == data.ip);
  89. //WcsDevice device = devices.Where(x => x.Ip == data.url && x.Port == data.port).FirstOrDefault();
  90. if (wcsDevice == null)
  91. {
  92. Log.Instance.WriteLogAdd("设备已离线===>>" + JsonConvert.SerializeObject(data));
  93. responseData.IsSuccess = false;
  94. return responseData;
  95. }
  96. WcsAction action = new WcsAction();
  97. action.Ip = data.ip;
  98. action.OperateType = data.data.operateType.ToString();
  99. WcsAction? actionInfo = wcsActionService.GetList(action).FirstOrDefault();
  100. if (actionInfo == null)
  101. {
  102. Log.Instance.WriteLogAdd(data.data.operateType.ToString() + "异常===>>" + "找不到对应实例" + JsonConvert.SerializeObject(data),
  103. EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType));
  104. responseData.IsSuccess = false;
  105. return responseData;
  106. }
  107. WcsDevice? plcDevice = devices.FirstOrDefault(x => x.ProtocolType == "S7_1500");
  108. SiemensS7Net s7 = DevicePlcS7.SiemensS7(plcDevice.Ip);
  109. OperateResult ConnectionResult = s7.ConnectServer();
  110. if (!ConnectionResult.IsSuccess)
  111. {
  112. s7.ConnectClose();
  113. Log.Instance.WriteLogAdd(data.data.operateType.ToString() + "异常===>>" + "PLC连接不上" + JsonConvert.SerializeObject(data),
  114. EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType));
  115. responseData.IsSuccess = false;
  116. return responseData;
  117. }
  118. WcsActionAddress actionAddressQuery = new WcsActionAddress();
  119. actionAddressQuery.ActionId = actionInfo.Id;
  120. /*actionAddressQuery.Type = ActionAddressTypeEnum.WRITE.ToString();*/
  121. /*actionAddressQuery.Sort = data.data.type;*/
  122. List<WcsActionAddress> WcsActionAddresses = wcsActionAddressService.GetList(actionAddressQuery);
  123. WcsActionAddress? wcsActionAddress = WcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.WRITE.ToString() && o.Sort == data.data.type).FirstOrDefault();
  124. if (WcsActionAddresses != null && data.data.type == 0)
  125. {
  126. OperateResult operateResult = s7.Write(wcsActionAddress.Address, Convert.ToInt16(data.data.startPosition));
  127. }
  128. else if (WcsActionAddresses != null && data.data.type == 1)
  129. {
  130. s7.Write(wcsActionAddress.Address, Convert.ToInt16(data.data.endPosition));
  131. }
  132. s7.ConnectClose();
  133. //插入回调
  134. TaskCallback taskCallbackData = new TaskCallback(data.url, data.data.operateType.ToString(),
  135. EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType), data.taskId, data.taskNodeId);
  136. taskCallbackData = setCallBackValue(WcsActionAddresses, taskCallbackData, data);
  137. await taskCallbackService.CreateOrUpdateAndCache(taskCallbackData);
  138. Log.Instance.WriteLogAdd(EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType) + "成功===>>" + JsonConvert.SerializeObject(data)
  139. , EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType));
  140. return responseData;
  141. }
  142. catch (Exception ex)
  143. {
  144. Log.Instance.WriteLogAdd(data.data.operateType + "异常===>>" + ex.Message + JsonConvert.SerializeObject(data),
  145. EnumHelper.GetEnumDescription<WcsActionType>(data.data.operateType));
  146. responseData.IsSuccess = false;
  147. responseData.Msg = ex.Message;
  148. return responseData;
  149. }
  150. }
  151. /// <summary>
  152. /// 采集数据S7
  153. /// </summary>
  154. /// <returns></returns>
  155. public async Task<string> DataCollectS7Job()
  156. {
  157. try
  158. {
  159. List<WcsDevice> deviceList = await getDeviceList();
  160. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()) && x.State).ToList();
  161. foreach (WcsDevice device in deviceList)
  162. {
  163. List<WcsTagValue> tagValues = new List<WcsTagValue>();
  164. string redis_key = "WCS:" + device.Ip + ":" + device.ProtocolType;
  165. var data = await _redis.GetDatabase().StringGetAsync(redis_key);
  166. if (data.IsNullOrEmpty)
  167. {
  168. WcsTagValue tagQuery = new WcsTagValue();
  169. tagQuery.ProtocolType = device.ProtocolType;
  170. tagQuery.Ip = device.Ip;
  171. tagValues = _wcsTagValueService.GetList(tagQuery);
  172. //首次设置redis
  173. if (tagValues != null && tagValues.Count > 0)
  174. {
  175. await _redis.GetDatabase().StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  176. }
  177. }
  178. else
  179. {
  180. tagValues = JsonConvert.DeserializeObject<List<WcsTagValue>>(data);
  181. }
  182. if (tagValues != null && tagValues.Count > 0)
  183. {
  184. tagValues = JsonConvert.DeserializeObject<List<WcsTagValue>>(data);
  185. List<WcsTagValue> changTagValues = new List<WcsTagValue>();
  186. //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  187. SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.Ip);
  188. OperateResult ConnectionResult = s7.ConnectServer();
  189. if (!ConnectionResult.IsSuccess)
  190. {
  191. device.State = false;
  192. await _deviceService.UpdateDevice(device);
  193. s7.ConnectClose();
  194. Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>" + device.Ip, LOG_TITLE_S7);
  195. return "采集失败,plc连不上";
  196. }
  197. else
  198. {
  199. foreach (WcsTagValue tagValueData in tagValues)
  200. {
  201. string operateResult = "";
  202. if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString()))
  203. {
  204. operateResult = s7.ReadBool(tagValueData.Address).Content.ToString();
  205. }
  206. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString()))
  207. {
  208. operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString();
  209. }
  210. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString()))
  211. {
  212. operateResult = s7.ReadString(tagValueData.Address).Content.ToString();
  213. }
  214. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Array.ToString()))
  215. {
  216. operateResult = ToolUtils.ReturnStringByBytes(s7.Read(tagValueData.Address, 40).Content);
  217. }
  218. if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult)
  219. {
  220. tagValueData.TagValue = operateResult.ToString();
  221. tagValueData.UpdateTime = DateTime.Now;
  222. changTagValues.Add(tagValueData);
  223. Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  224. //有变化更新数据库
  225. await _wcsTagValueService.Update(tagValueData);
  226. }
  227. Thread.Sleep(50);
  228. }
  229. s7.ConnectClose();
  230. //值有变化,重新设置一次redis
  231. if (changTagValues != null && changTagValues.Count > 0)
  232. {
  233. await _redis.GetDatabase().StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  234. }
  235. //存储采集数据
  236. CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_S7);
  237. }
  238. }
  239. }
  240. return "S7采集成功";
  241. }
  242. catch (Exception ex)
  243. {
  244. string errorMessage = $"S7采集异常===>> {ex.Message}\nStack Trace: {ex.StackTrace}";
  245. Log.Instance.WriteLogAdd(errorMessage, LOG_TITLE_S7);
  246. return "S7采集失败";
  247. }
  248. }
  249. /// <summary>
  250. /// 获取redis 设备在线列表
  251. /// </summary>
  252. /// <param name="strData"></param>
  253. /// <returns></returns>
  254. private async Task<List<WcsDevice>> getDeviceList()
  255. {
  256. List<WcsDevice> deviceList = new List<WcsDevice>();
  257. var deviceListData = await _redis.GetDatabase().StringGetAsync(wcs_redis_key + RedisKeyEnum.DeviceList);
  258. if (deviceListData.IsNullOrEmpty || deviceListData.Length() == 0)
  259. {
  260. deviceList = _deviceService.GetDeviceList();
  261. await _redis.GetDatabase().StringSetAsync(wcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList));
  262. }
  263. else
  264. {
  265. deviceList = JsonConvert.DeserializeObject<List<WcsDevice>>(deviceListData);
  266. }
  267. return deviceList;
  268. }
  269. public string Test()
  270. {
  271. Console.WriteLine(DateTime.Now);
  272. return "111";
  273. }
  274. /// <summary>
  275. /// 柔性产线,伺服等取和放回调任务
  276. /// </summary>
  277. /// <returns></returns>
  278. public async Task<string> CallbackJob2()
  279. {
  280. List<TaskCallback> taskList = new List<TaskCallback>();
  281. var taskCallbackListData = await _redis.GetDatabase().StringGetAsync(wcs_redis_key + RedisKeyEnum.CallbackTaskList);
  282. if (taskCallbackListData.IsNullOrEmpty)
  283. {
  284. taskList = await taskCallbackService.GetAllList();
  285. }
  286. else
  287. {
  288. taskList = JsonConvert.DeserializeObject<List<TaskCallback>>(taskCallbackListData);
  289. }
  290. //在线设备
  291. List<WcsDevice> deviceList = await getDeviceList();
  292. //taskList = taskList.Where(x => x.OperateType.Equals(ActionTypeEnum.RobotAction.ToString())).ToList();
  293. taskList = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).ToList();
  294. //TaskCallback task = taskList.Where(key => deviceList.Any(device => device.Ip == key.IP)).FirstOrDefault() ;
  295. if (taskList == null || taskList.Count == 0)
  296. {
  297. return "无回调任务";
  298. }
  299. string message = "";
  300. try
  301. {
  302. foreach (TaskCallback task in taskList)
  303. {
  304. WcsTagValue tagValueQuery = new WcsTagValue();
  305. tagValueQuery.Ip = task.IP;
  306. tagValueQuery.Address = task.Address;
  307. List<WcsTagValue> tagValues = _wcsTagValueService.GetList(tagValueQuery).ToList();
  308. WcsTagValue callBacktagValue = tagValues.Where(o => o.Address == task.Address).FirstOrDefault();
  309. //if ((callBacktagValue != null && callBacktagValue.TagValue == task.CallbackValue))
  310. if (callBacktagValue != null)
  311. {
  312. CallBackRequestData requestData = new CallBackRequestData();
  313. requestData.taskId = long.Parse(task.TaskId);
  314. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  315. requestData.TagValue = callBacktagValue.TagValue;
  316. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, wcs_callback_url, requestData, null);
  317. ResponseWCSCallbackData responseECSCallback = JsonConvert.DeserializeObject<ResponseWCSCallbackData>(result.Message);
  318. if (result.IsSuccess && responseECSCallback.code == 0)
  319. {
  320. //取 放动作结果 如果完成修改状态,否则
  321. if (callBacktagValue.TagValue == "3")
  322. {
  323. task.State = false;
  324. task.UpdateTime = DateTime.Now;
  325. await taskCallbackService.CreateOrUpdateAndCache(task);
  326. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ";";
  327. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  328. }
  329. else
  330. {
  331. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + ",请求结果:" + result.Message + ",返回结果:" + callBacktagValue.TagValue + ";";
  332. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  333. }
  334. }
  335. else
  336. {
  337. //ecs返回-5 任务作废
  338. if (result.IsSuccess && responseECSCallback.code == -5)
  339. {
  340. task.State = false;
  341. task.UpdateTime = DateTime.Now;
  342. task.Description = "ecs返回-5,回调任务作废";
  343. await taskCallbackService.CreateOrUpdateAndCache(task);
  344. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  345. Log.Instance.WriteLogAdd("回调异常,请求接口失败,wcs通知任务作废==>" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  346. }
  347. else
  348. {
  349. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  350. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(result), LOG_TITLE_CALLBACK);
  351. }
  352. }
  353. }
  354. //回调检测到失败,回调通知ecs
  355. /*if (!string.IsNullOrEmpty(task.FailAddress) || !string.IsNullOrEmpty(task.FailAddress2) || !string.IsNullOrEmpty(task.FailAddress3))
  356. {
  357. bool failFalg = false;
  358. if (!string.IsNullOrEmpty(task.FailAddress))
  359. {
  360. List<WcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress && o.TagValue == task.CallbackFailValue).ToList();
  361. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  362. {
  363. failFalg = true;
  364. }
  365. }
  366. if (!string.IsNullOrEmpty(task.FailAddress2))
  367. {
  368. List<WcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress2 && o.TagValue == task.CallbackFailValue2).ToList();
  369. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  370. {
  371. failFalg = true;
  372. }
  373. }
  374. if (!string.IsNullOrEmpty(task.FailAddress3))
  375. {
  376. List<WcsTagValue> FailCallbackTagValues = tagValues.Where(o => o.Address == task.FailAddress3 && o.TagValue == task.CallbackFailValue3).ToList();
  377. if (FailCallbackTagValues != null && FailCallbackTagValues.Count > 0)
  378. {
  379. failFalg = true;
  380. }
  381. }
  382. if (failFalg)
  383. {
  384. CallBackRequestData requestData = new CallBackRequestData();
  385. requestData.taskId = long.Parse(task.TaskId);
  386. requestData.taskNodeId = long.Parse(task.TaskNodeId);
  387. requestData.code = "0";
  388. requestData.msg = "操作失败";
  389. var result = await _apiRequestService.RequestAsync(RequsetModeEnum.Post, wcs_callback_url, requestData, null);
  390. if (result.IsSuccess)
  391. {
  392. task.State = false;
  393. task.UpdateTime = DateTime.Now;
  394. await taskCallbackService.CreateOrUpdateAndCache(task);
  395. message = task.OperateName + "==>taskId:" + task.TaskId + ",taskNodeId:" + task.TaskNodeId + message + ",请求结果:" + result.Message + ";";
  396. Log.Instance.WriteLogAdd(message, LOG_TITLE_CALLBACK);
  397. }
  398. else
  399. {
  400. message = message + JsonConvert.SerializeObject(task) + ",请求失败! WebApi 返回结果" + ";";
  401. Log.Instance.WriteLogAdd("回调异常,请求接口失败" + JsonConvert.SerializeObject(task), LOG_TITLE_CALLBACK);
  402. }
  403. }
  404. }*/
  405. Thread.Sleep(1000);
  406. }
  407. return string.IsNullOrEmpty(message) ? "无回调任务" : message;
  408. }
  409. catch (Exception ex)
  410. {
  411. Log.Instance.WriteLogAdd("回调异常===>>" + ex.Message, LOG_TITLE_CALLBACK);
  412. return "回调异常" + ex.Message;
  413. }
  414. }
  415. //设置回调值
  416. private TaskCallback setCallBackValue(List<WcsActionAddress> CcsActionAddresses, TaskCallback taskCallbackData, RequestData<LocationData> data)
  417. {
  418. WcsActionAddress actionAddress = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK.ToString() && o.Sort == data.data.type).FirstOrDefault();
  419. if (actionAddress != null)
  420. {
  421. taskCallbackData.Address = actionAddress.Address;
  422. taskCallbackData.CallbackValue = actionAddress.Value;
  423. }
  424. /*List<WcsActionAddress> CcsActionAddressCallBackFails = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.CALLBACK_FAIL.ToString()).ToList();
  425. List<WcsActionAddress> CcsActionAddressCallBackResets = CcsActionAddresses.Where(o => o.Type == ActionAddressTypeEnum.RESET.ToString()).ToList();
  426. foreach (WcsActionAddress actionAddress in CcsActionAddressCallBacks)
  427. {
  428. if (actionAddress.Sort == data.data.type)
  429. {
  430. taskCallbackData.Address = actionAddress.Address;
  431. taskCallbackData.CallbackValue = actionAddress.Value;
  432. }
  433. }
  434. foreach (WcsActionAddress actionAddress in CcsActionAddressCallBackFails)
  435. {
  436. if (actionAddress.Sort == 1)
  437. {
  438. taskCallbackData.FailAddress = actionAddress.Address;
  439. taskCallbackData.CallbackFailValue = actionAddress.Value;
  440. }
  441. else if (actionAddress.Sort == 2)
  442. {
  443. taskCallbackData.FailAddress2 = actionAddress.Address;
  444. taskCallbackData.CallbackFailValue2 = actionAddress.Value;
  445. }
  446. else if (actionAddress.Sort == 3)
  447. {
  448. taskCallbackData.FailAddress3 = actionAddress.Address;
  449. taskCallbackData.CallbackFailValue3 = actionAddress.Value;
  450. }
  451. }
  452. foreach (WcsActionAddress actionAddress in CcsActionAddressCallBackResets)
  453. {
  454. if (actionAddress.Sort == 1)
  455. {
  456. taskCallbackData.SuccessResetAddress = actionAddress.Address;
  457. taskCallbackData.SuccessResetValue = actionAddress.Value;
  458. }
  459. else if (actionAddress.Sort == 2)
  460. {
  461. taskCallbackData.SuccessResetAddress2 = actionAddress.Address;
  462. taskCallbackData.SuccessResetValue2 = actionAddress.Value;
  463. }
  464. }
  465. return taskCallbackData;*/
  466. return taskCallbackData;
  467. }
  468. public ResponseData fanuc(RequestData<LocationData> data)
  469. {
  470. ResponseData responseData = new ResponseData();
  471. try
  472. {
  473. string ip = data.ip;
  474. string port = data.port;
  475. string fun = data.fun;
  476. int ret = 0;
  477. ConDevice CIF = new ConDevice();
  478. if (fun == "All")
  479. {
  480. ConDevice2 CIF2 = new ConDevice2(ip, port);
  481. DeviceInfo info = new DeviceInfo();
  482. if (CIF2.h > 0)
  483. {
  484. info.MainProg = CIF2.MainProg();
  485. info.CurProg = CIF2.MainProg();
  486. info.Status = CIF2.Status();
  487. info.EMG = CIF2.EMG();
  488. info.ActFeed = CIF2.ActFeed();
  489. info.ActSpindle = CIF2.ActSpindle();
  490. info.SpindleLoad = CIF2.SpindleLoad();
  491. info.spindleMagnification = CIF2.spindleMagnification();
  492. info.ServoLoadX = CIF2.ServoLoadX();
  493. info.ServoLoadY = CIF2.ServoLoadY();
  494. info.ServoLoadZ = CIF2.ServoLoadZ();
  495. info.PowerOnTime = CIF2.PowerOnTime();
  496. info.AccumulateCuttingTime = CIF2.AccumulateCuttingTime();
  497. info.CuttingTimePerCycle = CIF2.CuttingTimePerCycle();
  498. info.WorkTime = CIF2.WorkTime();
  499. info.Part_Count = CIF2.Part_Count();
  500. string isalarm = "";
  501. //info.AlmMsg = CIF2.AlmMsg(out isalarm);
  502. info.AlmMsg = CIF2.operationAlarm();
  503. info.IsAlarm = isalarm;
  504. info.ToolNo = CIF2.ToolNo();
  505. info.ToolLife = CIF2.ToolLife();
  506. //info.ToolLife = CIF2.ToolLife(ip, port);
  507. string jsonalldata = JsonConvert.SerializeObject(info);
  508. CIF2.freehand();
  509. }
  510. }else if(fun== "UploadFile")
  511. {
  512. string prgname = data.prgname;
  513. ret = CIF.UploadNcProg(ip, port, prgname);
  514. if (ret == Fanuc.EW_OK)
  515. {
  516. Log.Instance.WriteLogAdd("UploadFile_OK:" + JsonConvert.SerializeObject(data),
  517. EnumHelper.GetEnumDescription<WcsActionType>(FANUC));
  518. }
  519. else
  520. {
  521. Log.Instance.WriteLogAdd("UploadFile_error:" + JsonConvert.SerializeObject(data),
  522. EnumHelper.GetEnumDescription<WcsActionType>(FANUC));
  523. }
  524. }
  525. return responseData;
  526. }
  527. catch (Exception ex)
  528. {
  529. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(data),
  530. EnumHelper.GetEnumDescription<WcsActionType>(FANUC));
  531. responseData.IsSuccess = false;
  532. responseData.Msg = ex.Message;
  533. return responseData;
  534. }
  535. }
  536. public ResponseData opcua(RequestBody opcBody)
  537. {
  538. ResponseData responseBody = new ResponseData();
  539. Server opcServer = null;
  540. try
  541. {
  542. // 从map中取出opcServer 判断是否存在,以及是否可用
  543. opcServerMap.TryGetValue(opcBody.ServerUrl, out opcServer);
  544. // 如果key不存在,或者存在单连接不上,则需要重新创建连接
  545. if (!opcServerMap.ContainsKey(opcBody.ServerUrl) || !opcServer.Session.Connected)
  546. {
  547. Ping pingSender = new Ping();
  548. PingReply reply = pingSender.Send(opcBody.Ip);
  549. if (reply.Status == IPStatus.Success)
  550. {
  551. opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
  552. }
  553. if (opcServer != null && opcServer.Session != null && opcServer.Session.Connected)
  554. {
  555. // 存储Server bean
  556. opcServerMap.Add(opcBody.ServerUrl, opcServer);
  557. }
  558. }
  559. if (opcServer != null && opcServer.Session != null && opcServer.Session.Connected)
  560. {
  561. if (opcBody.Type == ActionTypeEnum.Connect.ToString()) //连接状态
  562. {
  563. responseBody.result = true;
  564. }
  565. else if (opcBody.Type == ActionTypeEnum.Collect.ToString()) //采集
  566. {
  567. //ETH_S7Simens s7 = new ETH_S7Simens("192.168.11.164");
  568. //responseBody.runDatasInfo = JsonConvert.SerializeObject(s7.deviceInfo);
  569. if (opcBody.check == null)
  570. {
  571. // 封装需要采集字段的数据
  572. //this.addAddress(opcBody);
  573. }
  574. else
  575. {
  576. opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.6");//千机质检结果
  577. }
  578. List<string> values = opcServer.ReadValues(opcBody.Addresses);
  579. responseBody.values = values;
  580. /*RunDatasInfo runDatasInfo = new RunDatasInfo();
  581. for (int i = 0; i < values.Count; i++)
  582. {
  583. if (i == 0)
  584. {
  585. runDatasInfo.feedRate = values[i];
  586. }
  587. else if (i == 1)
  588. {
  589. runDatasInfo.spindleMagnification = values[i];
  590. }
  591. else if (i == 2)
  592. {
  593. runDatasInfo.spindleSpeed = values[i];
  594. }
  595. else if (i == 3)
  596. {
  597. runDatasInfo.spindleLoad = values[i];
  598. }
  599. else if (i == 4)
  600. {
  601. runDatasInfo.mainPro = values[i];
  602. }
  603. else if (i == 5)
  604. {
  605. runDatasInfo.content = values[i];
  606. }
  607. }
  608. responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);*/
  609. /*//报警
  610. SinumerikOpcUaAPI.FilterDefinition m_filter = new SinumerikOpcUaAPI.FilterDefinition();
  611. m_filter.AreaId = new NodeId("Sinumerik", (ushort)2);
  612. m_filter.Severity = EventSeverity.Min;
  613. m_filter.IgnoreSuppressedOrShelved = true;
  614. m_filter.EventTypes = (IList<NodeId>)new NodeId[1]
  615. {
  616. ObjectTypeIds.ConditionType
  617. };
  618. m_filter.SelectClauses = m_filter.ConstructSelectClauses(opcServer.Session, ObjectTypeIds.ConditionType);
  619. for (int index = 0; index < m_filter.SelectClauses.Count<SimpleAttributeOperand>(); ++index)
  620. {
  621. responseBody.errorsInfo += m_filter.SelectClauses[index].ToString() + (object)index + " ";
  622. }*/
  623. }
  624. else if (opcBody.Type == ActionTypeEnum.ToolList.ToString())
  625. {
  626. List<string> nums = this.readVariables(opcServer, new string[1]
  627. {
  628. "/Tool/Catalogue/numTools[u<Area index>]".Replace("<Area index>", this.currentToolArea.ToString())
  629. }
  630. );
  631. int num = int.Parse(nums[0]);
  632. List<ToolsInfo> toolInfoList = new List<ToolsInfo>();
  633. for (int index = 1; index <= num; index++)
  634. {
  635. try
  636. {
  637. List<string> stringList = this.readVariables(opcServer, new string[10]
  638. {
  639. "/Tool/Catalogue/toolNo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  640. "/Tool/Catalogue/toolIdent[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  641. "/Tool/Catalogue/toolInMag[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  642. "/Tool/Catalogue/toolInPlace[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  643. "/Tool/Catalogue/nrDuplo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  644. "/Tool/Catalogue/numCuttEdges[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  645. "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "3"),
  646. "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "6"),
  647. "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "12"),
  648. "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "15")
  649. }
  650. );
  651. ToolsInfo toolInfo = new ToolsInfo(); ;
  652. toolInfo.number = Convert.ToUInt16(stringList[0]) + "";
  653. toolInfo.name = stringList[1];
  654. toolInfo.length = stringList[6];
  655. toolInfo.radius = stringList[7];
  656. toolInfo.wearLength = stringList[8];
  657. toolInfo.wearRadius = stringList[9];
  658. //toolInfo.toolInMag = Convert.ToUInt16(stringList[2]);
  659. //toolInfo.toolInPlace = Convert.ToUInt16(stringList[3]);
  660. //toolInfo.nrDuplo = Convert.ToUInt16(stringList[4]);
  661. //toolInfo.numCuttEdges = Convert.ToUInt16(stringList[5]);
  662. toolInfoList.Add(toolInfo);
  663. }
  664. catch (Exception ex)
  665. {
  666. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(responseBody),
  667. EnumHelper.GetEnumDescription<WcsActionType>(OPCUA));
  668. }
  669. }
  670. responseBody.toolsInfo = JsonConvert.SerializeObject(toolInfoList);
  671. }
  672. /* else if (opcBody.Type == ActionTypeEnum.Read.ToString())
  673. {
  674. responseBody.values = opcServer.ReadValues(opcBody.Addresses);
  675. }
  676. else if (opcBody.Type == ActionTypeEnum.Write.ToString())
  677. {
  678. opcServer.WriteValues(opcBody.Values, opcBody.Addresses);
  679. }
  680. else if (opcBody.Type == ActionTypeEnum.SelectNc.ToString())
  681. {
  682. string sSelectedFileName = Path.GetFileName(opcBody.Path);
  683. string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + sSelectedFileName, Convert.ToUInt32(CHANNEL_NO)).status;
  684. if (status == "Good")
  685. {
  686. responseBody.msg = "选择成功";
  687. }
  688. else
  689. {
  690. responseBody.msg = "选择失败";
  691. }
  692. }
  693. else if (opcBody.Type == ActionTypeEnum.Upload.ToString())
  694. {
  695. string file = opcBody.Path;
  696. string serverPath = "";
  697. string status = "";
  698. //选择临时文件
  699. status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + TEMP_NC_NAME, Convert.ToUInt32(CHANNEL_NO)).status;
  700. try
  701. {
  702. string extension = Path.GetExtension(file);
  703. if (string.IsNullOrWhiteSpace(extension))
  704. {
  705. responseBody.msg = "文件名不合法";
  706. }
  707. try
  708. {
  709. byte[] data = opcServer.ReadFile(file);
  710. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  711. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  712. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  713. {
  714. responseBody.msg = "上传文件成功";
  715. YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
  716. }
  717. else
  718. {
  719. responseBody.msg = "上传文件失败";
  720. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  721. }
  722. // }
  723. }
  724. catch (Exception ex)
  725. {
  726. responseBody.msg = "上传文件失败===>" + ex.Message;
  727. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  728. }
  729. }
  730. catch (Exception ex)
  731. {
  732. responseBody.msg = "上传文件失败===>" + ex.Message;
  733. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  734. }
  735. //设位主程序
  736. status = opcServer.MethodCallSelectProgram(serverPath, Convert.ToUInt32(CHANNEL_NO)).status;
  737. }*/
  738. else if (opcBody.Type == ActionTypeEnum.UploadFileList.ToString())
  739. {
  740. for (int i = 0; i < opcBody.subFileList.Count; i++)
  741. {
  742. string file = opcBody.subFileList[i];
  743. string serverPath = "";
  744. try
  745. {
  746. string extension = Path.GetExtension(file);
  747. if (string.IsNullOrWhiteSpace(extension))
  748. {
  749. responseBody.result = false;
  750. responseBody.Msg = file + "==文件名不合法";
  751. break;
  752. }
  753. try
  754. {
  755. byte[] data = opcServer.ReadFile(file);
  756. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  757. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  758. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  759. {
  760. responseBody.Msg = "上传文件成功";
  761. }
  762. else
  763. {
  764. responseBody.Msg = "上传文件失败";
  765. responseBody.result = false;
  766. break;
  767. }
  768. }
  769. catch (Exception ex)
  770. {
  771. responseBody.Msg = "上传文件失败===>" + ex.Message;
  772. break;
  773. }
  774. }
  775. catch (Exception ex)
  776. {
  777. responseBody.Msg = "上传文件失败===>" + ex.Message;
  778. responseBody.result = false;
  779. }
  780. }
  781. //设为主程序
  782. string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + opcBody.prgName, Convert.ToUInt32(1)).status;
  783. if (status != "Good")
  784. {
  785. responseBody.Msg = "选择失败";
  786. responseBody.result = false;
  787. }
  788. /*for (int i = 0; i < opcBody.toolFileList.Count; i++)
  789. {
  790. string file = opcBody.toolFileList[i];
  791. string serverPath = "";
  792. try
  793. {
  794. string extension = Path.GetExtension(file);
  795. if (string.IsNullOrWhiteSpace(extension))
  796. {
  797. responseBody.result = false;
  798. responseBody.Msg = file + "==文件名不合法";
  799. break;
  800. }
  801. try
  802. {
  803. byte[] data = opcServer.ReadFile(file);
  804. serverPath = UPLOAD_TOOL_PATH + Path.GetFileName(file);
  805. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  806. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  807. {
  808. YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件成功");
  809. }
  810. else
  811. {
  812. YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件失败");
  813. break;
  814. }
  815. }
  816. catch (Exception ex)
  817. {
  818. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  819. break;
  820. }
  821. }
  822. catch (Exception ex)
  823. {
  824. YG.Log.Instance.WriteLogAdd($"对刀仪493-->{ex.Message}");
  825. }
  826. }*/
  827. }
  828. /*else if (opcBody.Type == ActionTypeEnum.DownLoad.ToString())
  829. {
  830. string file = opcBody.Path;
  831. string serverPath = "";
  832. try
  833. {
  834. string extension = Path.GetExtension(file);
  835. if (string.IsNullOrWhiteSpace(extension))
  836. {
  837. responseBody.msg = "文件名不合法";
  838. }
  839. try
  840. {
  841. //byte[] data = opcServer.ReadFile(file);
  842. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  843. // Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileFromServer("/Methods/CopyFileFromServer", serverPath);
  844. //
  845. byte[] op = opcServer.ReadFile(serverPath);
  846. DiagnosticInfoCollection diagnosticInfos = null;
  847. CallMethodRequestCollection callMethodRequestCollection = new CallMethodRequestCollection();
  848. CallMethodResultCollection results = new CallMethodResultCollection();
  849. CallMethodRequest callMethodRequest = new CallMethodRequest();
  850. callMethodRequest.MethodId = new NodeId("/Methods/CopyFileFromServer", mNAMESPACE_INDEX);
  851. callMethodRequest.ObjectId = new NodeId("/Methods", mNAMESPACE_INDEX);
  852. callMethodRequest.InputArguments.Add(serverPath);
  853. //callMethodRequest.InputArguments.Add(data);
  854. callMethodRequestCollection.Add(callMethodRequest);
  855. RequestHeader requestHeader = new RequestHeader();
  856. ResponseHeader responseHeader = opcServer.Session.Call(null, callMethodRequestCollection, out results, out diagnosticInfos);
  857. Server.MethodCallResult methodCallResult = new MethodCallResult(results);
  858. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  859. {
  860. responseBody.msg = "上传文件成功";
  861. YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
  862. Variant result3 = methodCallResult.results;
  863. byte[] buff;
  864. using (MemoryStream ms = new MemoryStream())
  865. {
  866. IFormatter iFormatter = new BinaryFormatter();
  867. iFormatter.Serialize(ms, result3.Value);
  868. buff = ms.GetBuffer();
  869. }
  870. // 将byte[]写入文件
  871. File.WriteAllBytes(file, buff);
  872. // 读取文件内容到字符串
  873. string fileContent = File.ReadAllText(file);
  874. fileContent = fileContent.Trim();
  875. // 去除字符串中的空格
  876. //string trimmedContent = fileContent.Trim(); // 使用Trim去除字符串首尾的空格
  877. // 或者使用Replace去除所有空格
  878. string trimmedContent = fileContent.Replace(" ", "");
  879. // 将处理过的字符串写回文件
  880. File.WriteAllText(file, trimmedContent);
  881. string aa = result3.ToString();
  882. }
  883. else
  884. {
  885. responseBody.msg = "上传文件失败";
  886. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  887. }
  888. // }
  889. }
  890. catch (Exception ex)
  891. {
  892. responseBody.msg = "上传文件失败===>" + ex.Message;
  893. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  894. }
  895. }
  896. catch (Exception ex)
  897. {
  898. responseBody.msg = "上传文件失败===>" + ex.Message;
  899. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  900. }
  901. }
  902. else if (opcBody.Type == ActionTypeEnum.Delete.ToString())
  903. {
  904. string file = opcBody.Path;
  905. string serverPath = "";
  906. try
  907. {
  908. string extension = Path.GetExtension(file);
  909. if (string.IsNullOrWhiteSpace(extension))
  910. {
  911. responseBody.msg = "文件名不合法";
  912. }
  913. else
  914. {
  915. try
  916. {
  917. //byte[] data = opcServer.ReadFile(file);
  918. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  919. Server.MethodCallResult methodCallResult = opcServer.MethodCallDeleteFile(serverPath);
  920. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  921. {
  922. responseBody.msg = "删除文件成功";
  923. YG.Log.Instance.WriteLogAdd(file + "删除文件成功");
  924. }
  925. else
  926. {
  927. responseBody.msg = "上传文件失败";
  928. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  929. }
  930. // }
  931. }
  932. catch (Exception ex)
  933. {
  934. responseBody.msg = "上传文件失败===>" + ex.Message;
  935. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  936. }
  937. }
  938. }
  939. catch (Exception ex)
  940. {
  941. responseBody.msg = "上传文件失败===>" + ex.Message;
  942. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  943. }
  944. }
  945. else if (opcBody.Type == ActionTypeEnum.SynFile.ToString())
  946. {
  947. try
  948. {
  949. Server.MethodCallResult methodCallResult = opcServer.MethodCall("GetAllFiles", UPLOAD_NC_PATH);
  950. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  951. {
  952. responseBody.msg = "同步文件成功";
  953. }
  954. else
  955. {
  956. responseBody.msg = "同步文件失败";
  957. }
  958. // }
  959. }
  960. catch (Exception ex)
  961. {
  962. responseBody.msg = "同步文件失败===>" + ex.Message;
  963. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  964. }
  965. }*/
  966. }
  967. else
  968. {
  969. responseBody.Code = 0;
  970. responseBody.Msg = "服务器离线,连不上opcUa";
  971. responseBody.result = false;
  972. }
  973. return responseBody;
  974. }
  975. catch (Exception ex)
  976. {
  977. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(responseBody),
  978. EnumHelper.GetEnumDescription<WcsActionType>(OPCUA));
  979. responseBody.result = false;
  980. responseBody.Msg = ex.Message;
  981. return responseBody;
  982. }
  983. }
  984. public ResponseData heidenhain(RequestBody hdhBody)
  985. {
  986. ResponseData responseBody = new ResponseData();
  987. try
  988. {
  989. if (hdhBody.Type == ActionTypeEnum.Connect.ToString())
  990. {
  991. Ping pingSender = new Ping();
  992. PingReply reply = pingSender.Send(hdhBody.ServerUrl);
  993. if (reply.Status != IPStatus.Success)
  994. {
  995. responseBody.result = false;
  996. }
  997. }
  998. else
  999. {
  1000. //第一次连接加入数组,以支持多台设备
  1001. if (deviceList == null || (deviceList.Where(m => m.Key == hdhBody.MachineName).Count() == 0))
  1002. {
  1003. m_ControlState = connect(hdhBody.MachineName);
  1004. //DNC连接正常,加入数组
  1005. if (m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  1006. {
  1007. deviceList.Add(hdhBody.MachineName, m_ControlState);
  1008. }
  1009. Thread.Sleep(500);
  1010. }
  1011. else
  1012. {
  1013. //取设备对应的状态
  1014. m_ControlState = deviceList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  1015. }
  1016. JHMachineInProcess Machine = machineList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  1017. if (m_ControlState != null && m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  1018. {
  1019. JHError m_Error = (JHError)Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHERROR);
  1020. JHErrorEntry2List errorsList = m_Error.GetErrorList();
  1021. IJHErrorEntry2 pErrorEntry = null;
  1022. for (int i = 0; i < errorsList.Count; i++)
  1023. {
  1024. pErrorEntry = errorsList[i];
  1025. if (pErrorEntry != null && pErrorEntry.Text != null)
  1026. {
  1027. //Console.WriteLine("===" + pErrorEntry.Text.ToString());
  1028. responseBody.errorsInfo += pErrorEntry.Text.ToString() + " ";
  1029. }
  1030. }
  1031. /*if (hdhBody.Type == ActionTypeEnum.Collect.ToString())
  1032. {
  1033. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1034. JHProcessData m_ProcessData = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHPROCESSDATA);
  1035. object pFeed = new object();
  1036. object pSpeed = new object();
  1037. object pRapid = new object();
  1038. object proStatus = new object();
  1039. //进出倍率 主轴倍率
  1040. m_Automatic.GetOverrideInfo(ref pFeed, ref pSpeed, ref pRapid);
  1041. m_Automatic.GetExecutionMode();
  1042. DNC_STS_PROGRAM dncProgram = m_Automatic.GetProgramStatus();
  1043. RunDatasInfo runDatasInfo = new RunDatasInfo();
  1044. runDatasInfo.feedRate = pFeed.ToString();
  1045. runDatasInfo.spindleMagnification = pSpeed.ToString();
  1046. runDatasInfo.spindleSpeed = pRapid.ToString();
  1047. responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);
  1048. object oHours = new object();
  1049. object oMinutes = new object();
  1050. // --- NC uptime --------------------------------------------------------------------------
  1051. m_ProcessData.GetNcUpTime(ref oHours, ref oMinutes);
  1052. string ncUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1053. // --- Machine uptime ---------------------------------------------------------------------
  1054. m_ProcessData.GetMachineUpTime(ref oHours, ref oMinutes);
  1055. string machineUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1056. // --- Machine running time ---------------------------------------------------------------
  1057. m_ProcessData.GetMachineRunningTime(ref oHours, ref oMinutes);
  1058. string runningTimes = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1059. }
  1060. else */
  1061. if (hdhBody.Type == ActionTypeEnum.Upload.ToString())
  1062. {
  1063. JHFileSystem m_FileSystem = (JHFileSystem)Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  1064. JHAutomatic m_Automatic = (JHAutomatic)Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1065. string sSelectedFile = Path.GetFileName(hdhBody.Path);
  1066. string dncPath = GenPath(RemotePath, sSelectedFile);
  1067. string tempDncPath = RemotePath + "\\2.h";
  1068. //设置临时程序为主程序
  1069. m_Automatic.SelectProgram(iChannel, tempDncPath);
  1070. try
  1071. { //删除上传文件,try异常防止文件不存在
  1072. //m_FileSystem.DeleteFile(dncPath);
  1073. }
  1074. catch (Exception edel)
  1075. {
  1076. }
  1077. //上传
  1078. m_FileSystem.TransmitFile(hdhBody.Path, dncPath);
  1079. //设当前上传程序为主程序
  1080. m_Automatic.SelectProgram(iChannel, dncPath);
  1081. }
  1082. /*else if (hdhBody.Type == ActionTypeEnum.DeleteNc.ToString())
  1083. {
  1084. JHFileSystem m_FileSystem = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  1085. string dncPath = GenPath(RemotePath, hdhBody.Path);
  1086. m_FileSystem.DeleteFile(dncPath);
  1087. }
  1088. else if (hdhBody.Type == ActionTypeEnum.SelectNcProgram.ToString())//选中程序
  1089. {
  1090. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1091. string dncPath = GenPath(RemotePath, hdhBody.Path);
  1092. m_Automatic.SelectProgram(iChannel, dncPath);
  1093. }
  1094. else if (hdhBody.Type == ActionTypeEnum.StartNcProgram.ToString())//启动程序备用
  1095. {
  1096. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1097. //m_Automatic.SelectProgram(iChannel, GenPath(RemotePath, hdhBody.Path));
  1098. //Thread.Sleep(1000);
  1099. m_Automatic.StartProgram(GenPath(RemotePath, hdhBody.Path));
  1100. }
  1101. else if (hdhBody.Type == ActionTypeEnum.Read.ToString())
  1102. {
  1103. }
  1104. else if (hdhBody.Type == ActionTypeEnum.Write.ToString())
  1105. {
  1106. }
  1107. else if (hdhBody.Type == ActionTypeEnum.ToolList.ToString())
  1108. {
  1109. IJHDataEntry2 ToolLine = null;
  1110. IJHDataEntry2List ToolCells = null;
  1111. //IJHDataEntry2 ToolCell = null;
  1112. List<ToolsInfo> toolsList = new List<ToolsInfo>();
  1113. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  1114. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  1115. //string ToolColumnNamesAccessor = @"\TABLE\TOOL\T\('1'-'50')"; // see Init()
  1116. string ToolColumnNamesAccessor = @"\TABLE\TOOL_P\T\('1'-'50')";
  1117. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  1118. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  1119. int ToolLinesCount = ToolLines.Count >= 50 ? 50 : ToolLines.Count;
  1120. //int ToolLinesCount = ToolLines.Count;
  1121. for (int i = 0; i < ToolLinesCount; i++)
  1122. {
  1123. ToolLine = ToolLines[i];
  1124. ToolCells = ToolLine.GetChildList();
  1125. // get child list from server
  1126. ToolsInfo toolsInfo = new ToolsInfo();
  1127. //刀位编码
  1128. int[] pCode = ToolCells[0].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  1129. toolsInfo.position = string.Join(".", pCode);
  1130. toolsInfo.number = ToolCells[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1131. toolsInfo.name = ToolCells[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1132. if (!String.IsNullOrEmpty(toolsInfo.name) && !String.IsNullOrEmpty(toolsInfo.number) && pCode.Length > 0 && pCode[1] > 0)
  1133. {
  1134. string ToolNumberAccessor = @"\TABLE\TOOL\T\" + toolsInfo.number.ToString();
  1135. IJHDataEntry2List ToolList = dataAccess.GetDataEntry2(ToolNumberAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false).GetChildList();
  1136. //报警期限
  1137. toolsInfo.warnLife = ToolList[10].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1138. //刀具寿命目标值
  1139. toolsInfo.targetLife = ToolList[11].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1140. //Cur_Time使用时间
  1141. toolsInfo.curTime = ToolList[12].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1142. toolsList.Add(toolsInfo);
  1143. }
  1144. }
  1145. //获取海德汉的刀具寿命信息
  1146. responseBody.toolsInfo = JsonConvert.SerializeObject(toolsList.Distinct().ToList());
  1147. }
  1148. }
  1149. else
  1150. {
  1151. responseBody.msg = m_ControlState.ToString();
  1152. responseBody.result = false;
  1153. deviceList.Remove(hdhBody.MachineName);
  1154. }*/
  1155. }
  1156. }
  1157. }
  1158. catch (Exception ex)
  1159. {
  1160. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(hdhBody),
  1161. EnumHelper.GetEnumDescription<WcsActionType>(HEIDENHAIN));
  1162. responseBody.IsSuccess = false;
  1163. responseBody.Msg = ex.Message;
  1164. return responseBody;
  1165. }
  1166. return responseBody;
  1167. }
  1168. private List<string> readVariables(Server server, string[] variables)
  1169. {
  1170. List<string> nodeIdStrings = new List<string>();
  1171. foreach (string variable in variables)
  1172. {
  1173. NodeId nodeId = new NodeId(variable, (ushort)2);
  1174. nodeIdStrings.Add(nodeId.ToString());
  1175. }
  1176. return server.ReadValues(nodeIdStrings);
  1177. }
  1178. private DNC_STATE connect(string connectName)
  1179. {
  1180. DNC_CNC_TYPE CncType;
  1181. IJHConnectionList connectionList = null;
  1182. IJHConnection connection = null;
  1183. try
  1184. {
  1185. JHMachineInProcess Machine = null;
  1186. //第一次连接加入数组,以支持多台设备
  1187. if (machineList == null || (machineList.Where(m => m.Key == connectName).Count() == 0))
  1188. {
  1189. Machine = new JHMachineInProcess();
  1190. //DNC连接正常,加入数组
  1191. machineList.Add(connectName, Machine);
  1192. Thread.Sleep(20);
  1193. }
  1194. else
  1195. {
  1196. //取对应设备
  1197. Machine = machineList.Where(m => m.Key == connectName).FirstOrDefault().Value;
  1198. }
  1199. Machine.ConnectRequest(connectName);
  1200. string sCurrentMachine = Machine.currentMachine;
  1201. // Find out control type
  1202. connectionList = Machine.ListConnections();
  1203. for (int i = 0; i < connectionList.Count; i++)
  1204. {
  1205. connection = connectionList[i];
  1206. if (connection.name == sCurrentMachine)
  1207. {
  1208. CncType = connection.cncType;
  1209. }
  1210. if (connection != null)
  1211. Marshal.ReleaseComObject(connection);
  1212. }
  1213. return Machine.GetState();
  1214. }
  1215. catch (COMException cex)
  1216. {
  1217. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  1218. }
  1219. catch (Exception ex)
  1220. {
  1221. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  1222. }
  1223. finally
  1224. {
  1225. if (connectionList != null)
  1226. Marshal.ReleaseComObject(connectionList);
  1227. if (connection != null)
  1228. Marshal.ReleaseComObject(connection);
  1229. }
  1230. }
  1231. private string GenPath(string part1, string part2)
  1232. {
  1233. string sFullPath = part1;
  1234. switch (part2)
  1235. {
  1236. case ".":
  1237. break;
  1238. case "..":
  1239. if (part1.EndsWith(@"\") && part1.Length > 5)
  1240. part1 = part1.Substring(0, part1.Length - 3);
  1241. int iLastFolderPos = part1.LastIndexOf(@"\");
  1242. if (iLastFolderPos >= 0)
  1243. sFullPath = part1.Substring(0, iLastFolderPos + 1);
  1244. break;
  1245. default:
  1246. if (part1.EndsWith(@"\"))
  1247. sFullPath = part1 + part2;
  1248. else
  1249. sFullPath = part1 + @"\" + part2;
  1250. break;
  1251. }
  1252. return sFullPath;
  1253. }
  1254. }
  1255. }