Form_Auto_baoya.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Threading;
  6. using System.Diagnostics;
  7. using StandardLibrary;
  8. using System.IO;
  9. using BZFAStandardLib;
  10. using System.Text;
  11. using System.IO.Ports;
  12. using System.Xml.Linq;
  13. using AxActUtlTypeLib;
  14. using Newtonsoft.Json.Linq;
  15. using Newtonsoft.Json;
  16. namespace MainForm
  17. {
  18. public partial class Form_Auto : Form
  19. {
  20. InovancePlc PLC_huichuan = new InovancePlc(0, "192.168.1.10", 502);
  21. AxActUtlType PLC_sanling=new AxActUtlType();//三菱PLC
  22. private object obj = new object();
  23. private int plcConnect = 1;//三菱PLC连接标志位
  24. bool Scanner1Status = false;//扫枪连接标志位
  25. bool Scanner2Status = false;
  26. bool Scanner3Status = false;
  27. private SerialPort Scanner1 = new SerialPort(AutoTool.Scom1, 115200);//扫枪串口
  28. public WebParameter web_Parameter = new WebParameter();//配置参数
  29. #region MES变量定义
  30. /// <summary>
  31. /// mes函数执行成功
  32. /// </summary>
  33. public const int MesBackOK = 0;
  34. /// <summary>
  35. /// MES的句柄
  36. /// </summary>
  37. public static int hMes = 0;
  38. public static int WriteLogFile(StringBuilder data)
  39. {
  40. //MessageBox.Show(data.ToString());
  41. return 0;
  42. }
  43. HQMES.MESBackFunc tempFunc;// 必须要加一个变量,这样不会被回收
  44. #endregion
  45. public Form_Auto()
  46. {
  47. InitializeComponent();
  48. CheckForIllegalCrossThreadCalls = false;
  49. }
  50. #region 控件随窗体自动变化
  51. /// <summary>
  52. /// 自动调整空间大小;
  53. /// </summary>
  54. private Size m_szInit;//初始窗体大小;
  55. private Dictionary<Control, System.Drawing.Rectangle> m_dicSize = new Dictionary<Control, System.Drawing.Rectangle>();
  56. protected override void OnLoad(EventArgs e)
  57. {
  58. m_szInit = this.Size;//获取初始大小;
  59. this.GetInitSize(this);
  60. base.OnLoad(e);
  61. }
  62. private void GetInitSize(Control ctrl)
  63. {
  64. foreach (Control c in ctrl.Controls)
  65. {
  66. m_dicSize.Add(c, new System.Drawing.Rectangle(c.Location, c.Size));
  67. this.GetInitSize(c);
  68. }
  69. }
  70. protected override void OnResize(EventArgs e)
  71. {
  72. //计算当前大小和初始大小的比例;
  73. float fx = (float)this.Width / m_szInit.Width;
  74. float fy = (float)this.Height / m_szInit.Height;
  75. foreach (var v in m_dicSize)
  76. {
  77. v.Key.Left = (int)(v.Value.Left * fx);
  78. v.Key.Top = (int)(v.Value.Top * fy);
  79. v.Key.Width = (int)(v.Value.Width * fx);
  80. v.Key.Height = (int)(v.Value.Height * fy);
  81. }
  82. base.OnResize(e);
  83. }
  84. protected override CreateParams CreateParams
  85. {
  86. get
  87. {
  88. CreateParams cp = base.CreateParams;
  89. cp.ExStyle |= 0x02000000;
  90. return cp;
  91. }
  92. }
  93. #endregion
  94. private void Form_Auto_Load(object sender, EventArgs e)
  95. {
  96. this.Controls.Add(PLC_sanling);
  97. Thread doworkThr = new Thread(flushDoWork);
  98. doworkThr.IsBackground = true;
  99. doworkThr.Start();
  100. #region PLC初始化
  101. try
  102. {
  103. PLC_sanling.ActLogicalStationNumber = 1;
  104. PLC_sanling.ActPassword = "";
  105. plcConnect = PLC_sanling.Open();
  106. if (plcConnect==0)
  107. {
  108. PLCtimer.Enabled = true;
  109. labPLCStatus.BackColor = Color.Green;
  110. labPLCStatus.Text = "已连接";
  111. AddMessage("与PLC通讯连接成功");
  112. }
  113. else
  114. {
  115. PLCtimer.Enabled = false;
  116. labPLCStatus.BackColor = Color.Red;
  117. labPLCStatus.Text = "未连接";
  118. AddMessage("与PLC通讯连接失败");
  119. }
  120. }
  121. catch (Exception ex)
  122. {
  123. plcConnect = 1;
  124. MessageBox.Show(ex.ToString());
  125. AddMessage("与PLC通讯连接异常,检查通讯线路");
  126. }
  127. #endregion
  128. #region 扫枪串口初始化
  129. try
  130. {
  131. Scanner1.Open();
  132. Scanner1Status = true;
  133. if (Scanner1Status)
  134. {
  135. COMstatus.BackColor = Color.Green;
  136. COMstatus.Text = "已连接";
  137. AddMessage("与扫码枪1连接成功");
  138. }
  139. else
  140. {
  141. COMstatus.BackColor = Color.Red;
  142. COMstatus.Text = "未连接";
  143. AddMessage("与扫码枪1连接失败");
  144. }
  145. }
  146. catch (Exception ex)
  147. {
  148. MessageBox.Show(ex.ToString());
  149. AddMessage("扫码枪1连接异常,检查通讯线路");
  150. }
  151. #endregion
  152. #region MES初始化
  153. MesInit();
  154. #endregion
  155. ReadXmlStatistics();
  156. AutoTool.save += SaveXmlStatistics;
  157. }
  158. short[] D7000 = new short[10];
  159. short[] D7010 = new short[5];
  160. short[] D7021 = new short[4];
  161. short temp0 = 0;
  162. short temp1 = 1;
  163. short temp2 = 2;
  164. string[] SN = new string[] { };
  165. private void flushDoWork()//工作主线程
  166. {
  167. while (true)
  168. {
  169. if (D7000[0] == 1)//扫码工位PLC请开启扫码
  170. {
  171. PLC_sanling.WriteDeviceBlock2("D7000", 1, ref temp0);
  172. FixtureSN.Text=Scaner();//扫枪扫码
  173. if (FixtureSN.Text != "")
  174. {
  175. //MES获取信息
  176. D7010[0] = 1;
  177. D7010[1] = 1;
  178. D7010[2] = 1;
  179. D7010[3] = 1;
  180. D7010[4] = 1;
  181. PLC_sanling.WriteDeviceBlock2("D7010",5, ref D7010[0]);//给PLC产品状态
  182. }
  183. else
  184. {
  185. PLC_sanling.WriteDeviceBlock2("D7010",1,ref temp2);//扫码失败
  186. AddMessage("条码扫描失败!");
  187. }
  188. InRefresh(D7010[1],D7010[2],D7010[3],D7010[4]);//刷新按钮状态
  189. }//D7000
  190. if (D7000[1] == 1)//机械手工位PLC请记录载具4穴状态
  191. {
  192. PLC_sanling.WriteDeviceBlock2("D7001",1,ref temp0);
  193. PLC_sanling.ReadDeviceBlock2("D7021",4,out D7021[0]);//从PLC读取当前产品状态
  194. //MES上传
  195. OutRefresh(D7021[0],D7021[1],D7021[2],D7021[3]);
  196. PLC_sanling.WriteDeviceBlock2("D7020",1,ref temp1);
  197. }//D7001
  198. if (D7000[2] == 1)//人工1工位PLC请开启扫码
  199. {
  200. PLC_sanling.WriteDeviceBlock2("D7002",1,ref temp0);
  201. //扫枪扫码
  202. //MES获取信息
  203. PLC_sanling.WriteDeviceBlock2("D7030", 5, ref D7010[0]);
  204. }//D7002
  205. if (D7000[3] == 1)//人工2工位PLC请开启扫码
  206. {
  207. PLC_sanling.WriteDeviceBlock2("D7003", 1, ref temp0);
  208. //扫枪扫码
  209. //MES获取信息
  210. PLC_sanling.WriteDeviceBlock2("D7040", 5, ref D7010[0]);
  211. }//D7003
  212. Thread.Sleep(800);
  213. }
  214. }
  215. private void PLCtimer_Tick(object sender, EventArgs e)//读取PLC寄存器
  216. {
  217. // PLCtimer.Stop();
  218. // PLC.H3u_Read_Int16(InovancePlc.Soft.REGI_H3U_DW, 1000, 7, ref RealValue);
  219. try
  220. {
  221. PLC_sanling.ReadDeviceBlock2("D7000", 10, out D7000[0]);
  222. }
  223. catch(Exception ex)
  224. {
  225. PLCtimer.Enabled = false;
  226. labPLCStatus.BackColor = Color.Red;
  227. labPLCStatus.Text = "未连接";
  228. AddMessage("与PLC通讯连接失败");
  229. }
  230. // PLCtimer.Start();
  231. }
  232. private void AddMessage(string message)
  233. {
  234. messageLog(message);
  235. string time = DateTime.Now.ToString("yyyy.MM.dd-HH:mm:ss");
  236. string msgShow = time + "--> " + message + "\r\n";
  237. this.BeginInvoke(new Action(() =>
  238. {
  239. dataGridView_current.Rows.Insert(0, time, message);
  240. if (dataGridView_current.Rows.Count >= 100)
  241. dataGridView_current.Rows.RemoveAt(dataGridView_current.Rows.Count - 1);
  242. }));
  243. }
  244. private void messageLog(string msg)
  245. {
  246. string path = AppDomain.CurrentDomain.BaseDirectory + "MsgLog\\";
  247. if (!Directory.Exists(path)) Directory.CreateDirectory(path);//判断路径是否存在,不存在则创建路径
  248. string FLogFile = path + "Log\\" + DateTime.Now.ToString("yyyy.MM.dd") + ".txt";
  249. string now = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss") + "--->";
  250. try
  251. {
  252. if (File.Exists(FLogFile))//判断log文件是否存在;
  253. TxtFile.WriteTxtFile(FLogFile, now + msg + "\r\n"); //存在则直接写入;
  254. else
  255. TxtFile.NewTxtFile(FLogFile, now + msg + "\r\n"); //不存在则新建并写入;
  256. }
  257. catch (Exception ex)
  258. {
  259. MessageBox.Show("异常:" + ex.Message, "Log保存", MessageBoxButtons.OK, MessageBoxIcon.Error);
  260. }
  261. }
  262. private void COMstatus_Click(object sender, EventArgs e)
  263. {
  264. try
  265. {
  266. if (!Scanner1.IsOpen)
  267. {
  268. Scanner1.Open();
  269. Scanner1Status = true;
  270. if (Scanner1Status)
  271. {
  272. COMstatus.BackColor = Color.Green;
  273. COMstatus.Text = "已连接";
  274. AddMessage("与扫码枪连接成功");
  275. }
  276. else
  277. {
  278. COMstatus.BackColor = Color.Red;
  279. COMstatus.Text = "未连接";
  280. AddMessage("与扫码枪连接失败");
  281. }
  282. }
  283. else
  284. {
  285. AddMessage("串口已经打开!");
  286. }
  287. }
  288. catch (Exception ex)
  289. {
  290. MessageBox.Show(ex.ToString());
  291. AddMessage("扫码枪连接异常,检查通讯线路");
  292. }
  293. //if (!isSFIS)
  294. //{
  295. // if (sfis.WebServiceLogin())
  296. // {
  297. // ScanerStatus.BackColor = Color.Green;
  298. // currentOP.Text = web_Parameter.op;
  299. // isSFIS = true;
  300. // }
  301. // else
  302. // {
  303. // MessageBox.Show("登录SFIS系统失败,请检查后重新登录");
  304. // AddMessage("登录失败,请检查SFIS网络!");
  305. // }
  306. //}
  307. //else
  308. //{
  309. // sfis.WebServiceLogout();
  310. // isSFIS = false;
  311. // ScanerStatus.BackColor = Color.Red;
  312. //}
  313. }
  314. private void saveCsv(string SN,string result)
  315. {
  316. lock (obj)
  317. {
  318. StreamWriter sw1 = null;
  319. string savePath = "D:\\TestData";
  320. if (!Directory.Exists(savePath))
  321. {
  322. Directory.CreateDirectory(savePath);
  323. }
  324. string dataPathStr = savePath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".csv";
  325. if (!File.Exists(dataPathStr))
  326. {
  327. sw1 = new StreamWriter(dataPathStr, true, Encoding.UTF8);
  328. sw1.WriteLine("txtBarcode,Y/M/D,H:M:S,RESULT,data1,data2,data3,data4");
  329. sw1.Dispose();
  330. }
  331. sw1 = new StreamWriter(dataPathStr, true, Encoding.UTF8);
  332. sw1.WriteLine(SN + "," + DateTime.Now.ToString("yyyy/MM/dd") + "," + DateTime.Now.ToString("HH:mm:ss") + "," + result);
  333. sw1.Dispose();
  334. }
  335. }
  336. //private void Temperature1Show(double data)
  337. //{
  338. // this.BeginInvoke(new Action(() =>
  339. // {
  340. // hole1.Temperature=(float) temperature1.TemperatureValue;
  341. // }));
  342. //}
  343. #region 数据统计
  344. private string strPath2 = "statistics.xml";
  345. public void CreadXmlStatistics()
  346. {
  347. XDocument docCount;
  348. docCount = new XDocument(
  349. new XDeclaration("1.0", "utf-8", "yes"),
  350. new XElement("ProductData",
  351. new XElement("Count",
  352. new XElement("passNum", 0),
  353. new XElement("failNum", 0))
  354. )
  355. );
  356. docCount.Save(strPath2);
  357. }
  358. private void ReadXmlStatistics()
  359. {
  360. try
  361. {
  362. if (!File.Exists(strPath2))
  363. {
  364. CreadXmlStatistics();
  365. }
  366. //加载XML文件
  367. XDocument xdoc = XDocument.Load(strPath2);
  368. //获取XML文件根节点
  369. XElement rootNode = xdoc.Root;
  370. //获取根节点下面对应的值
  371. XElement childNode0 = rootNode.Element("Count").Element("passNum");
  372. XElement childNode1 = rootNode.Element("Count").Element("failNum");
  373. OK.Text = childNode0.Value;
  374. NG.Text = childNode1.Value;
  375. Total.Text = (int.Parse(OK.Text) + int.Parse(NG.Text)).ToString();
  376. }
  377. catch (Exception ex)
  378. {
  379. MessageBox.Show(ex.ToString());
  380. }
  381. }
  382. private void SaveXmlStatistics()
  383. {
  384. lock (obj)
  385. {
  386. if (!File.Exists(strPath2))
  387. {
  388. CreadXmlStatistics();
  389. }
  390. //加载XML文件
  391. XDocument xdoc = XDocument.Load(strPath2);
  392. //获取XML文件根节点
  393. XElement rootNode = xdoc.Root;
  394. rootNode.Element("Count").ReplaceNodes(
  395. new XElement("passNum", OK.Text),
  396. new XElement("failNum", NG.Text));
  397. xdoc.Save(strPath2);
  398. }
  399. }
  400. #endregion
  401. private void btnClear_Click(object sender, EventArgs e)
  402. {
  403. DialogResult result = MessageBox.Show("请确认是否对计数清零?", "清零", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
  404. if (result == DialogResult.OK)
  405. {
  406. OK.Text = "";
  407. NG.Text = "";
  408. Total.Text = "";
  409. SaveXmlStatistics();
  410. AddMessage("统计计数清零成功!");
  411. }
  412. }
  413. private void labPLCStatus_Click(object sender, EventArgs e)
  414. {
  415. try
  416. {
  417. PLC_sanling.ActLogicalStationNumber = 1;
  418. PLC_sanling.ActPassword = "";
  419. plcConnect = PLC_sanling.Open();
  420. if (plcConnect == 0)
  421. {
  422. PLCtimer.Enabled = true;
  423. labPLCStatus.BackColor = Color.Green;
  424. labPLCStatus.Text = "已连接";
  425. AddMessage("与PLC通讯连接成功");
  426. }
  427. else
  428. {
  429. PLCtimer.Enabled = false;
  430. labPLCStatus.BackColor = Color.Red;
  431. labPLCStatus.Text = "未连接";
  432. AddMessage("与PLC通讯连接失败");
  433. }
  434. }
  435. catch (Exception ex)
  436. {
  437. plcConnect = 1;
  438. MessageBox.Show(ex.ToString());
  439. AddMessage("与PLC通讯连接异常,检查通讯线路");
  440. }
  441. }
  442. private string Scaner()
  443. {
  444. string rtn = "";
  445. Scanner1.DiscardInBuffer();
  446. if (Scanner1.IsOpen)
  447. {
  448. Scanner1.Write("TRIGGER");
  449. Thread.Sleep(300);
  450. rtn = Scanner1.ReadExisting();
  451. AddMessage("扫描条码:"+rtn);
  452. }
  453. else
  454. {
  455. rtn = "扫枪串口打开失败";
  456. AddMessage("扫枪串口未打开");
  457. }
  458. return rtn;
  459. }
  460. #region MES函数
  461. private void MesInit()
  462. {
  463. int len = 102400;
  464. StringBuilder strdata = new StringBuilder(len);
  465. if (hMes == 0)
  466. {
  467. tempFunc = WriteLogFile; // 必须要加一个变量,这样不会被回收 这个回调函数赋值只能放在这个位置,防止当多次点击init之后可能会出现回调函数被回收的现象
  468. if (0 == HQMES.MesInit(tempFunc, ref hMes, strdata, ref len))
  469. {
  470. JObject jt = (JObject)JsonConvert.DeserializeObject(strdata.ToString());
  471. string version = "";
  472. version = jt.GetValue("H_MSG") == null ? "" : jt.GetValue("H_MSG").ToString();//获取meshelepr的版本
  473. AddMessage("初始化链接MES成功!MEShelper版本:" + version);//strdata会返回一个meshelper的版本号表示初始化成功
  474. MESstatus.BackColor = Color.Green;
  475. MESstatus.Text = "已连接";
  476. }
  477. else
  478. {
  479. hMes = 0;
  480. AddMessage("初始化链接MES 失败 !");
  481. MESstatus.BackColor = Color.Red;
  482. MESstatus.Text = "未连接";
  483. }
  484. ;
  485. }
  486. else
  487. {
  488. AddMessage("请勿重复初始化MES链接!");
  489. }
  490. }
  491. private void MesStart(string SN)
  492. {
  493. if (hMes != 0)
  494. {
  495. int len = 102400;
  496. StringBuilder strdata = new StringBuilder(len);
  497. //StringBuilder SN = new StringBuilder("12345678901002");
  498. //StringBuilder ActionName = new StringBuilder("BT");
  499. //StringBuilder toolName = new StringBuilder("PRESSTOOL");
  500. string ActionName = web_Parameter.Station;
  501. string toolName = web_Parameter.Tool;
  502. string data = "";
  503. string msg = "";
  504. string retdata = "";
  505. string needload = "";
  506. if (0 == HQMES.MesStart(hMes, SN, ActionName, toolName, strdata, ref len))
  507. {
  508. AddMessage("链接MES 成功 !" + strdata.ToString());
  509. //start参数的解析,具体字段定义请参考《华勤MESHelper接口工具使用说明》
  510. JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString());
  511. data = jo.GetValue("DATA") == null ? "" : jo.GetValue("DATA").ToString();
  512. //data是一个json字符串,其中包含mes返回的主要字段,按照这个参考继续解析出来 例如获取CSN
  513. JObject jb = (JObject)JsonConvert.DeserializeObject(data);
  514. string CSN = jb.GetValue("CSN") == null ? "" : jb.GetValue("CSN").ToString();
  515. //
  516. msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();
  517. retdata = jo.GetValue("G_RET_DATA") == null ? "" : jo.GetValue("G_RET_DATA").ToString();//标记工具需要回传给MES的字段,是json格式,将其解析出来可以得到字段,工具必须将该字段赋值并回传给MES,在endmes函数回传
  518. needload = jo.GetValue("NeedLoad") == null ? "" : jo.GetValue("NeedLoad").ToString();//标记工具是否需要重启
  519. //解析结束
  520. }
  521. else
  522. {
  523. JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString());
  524. msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();//mes返回的错误信息最好将其在工具界面展示出来给操作人员查看
  525. AddMessage("链接MES 失败 !" + strdata.ToString());
  526. }
  527. }
  528. else
  529. {
  530. AddMessage("请初始化MES链接!");
  531. }
  532. }
  533. private void MesStart2(string SN)
  534. {
  535. if (hMes != 0)
  536. {
  537. int len = 102400;
  538. StringBuilder strdata = new StringBuilder(len);
  539. //StringBuilder SN = new StringBuilder("12345678901002");
  540. //StringBuilder ActionName = new StringBuilder("BT");
  541. //StringBuilder toolName = new StringBuilder("PRESSTOOL");
  542. string ActionName = web_Parameter.Station;
  543. string toolName = web_Parameter.Tool;
  544. string SNType = "9";//表示流程检查的输入数据类型:1 SN 2 IMEI 3 CSN 4 蓝牙 5 WiFi 6 入网证
  545. if (0 ==HQMES.MesStart2(hMes, SN, SNType, ActionName, toolName, strdata, ref len))
  546. {
  547. //这个函数返回的值跟MesStart一样,请参考MesStart的解析参数的操作
  548. AddMessage("链接MES 成功 !" + strdata.ToString());
  549. }
  550. else
  551. {
  552. AddMessage("链接MES 失败 !" + strdata.ToString());
  553. var jObject = JObject.Parse(strdata.ToString());
  554. var ss = jObject["Data"]["AutoUnlock"];
  555. }
  556. }
  557. else
  558. {
  559. MessageBox.Show("请初始化MES链接!");
  560. }
  561. }
  562. private void MesEnd(string SN,string ErrorCode)
  563. {
  564. if (hMes != 0)
  565. {
  566. int len = 102400;
  567. StringBuilder strdata = new StringBuilder(len);
  568. strdata.Append(web_Parameter.ErrorCode);//错误代码
  569. string ActionName =web_Parameter.Station;//工具动作
  570. string toolName = web_Parameter.Tool;//工具版本
  571. //string ErrorCode = textBox1.Text;//错误码 0表示测试成功,其它表示失败
  572. string nextws = "";//表示下一个工位
  573. string msg = "";//过站的错误信息
  574. if (0 ==HQMES.MesEnd(hMes, SN, ActionName, toolName, ErrorCode, strdata, ref len))
  575. {
  576. JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString());
  577. msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();
  578. nextws = jo.GetValue("G_NEXTWS") == null ? "" : jo.GetValue("G_NEXTWS").ToString();
  579. AddMessage("保存数据到MES 成功 !" + strdata.ToString());
  580. }
  581. else
  582. {
  583. JObject jo = (JObject)JsonConvert.DeserializeObject(strdata.ToString());
  584. msg = jo.GetValue("H_MSG") == null ? "" : jo.GetValue("H_MSG").ToString();//表示过站的错误信息,最好展示在工具的界面方便操作人员查看
  585. AddMessage("保存数据到MES 失败 !" + strdata.ToString());
  586. }
  587. }
  588. else
  589. {
  590. AddMessage("请初始化MES链接!");
  591. }
  592. }
  593. private void MesEnd2(string SN,string AllData)
  594. {
  595. if (hMes != 0)
  596. {
  597. int len = 102400;
  598. StringBuilder strdata = new StringBuilder(len);
  599. strdata.Append(web_Parameter.ErrDescription);
  600. string ActionName = web_Parameter.Station;
  601. string toolName = web_Parameter.Tool;
  602. string ErrorCode = web_Parameter.ErrorCode;
  603. // string AllData = textBox2.Text;//表示需要回传给mes的字段,json字符串形式传递
  604. string SNType = "9";//
  605. //start
  606. //假设需要回传的字段为a,值为1,将字段a上抛
  607. //JObject data = new JObject();
  608. //data.Add("a", "1");
  609. //AllData = data.ToString();
  610. //当遇到数据较多的时候,可以使用Dictionary类型存储数据,然后序列化
  611. //end
  612. if (0 ==HQMES.MesEnd2(hMes, SN, SNType, ActionName, toolName, ErrorCode/*G_CODE*/, AllData, strdata/*G_DESC*/, ref len))
  613. {
  614. //这个函数返回的值跟MesEnd一样,请参考MesEnd的解析参数的操作
  615. AddMessage("保存数据到MES 成功 !/r/n" + strdata.ToString());
  616. }
  617. else
  618. {
  619. AddMessage("保存数据到MES 失败 !/r/n" + strdata.ToString());
  620. }
  621. }
  622. else
  623. {
  624. AddMessage("请初始化MES链接!");
  625. }
  626. }
  627. #endregion
  628. private void InRefresh(short d1,short d2,short d3,short d4)
  629. {
  630. //this.BeginInvoke(new Action(() =>
  631. //{
  632. //}));
  633. Status1.BackColor = (d1 == 1 ? Color.Green : Color.Red);
  634. Status2.BackColor = (d2 == 1 ? Color.Green : Color.Red);
  635. Status3.BackColor = (d3 == 1 ? Color.Green : Color.Red);
  636. Status4.BackColor = (d4 == 1 ? Color.Green : Color.Red);
  637. }
  638. private void OutRefresh(short d1, short d2, short d3, short d4)
  639. {
  640. SN1.BackColor = (d1 == 1 ? Color.Green : Color.Red);
  641. SN2.BackColor = (d2 == 1 ? Color.Green : Color.Red);
  642. SN3.BackColor = (d3 == 1 ? Color.Green : Color.Red);
  643. SN4.BackColor = (d4 == 1 ? Color.Green : Color.Red);
  644. }
  645. private void test_Click(object sender, EventArgs e)
  646. {
  647. Jstructrue demo1 = new Jstructrue();
  648. Jstructrue demo2 = new Jstructrue();
  649. demo2.name = "SN";
  650. demo2.value = "1234567";
  651. demo1.name = "data";
  652. demo1.value = JsonConvert.SerializeObject(demo2);
  653. string y = JsonConvert.SerializeObject(demo1);
  654. // var json = new JsonSerializer().Deserialize(new JsonTextReader(new StringReader(y)));
  655. AddMessage(y);
  656. JObject a=(JObject)JsonConvert.DeserializeObject(y);
  657. string b = a.GetValue("value").ToString();
  658. AddMessage(b);
  659. Scaner();
  660. }
  661. public class Jstructrue//转换成json格式
  662. {
  663. public string name { get; set; }
  664. public string value { get; set; }
  665. }
  666. }
  667. }