DeviceHeidenhainHandle.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. using IMCS.Device.HeiDenHainBase;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.ComponentModel;
  10. using System.Data;
  11. using System.Diagnostics;
  12. using System.Drawing;
  13. using System.Windows.Forms;
  14. using HeidenhainDNCLib;
  15. namespace IMCS.Device
  16. {
  17. public class DeviceHeidenhainHandle
  18. {
  19. public enum ApplicationState { disconnected, connecting, connected, disconnecting }
  20. private delegate void OnStateChangedHandler(HeidenhainDNCLib.DNC_EVT_STATE eventValue);
  21. /// <summary>
  22. /// 海德汉德连接
  23. /// </summary>
  24. internal HeidenhainDNCLib.JHMachineInProcess Machine { get; private set; }
  25. #region 海德汉文件系统,上传下载
  26. /// <summary>
  27. /// 海德汉文件系统,上传下载
  28. /// </summary>
  29. private HeidenhainDNCLib.JHFileSystem m_FileSystem = null;
  30. // --- Helper objects
  31. private HeidenhainDNCLib.JHFileAttributes m_AttributesSelection = null;
  32. private HeidenhainDNCLib.JHFileAttributes m_AttributesState = null;
  33. #endregion
  34. private ApplicationState m_AppState = ApplicationState.disconnected;
  35. private HeidenhainDNCLib.JHAutomatic m_Automatic = null;
  36. private HeidenhainDNCLib.JHError m_Error = null;
  37. #region 刀具管理
  38. private HeidenhainDNCLib.JHDataAccess m_Tool = null;
  39. private bool initOkay = false;
  40. private HeidenhainDNCLib.DNC_CNC_TYPE ControlType { get; set; }
  41. private ListViewItem selectedTool = null;
  42. // --- data access path -----------------------------------------------------------------------
  43. private string ToolColumnNamesAccessor = string.Empty; // see Init()
  44. private string ToolTableAccessor = @"\TABLE\TOOL\T";
  45. private string ToolTableAccessorReadingWholeTyble = @"\TABLE\TOOL";
  46. #endregion
  47. #region 系统错误
  48. // --- other HEIDENHAIN helper objects and enumerations ---------------------------------------
  49. private HeidenhainDNCLib.DNC_CNC_TYPE CncType { get; set; }
  50. // --- other fields ---------------------------------------------------------------------------
  51. #endregion
  52. bool IsNck { get; set; }
  53. private List<MyDirectoryEntry> m_DirectoryEntryList = new List<MyDirectoryEntry>();
  54. /// <summary>
  55. /// 海德汉连接状态
  56. /// </summary>
  57. private HeidenhainDNCLib.DNC_STATE m_ControlState;
  58. private HeidenhainDNCLib.DNC_STATE m_PreviousControlState;
  59. internal ApplicationState AppState
  60. {
  61. get
  62. {
  63. return m_AppState;
  64. }
  65. private set
  66. {
  67. m_AppState = value;
  68. }
  69. }
  70. internal HeidenhainDNCLib.DNC_STATE ControlState
  71. {
  72. get
  73. {
  74. return m_ControlState;
  75. }
  76. private set
  77. {
  78. AppState = ApplicationState.connecting;
  79. m_ControlState = value;
  80. if (m_ControlState == HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE)
  81. AppState = ApplicationState.connected;
  82. }
  83. }
  84. private string m_Path = @"TNC:\";
  85. /// <summary>
  86. /// 海德汉默认文件路径
  87. /// </summary>
  88. private string ActPath
  89. {
  90. get
  91. {
  92. return m_Path;
  93. }
  94. set
  95. {
  96. m_Path = value;
  97. }
  98. }
  99. string connectionname;
  100. public DeviceHeidenhainHandle(string _connectionname)
  101. {
  102. connectionname = _connectionname;
  103. Machine_Init(connectionname);
  104. }
  105. #region 海德汉连接
  106. /// <summary>
  107. /// 海德汉连接
  108. /// </summary>
  109. /// <param name="bstrConnectionName"></param>
  110. public void Machine_Init(string bstrConnectionName)
  111. {
  112. try
  113. {
  114. Machine = new HeidenhainDNCLib.JHMachineInProcess();
  115. Machine.ConnectRequest(bstrConnectionName);
  116. Machine.OnStateChanged += new HeidenhainDNCLib._DJHMachineEvents2_OnStateChangedEventHandler(Machine_OnStateChanged);
  117. ControlState = Machine.GetState();
  118. }
  119. catch (COMException cex)
  120. {
  121. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  122. string strClassName = this.GetType().Name;
  123. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  124. MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
  125. }
  126. catch (Exception ex)
  127. {
  128. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  129. string strClassName = this.GetType().Name;
  130. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  131. MyHelper.ShowException(ex, strClassName, strMethodName);
  132. }
  133. }
  134. private void Machine_StateMachineNCK(HeidenhainDNCLib.DNC_EVT_STATE evtState)
  135. {
  136. // internal state machine of the NCK based controls
  137. // --> See HeidenhainDNC COM component dokumentation for more informations
  138. m_PreviousControlState = ControlState;
  139. switch (ControlState)
  140. {
  141. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED:
  142. switch (evtState)
  143. {
  144. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_NOT_AVAILABLE:
  145. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE;
  146. break;
  147. }
  148. break;
  149. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE:
  150. switch (evtState)
  151. {
  152. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_AVAILABLE:
  153. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_AVAILABLE;
  154. break;
  155. }
  156. break;
  157. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_AVAILABLE:
  158. switch (evtState)
  159. {
  160. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_NOT_AVAILABLE:
  161. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE;
  162. break;
  163. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_WAIT_PERMISSION:
  164. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_WAITING_PERMISSION;
  165. break;
  166. }
  167. break;
  168. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_WAITING_PERMISSION:
  169. switch (evtState)
  170. {
  171. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_AVAILABLE:
  172. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_AVAILABLE;
  173. break;
  174. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  175. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  176. break;
  177. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_PERMISSION_DENIED:
  178. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NO_PERMISSION;
  179. break;
  180. }
  181. break;
  182. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_AVAILABLE:
  183. switch (evtState)
  184. {
  185. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_BOOTED:
  186. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_BOOTED;
  187. break;
  188. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  189. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  190. break;
  191. }
  192. break;
  193. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_BOOTED:
  194. switch (evtState)
  195. {
  196. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_INITIALIZING:
  197. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_INITIALIZING;
  198. break;
  199. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  200. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  201. break;
  202. }
  203. break;
  204. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_INITIALIZING:
  205. switch (evtState)
  206. {
  207. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_AVAILABLE:
  208. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE;
  209. break;
  210. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  211. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  212. break;
  213. }
  214. break;
  215. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE:
  216. switch (evtState)
  217. {
  218. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_SHUTTING_DOWN:
  219. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_SHUTTING_DOWN;
  220. break;
  221. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  222. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  223. break;
  224. }
  225. break;
  226. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_SHUTTING_DOWN:
  227. switch (evtState)
  228. {
  229. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  230. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  231. break;
  232. }
  233. break;
  234. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED:
  235. switch (evtState)
  236. {
  237. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_CONNECTION_LOST:
  238. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_STOPPED;
  239. break;
  240. }
  241. break;
  242. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_STOPPED:
  243. switch (evtState)
  244. {
  245. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  246. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
  247. break;
  248. }
  249. break;
  250. case HeidenhainDNCLib.DNC_STATE.DNC_STATE_NO_PERMISSION:
  251. break;
  252. }
  253. Debug.WriteLine(m_PreviousControlState.ToString() + " --> " + ControlState.ToString());
  254. }
  255. private void Machine_OnStateChanged(HeidenhainDNCLib.DNC_EVT_STATE eventValue)
  256. {
  257. // Make sure the implementation is called asynchronously
  258. // Otherwise you may get a deadlock at unadvising the OnStateChanged event handler
  259. // BeginInvoke(new OnStateChangedHandler(Machine_OnStateChangedImpl), eventValue);
  260. Machine_OnStateChangedImpl(eventValue);
  261. }
  262. private void Machine_Disconnect()
  263. {
  264. AppState = ApplicationState.disconnecting;
  265. try
  266. {
  267. // 1. Dispose all panels which contains the COM interfaces (JHVersion, JHAutomatic, etc.)
  268. // Release all COM interfaces (Marshal.ReleaseComObject(JH...)) in the panel classes
  269. if (Machine != null)
  270. {
  271. // 2. Unsubscribe all events
  272. Machine.OnStateChanged -= new HeidenhainDNCLib._DJHMachineEvents2_OnStateChangedEventHandler(Machine_OnStateChanged);
  273. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  274. // 3. Disconect from control
  275. Machine.Disconnect();
  276. // 4. Release machine object
  277. Marshal.ReleaseComObject(Machine);
  278. Machine = null;
  279. }
  280. AppState = ApplicationState.disconnected;
  281. }
  282. catch (COMException cex)
  283. {
  284. string strClassName = this.GetType().Name;
  285. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  286. MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
  287. }
  288. catch (Exception ex)
  289. {
  290. string strClassName = this.GetType().Name;
  291. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  292. MyHelper.ShowException(ex, strClassName, strMethodName);
  293. }
  294. }
  295. private void Machine_OnStateChangedImpl(HeidenhainDNCLib.DNC_EVT_STATE eventValue)
  296. {
  297. try
  298. {
  299. Machine_StateMachineNCK(eventValue);
  300. switch (eventValue)
  301. {
  302. case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
  303. AppState = ApplicationState.disconnecting;
  304. Debug.WriteLine("--- automatic Disconnect ---");
  305. Machine_Disconnect();
  306. Debug.WriteLine("--- automatic ConnectRequest ---");
  307. Machine_Init(connectionname);
  308. break;
  309. }
  310. }
  311. catch (COMException cex)
  312. {
  313. string strClassName = this.GetType().ToString();
  314. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  315. MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
  316. }
  317. catch (Exception ex)
  318. {
  319. string strClassName = this.GetType().ToString();
  320. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  321. MyHelper.ShowException(ex, strClassName, strMethodName);
  322. }
  323. }
  324. #endregion
  325. #region 当前机床异常情况
  326. public void Error_Init()
  327. {
  328. m_Error = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHERROR);
  329. m_Error.OnError += new HeidenhainDNCLib._DJHErrorEvents_OnErrorEventHandler(M_Error_OnError);
  330. }
  331. private void M_Error_OnError(HeidenhainDNCLib.DNC_ERROR_GROUP errorGroup, int lErrorNumber, HeidenhainDNCLib.DNC_ERROR_CLASS errorClass, string bstrError, int lChannel)
  332. {
  333. }
  334. #endregion
  335. #region 机床启动停止
  336. public void Progam_Init()
  337. {
  338. m_Automatic = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
  339. }
  340. /// <summary>
  341. ///
  342. /// </summary>
  343. /// <param name="progamname">选择执行脚本的名称</param>
  344. /// <param name="channel"></param>
  345. public void Program_Select(string progamname, int channel = 0)
  346. {
  347. m_Automatic.SelectProgram(0, progamname);
  348. }
  349. /// <summary>
  350. ///
  351. /// </summary>
  352. /// <param name="progamname">机床加工的脚本名称</param>
  353. public void Program_Start(string progamname)
  354. {
  355. m_Automatic.StartProgram(progamname);
  356. }
  357. /// <summary>
  358. ///
  359. /// </summary>
  360. /// <param name="progamname"></param>
  361. /// <param name="channel"></param>
  362. public void Program_Stop(string progamname, int channel = 0)
  363. {
  364. m_Automatic.StopProgram(channel, false);
  365. }
  366. #endregion
  367. #region 上传文件
  368. private void File_Init()
  369. {
  370. m_FileSystem = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
  371. m_AttributesSelection = new HeidenhainDNCLib.JHFileAttributes();
  372. m_AttributesState = new HeidenhainDNCLib.JHFileAttributes();
  373. }
  374. /// <summary>
  375. /// 上传文件
  376. /// </summary>
  377. /// <param name="filename">文件路径+文件名称</param>
  378. /// <param name="path">文件路径</param>
  379. public void File_Upload(string filename, string path = @"TNC:\")
  380. {
  381. m_FileSystem.TransmitFile(filename, path);
  382. }
  383. /// <summary>
  384. /// 删除文件
  385. /// </summary>
  386. /// <param name="path">文件路径+文件名称</param>
  387. public void File_DelFile(string path)
  388. {
  389. m_FileSystem.DeleteFile(path);
  390. }
  391. /// <summary>
  392. /// 创建文件夹
  393. /// </summary>
  394. /// <param name="dirname">文件夹名称</param>
  395. /// <param name="path">文件路径</param>
  396. public void File_CreateDir(string dirname, string path = @"TNC:\")
  397. {
  398. m_FileSystem.MakeDirectory(dirname);
  399. }
  400. /// <summary>
  401. /// 判断文件是否存在
  402. /// </summary>
  403. /// <param name="filename">需要查找的文件名称</param>
  404. /// <param name="findpath">查找文件路径</param>
  405. /// <returns></returns>
  406. public bool File_FileExists(string filename, string findpath = @"TNC:\")
  407. {
  408. HeidenhainDNCLib.IJHDirectoryEntryList directoryEntryList = null;
  409. HeidenhainDNCLib.IJHDirectoryEntry directoryEntry = null;
  410. HeidenhainDNCLib.JHFileAttributes fileAttributes = null;
  411. m_DirectoryEntryList.Clear();
  412. try
  413. {
  414. directoryEntryList = m_FileSystem.ReadDirectory(ActPath, m_AttributesSelection, m_AttributesState);
  415. int iDirCount = directoryEntryList.Count;
  416. for (int i = 0; i < iDirCount; i++)
  417. {
  418. directoryEntry = directoryEntryList[i];
  419. // get entry informations
  420. MyDirectoryEntry entry = new MyDirectoryEntry();
  421. entry.Name = directoryEntry.name;
  422. entry.TimeStamp = directoryEntry.dateTime;
  423. entry.FileSize = directoryEntry.size;
  424. // get file attributes
  425. fileAttributes = directoryEntry.attributes;
  426. entry.Dir = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_DIR);
  427. entry.Hidden = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_HIDDEN);
  428. entry.Locked = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_LOCKED);
  429. entry.Modified = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_MODIFIED);
  430. entry.ReadOnly = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_READONLY);
  431. entry.System = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_SYSTEM);
  432. // add to list
  433. m_DirectoryEntryList.Add(entry);
  434. if (directoryEntry != null)
  435. Marshal.ReleaseComObject(directoryEntry);
  436. if (fileAttributes != null)
  437. Marshal.ReleaseComObject(fileAttributes);
  438. }
  439. }
  440. catch (COMException cex)
  441. {
  442. string strClassName = this.GetType().Name;
  443. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  444. MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
  445. }
  446. catch (Exception ex)
  447. {
  448. string strClassName = this.GetType().Name;
  449. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  450. MyHelper.ShowException(ex, strClassName, strMethodName);
  451. }
  452. finally
  453. {
  454. if (fileAttributes != null)
  455. Marshal.ReleaseComObject(fileAttributes);
  456. if (directoryEntry != null)
  457. Marshal.ReleaseComObject(directoryEntry);
  458. if (directoryEntryList != null)
  459. Marshal.ReleaseComObject(directoryEntryList);
  460. }
  461. return m_DirectoryEntryList.Where(m => m.Name.Equals(filename)).Count() > 0 ? true : false;
  462. }
  463. /// <summary>
  464. /// 下载文件
  465. /// </summary>
  466. /// <param name="bstrSourceFileName">路径+文件名称</param>
  467. /// <param name="destfile">路径+文件名称</param>
  468. public void File_DownFile(string bstrSourceFileName, string destfile)
  469. {
  470. m_FileSystem.ReceiveFile(bstrSourceFileName, destfile);
  471. }
  472. #endregion
  473. #region 刀具管理
  474. /// <summary>
  475. /// 刀具
  476. /// </summary>
  477. public void Tool_Init()
  478. {
  479. try
  480. {
  481. ToolColumnNamesAccessor = @"\TABLE\TOOL";
  482. m_Tool = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
  483. m_Tool.SetAccessMode(HeidenhainDNCLib.DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
  484. }
  485. catch (COMException cex)
  486. {
  487. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  488. string strClassName = this.GetType().Name;
  489. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  490. MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
  491. }
  492. catch (Exception ex)
  493. {
  494. ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
  495. string strClassName = this.GetType().Name;
  496. string strMethodName = MethodInfo.GetCurrentMethod().Name;
  497. MyHelper.ShowException(ex, strClassName, strMethodName);
  498. }
  499. }
  500. /// <summary>
  501. ///
  502. /// </summary>
  503. /// <returns></returns>
  504. public ListViewItem[] Tool_Read()
  505. {
  506. IJHDataEntry2 ToolTable = null;
  507. IJHDataEntry2List ToolLines = null;
  508. IJHDataEntry2 ToolLine = null;
  509. IJHDataEntry2List ToolCells = null;
  510. IJHDataEntry2 ToolCell = null;
  511. IJHDataEntryProperty2List CellPropertyList = null;
  512. IJHDataEntryProperty2 CellProperty = null;
  513. object CellValue = null;
  514. string sCellValue = null;
  515. ToolTable = m_Tool.GetDataEntry2(ToolTableAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
  516. ToolLines = ToolTable.GetChildList();
  517. //找到刀的总数量
  518. int ToolLinesCount = ToolLines.Count;
  519. ListViewItem[] ListViewToolLines = new ListViewItem[ToolLinesCount];
  520. for (int i = 0; i < ToolLinesCount; i++)
  521. {
  522. // check if worker has to be stoped
  523. ToolLine = ToolLines[i];
  524. // get child list from server
  525. ToolCells = ToolLine.GetChildList();
  526. ListViewItem ListViewToolLine = null;
  527. for (int j = 0; j < ToolCells.Count; j++)
  528. {
  529. ToolCell = ToolCells[j];
  530. // get property from server
  531. CellValue = ToolCell.GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
  532. if (CellValue != null)
  533. {
  534. sCellValue = CellValue.ToString();
  535. if (ToolCell.bstrName == "T")
  536. {
  537. sCellValue = sCellValue.Replace(",", ".");
  538. }
  539. }
  540. else
  541. {
  542. sCellValue = "<undefined>";
  543. }
  544. if (ListViewToolLine == null)
  545. {
  546. ListViewToolLine = new ListViewItem(sCellValue);
  547. /* MSDN INFO:
  548. * The Name property corresponds to the key for a ListViewItem in the ListView.ListViewItemCollection.
  549. * The key comparison is not case-sensitive. If the key parameter is null or an empty string, IndexOfKey returns -1.
  550. * --> We need the key to remove the item from list in a handy way
  551. */
  552. ListViewToolLine.Name = sCellValue;
  553. }
  554. else
  555. ListViewToolLine.SubItems.Add(sCellValue);
  556. if (ToolCell != null)
  557. Marshal.ReleaseComObject(ToolCell);
  558. if (CellPropertyList != null)
  559. Marshal.ReleaseComObject(CellPropertyList);
  560. if (CellProperty != null)
  561. Marshal.ReleaseComObject(CellProperty);
  562. }
  563. ListViewToolLines[i] = ListViewToolLine;
  564. if (ToolLine != null)
  565. Marshal.ReleaseComObject(ToolLine);
  566. if (ToolCells != null)
  567. Marshal.ReleaseComObject(ToolCells);
  568. }
  569. return ListViewToolLines;
  570. }
  571. #endregion
  572. }
  573. }