using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using Newtonsoft;//处理从mes获取的json字符串 using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace MEStest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int MESBackFunc(StringBuilder data); /// /// mes函数执行成功 /// public const int MesBackOK = 0; /// /// MES的句柄 /// public static int hMes = 0; private const string DLLPATH = "HQMES.dll"; [DllImport(DLLPATH)] public static extern int MesInit(MESBackFunc func, ref int hMes, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] public static extern int MesStart(int hMes, string SN, string ActionName, string Tools, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] public static extern int MesStart2(int hMes, string SN, string SNType, string ActionName, string Tools, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] public static extern int MesEnd(int hMes, string SN, string ActionName, string Tools, string ErrorCode, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] public static extern int MesEnd2(int hMes, string SN, string SNType, string ActionName, string Tools, string ErrorCode, string AllData, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] private static extern int MesSaveAndGetExtraInfo(int hMes, string G_TYPE, string G_POSITION, string G_KEY, string G_VALUE, string G_EXTINFO, StringBuilder sInfo, ref int InfoLen); [DllImport(DLLPATH)] public static extern int MesUnInit(int hMes); /// /// 回调函数 /// /// /// public static int WriteLogFile(StringBuilder data) { //MessageBox.Show(data.ToString()); return 0; } static int hmes = 0; private static MESBackFunc tempFunc;// 必须要加一个变量,这样不会被回收 private void btMesInit_Click(object sender, EventArgs e) { int len = 102400; StringBuilder strdata = new StringBuilder(len); if (hMes == 0) { tempFunc = WriteLogFile; // 必须要加一个变量,这样不会被回收 这个回调函数赋值只能放在这个位置,防止当多次点击init之后可能会出现回调函数被回收的现象 if (0 == MesInit(tempFunc, ref hMes, strdata, ref len)) { JObject jt = (JObject)JsonConvert.DeserializeObject(strdata.ToString()); string version = ""; version = jt.GetValue("H_MSG") == null ? "" : jt.GetValue("H_MSG").ToString();//获取meshelepr的版本 MessageBox.Show("初始化链接MES 成功 !MEShelper版本:" + version);//strdata会返回一个meshelper的版本号表示初始化成功 } else { hMes = 0; MessageBox.Show("初始化链接MES 失败 !"); } ; } else { MessageBox.Show("请勿重复初始化MES链接!"); } } private void btMesStart_Click(object sender, EventArgs e)//messtart函数,用来执行一般过站操作,只能使用sn过站,如需使用别的类型过站,请使用MesStart2函数 { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); //StringBuilder SN = new StringBuilder("12345678901002"); //StringBuilder ActionName = new StringBuilder("BT"); //StringBuilder toolName = new StringBuilder("PRESSTOOL"); string SN = tBSN.Text; string ActionName = tBStationHand.Text; string toolName = tBTool.Text; string data = ""; string msg = ""; string retdata = ""; string needload = ""; if (0 == MesStart(hMes, SN, ActionName, toolName, strdata, ref len)) { MessageBox.Show("链接MES 成功 !/r/n" + strdata.ToString()); //start参数的解析,具体字段定义请参考《华勤MESHelper接口工具使用说明》 JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString()); data = jo.GetValue("DATA") == null ? "" : jo.GetValue("DATA").ToString(); //data是一个json字符串,其中包含mes返回的主要字段,按照这个参考继续解析出来 例如获取CSN JObject jb = (JObject)JsonConvert.DeserializeObject(data); string CSN = jb.GetValue("CSN") ==null?"":jb.GetValue("CSN").ToString(); // msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString(); retdata = jo.GetValue("G_RET_DATA") == null ? "" : jo.GetValue("G_RET_DATA").ToString();//标记工具需要回传给MES的字段,是json格式,将其解析出来可以得到字段,工具必须将该字段赋值并回传给MES,在endmes函数回传 needload = jo.GetValue("NeedLoad") == null ? "" : jo.GetValue("NeedLoad").ToString();//标记工具是否需要重启 //解析结束 } else { JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString()); msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();//mes返回的错误信息最好将其在工具界面展示出来给操作人员查看 MessageBox.Show("链接MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } private void btMesGet_Click(object sender, EventArgs e) { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); string SN = tBSN.Text.ToString(); if (0 == MesSaveAndGetExtraInfo(hMes, "2", "BATROLL", SN, null, null, strdata, ref len)) { MessageBox.Show("链接MES 成功 !/r/n" + strdata.ToString()); } else { MessageBox.Show("链接MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } private void btMesSet_Click(object sender, EventArgs e) { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); string SN = tBSN.Text.ToString(); string RollData = "Max:5.100kg;Min:4.800kg;RollNum:3;Time:10s"; if (0 == MesSaveAndGetExtraInfo(hMes, "1", "BATROLL", SN, RollData, null, strdata, ref len)) { MessageBox.Show("保存数据到MES 成功 !/r/n" + strdata.ToString()); } else { MessageBox.Show("保存数据到MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } private void btMesEnd_Click(object sender, EventArgs e)//mesend函数仅仅向mes回传工具运行情况的错误码和错误描述,如需向mes回传特定字段请使用MesEnd2函数 { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); strdata.Append(textBox3.Text);//错误描述 string SN = tBSN.Text.ToString(); string ActionName = tBStationHand.Text;//工具动作 string toolName = tBTool.Text;//工具版本 string ErrorCode = textBox1.Text;//错误码 0表示测试成功,其它表示失败 string nextws = "";//表示下一个工位 string msg = "";//过站的错误信息 if (0 == MesEnd(hMes, SN, ActionName, toolName, ErrorCode, strdata, ref len)) { JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString()); msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString(); nextws = jo.GetValue("G_NEXTWS") == null ? "" : jo.GetValue("G_NEXTWS").ToString(); MessageBox.Show("保存数据到MES 成功 !/r/n" + strdata.ToString()); } else { JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString()); msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();//表示过站的错误信息,最好展示在工具的界面方便操作人员查看 MessageBox.Show("保存数据到MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } private void btMesUnInit_Click(object sender, EventArgs e) { if (hMes != 0) { if (0 == MesUnInit(hMes)) { MessageBox.Show("释放MES链接 成功 !"); } else { MessageBox.Show("释放MES链接 失败 !"); } } else { MessageBox.Show("请初始化MES链接!"); } } private void button1_Click(object sender, EventArgs e) { if (hMes != 0) { //StringBuilder SN = new StringBuilder("12345678901002"); //StringBuilder ActionName = new StringBuilder("BT"); //StringBuilder toolName = new StringBuilder("PRESSTOOL"); string SN = tBSN.Text; string ActionName = tBStationHand.Text; string toolName = tBTool.Text; for (int i = 0; i < 16; i++) { int len = 102400; StringBuilder strdata = new StringBuilder(len); if (0 == MesStart(hMes, SN, ActionName, toolName, strdata, ref len)) { //MessageBox.Show("链接MES 成功 !/r/n" + strdata.ToString()); } else { //MessageBox.Show("链接MES 失败 !/r/n" + strdata.ToString()); } } } else { MessageBox.Show("请初始化MES链接!"); } } private void textBox4_TextChanged(object sender, EventArgs e) { } private void button1_Click_1(object sender, EventArgs e) { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); strdata.Append(textBox1.Text); string SN = tBSN.Text; string ActionName = tBStationHand.Text; string toolName = tBTool.Text; string ErrorCode = textBox3.Text; string AllData = textBox2.Text;//表示需要回传给mes的字段,json字符串形式传递 string SNType = "1";// //start //假设需要回传的字段为a,值为1,将字段a上抛 //JObject data = new JObject(); //data.Add("a", "1"); //AllData = data.ToString(); //当遇到数据较多的时候,可以使用Dictionary类型存储数据,然后序列化 //end if (0 == MesEnd2(hMes, SN, "1", ActionName, toolName, ErrorCode, AllData, strdata, ref len)) { //这个函数返回的值跟MesEnd一样,请参考MesEnd的解析参数的操作 MessageBox.Show("保存数据到MES 成功 !/r/n" + strdata.ToString()); } else { MessageBox.Show("保存数据到MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } private void label2_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { if (hMes != 0) { int len = 102400; StringBuilder strdata = new StringBuilder(len); //StringBuilder SN = new StringBuilder("12345678901002"); //StringBuilder ActionName = new StringBuilder("BT"); //StringBuilder toolName = new StringBuilder("PRESSTOOL"); string SN = tBSN.Text; string ActionName = tBStationHand.Text; string toolName = tBTool.Text; string ErrorCode = textBox1.Text; string ErrorDes = textBox3.Text; string AllData = textBox2.Text; string SNType = "1";//表示流程检查的输入数据类型:1 SN 2 IMEI 3 CSN 4 蓝牙 5 WiFi 6 入网证 if (0 == MesStart2(hMes, SN,SNType, ActionName, toolName, strdata, ref len)) { //这个函数返回的值跟MesStart一样,请参考MesStart的解析参数的操作 MessageBox.Show("链接MES 成功 !/r/n" + strdata.ToString()); } else { MessageBox.Show("链接MES 失败 !/r/n" + strdata.ToString()); } } else { MessageBox.Show("请初始化MES链接!"); } } } }