using IMCS.Device.HeiDenHainBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using HeidenhainDNCLib;
namespace IMCS.Device
{
public class DeviceHeidenhainHandle
{
public enum ApplicationState { disconnected, connecting, connected, disconnecting }
private delegate void OnStateChangedHandler(HeidenhainDNCLib.DNC_EVT_STATE eventValue);
///
/// 海德汉德连接
///
internal HeidenhainDNCLib.JHMachineInProcess Machine { get; private set; }
#region 海德汉文件系统,上传下载
///
/// 海德汉文件系统,上传下载
///
private HeidenhainDNCLib.JHFileSystem m_FileSystem = null;
// --- Helper objects
private HeidenhainDNCLib.JHFileAttributes m_AttributesSelection = null;
private HeidenhainDNCLib.JHFileAttributes m_AttributesState = null;
#endregion
private ApplicationState m_AppState = ApplicationState.disconnected;
private HeidenhainDNCLib.JHAutomatic m_Automatic = null;
private HeidenhainDNCLib.JHError m_Error = null;
#region 刀具管理
private HeidenhainDNCLib.JHDataAccess m_Tool = null;
private bool initOkay = false;
private HeidenhainDNCLib.DNC_CNC_TYPE ControlType { get; set; }
private ListViewItem selectedTool = null;
// --- data access path -----------------------------------------------------------------------
private string ToolColumnNamesAccessor = string.Empty; // see Init()
private string ToolTableAccessor = @"\TABLE\TOOL\T";
private string ToolTableAccessorReadingWholeTyble = @"\TABLE\TOOL";
#endregion
#region 系统错误
// --- other HEIDENHAIN helper objects and enumerations ---------------------------------------
private HeidenhainDNCLib.DNC_CNC_TYPE CncType { get; set; }
// --- other fields ---------------------------------------------------------------------------
#endregion
bool IsNck { get; set; }
private List m_DirectoryEntryList = new List();
///
/// 海德汉连接状态
///
private HeidenhainDNCLib.DNC_STATE m_ControlState;
private HeidenhainDNCLib.DNC_STATE m_PreviousControlState;
internal ApplicationState AppState
{
get
{
return m_AppState;
}
private set
{
m_AppState = value;
}
}
internal HeidenhainDNCLib.DNC_STATE ControlState
{
get
{
return m_ControlState;
}
private set
{
AppState = ApplicationState.connecting;
m_ControlState = value;
if (m_ControlState == HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE)
AppState = ApplicationState.connected;
}
}
private string m_Path = @"TNC:\";
///
/// 海德汉默认文件路径
///
private string ActPath
{
get
{
return m_Path;
}
set
{
m_Path = value;
}
}
string connectionname;
public DeviceHeidenhainHandle(string _connectionname)
{
connectionname = _connectionname;
Machine_Init(connectionname);
}
#region 海德汉连接
///
/// 海德汉连接
///
///
public void Machine_Init(string bstrConnectionName)
{
try
{
Machine = new HeidenhainDNCLib.JHMachineInProcess();
Machine.ConnectRequest(bstrConnectionName);
Machine.OnStateChanged += new HeidenhainDNCLib._DJHMachineEvents2_OnStateChangedEventHandler(Machine_OnStateChanged);
ControlState = Machine.GetState();
}
catch (COMException cex)
{
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
}
catch (Exception ex)
{
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowException(ex, strClassName, strMethodName);
}
}
private void Machine_StateMachineNCK(HeidenhainDNCLib.DNC_EVT_STATE evtState)
{
// internal state machine of the NCK based controls
// --> See HeidenhainDNC COM component dokumentation for more informations
m_PreviousControlState = ControlState;
switch (ControlState)
{
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_NOT_AVAILABLE:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_AVAILABLE:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_AVAILABLE;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_AVAILABLE:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_HOST_NOT_AVAILABLE:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_NOT_AVAILABLE;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_WAIT_PERMISSION:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_WAITING_PERMISSION;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_WAITING_PERMISSION:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_AVAILABLE:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_AVAILABLE;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_PERMISSION_DENIED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NO_PERMISSION;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_AVAILABLE:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_BOOTED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_BOOTED;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_BOOTED:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_INITIALIZING:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_INITIALIZING;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_INITIALIZING:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_AVAILABLE:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_AVAILABLE:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_MACHINE_SHUTTING_DOWN:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_SHUTTING_DOWN;
break;
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_MACHINE_IS_SHUTTING_DOWN:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_CONNECTION_LOST:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_HOST_IS_STOPPED:
switch (evtState)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_DNC_IS_STOPPED;
break;
}
break;
case HeidenhainDNCLib.DNC_STATE.DNC_STATE_NO_PERMISSION:
break;
}
Debug.WriteLine(m_PreviousControlState.ToString() + " --> " + ControlState.ToString());
}
private void Machine_OnStateChanged(HeidenhainDNCLib.DNC_EVT_STATE eventValue)
{
// Make sure the implementation is called asynchronously
// Otherwise you may get a deadlock at unadvising the OnStateChanged event handler
// BeginInvoke(new OnStateChangedHandler(Machine_OnStateChangedImpl), eventValue);
Machine_OnStateChangedImpl(eventValue);
}
private void Machine_Disconnect()
{
AppState = ApplicationState.disconnecting;
try
{
// 1. Dispose all panels which contains the COM interfaces (JHVersion, JHAutomatic, etc.)
// Release all COM interfaces (Marshal.ReleaseComObject(JH...)) in the panel classes
if (Machine != null)
{
// 2. Unsubscribe all events
Machine.OnStateChanged -= new HeidenhainDNCLib._DJHMachineEvents2_OnStateChangedEventHandler(Machine_OnStateChanged);
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
// 3. Disconect from control
Machine.Disconnect();
// 4. Release machine object
Marshal.ReleaseComObject(Machine);
Machine = null;
}
AppState = ApplicationState.disconnected;
}
catch (COMException cex)
{
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
}
catch (Exception ex)
{
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowException(ex, strClassName, strMethodName);
}
}
private void Machine_OnStateChangedImpl(HeidenhainDNCLib.DNC_EVT_STATE eventValue)
{
try
{
Machine_StateMachineNCK(eventValue);
switch (eventValue)
{
case HeidenhainDNCLib.DNC_EVT_STATE.DNC_EVT_STATE_DNC_STOPPED:
AppState = ApplicationState.disconnecting;
Debug.WriteLine("--- automatic Disconnect ---");
Machine_Disconnect();
Debug.WriteLine("--- automatic ConnectRequest ---");
Machine_Init(connectionname);
break;
}
}
catch (COMException cex)
{
string strClassName = this.GetType().ToString();
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
}
catch (Exception ex)
{
string strClassName = this.GetType().ToString();
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowException(ex, strClassName, strMethodName);
}
}
#endregion
#region 当前机床异常情况
public void Error_Init()
{
m_Error = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHERROR);
m_Error.OnError += new HeidenhainDNCLib._DJHErrorEvents_OnErrorEventHandler(M_Error_OnError);
}
private void M_Error_OnError(HeidenhainDNCLib.DNC_ERROR_GROUP errorGroup, int lErrorNumber, HeidenhainDNCLib.DNC_ERROR_CLASS errorClass, string bstrError, int lChannel)
{
}
#endregion
#region 机床启动停止
public void Progam_Init()
{
m_Automatic = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHAUTOMATIC);
}
///
///
///
/// 选择执行脚本的名称
///
public void Program_Select(string progamname, int channel = 0)
{
m_Automatic.SelectProgram(0, progamname);
}
///
///
///
/// 机床加工的脚本名称
public void Program_Start(string progamname)
{
m_Automatic.StartProgram(progamname);
}
///
///
///
///
///
public void Program_Stop(string progamname, int channel = 0)
{
m_Automatic.StopProgram(channel, false);
}
#endregion
#region 上传文件
private void File_Init()
{
m_FileSystem = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHFILESYSTEM);
m_AttributesSelection = new HeidenhainDNCLib.JHFileAttributes();
m_AttributesState = new HeidenhainDNCLib.JHFileAttributes();
}
///
/// 上传文件
///
/// 文件路径+文件名称
/// 文件路径
public void File_Upload(string filename, string path = @"TNC:\")
{
m_FileSystem.TransmitFile(filename, path);
}
///
/// 删除文件
///
/// 文件路径+文件名称
public void File_DelFile(string path)
{
m_FileSystem.DeleteFile(path);
}
///
/// 创建文件夹
///
/// 文件夹名称
/// 文件路径
public void File_CreateDir(string dirname, string path = @"TNC:\")
{
m_FileSystem.MakeDirectory(dirname);
}
///
/// 判断文件是否存在
///
/// 需要查找的文件名称
/// 查找文件路径
///
public bool File_FileExists(string filename, string findpath = @"TNC:\")
{
HeidenhainDNCLib.IJHDirectoryEntryList directoryEntryList = null;
HeidenhainDNCLib.IJHDirectoryEntry directoryEntry = null;
HeidenhainDNCLib.JHFileAttributes fileAttributes = null;
m_DirectoryEntryList.Clear();
try
{
directoryEntryList = m_FileSystem.ReadDirectory(ActPath, m_AttributesSelection, m_AttributesState);
int iDirCount = directoryEntryList.Count;
for (int i = 0; i < iDirCount; i++)
{
directoryEntry = directoryEntryList[i];
// get entry informations
MyDirectoryEntry entry = new MyDirectoryEntry();
entry.Name = directoryEntry.name;
entry.TimeStamp = directoryEntry.dateTime;
entry.FileSize = directoryEntry.size;
// get file attributes
fileAttributes = directoryEntry.attributes;
entry.Dir = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_DIR);
entry.Hidden = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_HIDDEN);
entry.Locked = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_LOCKED);
entry.Modified = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_MODIFIED);
entry.ReadOnly = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_READONLY);
entry.System = fileAttributes.IsAttributeSet(HeidenhainDNCLib.DNC_ATTRIBUTE_TYPE.DNC_ATTRIBUTE_SYSTEM);
// add to list
m_DirectoryEntryList.Add(entry);
if (directoryEntry != null)
Marshal.ReleaseComObject(directoryEntry);
if (fileAttributes != null)
Marshal.ReleaseComObject(fileAttributes);
}
}
catch (COMException cex)
{
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
}
catch (Exception ex)
{
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowException(ex, strClassName, strMethodName);
}
finally
{
if (fileAttributes != null)
Marshal.ReleaseComObject(fileAttributes);
if (directoryEntry != null)
Marshal.ReleaseComObject(directoryEntry);
if (directoryEntryList != null)
Marshal.ReleaseComObject(directoryEntryList);
}
return m_DirectoryEntryList.Where(m => m.Name.Equals(filename)).Count() > 0 ? true : false;
}
///
/// 下载文件
///
/// 路径+文件名称
/// 路径+文件名称
public void File_DownFile(string bstrSourceFileName, string destfile)
{
m_FileSystem.ReceiveFile(bstrSourceFileName, destfile);
}
#endregion
#region 刀具管理
///
/// 刀具
///
public void Tool_Init()
{
try
{
ToolColumnNamesAccessor = @"\TABLE\TOOL";
m_Tool = Machine.GetInterface(HeidenhainDNCLib.DNC_INTERFACE_OBJECT.DNC_INTERFACE_JHDATAACCESS);
m_Tool.SetAccessMode(HeidenhainDNCLib.DNC_ACCESS_MODE.DNC_ACCESS_MODE_TABLEDATAACCESS, "");
}
catch (COMException cex)
{
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowComException(cex.ErrorCode, strClassName, strMethodName);
}
catch (Exception ex)
{
ControlState = HeidenhainDNCLib.DNC_STATE.DNC_STATE_NOT_INITIALIZED;
string strClassName = this.GetType().Name;
string strMethodName = MethodInfo.GetCurrentMethod().Name;
MyHelper.ShowException(ex, strClassName, strMethodName);
}
}
///
///
///
///
public ListViewItem[] Tool_Read()
{
IJHDataEntry2 ToolTable = null;
IJHDataEntry2List ToolLines = null;
IJHDataEntry2 ToolLine = null;
IJHDataEntry2List ToolCells = null;
IJHDataEntry2 ToolCell = null;
IJHDataEntryProperty2List CellPropertyList = null;
IJHDataEntryProperty2 CellProperty = null;
object CellValue = null;
string sCellValue = null;
ToolTable = m_Tool.GetDataEntry2(ToolTableAccessor, DNC_DATA_UNIT_SELECT.DNC_DATA_UNIT_SELECT_METRIC, false);
ToolLines = ToolTable.GetChildList();
//找到刀的总数量
int ToolLinesCount = ToolLines.Count;
ListViewItem[] ListViewToolLines = new ListViewItem[ToolLinesCount];
for (int i = 0; i < ToolLinesCount; i++)
{
// check if worker has to be stoped
ToolLine = ToolLines[i];
// get child list from server
ToolCells = ToolLine.GetChildList();
ListViewItem ListViewToolLine = null;
for (int j = 0; j < ToolCells.Count; j++)
{
ToolCell = ToolCells[j];
// get property from server
CellValue = ToolCell.GetPropertyValue(DNC_DATAENTRY_PROPKIND.DNC_DATAENTRY_PROPKIND_DATA);
if (CellValue != null)
{
sCellValue = CellValue.ToString();
if (ToolCell.bstrName == "T")
{
sCellValue = sCellValue.Replace(",", ".");
}
}
else
{
sCellValue = "";
}
if (ListViewToolLine == null)
{
ListViewToolLine = new ListViewItem(sCellValue);
/* MSDN INFO:
* The Name property corresponds to the key for a ListViewItem in the ListView.ListViewItemCollection.
* The key comparison is not case-sensitive. If the key parameter is null or an empty string, IndexOfKey returns -1.
* --> We need the key to remove the item from list in a handy way
*/
ListViewToolLine.Name = sCellValue;
}
else
ListViewToolLine.SubItems.Add(sCellValue);
if (ToolCell != null)
Marshal.ReleaseComObject(ToolCell);
if (CellPropertyList != null)
Marshal.ReleaseComObject(CellPropertyList);
if (CellProperty != null)
Marshal.ReleaseComObject(CellProperty);
}
ListViewToolLines[i] = ListViewToolLine;
if (ToolLine != null)
Marshal.ReleaseComObject(ToolLine);
if (ToolCells != null)
Marshal.ReleaseComObject(ToolCells);
}
return ListViewToolLines;
}
#endregion
}
}