Form1.cs 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. using HeidenhainDNCLib;
  2. using IMCS.HeidenHain;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Runtime.InteropServices;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. using System.Windows.Forms;
  17. using HEIDENHAIN.body;
  18. using System.Net.NetworkInformation;
  19. using System.Diagnostics.PerformanceData;
  20. using Newtonsoft.Json.Linq;
  21. using System.Reflection;
  22. using System.Security.Cryptography;
  23. namespace HEIDENHAIN
  24. {
  25. public partial class Form1 : Form
  26. {
  27. private int iChannel = 0;
  28. //private string RemotePath = "TNC:\\nc_prog\\ATUO";//ConfigurationManager.AppSettings["RemotePath"];
  29. private string RemotePath = "TNC:\\SMG80SKCX";//ConfigurationManager.AppSettings["RemotePath"];
  30. //连接设备列表
  31. public Dictionary<string, DNC_STATE> deviceList { get; set; } = new Dictionary<string, DNC_STATE>();
  32. private DNC_STATE m_ControlState;
  33. public Dictionary<string, JHMachineInProcess> machineList { get; set; } = new Dictionary<string, JHMachineInProcess>();
  34. //private JHMachineInProcess Machine = new JHMachineInProcess();
  35. // private JHAutomatic m_Automatic = null;
  36. // private JHFileSystem m_FileSystem = null;
  37. //private JHProcessData m_ProcessData = null;
  38. //private JHError m_Error = null;
  39. string Http_Request_Url = "http://127.0.0.1:8011/heidenhain/";
  40. bool _contine = true;//用于线程循环
  41. private AutoResetEvent autoConnectEvent = new AutoResetEvent(false);//此处需要调用System.Threading;用于触发等待的线程已发生的事件(连接)
  42. public delegate void RecvAndSendHandler(HttpListenerContext s);//此处需要调用System.Net用于请求和响应HttpListener类
  43. public event RecvAndSendHandler RecvAndSend;
  44. AsyncCallback callback;
  45. HttpListenerContext context = null;
  46. public Form1()
  47. {
  48. InitializeComponent();
  49. }
  50. private void Form1_Load(object sender, EventArgs e)
  51. {
  52. this.RecvAndSend += new RecvAndSendHandler(HttpListen_RecvAndSend);
  53. #region 添加监听的信息线程添加到线程池
  54. WaitCallback wc = new WaitCallback(http_Listen);
  55. ThreadPool.QueueUserWorkItem(wc);
  56. label1.Text = "HttpServer已开启:" + Http_Request_Url;
  57. #endregion
  58. }
  59. /// <summary>
  60. /// 监听的线程
  61. /// </summary>
  62. /// <param name="ob"></param>
  63. private void http_Listen(object ob)
  64. {
  65. callback = new AsyncCallback(acceptCallback);
  66. HttpListener httpListenner;
  67. httpListenner = new HttpListener();
  68. httpListenner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  69. httpListenner.Prefixes.Add(Http_Request_Url);
  70. httpListenner.Start();
  71. while (_contine)
  72. {
  73. try
  74. {
  75. httpListenner.BeginGetContext(callback, httpListenner);
  76. autoConnectEvent.WaitOne();
  77. }
  78. catch (Exception)
  79. {
  80. }
  81. Thread.Sleep(10);
  82. }
  83. }
  84. /// <summary>
  85. /// 回调函数
  86. /// </summary>
  87. /// <param name="ar"></param>
  88. private void acceptCallback(IAsyncResult ar)
  89. {
  90. try
  91. {
  92. context = ((HttpListener)ar.AsyncState).EndGetContext(ar);
  93. }
  94. catch (Exception)
  95. {
  96. autoConnectEvent.Set();
  97. }
  98. if (context != null)
  99. {
  100. RecvAndSend(context);//触发我们一开始声明的事件
  101. autoConnectEvent.Set();
  102. }
  103. }
  104. /// <summary>
  105. /// 接听到消息的方法
  106. /// </summary>
  107. /// <param name="cont"></param>
  108. private void HttpListen_RecvAndSend(HttpListenerContext cont)
  109. {
  110. HttpListenerRequest request = cont.Request;
  111. HttpListenerResponse response = context.Response;
  112. Servlet servlet = new MyServlet();
  113. servlet.onCreate();
  114. if (request.HttpMethod == "POST")
  115. {
  116. if (!request.Url.ToString().Contains("favicon"))
  117. {
  118. ResponseBody responseBody = new ResponseBody();
  119. string body = null;
  120. RequestBody hdhBody =null;
  121. // 给机床写入数据的时候,判断写入到第几个
  122. String writePar = "";
  123. try
  124. {
  125. Stream stream = context.Request.InputStream;
  126. StreamReader reader = new StreamReader(stream, Encoding.UTF8);
  127. body = reader.ReadToEnd();
  128. //YG.Log.Instance.WriteLogAdd(">>>===收到POST数据 : >>>>===" + body);
  129. hdhBody = JsonConvert.DeserializeObject<RequestBody>(body);
  130. AddList(DateTime.Now.ToString(), "POST", hdhBody.ServerUrl + ":设备:" + hdhBody.MachineName, "OK:数据接受");
  131. if (hdhBody.Type == ActionTypeEnum.Connect.ToString())
  132. {
  133. Ping pingSender = new Ping();
  134. PingReply reply = pingSender.Send(hdhBody.ServerUrl);
  135. if (reply.Status != IPStatus.Success)
  136. {
  137. responseBody.result = false;
  138. }
  139. }
  140. else
  141. {
  142. //第一次连接加入数组,以支持多台设备
  143. if (deviceList == null || (deviceList.Where(m => m.Key == hdhBody.MachineName).Count() == 0))
  144. {
  145. m_ControlState = connect(hdhBody.MachineName);
  146. //DNC连接正常,加入数组
  147. if (m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  148. {
  149. deviceList.Add(hdhBody.MachineName, m_ControlState);
  150. }
  151. Thread.Sleep(500);
  152. }
  153. else
  154. {
  155. //取设备对应的状态
  156. m_ControlState = deviceList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  157. }
  158. // ping 不通则位离线状态
  159. Ping pingSender = new Ping();
  160. PingReply reply = pingSender.Send(hdhBody.ServerUrl,500);
  161. if (reply.Status != IPStatus.Success)
  162. {
  163. m_ControlState = DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  164. }
  165. if (m_ControlState != null && m_ControlState.ToString() == "DNC_STATE_MACHINE_IS_AVAILABLE")
  166. {
  167. JHMachineInProcess Machine = machineList.Where(m => m.Key == hdhBody.MachineName).FirstOrDefault().Value;
  168. JHError m_Error = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHERROR);
  169. JHErrorEntry2List errorsList = m_Error.GetErrorList();
  170. IJHErrorEntry2 pErrorEntry = null;
  171. for (int i = 0; i < errorsList.Count; i++)
  172. {
  173. pErrorEntry = errorsList[i];
  174. if (pErrorEntry != null && pErrorEntry.Text != null)
  175. {
  176. //Console.WriteLine("===" + pErrorEntry.Text.ToString());
  177. responseBody.errorsInfo += pErrorEntry.Text.ToString() + " ";
  178. }
  179. }
  180. if (hdhBody.Type == ActionTypeEnum.Collect.ToString())
  181. {
  182. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  183. JHProcessData m_ProcessData = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHPROCESSDATA);
  184. object pFeed = new object();
  185. object pSpeed = new object();
  186. object pRapid = new object();
  187. object proStatus = new object();
  188. //进出倍率 主轴倍率
  189. m_Automatic.GetOverrideInfo(ref pFeed, ref pSpeed, ref pRapid);
  190. m_Automatic.GetExecutionMode();
  191. DNC_STS_PROGRAM dncProgram = m_Automatic.GetProgramStatus();
  192. RunDatasInfo runDatasInfo = new RunDatasInfo();
  193. runDatasInfo.feedRate = pFeed.ToString();
  194. runDatasInfo.spindleMagnification = pSpeed.ToString();
  195. runDatasInfo.spindleSpeed = pRapid.ToString();
  196. responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);
  197. object oHours = new object();
  198. object oMinutes = new object();
  199. // --- NC uptime --------------------------------------------------------------------------
  200. m_ProcessData.GetNcUpTime(ref oHours, ref oMinutes);
  201. string ncUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  202. // --- Machine uptime ---------------------------------------------------------------------
  203. m_ProcessData.GetMachineUpTime(ref oHours, ref oMinutes);
  204. string machineUpTime = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  205. // --- Machine running time ---------------------------------------------------------------
  206. m_ProcessData.GetMachineRunningTime(ref oHours, ref oMinutes);
  207. string runningTimes = oHours.ToString() + ":" + (Convert.ToInt32(oMinutes) > 9 ? oMinutes.ToString() : ("0" + oMinutes.ToString()));
  208. }
  209. else if (hdhBody.Type == ActionTypeEnum.Upload.ToString())
  210. {
  211. JHFileSystem m_FileSystem = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  212. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  213. string sSelectedFile = Path.GetFileName(hdhBody.Path);
  214. string dncPath = null;
  215. string tempDncPath = RemotePath + "\\2.h";
  216. //防止地址内容累加
  217. string newRemotePath = null;
  218. if (hdhBody.Address != "")
  219. {
  220. newRemotePath = RemotePath + "\\" + hdhBody.Address;
  221. }
  222. //上传
  223. dncPath = GenPath(RemotePath, sSelectedFile);
  224. //设置临时程序为主程序
  225. m_Automatic.SelectProgram(iChannel, tempDncPath);
  226. try
  227. { //删除上传文件,try异常防止文件不存在
  228. //m_FileSystem.DeleteFile(dncPath);
  229. }
  230. catch (Exception edel)
  231. {
  232. }
  233. YG.Log.Instance.WriteLogAdd($"海德汉nc上传位置--->>" + dncPath, "海德汉nc上传");
  234. //上传
  235. m_FileSystem.TransmitFile(hdhBody.Path, dncPath);
  236. //设当前上传程序为主程序
  237. m_Automatic.SelectProgram(iChannel, dncPath);
  238. }
  239. else if (hdhBody.Type == ActionTypeEnum.DeleteNc.ToString())
  240. {
  241. JHFileSystem m_FileSystem = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  242. string dncPath = GenPath(RemotePath, hdhBody.Path);
  243. m_FileSystem.DeleteFile(dncPath);
  244. }
  245. else if (hdhBody.Type == ActionTypeEnum.SelectNcProgram.ToString())//选中程序
  246. {
  247. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  248. string dncPath = GenPath(RemotePath, hdhBody.Path);
  249. YG.Log.Instance.WriteLogAdd($"海德汉设置nc--->>" + dncPath, "海德汉机床nc设置");
  250. m_Automatic.SelectProgram(iChannel, dncPath);
  251. }
  252. else if (hdhBody.Type == ActionTypeEnum.StartNcProgram.ToString())//启动程序备用
  253. {
  254. JHAutomatic m_Automatic = Machine.GetInterface(DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  255. //m_Automatic.SelectProgram(iChannel, GenPath(RemotePath, hdhBody.Path));
  256. //Thread.Sleep(1000);
  257. string sSelectedFile = Path.GetFileName(hdhBody.Path);
  258. string bstrProgramName = GenPath(RemotePath, sSelectedFile);
  259. YG.Log.Instance.WriteLogAdd($"海德汉执行启动--->>" + bstrProgramName, "海德汉机床启动");
  260. m_Automatic.StartProgram(bstrProgramName);
  261. }
  262. else if (hdhBody.Type == ActionTypeEnum.Read.ToString())
  263. {
  264. }
  265. else if (hdhBody.Type == ActionTypeEnum.Write.ToString())
  266. {
  267. }
  268. else if (hdhBody.Type == ActionTypeEnum.ToolList.ToString())
  269. {
  270. IJHDataEntry2 ToolLine = null;
  271. IJHDataEntry2List ToolCells = null;
  272. //IJHDataEntry2 ToolCell = null;
  273. List<ToolsInfo> toolsList = new List<ToolsInfo>();
  274. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  275. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  276. //string ToolColumnNamesAccessor = @"\TABLE\TOOL\T\('1'-'50')"; // see Init()
  277. string ToolColumnNamesAccessor = @"\TABLE\TOOL_P\P\('1.1'-'1.50')";
  278. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  279. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  280. int ToolLinesCount = ToolLines.Count >= 50 ? 50 : ToolLines.Count;
  281. //int ToolLinesCount = ToolLines.Count;
  282. for (int i = 0; i < ToolLinesCount; i++)
  283. {
  284. ToolLine = ToolLines[i];
  285. ToolCells = ToolLine.GetChildList();
  286. // get child list from server
  287. ToolsInfo toolsInfo = new ToolsInfo();
  288. //刀位编码
  289. int[] pCode = ToolCells[0].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  290. toolsInfo.position = string.Join(".", pCode);
  291. toolsInfo.number = ToolCells[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  292. toolsInfo.name = ToolCells[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  293. if (!String.IsNullOrEmpty(toolsInfo.name) && !String.IsNullOrEmpty(toolsInfo.number) && pCode.Length > 0 && pCode[1] > 0)
  294. {
  295. string ToolNumberAccessor = @"\TABLE\TOOL\T\" + toolsInfo.number.ToString();
  296. IJHDataEntry2List ToolList = dataAccess.GetDataEntry2(ToolNumberAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false).GetChildList();
  297. //报警期限
  298. toolsInfo.warnLife = ToolList[11].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  299. //刀具寿命目标值
  300. toolsInfo.targetLife = ToolList[12].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  301. //Cur_Time使用时间
  302. toolsInfo.curTime = ToolList[13].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  303. // 刀具锁定状态,
  304. toolsInfo.tl = ToolList[8].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  305. // 刀具使用完毕此刀位可以换刀,
  306. toolsInfo.doc = ToolList[14].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  307. toolsList.Add(toolsInfo);
  308. }
  309. }
  310. //获取海德汉的刀具寿命信息
  311. responseBody.toolsInfo = JsonConvert.SerializeObject(toolsList.Distinct().ToList());
  312. }
  313. else if (hdhBody.Type == ActionTypeEnum.ReadAndWriteTool.ToString())
  314. {
  315. //机外对刀仪数据
  316. JObject jsonObject = JObject.Parse(hdhBody.CutterData);
  317. // 返回的结果,数据
  318. var returnData = new Dictionary<string, object>();
  319. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  320. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  321. /*刀具表数据修改*/
  322. //刀具表查询语句
  323. writePar = "刀具表写入开始";
  324. string ToolColumnNamesAccessor = @"\TABLE\TOOL\T\" + jsonObject.GetValue("cutterT");
  325. //刀具表数据
  326. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  327. // 获取字段列表
  328. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  329. // 换刀标识移除
  330. returnData.Add("doc", "");
  331. writePar = "doc";
  332. ToolLines[14].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, "", false);
  333. //设置刀具名-对应机床表name
  334. var data1 = ToolLines[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  335. returnData.Add("cutterName", data1);
  336. writePar = "cutterName";
  337. ToolLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterName", out JToken cutterName) ? jsonObject.GetValue("cutterName") : "", false);
  338. //刀具类型 - 对应机床TYP
  339. var data2 = ToolLines[13].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  340. returnData.Add("cutterTypDnc", data2);
  341. writePar = "cutterTypDnc";
  342. ToolLines[13].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterTypDnc", out JToken cutterTypDnc) ? jsonObject.GetValue("cutterTypDnc") : "0", false);
  343. //刀具长度 - 对应机床 L
  344. var data3 = ToolLines[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  345. returnData.Add("cutterZl", data3);
  346. writePar = "cutterZl";
  347. ToolLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterZl", out JToken cutterZl) ? jsonObject.GetValue("cutterZl") : "0", false);
  348. //刀具半径 - 对应机床R
  349. var data4 = ToolLines[3].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  350. returnData.Add("cutterXl", data4);
  351. writePar = "cutterXl";
  352. ToolLines[3].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterXl", out JToken cutterXl) ? jsonObject.GetValue("cutterXl") : "0", false);
  353. //刀具寿命 - 对应机床time1
  354. var data5 = ToolLines[10].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  355. returnData.Add("cutterTime1", data5);
  356. writePar = "cutterTime1";
  357. ToolLines[10].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterTime1", out JToken cutterTime1) ? jsonObject.GetValue("cutterTime1") : "0", false);
  358. //刀具寿命 - 对应机床time2
  359. var data6 = ToolLines[11].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  360. returnData.Add("cutterTime2", data6);
  361. writePar = "cutterTime2";
  362. ToolLines[11].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterTime2", out JToken cutterTime2) ? jsonObject.GetValue("cutterTime2") : "0", false);
  363. //PLC状态 - 对应机床
  364. var data7 = ToolLines[15].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  365. returnData.Add("cutterPlcBit", data7);
  366. writePar = "cutterPlcBit";
  367. ToolLines[15].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterPlcBit", out JToken cutterPlcBit) ? jsonObject.GetValue("cutterPlcBit") : "0", false);
  368. //刀具使用寿命,不允许超过该值 -- 对应机床
  369. var data8 = ToolLines[45].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  370. returnData.Add("cutterOverTime", data8);
  371. writePar = "cutterOverTime";
  372. ToolLines[45].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterOverTime", out JToken cutterOverTime) ? jsonObject.GetValue("cutterOverTime") : "0", false);
  373. //在刀具轴方向上的刀齿长
  374. var data9 = ToolLines[16].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  375. returnData.Add("lcuts", data9);
  376. writePar = "lcuts";
  377. ToolLines[16].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("lcuts", out JToken lcuts) ? jsonObject.GetValue("lcuts") : "0", false);
  378. //准确定义刀具的切削刃正面宽度
  379. var data10 = ToolLines[46].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  380. returnData.Add("rcuts", data10);
  381. writePar = "rcuts";
  382. ToolLines[46].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("rcuts", out JToken rcuts) ? jsonObject.GetValue("rcuts") : "0", false);
  383. //准确定义刀具的刀具可用长度
  384. var data11 = ToolLines[17].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  385. returnData.Add("lu", data11);
  386. writePar = "lu";
  387. ToolLines[17].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("lu", out JToken lu) ? jsonObject.GetValue("lu") : "0", false);
  388. //准确定义刀具的刀颈半径
  389. var data12 = ToolLines[18].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  390. returnData.Add("rn", data12);
  391. writePar = "rn";
  392. ToolLines[18].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("rn", out JToken rn) ? jsonObject.GetValue("rn") : "0", false);
  393. //最大的切入角度
  394. var data13 = ToolLines[19].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  395. returnData.Add("angle", data13);
  396. writePar = "angle";
  397. ToolLines[19].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("angle", out JToken angle) ? jsonObject.GetValue("angle") : "0", false);
  398. var data14 = ToolLines[31].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  399. returnData.Add("nmax", data14);
  400. writePar = "nmax";
  401. ToolLines[31].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("nmax", out JToken nmax) ? jsonObject.GetValue("nmax") : "0", false);
  402. // 如果没有子车刀类型,不需要往车刀表添加
  403. if (!string.IsNullOrEmpty(jsonObject.GetValue("cutterTypSubDnc").ToString())
  404. && jsonObject.TryGetValue("cutterTypSubDnc", out JToken value) && value != null)
  405. {
  406. writePar = "车刀表写入开始";
  407. /*车刀表数据设置更新*/
  408. // 车刀表数据查询语句
  409. string CheDaoColumnNamesAccessor = @"\TABLE\TOOLTURN\T\" + jsonObject.GetValue("cutterT");
  410. // 查询表数据
  411. IJHDataEntry2 CheDaoTable = dataAccess.GetDataEntry2(CheDaoColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  412. // 获取字段列表
  413. IJHDataEntry2List CheDaoLines = CheDaoTable.GetChildList();
  414. // 设置刀具名-对应机床表name
  415. CheDaoLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterName", out JToken cutterName_cd) ? jsonObject.GetValue("cutterName") : "", false);
  416. // 设置刀具在Z轴方向上的长度 - 对应机床 ZL
  417. var cdData1 = CheDaoLines[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  418. returnData["cutterZl"] = cdData1;
  419. writePar = "cutterZl";
  420. CheDaoLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterZl", out JToken cutterZl_cd) ? jsonObject.GetValue("cutterZl") : "0", false);
  421. // 车刀在X轴方向上的长度 - 对应机床XL
  422. var cdData2 = CheDaoLines[3].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  423. returnData["cutterXl"] = cdData2;
  424. writePar = "cutterXl";
  425. CheDaoLines[3].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterXl", out JToken cutterXl_cd) ? jsonObject.GetValue("cutterXl") : "0", false);
  426. // 车刀在y轴方向上的长度 - 对应机床yL
  427. var cdData3 = CheDaoLines[4].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  428. returnData["cutterYl"] = cdData3;
  429. writePar = "cutterYl";
  430. CheDaoLines[4].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterYl", out JToken cutterYl_cd) ? jsonObject.GetValue("cutterYl") : "0", false);
  431. // 切削刃半径 - 对应机床rs
  432. var cdData4 = CheDaoLines[8].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  433. returnData["cutterRs"] = cdData4;
  434. writePar = "cutterRs";
  435. CheDaoLines[8].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterRs", out JToken cutterRs_cd) ? jsonObject.GetValue("cutterRs") : "0", false);
  436. // 设置车刀子类型
  437. var cdData5 = CheDaoLines[18].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  438. returnData["cutterTypSubDnc"] = cdData5;
  439. writePar = "cutterTypSubDnc";
  440. CheDaoLines[18].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterTypSubDnc", out JToken cutterTypSubDnc_cd) ? jsonObject.GetValue("cutterTypSubDnc") : "", false);
  441. // 车刀方向 TO 刀具定向?
  442. var cdData6 = CheDaoLines[10].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  443. returnData["cutterTo"] = cdData6;
  444. writePar = "cutterTo";
  445. CheDaoLines[10].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterTo", out JToken cutterTo_cd) ? jsonObject.GetValue("cutterTo") : "0", false);
  446. //刀具长度1的差值
  447. var cdData7 = CheDaoLines[5].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  448. returnData["dzl"] = cdData7;
  449. writePar = "dzl";
  450. CheDaoLines[5].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("dzl", out JToken dzl_cd) ? jsonObject.GetValue("dzl") : "0", false);
  451. //刀具长度2的差值
  452. var cdData8 = CheDaoLines[6].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  453. returnData["dxl"] = cdData8;
  454. writePar = "dxl";
  455. CheDaoLines[6].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("dxl", out JToken dxl_cd) ? jsonObject.GetValue("dxl") : "0", false);
  456. //刀具长度3的差值
  457. var cdData9 = CheDaoLines[7].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  458. returnData["dyl"] = cdData9;
  459. writePar = "dyl";
  460. CheDaoLines[7].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("dyl", out JToken dyl_cd) ? jsonObject.GetValue("dyl") : "0", false);
  461. //刀具半径的差值
  462. var cdData10 = CheDaoLines[9].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  463. returnData["drs"] = cdData10;
  464. writePar = "drs";
  465. CheDaoLines[9].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("drs", out JToken drs_cd) ? jsonObject.GetValue("drs") : "0", false);
  466. //开槽刀宽度的差值
  467. var cdData11 = CheDaoLines[17].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  468. returnData["dcw"] = cdData11;
  469. writePar = "dcw";
  470. CheDaoLines[17].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("dcw", out JToken dcw_cd) ? jsonObject.GetValue("dcw") : "0", false);
  471. // 主轴定向角 0ri
  472. var cdData12 = CheDaoLines[11].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  473. returnData["cutterOri"] = cdData12;
  474. writePar = "cutterOri";
  475. CheDaoLines[11].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterOri", out JToken cutterOri_cd) ? jsonObject.GetValue("cutterOri") : "0", false);
  476. // 下刀角
  477. var cdData13 = CheDaoLines[16].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  478. returnData["tangle"] = cdData13;
  479. writePar = "tangle";
  480. CheDaoLines[14].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("tangle", out JToken tangle_cd) ? jsonObject.GetValue("tangle") : "0", false);
  481. // 刀尖角
  482. var cdData14 = CheDaoLines[15].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  483. returnData["pangle"] = cdData14;
  484. writePar = "pangle";
  485. CheDaoLines[13].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("pangle", out JToken pangle_cd) ? jsonObject.GetValue("pangle") : "0", false);
  486. // 切槽刀的切削长度
  487. var cdData15 = CheDaoLines[17].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  488. returnData["cutlength"] = cdData15;
  489. writePar = "cutlength";
  490. CheDaoLines[15].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutlength", out JToken cutlength_cd) ? jsonObject.GetValue("cutlength") : "0", false);
  491. // 切槽刀的切削长度
  492. var cdData16 = CheDaoLines[18].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  493. returnData["cutwidth"] = cdData16;
  494. writePar = "cutwidth";
  495. CheDaoLines[16].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutwidth", out JToken cutwidth_cd) ? jsonObject.GetValue("cutwidth") : "0", false);
  496. }
  497. /*刀位表数据设置更新*/
  498. //刀位表数据查询语句
  499. writePar = "刀位表写入开始";
  500. string writeOrDel = jsonObject.GetValue("writeOrDel").ToString();
  501. string DaoWeiColumnNamesAccessor = "";
  502. if (jsonObject.GetValue("cutterP").ToString().Contains("1."))
  503. {
  504. DaoWeiColumnNamesAccessor = @"\TABLE\TOOL_P\P\" + jsonObject.GetValue("cutterP");
  505. }
  506. else
  507. {
  508. DaoWeiColumnNamesAccessor = @"\TABLE\TOOL_P\P\1." + jsonObject.GetValue("cutterP");
  509. }
  510. // 查询表数据
  511. IJHDataEntry2 DaoWeiTable = dataAccess.GetDataEntry2(DaoWeiColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  512. // 获取字段列表
  513. IJHDataEntry2List DaoWeiLines = DaoWeiTable.GetChildList();
  514. // 设置刀具名
  515. writePar = "cutterName";
  516. DaoWeiLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterName", out JToken cutterName_dw) ? jsonObject.GetValue("cutterName") : "", false);
  517. // 设置刀号
  518. writePar = "cutterT";
  519. if (writeOrDel == "2")
  520. {
  521. DaoWeiLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 1000, false);
  522. }
  523. else
  524. {
  525. DaoWeiLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.TryGetValue("cutterT", out JToken cutterT_dw) ? jsonObject.GetValue("cutterT") : "0", false);
  526. }
  527. responseBody.msg = "数据设置成功";
  528. responseBody.returnData = JsonConvert.SerializeObject(returnData);
  529. responseBody.result = true;
  530. }
  531. else if (hdhBody.Type == ActionTypeEnum.WriteDeviationValue.ToString())
  532. { // 给机床写偏差值
  533. JObject jsonObject = JObject.Parse(hdhBody.DeviationValue);
  534. JHDataAccess dataAccess1 = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  535. dataAccess1.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  536. //*偏差值表数据修改*//*
  537. //偏差值表查询语句
  538. string ToolColumnNamesAccessor1 = @"\TABLE\HAN121601\NR\'1'";
  539. //偏差值表数据
  540. IJHDataEntry2 ToolTable = dataAccess1.GetDataEntry2(ToolColumnNamesAccessor1, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  541. // 获取字段列表
  542. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  543. //设置偏差值,先设置偏差值为零
  544. ToolLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  545. ToolLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  546. ToolLines[3].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  547. ToolLines[4].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  548. ToolLines[5].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  549. ToolLines[6].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, 0, false);
  550. ToolLines[1].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactXaxisOffset"), false);
  551. ToolLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactYaxisOffset"), false);
  552. ToolLines[3].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactZaxisOffset"), false);
  553. ToolLines[4].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactAaxisOffset"), false);
  554. ToolLines[5].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactBaxisOffset"), false);
  555. ToolLines[6].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("exactCaxisOffset"), false);
  556. // 校验偏差值
  557. Thread.Sleep(50);
  558. Boolean checkThrough = true;
  559. string isreason = null;
  560. var data1 = ToolLines[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  561. if (data1 != Convert.ToDouble(jsonObject.GetValue("exactXaxisOffset"))) { checkThrough = false; isreason = "exactXaxisOffset"; }
  562. var data2 = ToolLines[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  563. if (data2 != Convert.ToDouble(jsonObject.GetValue("exactYaxisOffset"))) { checkThrough = false; isreason = "exactYaxisOffset"; }
  564. var data3 = ToolLines[3].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  565. if (data3 != Convert.ToDouble(jsonObject.GetValue("exactZaxisOffset"))) { checkThrough = false; isreason = "exactZaxisOffset"; }
  566. var data4 = ToolLines[4].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  567. if (data4 != Convert.ToDouble(jsonObject.GetValue("exactAaxisOffset"))) { checkThrough = false; isreason = "exactAaxisOffset"; }
  568. var data5 = ToolLines[5].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  569. if (data5 != Convert.ToDouble(jsonObject.GetValue("exactBaxisOffset"))) { checkThrough = false; isreason = "exactBaxisOffset"; }
  570. var data6 = ToolLines[6].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  571. if (data6 != Convert.ToDouble(jsonObject.GetValue("exactCaxisOffset"))) { checkThrough = false; isreason = "exactCaxisOffset"; }
  572. if (!checkThrough)
  573. {
  574. responseBody.msg = "数据校验不成功,异常字段" + isreason;
  575. responseBody.result = false;
  576. }
  577. else
  578. {
  579. responseBody.msg = "数据设置成功";
  580. responseBody.result = true;
  581. }
  582. }
  583. else if (hdhBody.Type == ActionTypeEnum.ReadProbeData.ToString())
  584. {
  585. IJHDataEntry2 ToolLine = null;
  586. IJHDataEntry2List ToolCells = null;
  587. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  588. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  589. /*探头检测结果表数据修改*/
  590. //探头检测结果表查询语句
  591. string ToolColumnNamesAccessor = @"\TABLE\TOOL_P\P\('1'-'50')";
  592. //探头检测结果表数据
  593. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  594. // 获取字段列表
  595. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  596. int ToolLinesCount = ToolLines.Count >= 50 ? 50 : ToolLines.Count;
  597. for (int i = 0; i < ToolLinesCount; i++)
  598. {
  599. ToolLine = ToolLines[i];
  600. ToolCells = ToolLine.GetChildList();
  601. // get child list from server
  602. ToolsInfo toolsInfo = new ToolsInfo();
  603. //刀位编码
  604. int[] pCode = ToolCells[0].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  605. toolsInfo.position = string.Join(".", pCode);
  606. toolsInfo.number = ToolCells[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  607. toolsInfo.name = ToolCells[2].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA).ToString();
  608. YG.Log.Instance.WriteLogAdd($"海德汉读取探头检测数据--->>" + JsonConvert.SerializeObject(toolsInfo), "海德汉机床探头检测数据");
  609. }
  610. }
  611. else if (hdhBody.Type == ActionTypeEnum.WriteTakeCutter.ToString()) { // 给机床写入取刀标识
  612. //机外对刀仪数据
  613. JObject jsonObject = JObject.Parse(hdhBody.CutterData);
  614. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  615. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  616. // 需要判定,写入标识的刀柄号,是否再用
  617. string DaoWeiColumnNamesAccessor = @"\TABLE\TOOL_P\P\0.0";
  618. // 查询表数据
  619. IJHDataEntry2 DaoWeiTable = dataAccess.GetDataEntry2(DaoWeiColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  620. // 获取字段列表
  621. IJHDataEntry2List DaoWeiLines = DaoWeiTable.GetChildList();
  622. var tcode = DaoWeiLines[1].GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  623. if (jsonObject.GetValue("cutterT") == tcode.ToString()) {
  624. responseBody.msg = "数据设置失败,主轴正在使用此刀";
  625. responseBody.result = false;
  626. }
  627. else {
  628. string ToolColumnNamesAccessor = @"\TABLE\TOOL\T\" + jsonObject.GetValue("cutterT");
  629. //刀具表数据
  630. IJHDataEntry2 ToolTable = dataAccess.GetDataEntry2(ToolColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  631. // 获取字段列表
  632. IJHDataEntry2List ToolLines = ToolTable.GetChildList();
  633. ToolLines[14].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("doc"), false);
  634. responseBody.msg = "数据设置成功";
  635. responseBody.result = true;
  636. }
  637. }
  638. else if (hdhBody.Type == ActionTypeEnum.BindingInfo.ToString()) { // 给机床写入绑定信息
  639. //机外对刀仪数据
  640. JObject jsonObject = JObject.Parse(hdhBody.BindInfo);
  641. JHDataAccess dataAccess = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  642. dataAccess.SetAccessMode(DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  643. // 需要判定,写入标识的刀柄号,是否再用
  644. string DaoWeiColumnNamesAccessor = @"\TABLE\QR\NR\2";
  645. // 查询表数据
  646. IJHDataEntry2 DaoWeiTable = dataAccess.GetDataEntry2(DaoWeiColumnNamesAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  647. // 获取字段列表
  648. IJHDataEntry2List DaoWeiLines = DaoWeiTable.GetChildList();
  649. DaoWeiLines[2].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("uniqueCode"), false);
  650. DaoWeiLines[3].SetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA, jsonObject.GetValue("trayCode"), false);
  651. responseBody.msg = "数据设置成功";
  652. responseBody.result = true;
  653. }
  654. }
  655. else
  656. {
  657. responseBody.msg = m_ControlState.ToString();
  658. responseBody.result = false;
  659. deviceList.Remove(hdhBody.MachineName);
  660. machineList.Remove(hdhBody.MachineName);
  661. }
  662. }
  663. }
  664. catch (Exception opcex)
  665. {
  666. YG.Log.Instance.WriteLogAdd($"海德汉响应异常--->>" + opcex.Message);
  667. if (writePar.Length > 0) {
  668. writePar = "写入数据报错位置:" + writePar;
  669. }
  670. AddList(DateTime.Now.ToString(), "POST", request.Url.ToString(), "响应异常:" + opcex.Message+ writePar);
  671. responseBody.result = false;
  672. responseBody.msg = opcex.Message + writePar;
  673. //发生异常,清空数组,重新连接
  674. deviceList = new Dictionary<string, DNC_STATE>();
  675. machineList = new Dictionary<string, JHMachineInProcess>();
  676. }
  677. finally {
  678. AddList(DateTime.Now.ToString(), "POST", hdhBody.ServerUrl + ":响应数据:" + responseBody.toolsInfo, responseBody.result ? "OK,消息消费成功" : "失败,消息消费失败" + m_ControlState != null ? m_ControlState.ToString() : "");
  679. response.ContentType = "application/json;charset=UTF-8";
  680. response.ContentEncoding = Encoding.UTF8;
  681. response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
  682. string retJsonData = JsonConvert.SerializeObject(responseBody);
  683. using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
  684. {
  685. YG.Log.Instance.WriteLogAdd($"海德汉响应结果--->>{JsonConvert.SerializeObject(JsonConvert.SerializeObject(responseBody))}--->>{body}\r\n");
  686. writer.Write(JsonConvert.SerializeObject(responseBody));
  687. writer.Close();
  688. response.Close();
  689. }
  690. }
  691. }
  692. }
  693. else if (request.HttpMethod == "GET")
  694. {
  695. if (!request.Url.ToString().Contains("favicon"))
  696. {
  697. string ip = request.QueryString["ip"];
  698. string port = request.QueryString["port"];
  699. string fun = request.QueryString["fun"];
  700. AddList(DateTime.Now.ToString(), "GET", ip + port + fun, "OK");
  701. }
  702. response.Close();
  703. }
  704. }
  705. private DNC_STATE connect(string connectName)
  706. {
  707. DNC_CNC_TYPE CncType ;
  708. IJHConnectionList connectionList = null;
  709. IJHConnection connection = null;
  710. try
  711. {
  712. JHMachineInProcess Machine = null;
  713. //第一次连接加入数组,以支持多台设备
  714. if (machineList == null || (machineList.Where(m => m.Key == connectName).Count() == 0))
  715. {
  716. Machine = new JHMachineInProcess();
  717. //DNC连接正常,加入数组
  718. machineList.Add(connectName, Machine);
  719. Thread.Sleep(20);
  720. }
  721. else
  722. {
  723. //取对应设备
  724. Machine = machineList.Where(m => m.Key == connectName).FirstOrDefault().Value;
  725. }
  726. Machine.ConnectRequest(connectName);
  727. string sCurrentMachine = Machine.currentMachine;
  728. // Find out control type
  729. connectionList = Machine.ListConnections();
  730. for (int i = 0; i < connectionList.Count; i++)
  731. {
  732. connection = connectionList[i];
  733. if (connection.name == sCurrentMachine)
  734. {
  735. CncType = connection.cncType;
  736. }
  737. if (connection != null)
  738. Marshal.ReleaseComObject(connection);
  739. }
  740. return Machine.GetState();
  741. }
  742. catch (COMException cex)
  743. {
  744. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  745. }
  746. catch (Exception ex)
  747. {
  748. return DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  749. }
  750. finally
  751. {
  752. if (connectionList != null)
  753. Marshal.ReleaseComObject(connectionList);
  754. if (connection != null)
  755. Marshal.ReleaseComObject(connection);
  756. }
  757. }
  758. private string GenPath(string part1, string part2)
  759. {
  760. string sFullPath = part1;
  761. switch (part2)
  762. {
  763. case ".":
  764. break;
  765. case "..":
  766. if (part1.EndsWith(@"\") && part1.Length > 5)
  767. part1 = part1.Substring(0, part1.Length - 3);
  768. int iLastFolderPos = part1.LastIndexOf(@"\");
  769. if (iLastFolderPos >= 0)
  770. sFullPath = part1.Substring(0, iLastFolderPos + 1);
  771. break;
  772. default:
  773. if (part1.EndsWith(@"\"))
  774. sFullPath = part1 + part2;
  775. else
  776. sFullPath = part1 + @"\" + part2;
  777. break;
  778. }
  779. return sFullPath;
  780. }
  781. public class Servlet
  782. {
  783. public virtual void onGet(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response, string info) { }
  784. public virtual void onPost(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { }
  785. public virtual void onCreate()
  786. {
  787. }
  788. }
  789. public void AddList(string dtime, string type, string url, string res)
  790. {
  791. this.Invoke(new Action(delegate ()
  792. {
  793. listView1.BeginUpdate(); //数据更新,UI暂时挂起,直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度
  794. ListViewItem lvi = new ListViewItem();
  795. lvi.Text = dtime;
  796. lvi.SubItems.Add(type);
  797. lvi.SubItems.Add(url);
  798. lvi.SubItems.Add(res);
  799. this.listView1.Items.Insert(0, lvi);
  800. if (this.listView1.Items.Count > 100)
  801. {
  802. this.listView1.Items.Clear();
  803. }
  804. this.listView1.EndUpdate(); //结束数据处理,UI界面一次性绘制。}
  805. }));
  806. }
  807. public class MyServlet : Servlet
  808. {
  809. public override void onCreate()
  810. {
  811. base.onCreate();
  812. }
  813. public override void onGet(HttpListenerRequest request, HttpListenerResponse response, string info)
  814. {
  815. Console.WriteLine("GET:" + request.Url);
  816. byte[] buffer = Encoding.UTF8.GetBytes(info);
  817. //string sss = request.QueryString["ty"];
  818. System.IO.Stream output = response.OutputStream;
  819. output.Write(buffer, 0, buffer.Length);
  820. // You must close the output stream.
  821. output.Close();
  822. //listener.Stop();
  823. }
  824. public override void onPost(HttpListenerRequest request, HttpListenerResponse response)
  825. {
  826. Console.WriteLine("POST:" + request.Url);
  827. byte[] res = Encoding.UTF8.GetBytes("OK");
  828. response.OutputStream.Write(res, 0, res.Length);
  829. }
  830. }
  831. }
  832. }