using Cksoft.Data; using Cksoft.Unity; using DllEapEntity; using DllEapEntity.Rms; using DllHsms; using DllHsmsWeb; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using ZipFileHelper; namespace DllEapDal { public class FilesProgramDal { private IDatabase CurrDb = null; public FilesProgramDal(IDatabase db) { CurrDb = db; } public OrderDetail ReadMachineOrderDetail(int macid, int sval, int fval, ref string errorinfo) { //读取机台信息 string condition = $" and a.macid={macid}"; List macs = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (macs == null) return null; if (macs.Count <= 0) { errorinfo = $"未找到机台ID【{macid}】的机台指令信息。"; return null; } condition = $" and a.preid={macs[0].PreID} and a.sval={sval} and a.fval={fval}"; List details = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (details == null) return null; if (details.Count <= 0) { errorinfo = "未找到您要的指令。"; return null; } return details[0]; } /// /// 获取请求机台程序的指令数据 /// /// /// /// /// private List GetS2F41Data(string programname, int preid, ref string errorinfo) { string rcmd = "PP_PREP"; List ldata = new List(); OrderData lentity = new OrderData(); lentity.ID = 1; lentity.ParentID = 0; lentity.PreID = preid; lentity.FCode = "L"; lentity.FLen = 2; ldata.Add(lentity); OrderData entity = new OrderData(); entity.ID = 2; entity.ParentID = 1; entity.FNum = 10; entity.PreID = preid; entity.FCode = "A"; entity.FContent = rcmd; entity.FLen = rcmd.Length; ldata.Add(entity); entity = new OrderData();//添加L节点 entity.ID = 3; entity.ParentID = 1; entity.FNum = 20; entity.PreID = preid; entity.FCode = "L"; entity.FLen = 1; ldata.Add(entity); entity = new OrderData();//添加L节点 entity.ID = 4; entity.ParentID = 3; entity.FNum = 10; entity.PreID = preid; entity.FCode = "L"; entity.FLen = 2; ldata.Add(entity); string cpname = "PPID"; entity = new OrderData(); entity.ID = 5; entity.ParentID = 4; entity.FNum = 10; entity.PreID = preid; entity.FCode = "A"; entity.FContent = cpname; entity.FLen = cpname.Length; ldata.Add(entity); entity = new OrderData(); entity.ID = 6; entity.ParentID = 4; entity.FNum = 20; entity.PreID = preid; entity.FCode = "A"; entity.FContent = programname; entity.FLen = programname.Length; ldata.Add(entity); return ldata; } /// /// DP机台装载程序指令数据 /// /// 要装载的程序名称 /// /// /// private List GetS2F41DataForPPSelect(string programname, int preid, ref string errorinfo) { string rcmd = "PP_SELECT"; List ldata = new List(); OrderData lentity = new OrderData(); lentity.ID = 1; lentity.ParentID = 0; lentity.PreID = preid; lentity.FCode = "L"; lentity.FLen = 2; ldata.Add(lentity); OrderData entity = new OrderData(); entity.ID = 2; entity.ParentID = 1; entity.FNum = 10; entity.PreID = preid; entity.FCode = "A"; entity.FContent = rcmd; entity.FLen = rcmd.Length; ldata.Add(entity); entity = new OrderData();//添加L节点 entity.ID = 3; entity.ParentID = 1; entity.FNum = 20; entity.PreID = preid; entity.FCode = "L"; entity.FLen = 1; ldata.Add(entity); entity = new OrderData();//添加L节点 entity.ID = 4; entity.ParentID = 3; entity.FNum = 10; entity.PreID = preid; entity.FCode = "L"; entity.FLen = 2; ldata.Add(entity); string cpname = "PPID"; entity = new OrderData(); entity.ID = 5; entity.ParentID = 4; entity.FNum = 10; entity.PreID = preid; entity.FCode = "A"; entity.FContent = cpname; entity.FLen = cpname.Length; ldata.Add(entity); entity = new OrderData(); entity.ID = 6; entity.ParentID = 4; entity.FNum = 20; entity.PreID = preid; entity.FCode = "A"; entity.FContent = programname; entity.FLen = programname.Length; ldata.Add(entity); return ldata; } private List GetS2F41DataForHit(int preid, string rcmd, ref string errorinfo) { //string rcmd = "ENTER_HIT"; List ldata = new List(); OrderData lentity = new OrderData(); lentity.ID = 1; lentity.ParentID = 0; lentity.PreID = preid; lentity.FCode = "L"; lentity.FLen = 2; ldata.Add(lentity); OrderData entity = new OrderData(); entity.ID = 2; entity.ParentID = 1; entity.FNum = 10; entity.PreID = preid; entity.FCode = "A"; entity.FContent = rcmd; entity.FLen = rcmd.Length; ldata.Add(entity); entity = new OrderData();//添加L节点 entity.ID = 3; entity.ParentID = 1; entity.FNum = 20; entity.PreID = preid; entity.FCode = "L"; entity.FLen = 0; ldata.Add(entity); return ldata; } private List GetS7F5Data(string programname, int preid, ref string errorinfo) { List ldata = new List(); OrderData lentity = new OrderData(); lentity.ID = 1; lentity.ParentID = 0; lentity.PreID = preid; lentity.FCode = "A"; lentity.FContent = programname; lentity.FLen = programname.Length; ldata.Add(lentity); return ldata; } /// /// 将机台设置为1086参数 /// /// /// /// private int SetEc1086(Machine mac, ref string errorinfo) { try { HsmsWeb accessmac = new HsmsWeb(); //发送指令,将程序模式设置为hit模式 OrderDetail order = ReadMachineOrderDetail(mac.ID, 2, 41, ref errorinfo); List datas = GetS2F41DataForHit(order.PreID, "ENTER_HIT", ref errorinfo); OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); if (rec == null) return -1; int result = int.Parse(rec.Datalists[1].FContent); if (result > 0) { errorinfo = $"将机台设置为HIT模式出错,错误代码为:{result}"; return -1; } return 1; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return -1; } } /// /// 发送指令 /// /// /// /// public int SendOrder(Machine mac, int sval, int fval, ref string errorinfo) { try { string condition = $""; List macorder = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (macorder.Count <= 0) { errorinfo = $"未找到机台【{mac.FCode}】对应的指令。"; return -1; } condition = $" and a.preid={macorder[0].PreID} and a.sval={sval} and a.fval={fval}"; List order = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (order.Count <= 0) { errorinfo = $"未找到机台【{mac.FCode}】对应的S2F15指令。"; return -1; } condition = $" and a.preid={order[0].ID}"; List datas = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); HsmsWeb accessmac = new HsmsWeb(); OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order[0], datas, ref errorinfo); if (rec == null) return -1; int result = int.Parse(rec.Datalists[0].FContent); if (result > 0) { errorinfo = $"设置机台ECID参数出错,错误代码为:{result}"; return -1; } return 1; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return -1; } } /// /// 将机台设置为HIT模式 /// /// /// /// private int SetHit(Machine mac, string rcmd, ref string errorinfo) { try { HsmsWeb accessmac = new HsmsWeb(); //发送指令,将程序模式设置为hit模式 OrderDetail order = ReadMachineOrderDetail(mac.ID, 2, 41, ref errorinfo); List datas = GetS2F41DataForHit(order.PreID, rcmd, ref errorinfo); OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); if (rec == null) return -1; int result = int.Parse(rec.Datalists[1].FContent); if (result == 5) return 1; if (result == 0) return 1; return -1; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return -1; } } /// /// 获取机台当前使用的程序文件,并将文件放到指定的目录 /// /// /// /// public string ReadProgramFromMac(Machine mac, ProgramMst program, string desdir, ref string errorinfo) { try { HsmsWeb accessmac = new HsmsWeb(); //发送指令,将程序模式设置为hit模式 //OrderDetail order = ReadMachineOrderDetail(mac.ID, 2, 41, ref errorinfo); //List datas = GetS2F41DataForHit(program.FName, order.PreID, ref errorinfo); //OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); //if (rec == null) // return null; //int result = int.Parse(rec.Datalists[1].FContent); //if(result>0) //{ // errorinfo = $"将机台设置为HIT模式出错,错误代码为:{result}"; // return null; //} int result = SetHit(mac, "ENTER_HIT", ref errorinfo); if (result <= 0) { return null; } //发送取程序的指令 OrderDetail order = ReadMachineOrderDetail(mac.ID, 2, 41, ref errorinfo); List datas = GetS2F41Data(program.FName, order.PreID, ref errorinfo); OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); if (rec == null) return null; result = int.Parse(rec.Datalists[1].FContent); if (result != 0 && result != 4) { errorinfo = $"下载程序不成功,错误代码为:{rec.Datalists[1].FContent}。"; return null; } if (result == 4) { //说明机台已经开始处理程序,休眠5秒钟,等待机台处理 //或等待处理完成事件上来 Thread.Sleep(1000 * 5); } order = ReadMachineOrderDetail(mac.ID, 7, 5, ref errorinfo); datas = GetS7F5Data(program.FName, order.PreID, ref errorinfo); rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); if (rec == null) return null; datas = rec.Datalists; if (datas[0].FLen == 0) { errorinfo = "未能正确的获取程序文件。"; return ""; } result = UnityHelper.WriteFile(desdir, program.FName, datas[2].OrgDatas, ref errorinfo); if (result <= 0) return null; return program.FName; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return ""; } } /// /// 获取程序参数 /// /// /// /// /// /// public List GetProgramParams(string rarpath, Machine mac, ProgramMst program, string desdir, ref string errorinfo) { try { string programname = ReadProgramFromMac(mac, program, desdir, ref errorinfo); if (string.IsNullOrEmpty(programname)) return null; string filepath = desdir + "\\" + programname; string tempdesdir = desdir + "\\temp"; List filesdata = UnCompressForKs.GetParamsFor(rarpath, filepath, programname , tempdesdir, mac.MModeID, ref errorinfo); return filesdata; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } /// /// 根据机台编号、产品编号、制程代码等信息查找程序,返回程序ID /// /// /// /// /// /// public ProgramMst FindProgram(Machine mac, string partcode, string pcode, ref string errorinfo) { try { string condition = $" and b.ModelID={mac.MModeID} and b.ProcessCode='{pcode}'"; List rules = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (rules == null) return null; if (rules.Count <= 0) { errorinfo = "未找到对应的程序规则。"; return null; } //先精确匹配产品编号 List templist = rules.Where(t => t.PartCode == partcode).ToList(); if (templist.Count > 0) return CurrDb.FindEntityFor(templist[0].ProgramMstID); //取模糊匹配的规则 rules = rules.Where(t => t.PartCode.Contains("%")).ToList(); if (rules.Count <= 0) { errorinfo = "未找到对应的程序规则。"; return null; } //去掉规则里产品编号的“%”符号 foreach (var item in rules) { item.PartCode = item.PartCode.Replace("%", ""); } //排序规则列表,按产品编号长度从大到小排列 rules = rules.OrderByDescending(t => t.PartCode.Length).ToList(); foreach (var item in rules) { if (partcode.Contains(item.PartCode)) { return CurrDb.FindEntityFor(item.ProgramMstID); } } errorinfo = "未找到对应的程序规则。"; return null; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } /// /// 根据机台编号读取机台 /// /// /// /// public Machine ReadMachine(string maccode, ref string errorinfo) { try { string condition = $" and a.fcode='{maccode}'"; List macs = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (macs == null) { errorinfo = $"未找到机台编号【{maccode}】的机台信息。"; return null; } if (macs.Count <= 0) { errorinfo = $"未找到机台编号【{maccode}】的机台信息。"; return null; } return macs[0]; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } private void SendInfo(string maccode, string info) { try { MacOrderSendDal senddal = new MacOrderSendDal(CurrDb); string temperrorinfo = ""; senddal.SendS10F3(maccode, info, ref temperrorinfo); } catch { return; } } public string GetMacStatus(Machine mac, ref string errorinfo) { try { OrderDetail order = ReadMachineOrderDetail(mac.ID, 1, 3, ref errorinfo); if (order == null) return ""; string condition = $" and a.PreID={mac.MModeID} and b.FCode='{StandardCode.SVID_CurrentStatus}'"; List mmsecs = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (mmsecs.Count <= 0) { errorinfo = $"未找到机台【{mac.FCode}】对应的状态参数定义。"; return ""; } List datas = new List(); OrderData lentity = new OrderData(); lentity.ID = 1; lentity.ParentID = 0; lentity.PreID = order.ID; lentity.FCode = "L"; lentity.FContent = ""; lentity.FLen = 1; lentity.FNum = 10; datas.Add(lentity); lentity = new OrderData(); lentity.ID = 2; lentity.ParentID = 1; lentity.PreID = order.ID; lentity.FCode = mmsecs[0].DCode; lentity.FContent = mmsecs[0].FVal; lentity.FLen = 1; lentity.FNum = 10; datas.Add(lentity); HsmsWeb accessmac = new HsmsWeb(); OrderBlock rec = accessmac.SendOrderFor(mac.FCode, order, datas, ref errorinfo); if (rec == null) return ""; return rec.Datalists[1].FContent; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return ""; } } public int DownloadProgram(Machine mac, string orgprogramname, ref string errorinfo) { try { orgprogramname = orgprogramname.Trim(); #region #endregion //产生随机文件 int rdcount = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999); string programid = rdcount.ToString("0000"); int result = 0; if (mac.CallPMode <= 2) { //说明要下载程序 MacProgramDal macprogramdal = new MacProgramDal(CurrDb); int orgtypeid = 1; string programdir = AppConfigurtaionServices.Configuration["ProgramDir"]; if (mac.CallPMode == 1) { orgtypeid = 1; } else { orgtypeid = 2; } byte[] filedatas = macprogramdal.ReadMacProgram(mac, orgprogramname, orgtypeid, programdir, ref errorinfo); if (filedatas == null) { errorinfo = $"读取文件发生错误:{errorinfo}"; return -30; } string rootdir = AppConfigurtaionServices.Configuration["RootDir"]; string rootpath = $@"\\{mac.IPAddress}\{rootdir}\auto"; //rootpath = $@"\\10.2.30.199\c\Disco\3000\Cver\000\dev\auto"; //清空目录 DirectoryInfo dirinfo = new DirectoryInfo(rootpath); if (dirinfo.Exists) { dirinfo.Delete(true); } //清空所有程序 //string parentdir = $@"\\10.2.30.199\c\Disco\3000\Cver\000\dev"; //parentdir = $@"\\{mac.IPAddress}\{rootdir}"; //ClearProgram(rootpath); result = DownloadProgram(mac, programid, orgprogramname, filedatas, rootpath, ref errorinfo); if (result <= 0) { errorinfo = $"下载文件发生错误:{errorinfo}"; return -20; } //修改文件内容 string filecontent = $"{programid},{orgprogramname}"; result = WriteFile(rootpath, filecontent, ref errorinfo); if (result <= 0) { errorinfo = $"修改列表文件发生错误:{errorinfo}"; return result - 1; } } return 1; } catch (Exception ex) { errorinfo = "FilesProgramDal类函数DownloadProgram发生异常:" + ex.Message.ToString(); return -1; } } //清空程序目录下所有程序引导 private bool ClearProgram(string dir) { FileInfo files = new FileInfo($@"{dir}\dev.LST"); if (files.Exists) { //清空内容 StreamWriter sw = new StreamWriter(files.FullName, false, System.Text.Encoding.ASCII); sw.WriteLine(""); sw.Close(); } files = new FileInfo($@"{dir}\devid.LST"); if (files.Exists) { //清空内容 StreamWriter sw = new StreamWriter(files.FullName, false, System.Text.Encoding.ASCII); sw.WriteLine(""); sw.Close(); } DirectoryInfo dirinfo = new DirectoryInfo(dir); foreach (var item in dirinfo.GetDirectories()) { return ClearProgram(item.FullName); } return true; } public int DownloadProgram(Machine mac, string programid, string programname, byte[] filedatas, string rootpath, ref string errorinfo) { try { byte[] filelen = new byte[4]; Array.Copy(filedatas, 0, filelen, 0, 4); int dfdlen = GetFileLen(filelen); byte[] dfdfiles = new byte[dfdlen]; Array.Copy(filedatas, 12, dfdfiles, 0, dfdlen); //替换程序名称 dfdfiles = DiodesProgramFileHelper.ReplaceProgramNameForDfd(dfdfiles, programname, ref errorinfo); if (dfdfiles == null) { errorinfo = $"替换程序名称发生异常:{errorinfo}"; return -100; } int result = UnityHelper.WriteFile(rootpath, $"{programid}.dfd", dfdfiles, ref errorinfo); if (result <= 0) { errorinfo = $"写入DFD文件发生异常:{errorinfo}"; return -1; } Array.Copy(filedatas, 4, filelen, 0, 4); int clnlen = GetFileLen(filelen); byte[] clnfiles = new byte[clnlen]; Array.Copy(filedatas, 12 + dfdlen, clnfiles, 0, clnlen); result = UnityHelper.WriteFile(rootpath, $"{programid}.cln", clnfiles, ref errorinfo); if (result <= 0) { errorinfo = $"写入CLN文件发生异常:{errorinfo}"; return -1; } Array.Copy(filedatas, 8, filelen, 0, 4); int alulen = GetFileLen(filelen); byte[] alufiles = new byte[alulen]; Array.Copy(filedatas, 12 + dfdlen + clnlen, alufiles, 0, alulen); result = UnityHelper.WriteFile(rootpath, $"{programid}.alu", alufiles, ref errorinfo); if (result <= 0) { errorinfo = $"写入ALU文件发生异常:{errorinfo}"; return -1; } return 1; } catch (Exception ex) { errorinfo = $"机台编号={mac.FCode},程序ID={programid}, 程序名称={programname}, 文件长度={filedatas.Length},文件路径={rootpath} 下载文件发生异常:" + ex.Message.ToString(); return -1; } } //private int WriteFile(string filedir, string filecontent, ref string errorinfo) //{ // StreamWriter sw = null; // try // { // string filepath = filedir + "\\dev.LST"; // if (!File.Exists(@filepath)) // { // FileStream fs= File.Create(filepath); // fs.Close(); // } // sw = new StreamWriter(filepath, false, System.Text.Encoding.ASCII); // sw.WriteLine(filecontent); // sw.Close(); // filepath = filedir + "\\devid.LST"; // if (!File.Exists(@filepath)) // { // FileStream fs = File.Create(filepath); // fs.Close(); // } // sw = new StreamWriter(filepath, false, System.Text.Encoding.ASCII); // sw.WriteLine(filecontent); // sw.Close(); // return 1; // } // catch (Exception ex) // { // errorinfo = ex.Message; // return -1; // } // finally // { // if (sw != null) // sw.Close(); // } //} private int WriteFile(string filedir, string filecontent, ref string errorinfo) { try { int result = UnityHelper.WriteFile(filedir, $"dev.LST", System.Text.Encoding.ASCII.GetBytes(filecontent), ref errorinfo); if (result <= 0) return -1; result = UnityHelper.WriteFile(filedir, $"devid.LST", System.Text.Encoding.ASCII.GetBytes(filecontent), ref errorinfo); if (result <= 0) return -1; return 1; } catch (Exception ex) { errorinfo = ex.Message; return -1; } } private int GetFileLen(byte[] filelen) { return BitConverter.ToInt32(filelen, 0); } public int DownloadProgram(string maccode, string orgprogramname, ref string errorinfo) { try { string condition = $" and a.fcode='{maccode}'"; List macs = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (macs == null || macs.Count <= 0) { errorinfo = "未找到机台信息。"; return -1; } return DownloadProgram(macs[0], orgprogramname, ref errorinfo); } catch (Exception ex) { errorinfo = $"机台编号={maccode},程序名称={orgprogramname} 发生异常:" + ex.Message.ToString(); return -1; } } } }