TaskService.cs 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437
  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. responseData.result = false;
  522. Log.Instance.WriteLogAdd("UploadFile_error:" + JsonConvert.SerializeObject(data),
  523. EnumHelper.GetEnumDescription<WcsActionType>(FANUC));
  524. }
  525. }
  526. return responseData;
  527. }
  528. catch (Exception ex)
  529. {
  530. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(data),
  531. EnumHelper.GetEnumDescription<WcsActionType>(FANUC));
  532. responseData.IsSuccess = false;
  533. responseData.Msg = ex.Message;
  534. return responseData;
  535. }
  536. }
  537. public ResponseData opcua(RequestBody opcBody)
  538. {
  539. ResponseData responseBody = new ResponseData();
  540. Server opcServer = null;
  541. try
  542. {
  543. // 从map中取出opcServer 判断是否存在,以及是否可用
  544. opcServerMap.TryGetValue(opcBody.ServerUrl, out opcServer);
  545. // 如果key不存在,或者存在单连接不上,则需要重新创建连接
  546. if (!opcServerMap.ContainsKey(opcBody.ServerUrl) || !opcServer.Session.Connected)
  547. {
  548. Ping pingSender = new Ping();
  549. PingReply reply = pingSender.Send(opcBody.Ip);
  550. if (reply.Status == IPStatus.Success)
  551. {
  552. opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
  553. }
  554. if (opcServer != null && opcServer.Session != null && opcServer.Session.Connected)
  555. {
  556. // 存储Server bean
  557. opcServerMap.Add(opcBody.ServerUrl, opcServer);
  558. }
  559. }
  560. if (opcServer != null && opcServer.Session != null && opcServer.Session.Connected)
  561. {
  562. if (opcBody.Type == ActionTypeEnum.Connect.ToString()) //连接状态
  563. {
  564. responseBody.result = true;
  565. }
  566. else if (opcBody.Type == ActionTypeEnum.Collect.ToString()) //采集
  567. {
  568. //ETH_S7Simens s7 = new ETH_S7Simens("192.168.11.164");
  569. //responseBody.runDatasInfo = JsonConvert.SerializeObject(s7.deviceInfo);
  570. if (opcBody.check == null)
  571. {
  572. // 封装需要采集字段的数据
  573. //this.addAddress(opcBody);
  574. }
  575. else
  576. {
  577. opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.6");//千机质检结果
  578. }
  579. List<string> values = opcServer.ReadValues(opcBody.Addresses);
  580. responseBody.values = values;
  581. /*RunDatasInfo runDatasInfo = new RunDatasInfo();
  582. for (int i = 0; i < values.Count; i++)
  583. {
  584. if (i == 0)
  585. {
  586. runDatasInfo.feedRate = values[i];
  587. }
  588. else if (i == 1)
  589. {
  590. runDatasInfo.spindleMagnification = values[i];
  591. }
  592. else if (i == 2)
  593. {
  594. runDatasInfo.spindleSpeed = values[i];
  595. }
  596. else if (i == 3)
  597. {
  598. runDatasInfo.spindleLoad = values[i];
  599. }
  600. else if (i == 4)
  601. {
  602. runDatasInfo.mainPro = values[i];
  603. }
  604. else if (i == 5)
  605. {
  606. runDatasInfo.content = values[i];
  607. }
  608. }
  609. responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);*/
  610. /*//报警
  611. SinumerikOpcUaAPI.FilterDefinition m_filter = new SinumerikOpcUaAPI.FilterDefinition();
  612. m_filter.AreaId = new NodeId("Sinumerik", (ushort)2);
  613. m_filter.Severity = EventSeverity.Min;
  614. m_filter.IgnoreSuppressedOrShelved = true;
  615. m_filter.EventTypes = (IList<NodeId>)new NodeId[1]
  616. {
  617. ObjectTypeIds.ConditionType
  618. };
  619. m_filter.SelectClauses = m_filter.ConstructSelectClauses(opcServer.Session, ObjectTypeIds.ConditionType);
  620. for (int index = 0; index < m_filter.SelectClauses.Count<SimpleAttributeOperand>(); ++index)
  621. {
  622. responseBody.errorsInfo += m_filter.SelectClauses[index].ToString() + (object)index + " ";
  623. }*/
  624. }
  625. else if (opcBody.Type == ActionTypeEnum.ToolList.ToString())
  626. {
  627. List<string> nums = this.readVariables(opcServer, new string[1]
  628. {
  629. "/Tool/Catalogue/numTools[u<Area index>]".Replace("<Area index>", this.currentToolArea.ToString())
  630. }
  631. );
  632. int num = int.Parse(nums[0]);
  633. List<ToolsInfo> toolInfoList = new List<ToolsInfo>();
  634. for (int index = 1; index <= num; index++)
  635. {
  636. try
  637. {
  638. List<string> stringList = this.readVariables(opcServer, new string[10]
  639. {
  640. "/Tool/Catalogue/toolNo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  641. "/Tool/Catalogue/toolIdent[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  642. "/Tool/Catalogue/toolInMag[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  643. "/Tool/Catalogue/toolInPlace[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  644. "/Tool/Catalogue/nrDuplo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  645. "/Tool/Catalogue/numCuttEdges[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
  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>", "3"),
  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>", "6"),
  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>", "12"),
  649. "/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")
  650. }
  651. );
  652. ToolsInfo toolInfo = new ToolsInfo(); ;
  653. toolInfo.number = Convert.ToUInt16(stringList[0]) + "";
  654. toolInfo.name = stringList[1];
  655. toolInfo.length = stringList[6];
  656. toolInfo.radius = stringList[7];
  657. toolInfo.wearLength = stringList[8];
  658. toolInfo.wearRadius = stringList[9];
  659. //toolInfo.toolInMag = Convert.ToUInt16(stringList[2]);
  660. //toolInfo.toolInPlace = Convert.ToUInt16(stringList[3]);
  661. //toolInfo.nrDuplo = Convert.ToUInt16(stringList[4]);
  662. //toolInfo.numCuttEdges = Convert.ToUInt16(stringList[5]);
  663. toolInfoList.Add(toolInfo);
  664. }
  665. catch (Exception ex)
  666. {
  667. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(responseBody),
  668. EnumHelper.GetEnumDescription<WcsActionType>(OPCUA));
  669. }
  670. }
  671. responseBody.toolsInfo = JsonConvert.SerializeObject(toolInfoList);
  672. }
  673. /* else if (opcBody.Type == ActionTypeEnum.Read.ToString())
  674. {
  675. responseBody.values = opcServer.ReadValues(opcBody.Addresses);
  676. }
  677. else if (opcBody.Type == ActionTypeEnum.Write.ToString())
  678. {
  679. opcServer.WriteValues(opcBody.Values, opcBody.Addresses);
  680. }
  681. else if (opcBody.Type == ActionTypeEnum.SelectNc.ToString())
  682. {
  683. string sSelectedFileName = Path.GetFileName(opcBody.Path);
  684. string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + sSelectedFileName, Convert.ToUInt32(CHANNEL_NO)).status;
  685. if (status == "Good")
  686. {
  687. responseBody.msg = "选择成功";
  688. }
  689. else
  690. {
  691. responseBody.msg = "选择失败";
  692. }
  693. }
  694. else if (opcBody.Type == ActionTypeEnum.Upload.ToString())
  695. {
  696. string file = opcBody.Path;
  697. string serverPath = "";
  698. string status = "";
  699. //选择临时文件
  700. status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + TEMP_NC_NAME, Convert.ToUInt32(CHANNEL_NO)).status;
  701. try
  702. {
  703. string extension = Path.GetExtension(file);
  704. if (string.IsNullOrWhiteSpace(extension))
  705. {
  706. responseBody.msg = "文件名不合法";
  707. }
  708. try
  709. {
  710. byte[] data = opcServer.ReadFile(file);
  711. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  712. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  713. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  714. {
  715. responseBody.msg = "上传文件成功";
  716. YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
  717. }
  718. else
  719. {
  720. responseBody.msg = "上传文件失败";
  721. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  722. }
  723. // }
  724. }
  725. catch (Exception ex)
  726. {
  727. responseBody.msg = "上传文件失败===>" + ex.Message;
  728. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  729. }
  730. }
  731. catch (Exception ex)
  732. {
  733. responseBody.msg = "上传文件失败===>" + ex.Message;
  734. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  735. }
  736. //设位主程序
  737. status = opcServer.MethodCallSelectProgram(serverPath, Convert.ToUInt32(CHANNEL_NO)).status;
  738. }*/
  739. else if (opcBody.Type == ActionTypeEnum.UploadFileList.ToString())
  740. {
  741. for (int i = 0; i < opcBody.subFileList.Count; i++)
  742. {
  743. string file = opcBody.subFileList[i];
  744. string serverPath = "";
  745. try
  746. {
  747. string extension = Path.GetExtension(file);
  748. if (string.IsNullOrWhiteSpace(extension))
  749. {
  750. responseBody.result = false;
  751. responseBody.Msg = file + "==文件名不合法";
  752. break;
  753. }
  754. try
  755. {
  756. byte[] data = opcServer.ReadFile(file);
  757. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  758. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  759. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  760. {
  761. responseBody.Msg = "上传文件成功";
  762. }
  763. else
  764. {
  765. responseBody.Msg = "上传文件失败";
  766. responseBody.result = false;
  767. break;
  768. }
  769. }
  770. catch (Exception ex)
  771. {
  772. responseBody.Msg = "上传文件失败===>" + ex.Message;
  773. break;
  774. }
  775. }
  776. catch (Exception ex)
  777. {
  778. responseBody.Msg = "上传文件失败===>" + ex.Message;
  779. responseBody.result = false;
  780. }
  781. }
  782. //设为主程序
  783. string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + opcBody.prgName, Convert.ToUInt32(1)).status;
  784. if (status != "Good")
  785. {
  786. responseBody.Msg = "选择失败";
  787. responseBody.result = false;
  788. }
  789. /*for (int i = 0; i < opcBody.toolFileList.Count; i++)
  790. {
  791. string file = opcBody.toolFileList[i];
  792. string serverPath = "";
  793. try
  794. {
  795. string extension = Path.GetExtension(file);
  796. if (string.IsNullOrWhiteSpace(extension))
  797. {
  798. responseBody.result = false;
  799. responseBody.Msg = file + "==文件名不合法";
  800. break;
  801. }
  802. try
  803. {
  804. byte[] data = opcServer.ReadFile(file);
  805. serverPath = UPLOAD_TOOL_PATH + Path.GetFileName(file);
  806. Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);
  807. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  808. {
  809. YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件成功");
  810. }
  811. else
  812. {
  813. YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件失败");
  814. break;
  815. }
  816. }
  817. catch (Exception ex)
  818. {
  819. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  820. break;
  821. }
  822. }
  823. catch (Exception ex)
  824. {
  825. YG.Log.Instance.WriteLogAdd($"对刀仪493-->{ex.Message}");
  826. }
  827. }*/
  828. }
  829. /*else if (opcBody.Type == ActionTypeEnum.DownLoad.ToString())
  830. {
  831. string file = opcBody.Path;
  832. string serverPath = "";
  833. try
  834. {
  835. string extension = Path.GetExtension(file);
  836. if (string.IsNullOrWhiteSpace(extension))
  837. {
  838. responseBody.msg = "文件名不合法";
  839. }
  840. try
  841. {
  842. //byte[] data = opcServer.ReadFile(file);
  843. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  844. // Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileFromServer("/Methods/CopyFileFromServer", serverPath);
  845. //
  846. byte[] op = opcServer.ReadFile(serverPath);
  847. DiagnosticInfoCollection diagnosticInfos = null;
  848. CallMethodRequestCollection callMethodRequestCollection = new CallMethodRequestCollection();
  849. CallMethodResultCollection results = new CallMethodResultCollection();
  850. CallMethodRequest callMethodRequest = new CallMethodRequest();
  851. callMethodRequest.MethodId = new NodeId("/Methods/CopyFileFromServer", mNAMESPACE_INDEX);
  852. callMethodRequest.ObjectId = new NodeId("/Methods", mNAMESPACE_INDEX);
  853. callMethodRequest.InputArguments.Add(serverPath);
  854. //callMethodRequest.InputArguments.Add(data);
  855. callMethodRequestCollection.Add(callMethodRequest);
  856. RequestHeader requestHeader = new RequestHeader();
  857. ResponseHeader responseHeader = opcServer.Session.Call(null, callMethodRequestCollection, out results, out diagnosticInfos);
  858. Server.MethodCallResult methodCallResult = new MethodCallResult(results);
  859. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  860. {
  861. responseBody.msg = "上传文件成功";
  862. YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
  863. Variant result3 = methodCallResult.results;
  864. byte[] buff;
  865. using (MemoryStream ms = new MemoryStream())
  866. {
  867. IFormatter iFormatter = new BinaryFormatter();
  868. iFormatter.Serialize(ms, result3.Value);
  869. buff = ms.GetBuffer();
  870. }
  871. // 将byte[]写入文件
  872. File.WriteAllBytes(file, buff);
  873. // 读取文件内容到字符串
  874. string fileContent = File.ReadAllText(file);
  875. fileContent = fileContent.Trim();
  876. // 去除字符串中的空格
  877. //string trimmedContent = fileContent.Trim(); // 使用Trim去除字符串首尾的空格
  878. // 或者使用Replace去除所有空格
  879. string trimmedContent = fileContent.Replace(" ", "");
  880. // 将处理过的字符串写回文件
  881. File.WriteAllText(file, trimmedContent);
  882. string aa = result3.ToString();
  883. }
  884. else
  885. {
  886. responseBody.msg = "上传文件失败";
  887. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  888. }
  889. // }
  890. }
  891. catch (Exception ex)
  892. {
  893. responseBody.msg = "上传文件失败===>" + ex.Message;
  894. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  895. }
  896. }
  897. catch (Exception ex)
  898. {
  899. responseBody.msg = "上传文件失败===>" + ex.Message;
  900. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  901. }
  902. }
  903. else if (opcBody.Type == ActionTypeEnum.Delete.ToString())
  904. {
  905. string file = opcBody.Path;
  906. string serverPath = "";
  907. try
  908. {
  909. string extension = Path.GetExtension(file);
  910. if (string.IsNullOrWhiteSpace(extension))
  911. {
  912. responseBody.msg = "文件名不合法";
  913. }
  914. else
  915. {
  916. try
  917. {
  918. //byte[] data = opcServer.ReadFile(file);
  919. serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
  920. Server.MethodCallResult methodCallResult = opcServer.MethodCallDeleteFile(serverPath);
  921. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  922. {
  923. responseBody.msg = "删除文件成功";
  924. YG.Log.Instance.WriteLogAdd(file + "删除文件成功");
  925. }
  926. else
  927. {
  928. responseBody.msg = "上传文件失败";
  929. YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
  930. }
  931. // }
  932. }
  933. catch (Exception ex)
  934. {
  935. responseBody.msg = "上传文件失败===>" + ex.Message;
  936. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  937. }
  938. }
  939. }
  940. catch (Exception ex)
  941. {
  942. responseBody.msg = "上传文件失败===>" + ex.Message;
  943. YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
  944. }
  945. }
  946. else if (opcBody.Type == ActionTypeEnum.SynFile.ToString())
  947. {
  948. try
  949. {
  950. Server.MethodCallResult methodCallResult = opcServer.MethodCall("GetAllFiles", UPLOAD_NC_PATH);
  951. if (methodCallResult.status.ToUpper().Equals("GOOD"))
  952. {
  953. responseBody.msg = "同步文件成功";
  954. }
  955. else
  956. {
  957. responseBody.msg = "同步文件失败";
  958. }
  959. // }
  960. }
  961. catch (Exception ex)
  962. {
  963. responseBody.msg = "同步文件失败===>" + ex.Message;
  964. YG.Log.Instance.WriteLogAdd($"{ex.Message}");
  965. }
  966. }*/
  967. }
  968. else
  969. {
  970. responseBody.Code = 0;
  971. responseBody.Msg = "服务器离线,连不上opcUa";
  972. responseBody.result = false;
  973. }
  974. return responseBody;
  975. }
  976. catch (Exception ex)
  977. {
  978. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(responseBody),
  979. EnumHelper.GetEnumDescription<WcsActionType>(OPCUA));
  980. responseBody.result = false;
  981. responseBody.Msg = ex.Message;
  982. return responseBody;
  983. }
  984. }
  985. public ResponseData heidenhain(RequestBody hdhBody)
  986. {
  987. ResponseData responseBody = new ResponseData();
  988. try
  989. {
  990. if (hdhBody.Type == ActionTypeEnum.Connect.ToString())
  991. {
  992. Ping pingSender = new Ping();
  993. PingReply reply = pingSender.Send(hdhBody.ServerUrl);
  994. if (reply.Status != IPStatus.Success)
  995. {
  996. responseBody.result = false;
  997. }
  998. }
  999. else
  1000. {
  1001. //第一次连接加入数组,以支持多台设备
  1002. if (deviceList == null || (deviceList.Where(m => m.Key == hdhBody.MachineName).Count() == 0))
  1003. {
  1004. m_ControlState = connect(hdhBody.MachineName);
  1005. //DNC连接正常,加入数组
  1006. if (m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  1007. {
  1008. deviceList.Add(hdhBody.MachineName, m_ControlState);
  1009. }
  1010. Thread.Sleep(500);
  1011. }
  1012. else
  1013. {
  1014. //取设备对应的状态
  1015. m_ControlState = deviceList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  1016. }
  1017. JHMachineInProcess Machine = machineList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  1018. if (m_ControlState != null && m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  1019. {
  1020. JHError m_Error = (JHError)Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHERROR);
  1021. JHErrorEntry2List errorsList = m_Error.GetErrorList();
  1022. IJHErrorEntry2 pErrorEntry = null;
  1023. for (int i = 0; i < errorsList.Count; i++)
  1024. {
  1025. pErrorEntry = errorsList[i];
  1026. if (pErrorEntry != null && pErrorEntry.Text != null)
  1027. {
  1028. //Console.WriteLine("===" + pErrorEntry.Text.ToString());
  1029. responseBody.errorsInfo += pErrorEntry.Text.ToString() + " ";
  1030. }
  1031. }
  1032. /*if (hdhBody.Type == ActionTypeEnum.Collect.ToString())
  1033. {
  1034. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1035. JHProcessData m_ProcessData = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHPROCESSDATA);
  1036. object pFeed = new object();
  1037. object pSpeed = new object();
  1038. object pRapid = new object();
  1039. object proStatus = new object();
  1040. //进出倍率 主轴倍率
  1041. m_Automatic.GetOverrideInfo(ref pFeed, ref pSpeed, ref pRapid);
  1042. m_Automatic.GetExecutionMode();
  1043. DNC_STS_PROGRAM dncProgram = m_Automatic.GetProgramStatus();
  1044. RunDatasInfo runDatasInfo = new RunDatasInfo();
  1045. runDatasInfo.feedRate = pFeed.ToString();
  1046. runDatasInfo.spindleMagnification = pSpeed.ToString();
  1047. runDatasInfo.spindleSpeed = pRapid.ToString();
  1048. responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);
  1049. object oHours = new object();
  1050. object oMinutes = new object();
  1051. // --- NC uptime --------------------------------------------------------------------------
  1052. m_ProcessData.GetNcUpTime(ref oHours, ref oMinutes);
  1053. string ncUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1054. // --- Machine uptime ---------------------------------------------------------------------
  1055. m_ProcessData.GetMachineUpTime(ref oHours, ref oMinutes);
  1056. string machineUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1057. // --- Machine running time ---------------------------------------------------------------
  1058. m_ProcessData.GetMachineRunningTime(ref oHours, ref oMinutes);
  1059. string runningTimes = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  1060. }
  1061. else */
  1062. if (hdhBody.Type == ActionTypeEnum.Upload.ToString())
  1063. {
  1064. JHFileSystem m_FileSystem = (JHFileSystem)Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  1065. JHAutomatic m_Automatic = (JHAutomatic)Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1066. string sSelectedFile = Path.GetFileName(hdhBody.Path);
  1067. string dncPath = GenPath(RemotePath, sSelectedFile);
  1068. string tempDncPath = RemotePath + "\\2.h";
  1069. //设置临时程序为主程序
  1070. m_Automatic.SelectProgram(iChannel, tempDncPath);
  1071. try
  1072. { //删除上传文件,try异常防止文件不存在
  1073. //m_FileSystem.DeleteFile(dncPath);
  1074. }
  1075. catch (Exception edel)
  1076. {
  1077. }
  1078. //上传
  1079. m_FileSystem.TransmitFile(hdhBody.Path, dncPath);
  1080. //设当前上传程序为主程序
  1081. m_Automatic.SelectProgram(iChannel, dncPath);
  1082. }
  1083. /*else if (hdhBody.Type == ActionTypeEnum.DeleteNc.ToString())
  1084. {
  1085. JHFileSystem m_FileSystem = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  1086. string dncPath = GenPath(RemotePath, hdhBody.Path);
  1087. m_FileSystem.DeleteFile(dncPath);
  1088. }
  1089. else if (hdhBody.Type == ActionTypeEnum.SelectNcProgram.ToString())//选中程序
  1090. {
  1091. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1092. string dncPath = GenPath(RemotePath, hdhBody.Path);
  1093. m_Automatic.SelectProgram(iChannel, dncPath);
  1094. }
  1095. else if (hdhBody.Type == ActionTypeEnum.StartNcProgram.ToString())//启动程序备用
  1096. {
  1097. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  1098. //m_Automatic.SelectProgram(iChannel, GenPath(RemotePath, hdhBody.Path));
  1099. //Thread.Sleep(1000);
  1100. m_Automatic.StartProgram(GenPath(RemotePath, hdhBody.Path));
  1101. }
  1102. else if (hdhBody.Type == ActionTypeEnum.Read.ToString())
  1103. {
  1104. }
  1105. else if (hdhBody.Type == ActionTypeEnum.Write.ToString())
  1106. {
  1107. }
  1108. else if (hdhBody.Type == ActionTypeEnum.ToolList.ToString())
  1109. {
  1110. IJHDataEntry2 ToolLine = null;
  1111. IJHDataEntry2List ToolCells = null;
  1112. //IJHDataEntry2 ToolCell = null;
  1113. List<ToolsInfo> toolsList = new List<ToolsInfo>();
  1114. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  1115. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  1116. //string ToolColumnNamesAccessor = @"\TABLE\TOOL\T\('1'-'50')"; // see Init()
  1117. string ToolColumnNamesAccessor = @"\TABLE\TOOL_P\T\('1'-'50')";
  1118. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  1119. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  1120. int ToolLinesCount = ToolLines.Count >= 50 ? 50 : ToolLines.Count;
  1121. //int ToolLinesCount = ToolLines.Count;
  1122. for (int i = 0; i < ToolLinesCount; i++)
  1123. {
  1124. ToolLine = ToolLines[i];
  1125. ToolCells = ToolLine.GetChildList();
  1126. // get child list from server
  1127. ToolsInfo toolsInfo = new ToolsInfo();
  1128. //刀位编码
  1129. int[] pCode = ToolCells[0].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  1130. toolsInfo.position = string.Join(".", pCode);
  1131. toolsInfo.number = ToolCells[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1132. toolsInfo.name = ToolCells[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1133. if (!String.IsNullOrEmpty(toolsInfo.name) && !String.IsNullOrEmpty(toolsInfo.number) && pCode.Length > 0 && pCode[1] > 0)
  1134. {
  1135. string ToolNumberAccessor = @"\TABLE\TOOL\T\" + toolsInfo.number.ToString();
  1136. IJHDataEntry2List ToolList = dataAccess.GetDataEntry2(ToolNumberAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false).GetChildList();
  1137. //报警期限
  1138. toolsInfo.warnLife = ToolList[10].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1139. //刀具寿命目标值
  1140. toolsInfo.targetLife = ToolList[11].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1141. //Cur_Time使用时间
  1142. toolsInfo.curTime = ToolList[12].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  1143. toolsList.Add(toolsInfo);
  1144. }
  1145. }
  1146. //获取海德汉的刀具寿命信息
  1147. responseBody.toolsInfo = JsonConvert.SerializeObject(toolsList.Distinct().ToList());
  1148. }
  1149. }
  1150. else
  1151. {
  1152. responseBody.msg = m_ControlState.ToString();
  1153. responseBody.result = false;
  1154. deviceList.Remove(hdhBody.MachineName);
  1155. }*/
  1156. }
  1157. }
  1158. }
  1159. catch (Exception ex)
  1160. {
  1161. Log.Instance.WriteLogAdd("异常===>>" + ex + JsonConvert.SerializeObject(hdhBody),
  1162. EnumHelper.GetEnumDescription<WcsActionType>(HEIDENHAIN));
  1163. responseBody.IsSuccess = false;
  1164. responseBody.Msg = ex.Message;
  1165. return responseBody;
  1166. }
  1167. return responseBody;
  1168. }
  1169. private List<string> readVariables(Server server, string[] variables)
  1170. {
  1171. List<string> nodeIdStrings = new List<string>();
  1172. foreach (string variable in variables)
  1173. {
  1174. NodeId nodeId = new NodeId(variable, (ushort)2);
  1175. nodeIdStrings.Add(nodeId.ToString());
  1176. }
  1177. return server.ReadValues(nodeIdStrings);
  1178. }
  1179. private DNC_STATE connect(string connectName)
  1180. {
  1181. DNC_CNC_TYPE CncType;
  1182. IJHConnectionList connectionList = null;
  1183. IJHConnection connection = null;
  1184. try
  1185. {
  1186. JHMachineInProcess Machine = null;
  1187. //第一次连接加入数组,以支持多台设备
  1188. if (machineList == null || (machineList.Where(m => m.Key == connectName).Count() == 0))
  1189. {
  1190. Machine = new JHMachineInProcess();
  1191. //DNC连接正常,加入数组
  1192. machineList.Add(connectName, Machine);
  1193. Thread.Sleep(20);
  1194. }
  1195. else
  1196. {
  1197. //取对应设备
  1198. Machine = machineList.Where(m => m.Key == connectName).FirstOrDefault().Value;
  1199. }
  1200. Machine.ConnectRequest(connectName);
  1201. string sCurrentMachine = Machine.currentMachine;
  1202. // Find out control type
  1203. connectionList = Machine.ListConnections();
  1204. for (int i = 0; i < connectionList.Count; i++)
  1205. {
  1206. connection = connectionList[i];
  1207. if (connection.name == sCurrentMachine)
  1208. {
  1209. CncType = connection.cncType;
  1210. }
  1211. if (connection != null)
  1212. Marshal.ReleaseComObject(connection);
  1213. }
  1214. return Machine.GetState();
  1215. }
  1216. catch (COMException cex)
  1217. {
  1218. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  1219. }
  1220. catch (Exception ex)
  1221. {
  1222. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  1223. }
  1224. finally
  1225. {
  1226. if (connectionList != null)
  1227. Marshal.ReleaseComObject(connectionList);
  1228. if (connection != null)
  1229. Marshal.ReleaseComObject(connection);
  1230. }
  1231. }
  1232. private string GenPath(string part1, string part2)
  1233. {
  1234. string sFullPath = part1;
  1235. switch (part2)
  1236. {
  1237. case ".":
  1238. break;
  1239. case "..":
  1240. if (part1.EndsWith(@"\") && part1.Length > 5)
  1241. part1 = part1.Substring(0, part1.Length - 3);
  1242. int iLastFolderPos = part1.LastIndexOf(@"\");
  1243. if (iLastFolderPos >= 0)
  1244. sFullPath = part1.Substring(0, iLastFolderPos + 1);
  1245. break;
  1246. default:
  1247. if (part1.EndsWith(@"\"))
  1248. sFullPath = part1 + part2;
  1249. else
  1250. sFullPath = part1 + @"\" + part2;
  1251. break;
  1252. }
  1253. return sFullPath;
  1254. }
  1255. }
  1256. }