using IMCS.Device.FanucBase; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YG.Device; using static IMCS.Device.FanucBase.Focas1; namespace IMCS.Device { public class Fanuc : Focas1 { //下载程序 5-27 //开始 private static short dwnstart(ushort handle, short type) { return Fanuc.cnc_dwnstart3(handle, type); } //结束 private static short dwnend(ushort handle) { return Fanuc.cnc_dwnend3(handle); } //下载 private static short dwnload(ushort handle, ref int datalength, string data) { //开始下载程序 datalength将会被返回,实际的输出的字符数量 return Fanuc.cnc_download3(handle, ref datalength, data); } //获取详细的错误信息 private static short getdtailerr(ushort handle, Fanuc.ODBERR odberr) { return Fanuc.cnc_getdtailerr(handle, odberr); } //下载程序的入口点 /// /// 向CNC下载指定类型的程序 /// /// 句柄 /// 程序类型 /// 程序的内容 /// 保存返回错误信息的详细内容,为null不返回 /// 错误码 public static short download(ushort handle, short type, string data, Fanuc.ODBERR odberr) { int datalength = data.Length; short ret = dwnstart(handle, type); if (ret == 0) { int olddata = datalength; while (true) { ret = dwnload(handle, ref datalength, data); //说明缓存已满或为空,继续尝试 if (ret == (short)Fanuc.focas_ret.EW_BUFFER) { continue; } if (ret == Fanuc.EW_OK) { //说明当前下载完成,temp记录剩余下载量 int temp = olddata - datalength; if (temp <= 0) { break; } else { data = data.Substring(datalength, temp); datalength = temp; olddata = temp; } } else { //下载出现错误,解析出具体的错误信息 if (odberr != null) { getdtailerr(handle, odberr); } //下载出错 break; } } //判断是哪里出的问题 if (ret == 0) { ret = dwnend(handle); //结束下载出错 return ret; } else { dwnend(handle); //下载出错 return ret; } } else { dwnend(handle); //开始下载出错 return ret; } } //下载程序 5-27 //上传程序 5-28 //开始 private static short upstart(ushort handle, short type, int startno, int endno) { return cnc_upstart3(handle, type, startno, endno); } //上传 private static short uplod(ushort handle, int length, char[] databuf) { return cnc_upload3(handle, ref length, databuf); } //结束 private static short upend(ushort handle) { return cnc_upend3(handle); } //上传程序的入口 /// /// 根据程序号读取指定程序 /// /// 句柄 /// 类型 /// 程序号 /// 详细错误内容,null不返回 /// 返回的程序内容 /// 错误码 public static short upload(ushort handle, short type, int no, ref string data, Fanuc.ODBERR odberr) { int startno = no; int endno = no; int length = 256; char[] databuf = new char[256]; short ret = upstart(handle, type, startno, endno); if (ret == Fanuc.EW_OK) { string temp = ""; while (true) { //上传 ret = uplod(handle, length, databuf); temp = new string(databuf); int one = temp.Length; if (ret == (short)Fanuc.focas_ret.EW_BUFFER) { continue; } if (ret == Fanuc.EW_OK) { temp = temp.Replace("\0", ""); data += temp; string lastchar = temp.Substring(temp.Length - 1, 1); if (lastchar == "%") { break; } } else { //下载出现错误,解析出具体的错误信息 if (odberr != null) { getdtailerr(handle, odberr); } //下载出错 break; } } //判断是哪里出的问题 if (ret == 0) { ret = upend(handle); //结束上传出错 return ret; } else { upend(handle); //上传出错 return ret; } } else { //开始出错 upend(handle); return ret; } } //上传程序 5-28 //根据alm_grp 编号 返回 提示内容 简 public static string getalmgrp(short no) { string ret = ""; switch (no) { case 0: ret = "SW"; break; case 1: ret = "PW"; break; case 2: ret = "IO"; break; case 3: ret = "PS"; break; case 4: ret = "OT"; break; case 5: ret = "OH"; break; case 6: ret = "SV"; break; case 7: ret = "SR"; break; case 8: ret = "MC"; break; case 9: ret = "SP"; break; case 10: ret = "DS"; break; case 11: ret = "IE"; break; case 12: ret = "BG"; break; case 13: ret = "SN"; break; case 14: ret = "reserved"; break; case 15: ret = "EX"; break; case 19: ret = "PC"; break; default: ret = "Not used"; break; } return ret; } //根据alm_grp 编号 返回 提示内容 简 //2016-6-2 根据地址码和地址号,返回完整的显示信息 public static string getpmcadd(short a, ushort b) { string tempa = ""; switch (a) { case 0: tempa = "G"; break; case 1: tempa = "F"; break; case 2: tempa = "Y"; break; case 3: tempa = "X"; break; case 4: tempa = "A"; break; case 5: tempa = "R"; break; case 6: tempa = "T"; break; case 7: tempa = "K"; break; case 8: tempa = "C"; break; case 9: tempa = "D"; break; default: tempa = "n"; break; } string tempb = b.ToString().PadLeft(4, '0'); return tempa + tempb; } //2016-6-2 根据地址码和地址号,返回完整的显示信息 } /// /// 发那科 /// public class DeviceFanucHandle { public bool IsOn { get; set; } public ushort h; public DeviceFanucHandle(string ip, int port, int outtime = 10) { int ret = Fanuc.cnc_allclibhndl3(ip, Convert.ToUInt16(port), outtime, out h); if (ret == Fanuc.EW_OK) { IsOn = true; YG.Log.Instance.WriteLogAdd($"Fanuc连接成功--->{DateTime.Now}"); } else { IsOn = false; YG.Log.Instance.WriteLogAdd($"Fanuc连接失败--->{DateTime.Now}"); } } /// /// 关闭连接 /// /// public bool Fanuc_Close() { bool result = false; if (IsOn) { int ret = Fanuc.cnc_freelibhndl(h); if (ret == Fanuc.EW_OK) { YG.Log.Instance.WriteLogAdd("断开连接成功!"); result = true; } else { YG.Log.Instance.WriteLogAdd($"{ret}--->断开连接失败-->>{DateTime.Now}"); } } return result; } /// /// 读取正在执行的程序名称 /// /// public bool Fanuc_ReadCurrentProc() { bool result = false; ODBEXEPRG oDBEXEPRG = new ODBEXEPRG(); short ret = Fanuc.cnc_exeprgname(h, oDBEXEPRG); if (ret == Fanuc.EW_OK) { YG.Log.Instance.WriteLogAdd("成功读取当前正在执行的程序名称!"); result = true; } else { YG.Log.Instance.WriteLogAdd($"{ret}--->读取当前正在执行的程序名称失败-->>{DateTime.Now}"); } return result; } /// /// 读取当前机床刀具信息 /// /// public bool Fanuc_ReadTool() { bool result = false; get_tool_life(); return result; } /// /// 读取获得刀片的有关信息 /// private void get_tool_life()// { Fanuc.ODBTLIFE5 tool = new Focas1.ODBTLIFE5();//读取刀片组的序号 Fanuc.ODBTLIFE2 tool1 = new Focas1.ODBTLIFE2();// Fanuc.ODBTLIFE3 tool2 = new Focas1.ODBTLIFE3();//刀具的数量 Fanuc.ODBTG btg = new Focas1.ODBTG(); Fanuc.ODBUSEGRP grp = new Focas1.ODBUSEGRP(); int m = 2; //读取刀具寿命管理数据 Fanuc.cnc_rdgrpid2(h, m, tool); int group_numer = tool.data; int all = Fanuc.cnc_rdngrp(h, tool1);//刀片组的全部数量 short b = Convert.ToInt16(group_numer); Fanuc.cnc_rdntool(h, b, tool2);//刀具的数量 Fanuc.cnc_rdlife(h, b, tool2);//刀具寿命 Fanuc.cnc_rdcount(h, b, tool2);//刀具计时器 Fanuc.cnc_rdtoolgrp(h, 2, 20 + 20 * 1, btg);//根据刀组号读出所有信息,很重要; Fanuc.cnc_rdtlusegrp(h, grp);//读出正在使用的到组号; System.Console.WriteLine("刀片组号:" + group_numer); System.Console.WriteLine("type:" + tool.type); System.Console.WriteLine("刀片组的全部数量" + all); System.Console.WriteLine("刀片号:" + tool2.data); System.Console.WriteLine("刀片组号;" + group_numer + " 寿命:" + tool2.data); System.Console.WriteLine("刀片组号;" + group_numer + " 寿命计时:" + tool2.data); } } }