using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.Common; using System.IO; using Common; using EZNCAUTLib; using RequestServer.HttpServer; namespace EZSockets { /// /// 封装的三菱的通讯类 /// public class MitCom { private EZNCAUTLib.DispEZNcCommunication EZNcCom;//通讯库变量 private EZNCAUTLib.DispEZNcCommunication EZNcCom106; private EZNCAUTLib.DispEZNcCommunication EZNcCom107; public static Dictionary deviceList { get; set; } = new Dictionary(); private int lResult=1; private int lSystemType; private string szMessage; public event Common.MyDelegate AlarmData;//声明事件 Random x = new Random(); public MitCom(string ipAdress) { // EZNcCom = deviceList.Where(m => m.Key == ipAdress).FirstOrDefault().Value; } /// /// 连接三菱设备 /// public void GetSimConnect(string nCTypeCmb,string nCCardNo,string timeOut,string ipAdress) { int lResultOpen = -1; int lResultClose = -1; int lMachine; int lTimeOut; string strHostName; if (EZNcCom == null) { EZNcCom = new EZNCAUTLib.DispEZNcCommunication(); switch (nCTypeCmb) { case "MAGIC64": lSystemType = (int)sysType.EZNC_SYS_MAGICCARD64; break; case "M6x5M": lSystemType = (int)sysType.EZNC_SYS_MELDAS6X5M; break; case "M6x5L": lSystemType = (int)sysType.EZNC_SYS_MELDAS6X5L; break; case "C6/C64": lSystemType = (int)sysType.EZNC_SYS_MELDASC6C64; break; case "M700M": lSystemType = (int)sysType.EZNC_SYS_MELDAS700M; break; case "M700L": lSystemType = (int)sysType.EZNC_SYS_MELDAS700L; break; case "M800M": lSystemType = (int)sysType.EZNC_SYS_MELDAS800M; break; case "M800L": lSystemType = (int)sysType.EZNC_SYS_MELDAS800L; break; case "M80B": break; default: MessageBox.Show("三菱NC 类型选取错误!"); return; } lMachine = Convert.ToInt32(nCCardNo); lTimeOut = Convert.ToInt32(timeOut); if (string.IsNullOrEmpty(ipAdress)) { strHostName = "EZNC_LOCALHOST"; } else { if (ipAdress == "连接前请设定") { strHostName = "EZNC_LOCALHOST"; } else { strHostName = ipAdress; } } if (lSystemType == (int)sysType.EZNC_SYS_MELDASC6C64 || lSystemType == (int)sysType.EZNC_SYS_MELDAS700M || lSystemType == (int)sysType.EZNC_SYS_MELDAS700L || lSystemType == (int)sysType.EZNC_SYS_MELDAS800M || lSystemType == (int)sysType.EZNC_SYS_MELDAS800L) { if (lSystemType == (int)sysType.EZNC_SYS_MELDASC6C64) { lResult = EZNcCom.SetTCPIPProtocol(strHostName, 64758); //64758 } else { lResult = EZNcCom.SetTCPIPProtocol(strHostName, 683); //683 } ErrorCheck("SetTCPIPProtocol"); if (lResult == 0) { lResultOpen = EZNcCom.Open2(lSystemType, lMachine, lTimeOut, "EZNC_LOCALHOST");//EZNC_LOCALHOST lResult = lResultOpen; deviceList.Add(ipAdress, EZNcCom); ErrorCheck("Open"); } } else { lResultOpen = EZNcCom.Open2(lSystemType, lMachine, lTimeOut, strHostName); ErrorCheck("Open"); } } else { lResult = EZNcCom.Close(); ErrorCheck("Close"); EZNcCom = null; } } public void SimClose() { if(EZNcCom != null) { lResult = EZNcCom.Close(); ErrorCheck("Close"); } EZNcCom = null; } /// /// 获取版本号 /// IAxistNo:设置轴号(从轴1 =从1) /// lIndex:设置参数编号。 /*lIndex=0: NC系统S / W编号,名称和PLC版本取决于系统规格。 lIndex=1控制单元,扩展单元取决于系统规格。 lIndex=2 RIO单元,终端RIO单元轴设置仅适用于C70。取决于系统规格。*/ /* 以UNICODE字符串形式获取各种NC系统软件版本信息。 0:获取NC系统的系统S / W编号,名称和PLC版本。 字符串数据的格式如下: NC系统软件编号\ tNC系统名称\ t可编程控制器系统编号\ 0在NC系统编号和NC系统的S / W名称之间插入TAB代码。数据的末尾变成NULL代码。输出示例:“BND-2005W000-A0三菱CNC 830WM” 如果没有项目,将会出现一个TAB代码。如果终止项不存在,则为NULL.代码将遵循TAB代码。 1:获取控制单元和扩展单元版本。 字符串数据的格式如下。 控制单元号\ t扩展单元号\ 0 在控制单元号码和分机号码之间插入一个TAB代码。 数据的末尾变成NULL代码。 2:获取RIO单元和终端RIO单元版本。 字符串数据的格式如下。 RIO单元号\ tTerminal RIO单元号\ 0 M700有RIO单元1 \ t RIO单元2 \ t ... \ 0有24个项目。 M700 / M800系列有RIO单元1¥RIO单元2¥t5 ...¥0最多32项(*)。 *确认与MTB的RIO单元的数量。 在RIO单元号码和终端RIO单元号码之间插入TAB代码。 数据的末尾变成NULL代码。 由于在本产品中分配字符串区域内存,使用VC ++的客户端需要 用CoTaskMemFree()显式释放字符串区域内存。*/ /// public void GetSimVersion(int lAxistNo, int lIndex, out string version) { version = ""; try { if (EZNcCom != null) { lResult = EZNcCom.System_GetVersion(lAxistNo, lIndex, out version);//系统号码,名称,控制S/W版本取得 ErrorCheck("GetVersion"); } } catch { ErrorCheck("通讯已关闭"); version = ""; } } /// /// 获取自动运行状态: /// lindex=0:刀具测量。plStatus=0:刀具未测量;=1:已测量 /// lindex=1:在自动运行模式下:获取系统自动运行的状态指示。plStatus=0:无自动运行;=1:自动运行 /// lindex=2:自动运行开始:获取系统自动运行的状态指示,并且正在执行移动命令或M,S,T,B进程. 。plStatus=0:没有开始自动运行;=1:开始自动运行 /// lindex=3:自动运行暂停:在执行移动指令或其他自动操作指令时,获取表示自动操作暂停的状态。plStatus=0:无暂停;=1:暂停 /// 函数说明: /// 获取运行状态。自动运行暂停功能仅在M700 / M800系列中有效。指示PLC接口自动运行状态的信号包括“自动运行”,“自动运行启动”和“自动运行暂停”。   /// 在每个状态下这三个信号的ON / OFF状态如下所示。 /// public void GetRunStatus(int lindex,out int plStatus) { plStatus = 0; try { if (EZNcCom != null) { lResult = EZNcCom.Status_GetRunStatus(lindex, out plStatus); ErrorCheck("GetRunStatus"); } } catch { ErrorCheck("通讯已关闭"); } } #region 轴坐标 double dPosition = 0.0f; /* //注意这里的库用的是表示度为14的,下方有表示度282的另一个方法。别用错库。*/ /// /// 获取机械坐标 /// public void GetAxisPosition(int axistno,out Communicationcs DataContainer ) { DataContainer = new Communicationcs(); try { if (EZNcCom != null) { for (int i = 1; i <= axistno; i++) { #region 获取剩余行程 lResult = EZNcCom.Position_GetDistance2(i, out dPosition, 0); ErrorCheck("GetDisTance"); if (lResult == 0) { DataContainer.simDisPos.Add(dPosition.ToString("#0.000")); } #endregion #region 获取当前坐标(相对坐标) lResult = EZNcCom.Position_GetCurrentPosition(i, out dPosition); ErrorCheck("GetCurrentPosition"); if (lResult == 0) { DataContainer.simCurPos.Add(dPosition.ToString("#0.000")); } #endregion #region 获取工件坐标 lResult = EZNcCom.Position_GetWorkPosition(i, out dPosition, 0); ErrorCheck("GetWorkPosition"); if (lResult == 0) { DataContainer.simWorkPos.Add(dPosition.ToString("#0.000")); } #endregion #region 获取机械坐标 lResult = EZNcCom.Position_GetMachinePosition(1, out dPosition, 0); ErrorCheck("GetMachinePosition"); if (lResult == 0) { DataContainer.simMaPos.Add(dPosition.ToString("#0.000")); } #endregion } } } catch { ErrorCheck("通讯已关闭" ); } } #endregion /// /// 获取主轴信息 /// public void GetSpindleInfo(int index,int lspindle,out int pldata, out string loadstr) { #region 接口描述 /*** 主轴监视 * lIndex:设置主轴的参数编号。 * lIndex 描述数据 范围 备注 * 0 增益。 主轴位置回路增益。 单位:1 / s * 1 下垂。 位置偏差量。 单位:L * 2 主轴(SR,SF)转速。 主轴电机转速。 包括进给。 0[RPM] * 3 负载。 主轴电机负载。 0 [%] * 4 LED显示屏。 驱动器上有7段LED显示屏。 从“00 \ 0”到“FF \ 0”输出一个3位数的字符串。 * 5 报警1。 最多3个字母数字字符 * 6 报警2 同上 * 7 报警3 同上 * 8 报警4 同上 M700/M800 series onl * 10 周期计数器。 * 11 控制输入1。 * 12 * 13 * 14 * 15 控制输出1。 * 16 * 17 * 18 * 19 * **lSpindle:设定主轴编号。 * ** plData:返回主轴状态。 * ** lppwszBuffer:获取主轴信息作为UNICODE字符串。 * ***/ /*** 主轴诊断 * AxisNo:设置轴号(从轴1 = 1) * lIndex:设置诊断信息。 * lIndex 描述数据 范围 备注 * 0 工作时长 * 1 报警记录1(报警号码)。 上一个主轴报警号码 * 2 2(报警号码)。 * 3 3(报警号码)。 * 4 4(报警号码)。 * 5 5(报警号码)。 * 6 6(报警号码)。 * 7 7(报警号码)。 * 8 8(报警号码)。 * 11 报警记录1(时间)。 上一个主轴报警时间 * 12 2(时间)。 * 13 3(时间)。 * 14 4(时间)。 * 15 5(时间)。 * 16 6(时间)。 * 17 7(时间)。 * 18 8(时间)。 * ***/ #endregion pldata=-1; loadstr=""; try { if (EZNcCom != null) { lResult = EZNcCom.Monitor_GetSpindleMonitor(index, lspindle, out pldata, out loadstr); ErrorCheck("GetSpindleMonitor"); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 获取伺服轴信息 /// lAxisNo: Sets the axis No. (From Axis 1 = from 1) ///lindex:设置在所述一组系统中设定轴号的参数号。 /****************** * lIndex Description Data range Remarks * 0 获得:位置增益回路显示 1/s * 1 下垂:跟踪延迟 i * 2 实际的电机速度 rpm * 3 负载电流,电机电流(停机时转换为连续电流显示)。 % * 4 最大电流1 % * 5 最大电流2 % * 6 超负荷 % * 7 重新加载,再生负载 % * 10 周期计数器 pulse * 101 报警1 输出一个3位数字字符串。 * ****************/ ///plData:返回轴的状态。 ///lppwszBuffer:输出数据(返回值)作为UNICODE字符串,当任何100到104为lIndex设置。 ///对于M700 / M800系列,当lIndex设置为11到15,18到20或100到104中的任意一个时,将数据(返回值)作为UNICODE字符串输出。 ///获取设定零件系统中设定轴号的伺服监控信息。当索引表中的数据范围为[单位:指令单位]时,需要根据三菱CNC的指令单位进行转换。 设定单位请参照三菱CNC的规格 /// public void GetServoInfo(int lAxisNo,int index,out int plData,out string loaStr,string alarmCode) { plData = -1; loaStr = ""; try { if (EZNcCom != null) { lResult = EZNcCom.Monitor_GetServoMonitor(lAxisNo, index, out plData, out loaStr); ErrorCheck(alarmCode); } } catch { ErrorCheck("通讯已关闭"); } } /// /// Group: 设置参数的组号。这个似乎对读取数据没影响 /// item:参数号 /// Size:设置读取参数的数量。 范围从1开始。最多可取5个 /// lAxis:设置要获取参数的轴。除非需要获取的参数取决于轴,否则不需要设置该参数 /// /// public void GetParaValue(int lGroup, int lItem, int lSize, int lAxis, out string overValue) { object pvValue=null; overValue = ""; try { if (EZNcCom != null) { if (lGroup == 3) { for (int i = 1; i <= lAxis; i++) { lResult = EZNcCom.Parameter_GetData3(lGroup, lItem, lSize, i, out pvValue); } } else { lResult = EZNcCom.Parameter_GetData3(lGroup, lItem, lSize, 1, out pvValue); } ErrorCheck("GetParameterData"); var value = pvValue as string[]; if (value != null&&value .Count() >=0) { overValue = value[0]; } } } catch { ErrorCheck("通讯已关闭"); } } /// /// 获取进给速递 ///FeedSpeedType:进给速度类型,设置要获得的进给速度的类型。 /*FeedSpeedType=0;指令进给速度(FA) =1;手动有效进给速度(FM) =2;同步进给速度(FS) =3;攻丝(FE) pdspeed:返回指定系统的进给速度。*/ /// public void GetFeedSpeed(int lFeedType,out double pdSpeed,string alarmMsg) { pdSpeed = 0.0; try { if (EZNcCom != null) { lResult = EZNcCom.Position_GetFeedSpeed(lFeedType, out pdSpeed); ErrorCheck(alarmMsg); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 获取报警消息 /// lMessageNumber:设置要获取的消息的数量。 值:1至10(最大) /// lAlarmType:设置要获取的警报类型 /// M_ALM_NC_ALARM: NC报警 /// M_ALM_STOP_CODEL:停止代码 /// M_ALM_PLC_ALARM :PLC报警消息 /// M_ALM_OPE_MSG:操作员消息 /// M_ALM_ALL_ALARM:不区分报警类型 /// lppwszBuffer:以UNICODE字符串形式获取报警信息。消息格式包括CR,LF代码来区分消息。 此外,在消息的末尾插入NULL。 ///获取设定NC控制单元中当前产生的报警的报警信息。该报警信息的语言符合NC参数(#1043 lang)。 ///消息按重要性降序排列。由于在本产品中分配字符串区域内存,使用VC ++的客户端需要用CoTaskMemFree()显式释放字符串区域内存。 ///M800系列不支持此功能。 (EZ_ERR_NOT_SUPPORT返回plRet。) /// public void GetAlarm(out string[] AlarmMsg) { AlarmMsg = new string[3]; int[] lRes = new int[3]; int tmp = 0; try { if (EZNcCom != null) { if (lSystemType == (int)sysType.EZNC_SYS_MELDAS6X5M || lSystemType == (int)sysType.EZNC_SYS_MELDASC6C64) { lRes[0] = EZNcCom.System_GetAlarm2(3, (int)alarmType.M_ALM_NC_ALARM, out AlarmMsg[0]); lResult = lRes[0]; ErrorCheck("GetAlarm"); lRes[1] = EZNcCom.System_GetAlarm2(3, (int)alarmType.M_ALM_PLC_ALARM, out AlarmMsg[1]); lResult = lRes[1]; ErrorCheck("GetAlarm"); lRes[2] = EZNcCom.System_GetAlarm2(3, (int)alarmType.M_ALM_OPE_MSG, out AlarmMsg[2]); lResult = lRes[2]; ErrorCheck("GetAlarm"); if (lRes[0] + lRes[1] + lRes[2] == 0) { for (int K = 0; K < 3; K++) { if (!string.IsNullOrEmpty(AlarmMsg[K])) { } } } } if (lSystemType == (int)sysType.EZNC_SYS_MAGICBOARD64 || lSystemType == (int)sysType.EZNC_SYS_MELDAS700M || lSystemType == (int)sysType.EZNC_SYS_MELDAS700L || lSystemType == (int)sysType.EZNC_SYS_MELDAS800M || lSystemType == (int)sysType.EZNC_SYS_MELDAS800L || lSystemType == (int)sysType.EZNC_SYS_MELDAS6X5L) { lResult = EZNcCom.System_GetAlarm2(10, (int)alarmType.M_ALM_ALL_ALARM, out AlarmMsg[0]); ErrorCheck("GetAlarm"); } } } catch { ErrorCheck("通讯已关闭"); } } /// /// 获取自动运行时间 /// /plTime:返回自动运行开始的总处理时间(小时,分钟,秒),使用内存(磁带)或MDI模式到M02 / M30的终止或复位操作。 ///值:0到99995959 ///输出示例:9999:59:59 = 99995959 ///从存储器(磁带)开始的自动运行开始或MDI模式到M02 / M30的终止或复位操作获取总处理时间(小时,分钟,秒)。当值达到最大值时停止积分,并保持最大值。 /// public void GetRunTime(out int plTime) { plTime = 0; try { if (EZNcCom != null) { lResult = EZNcCom.Time_GetRunTime(out plTime); ErrorCheck("Time_GetRunTime"); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 读取PLC参数 /// public void GetPLCPar(int lindex,out int value) { value = 0; try { if (EZNcCom != null) { lResult = EZNcCom.Parameter_GetPlcParameter(lindex, out value); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 读取程序号 ///lProgramType:设置程序类型。 ///EZNC_MAINPRG::主程序//EZNC_SUBPRG子程序 ///ppwszProgramNo:返回已完成搜索的程序的编号.目前以UNICODE字符串自动运行。 程序编号作为M700 / M800系列的程序文件名。 ///自动返回已完成搜索或当前搜索的程序的编号 /// /// public void GetProgramNumber(out string PrgNo) { string szPrgNo; int szPrg; PrgNo=null ; try { if (EZNcCom != null) { if (lSystemType == (int)sysType.EZNC_SYS_MELDAS700M || lSystemType == (int)sysType.EZNC_SYS_MELDAS700L || lSystemType == (int)sysType.EZNC_SYS_MELDAS800L) { lResult = EZNcCom.Program_GetProgramNumber2((int)progType.EZNC_MAINPRG, out szPrgNo); ErrorCheck("GetProgramNumber2"); if (lResult == 0) { PrgNo = szPrgNo; } } else { lResult = EZNcCom.Program_GetProgramNumber((int)progType.EZNC_MAINPRG, out szPrg); ErrorCheck("GetProgramNumber"); if (lResult == 0) { PrgNo = szPrg.ToString (); } } } else { ErrorCheck("获取GetProgramNumber2失败"); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 程序序列号取得 /// public void GetSequenceNo(out int lSequenceNo) { lSequenceNo = 0; int sequenceNo = 0; try { if (EZNcCom != null) { lResult = EZNcCom.Program_GetSequenceNumber((int)progType.EZNC_MAINPRG, out sequenceNo); ErrorCheck("GetsequenceNumber"); if (lResult == 0) { lSequenceNo = sequenceNo; } else { ErrorCheck("获取GetProgramNumber2失败"); } } else { ErrorCheck("通讯对象未建立"); } } catch { ErrorCheck("通讯已关闭"); } } /// ///获取当前正在运行程序 ///当前块读出 ///lBlockNumber:设置要获取的块数。 值:1到10 ///lppwszProgramData:以UNICODE字符串的形式获取程序块。 分开程序块,CR,LF代码插入它们之间。 另外,在NULL处插入NULL结束。 ///plCurrentBlockNo:返回得到的块中正在执行的块号。 ///0未运行 ///1第一块 ///2第二块 ///获取已经完成操作搜索的程序或正在执行的程序。 读取正在运行的程序段或者运行中的程序段。 /// public void GetProgram(out string PrgData) { string szPrgData = null; PrgData = "null"; int lCurrentBlkNo; try { if (EZNcCom != null) { lResult = EZNcCom.Program_CurrentBlockRead(10, out szPrgData, out lCurrentBlkNo); ErrorCheck("CurrentBlockRead"); if (lResult == 0) { PrgData = szPrgData; } else { ErrorCheck("获取GetProgramNumber2失败"); } } else { ErrorCheck("通讯对象未建立"); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 获取刀具偏置组数 /// 返回设定零件系统的刀具偏置组数。组数由NC规格决定。值含义:200 = 200 [sets] /// public void GetToolSetSize(out int toolSetSize) { int toolCount; toolSetSize = 0; try { if (EZNcCom != null) { lResult = EZNcCom.Tool_GetToolSetSize(out toolCount); ErrorCheck("Tool_GetToolSetSize"); if (lResult == 0) { toolSetSize = toolCount; } else { ErrorCheck("Tool_GetToolSetSize失败"); } } } catch { ErrorCheck("通讯已关闭"); } } /// ///获取刀补信息 ///lType:设置刀具补偿类型。 请参阅参数表。 ///lKind:设置刀具补偿量的类型。 请参阅参数表。 ///lToolSetNo:设置刀具偏置组号。可以通过GetToolSetSize()获取组数。 ///pdOffset:返回刀具偏置量。 请参阅参数表。 ///plNo:返回假想的刀尖点数。 请参阅参数表。仅L系统类型。 除L系统类型外,不返回任何内容。 ///Function:获取设定零件系统/轴号的刀具偏置量。参数表中显示的范围因三菱CNC的英制,公制等指令单位而异。 有关详细信息,请参阅每个三菱CNC的安装手册。 /// public void GetToolOffSet(int lType,int lKind,int lToolSetNo,out double offSet,out int no) { offSet = -1; no = -1; double pdOffSet; int plNo; try { if (EZNcCom != null) { lResult = EZNcCom.Tool_GetOffset(lType, lKind, lToolSetNo, out pdOffSet, out plNo); ErrorCheck("GetOffset"); if (lResult == 0) { offSet = pdOffSet; no = plNo; } else { ErrorCheck("获取GetOffset失败"); } } else { ErrorCheck("通讯对象未建立"); } } catch { ErrorCheck("通讯已关闭"); } } #region 文件相关 /// /// 驱动信息取得 ///lppwszDriveInfo:以UNICODE字符串形式获取驱动器信息。 ///驱动器信息的格式如下所示: ///驱动器名称:CRLFDrive名称:CRLF ...驱动器名称:CRLF \ 0 ///要分隔驱动器名称,将在它们之间插入CR,LF代码。 数据的结尾 ///成为CR,LF代码和NULL代码。 数据的末尾变成NULL代码。 /// public void GetDriveInfomation(out string driveInfo) { string lppwszDriveInfo; driveInfo = null; try { if (EZNcCom != null) { lResult = EZNcCom.File_GetDriveInformation(out lppwszDriveInfo); if (lResult != 0) { driveInfo = lppwszDriveInfo; } else { ErrorCheck(" When a drive does not exist"); } } } catch { ErrorCheck("通讯已关闭"); } } /// /// 目录检索 /// lpcwszDirectryName:将目录名称设置为UNICODE字符串。 ///使用绝对路径指定目录,如下所示: ///驱动器名称+“:”+ \目录名称\文件名称... 获取设置的文件名称信息。 (注1) ///驱动器名称+“:”+“\ Directory name”... 获取设置的目录名称信息。 (注1) ///驱动器名称+“:”+ \目录名称\ ... 获取设置的目录信息。 ///(注1)该设置适用于M700 / M800系列。 ///FileType:设置要读取的数据的类型和格式。以下内容也可以用管道(|)设置。 当设置NULL时,读取文件信息。 ///值含义 ////EZNC_DISK_DIRTYPE 读取目录信息 ///EZNC_DISK_COMMENT 读取的注释信息(仅在NC控制单元一侧) ///EZNC_DISK_DATE 读取日期信息(仅在个人计算机端) ///EZNC_DISK_SIZE 读取大小信息 ///lppwszFileInfo:以UNICODE字符串的形式获取文件信息。 ///文件信息的格式如下所示:文件名\大小\日期\评论\ 0.一个TAB代码插入文件名,大小,日期和评论之间。数据的末尾变成NULL代码。 ///plRet:返回是否读取文件信息或返回错误代码。 (在自动化时,使用返回值。) ///0:当没有文件信息时 ///1或更多:当存在文件信息时 ///EZNC_FILE_DIR_DATASIZE:超出了最大数据大小 ///EZNC_FILE_DIR_NOTOPEN:未打开 ///EZNC_FILE_DIR_READ:文件信息读取错误 ///EZNC_FILE_DIR_ALREADYOPENED:不同的目录已经打开 ///EZNC_FILE_DIR_NODRIVE:驱动器不存在 ///EZNC_FILE_DIR_NODIR:目录不存在 ///(注2)如果个人计算机发生错误,错误代码EZNC_FILE_ ...将变为EZNC_PCFILE_... ///Function 说明: ///搜索目录。 ///在FindDir2()中,可以通过读取一次来读取一个文件的信息。要不断获取目录信息,可以通过重复调用FindNextDir2()来获取设置目录中的文件名列表。要存储在由lpszFileInfo指示的区域中的文件信息的格式如下: ///文件名\ tSize \ tDate \ tComment \ 0 ///TAB代码插入文件名称,大小,日期和注释之间。数据的末尾变成NULL代码。仅存储在读取类型中设置的文件名后面的信息。例如,如果设置了“EZNC_DISK_COMMENT | EZNC_DISK_DATE”,则信息如下: ///文件名\ tDate \ tComment \ 0 ///如果为注释不能注释的文件设置了“EZNC_DISK_SIZE | EZNC_DISK_COMMENT” ///被添加,注释信息将不会被输出,注释将如下所示:文件名\ tSize \ t \ 0 ///对于日期无法获取的文件,设置“EZNC_DISK_SIZE | EZNC_DISK_DATE | EZNC_DISK_COMMENT“变成如下,没有日期信息输出。文件名\ tSize \ t \ tComment \ 0 ///*日期无法获得的文件是指NC控制单元上的文件侧。 ///由于字符串区域内存在本产品中分配,使用VC ++的客户端需要 ///用CoTaskMemFree()显式释放字符串区域内存。 ///(注1)读取NC侧紧凑型闪存(M700系列)的目录大小信息不支持SD卡(M800系列)。读取的目录大小信息无效。 ///(注2)对于C70,指定个人计算机上的文件并指定0lFileType,\ t被添加到文件信息的结尾(文件名\ t \ 0)。要使用获取的文件信息,请在使用前删除\ t。 ///说明: ///当使用FindDir2()时,在执行ResetDir()之前,不能执行FindDir2(),OpenFile3(),OpenNcFile2()。 ///执行时,出现“EZNC_FILE_DIR_ALREADYOPENED(0x80030101)不同目录已经打开”的错误。 使用它时,在执行FindDir2()后立即执行ResetDir()。 /// public void GetFindDir(string item,out string dirInfo) { item = null; dirInfo = null; try { if (EZNcCom != null) { lResult = EZNcCom.File_FindDir2(item, (int)fileDir.EZNC_DISK_SIZE, out dirInfo); } } catch { ErrorCheck("通讯已关闭"); } // lResult = EZNcCom.File_FindNextDir( out sss); } /// /// 目录检索结束 /// 终止目录搜索。要再次搜索目录,请执行FindDir2()。 /// public void ResertDir() { try { if (EZNcCom != null) { lResult = EZNcCom.File_ResetDir(); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 空余容量取得 /// 单位bit /// public void GetDriveSize(string path, out int driveInfo) { int lppwszDriveInfo; driveInfo = 0; try { if (EZNcCom != null) { lResult = EZNcCom.File_GetDriveSize(path, out lppwszDriveInfo); if (lResult == 0) { driveInfo = lppwszDriveInfo; } else { ErrorCheck("GetDriveInformation失败"); } } } catch { ErrorCheck("通讯已关闭"); } } /// /// 开放式加工程序专用文件 /// 打开NC程序 /// lpcwszFileName:将包含路径的文件名设置为UNICODE字符串。 /// lMode:设置打开模式。 /// 以下路径以外的路径不能使用。 /// M700系列 /// M01:\ PRG \ USER \加工程序编号 ///M01:\ PRG \ UMACRO \加工程序编号 ///M01:\ PRG \ MMACRO \加工程序编号 ///M01:\ PRG \ FIX \加工程序编号 ///M01:\ PRG \ MDI \加工程序编号 ///M800系列 ///M01:\ PRG \ USER \加工程序名称(32或更少的字母数字字符包括扩展名) ///M01:\ PRG \ MMACRO \加工程序号(100010000-199999999) ///M01:\ PRG \ FIX \加工程序号(100000010 -100009999) ///M01:\ PRG\ MDI\ MDI.PRG ///function ///在设定模式下打开加工程序文件。 创建临时文件的目录按以下优先级顺序创建: ///使用环境变量TMP指定的目录 ///安装产品的目录 ///临时文件名称是“MELDASn”。 一个数字被放置在n中。 ///OpenFile3()不能同时使用。 C70不支持此功能。 (EZ_ERR_NOT_SUPPORT返回到plRet。) ///(注1)确保使用CloseNCFile2()(或AbortNCFile2())关闭打开的文件。 如果CloseNCFile2()未使用,临时文件将保留。 ///(注2)对于M700 / M800系列,在NC控制单元自动运行期间,可以执行写入或覆盖操作,除非正在执行用于操作的文件的自动操作。 读取操作可以在NC控制单元的自动操作期间执行。 /// public void OpenNCFile(string fileName) { try { if (EZNcCom != null) { lResult = EZNcCom.File_OpenNCFile2(fileName, (int)openFileMode.EZNC_FILE_OVERWRITE); } } catch { ErrorCheck("通讯已关闭"); } } /// /// Nc程序文件关闭 /// 关闭加工程序文件。C70不支持此功能。 (EZ_ERR_NOT_SUPPORT返回到plRet。) ///(注1)对于M700 / M800系列,除非正在执行用于操作的文件的自动操作,否则可以在NC控制单元的自动操作期间执行操作。 ///(注2)使用OpenNCFile2()打开文件时,确保将其关闭CloseNCFile2()(或AborNCtFile2())。 /// public void CloseNCFile() { try { if (EZNcCom != null) { lResult = EZNcCom.File_CloseNCFile2(); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 读取NC程序 /// 长度:以字节数设置一次读取的数据大小。 /// vData:返回VARIANT中的读取字节数据数组。 ///数据从用OpenNCFile2()打开的加工程序文件中读取。 要读取的数据返回一个字节数据数组及其字节数。 当pdwNumRead小于dwLength时,确定文件结束。 ///设置一次读取的数据大小。 读取大文件时,可以分多个部分读取。 该文件可以按顺序读取,直到执行CloseNCFile2()。 ///C70不支持此功能。 (EZ_ERR_NOT_SUPPORT返回到plRet。) /// public void ReadNcFile(int lLength,out string vData,string filename) { object Data = null; vData = null; try { if (EZNcCom != null) { lResult = EZNcCom.File_OpenNCFile2(filename, (int)openFileMode.EZNC_FILE_READ); lResult = EZNcCom.File_ReadNCFile2(lLength, out Data); if (lResult == 0) { var value = Data as string[]; if (value != null && value.Count() >= 0) { vData = value[0]; } } else { ErrorCheck("ReadNCFile失败"); } EZNcCom.File_CloseNCFile2(); } else { ErrorCheck("通讯对象未建立"); } } catch { ErrorCheck("通讯已关闭"); } } /// /// 写入NC程序 /// 自动化的说法: ///vData:创建要写入字节数组的数据,并将其替换为vData(VARIANT类型),如下例所示。 ///例)Dim vWriteFile As Variant ///Dim byteWrite()As Byte ///vWriteFile = byteWrite ///function说明 ///数据被写入用OpenNCFile2()打开的加工程序文件中。 要写入的数据是字节数组中的数据。 ///设置一次写入数据的大小。 当写入大量的数据时,它可以被写入多个部分。 数据可以按顺序写入,直到执行CloseNCFile2()。 ///C70不支持此功能。 (EZ_ERR_NOT_SUPPORT返回到plRet。) ///(注)对于M700 / M800系列,当编辑锁定B(#8105)参数为1时,不能写入程序8000至9999。 当编辑锁定C(#1121)参数为1时,程序9000至9999无法写入。 /// public void WriteNcFile(string filename,string data) { object vata = data; try { if (EZNcCom != null) { lResult = EZNcCom.File_OpenNCFile2(filename, (int)openFileMode.EZNC_FILE_READ); lResult = EZNcCom.File_WriteNCFile(vata); EZNcCom.File_CloseNCFile2(); } } catch { ErrorCheck("通讯已关闭"); } } #endregion public void SetPrograme() { //try //{ string targetPath = "T1.NC"; lResult = EZNcCom.Operation_Search(targetPath,0,0); // EZNcCom.File_OpenNCFile2(targetPath, (int)openFileMode.EZNC_FILE_OVERWRITE); EZNcCom.Operation_Run(); // OpenNCFile(targetPath); if (EZNcCom != null) { lResult = EZNcCom.File_CloseNCFile2(); } //} //catch(Exception ex) //{ //} //return true; } /// /// /// /// /// /// ///M800系列 ///M01:\ PRG \ USER \加工程序名称(32或更少的字母数字字符包括扩展名) ///M01:\ PRG \ MMACRO \加工程序号(100010000-199999999) ///M01:\ PRG \ FIX \加工程序号(100000010 -100009999) ///M01:\ PRG\ MDI\ MDI.PRG public bool UpdateNCPrgToCNC(string filename) { string ErrorMsg = ""; int ErrorCode; try { if (filename == "") { ErrorMsg = "程序名不能为空."; ErrorCode = -1; return false; } if (!File.Exists(filename)) { ErrorMsg = "指定程序不存在."; ErrorCode = -1; return false; }; //if (!isConnectCNC) //{ // ReConnected(); //} // ReConnected(); //Data update cnc program from PC to cnc //*************************************************************************** //File_Copy2(lpcwszSrcFileName, lpcwszDstFileName) //lResult = dispEZNc_Com.File_Copy2("E:\\TEMP\\9005", "M01:\\PRG\\USER\\9005"); int index = filename.LastIndexOf("\\") + 1; string ncfileName = filename.Substring(index, (filename.Length - index)); string targetPath = "M01:\\PRG\\USER\\" + ncfileName; object content = ""; //int nRet = EZNcCom.File_Copy2(targetPath, "d:\\test123.NC"); //targetPath = "M01:\\PRG\\USER\\TEST.NC"; //string line; //StringBuilder sb = new StringBuilder(); //// 创建一个 StreamReader 的实例来读取文件 ,using 语句也能关闭 StreamReader //using (System.IO.StreamReader sr = new System.IO.StreamReader(filename)) //{ // // 从文件读取并显示行,直到文件的末尾 // while ((line = sr.ReadLine()) != null) // { // //Console.WriteLine(line); // sb.Append(line); // } //} //line = sb.ToString(); //EZNcCom.File_OpenNCFile2(targetPath, (int)openFileMode.EZNC_FILE_OVERWRITE); //EZNcCom.File_WriteNCFile(line); //EZNcCom.File_CloseNCFile2(); EZNcCom.File_Delete2(targetPath); int nRet = EZNcCom.File_Copy2(filename, targetPath); if (nRet == 0) { ErrorMsg = ""; ErrorCode = 0; return true; } else { long retCode = (long)nRet; //switch (retCode) //{ // case EZNcCom.EZNC_FILE_COPY_BUSY: // ErrorMsg = "Copy is disabled (during operation)"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_ENTRYOVER: // ErrorMsg = "Registration limit exceeded"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_FILEEXIST: // ErrorMsg = "Copy destination file already exists"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_FILESYSTEM: // ErrorMsg = "File system error"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_ILLEGALNAME: // ErrorMsg = "Invalid file name format"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_MEMORYOVER: // ErrorMsg = "Memory capacity exceeded"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_NODIR: // ErrorMsg = "Directory does not exist"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_NODRIVE: // ErrorMsg = "Drive does not exist"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_NOFILE: // ErrorMsg = "File does not exist"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_PLCRUN: // ErrorMsg = "Copy is disabled (programmable controller in operation)"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_READ: // ErrorMsg = "Transfer source file is not readable"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_WRITE: // ErrorMsg = "Transfer destination file is not writable"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_FILE_COPY_PROTECT: // ErrorMsg = "Copying is disabled (protected)"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_PCFILE_COPY_CREATE: // ErrorMsg = "File cannot be created (PC only)"; // ErrorCode = nRet; // break; // case EZNcErr.EZNC_PCFILE_COPY_OPEN: // ErrorMsg = "File cannot be opened (personal computer only)"; // ErrorCode = nRet; // break; // default: // ErrorMsg = "UpdateNCPrgToCNC Error"; // ErrorCode = -1; // break; //} return false; } } catch (Exception ex) { ErrorMsg = ex.Message + ex.StackTrace; return false; } finally { // FreeConnected(); } } /// /// 错误代码提示 /// /// private void ErrorCheck(string szMethod) { if (EZNcCom != null) { if (lResult != 0) { szMessage = szMethod + " Failed. " + "0x" + Convert.ToString(lResult, 16) + szMessage + "\r\n"; } else { szMessage = szMethod + "通讯正常"; } } else { szMessage = szMethod; } //发布事件 if (AlarmData != null&&szMessage!=""&&szMessage!=null) { AlarmData(szMessage); } szMessage = ""; } } }