using System; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Threading; using System.Windows.Forms; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; using UAS_MES_NEW.PublicMethod; namespace UAS_MES_NEW.Make { public partial class Make_GetTestData : Form { DataHelper dh; AutoSizeFormClass asc = new AutoSizeFormClass(); LogStringBuilder sql = new LogStringBuilder(); string oErrorMessage = ""; string oMakeCode = ""; string oMsID = ""; public Make_GetTestData() { InitializeComponent(); } private void Make_GetTestData_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); dh = SystemInf.dh; //默认选中串口参数(SCPI协议: 9600/8/N/1/None) BaudRate.SelectedIndex = 0; DataBits.SelectedIndex = 0; Parity.SelectedIndex = 0; StopBits.SelectedIndex = 0; Handshake.SelectedIndex = 0; //聚焦SN输入框 sncode.Focus(); OperateResult.AppendText(">>请输入SN\n", Color.Black); //初始化工步计数 StepCount.StepCode = User.CurrentStepCode; StepCount.Source = User.UserSourceCode; StepCount.LineCode = User.UserLineCode; StepCount.Dh = dh; StepCount.Start(); } private void Make_GetTestData_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } /// /// 根据界面设置创建并配置SerialPort /// private SerialPort CreateSerialPort(int readTimeout = 3000) { int baud = 9600; int.TryParse(BaudRate.Text, out baud); int dataBits = 8; int.TryParse(DataBits.Text, out dataBits); System.IO.Ports.Parity parity = System.IO.Ports.Parity.None; switch (Parity.Text) { case "Odd": parity = System.IO.Ports.Parity.Odd; break; case "Even": parity = System.IO.Ports.Parity.Even; break; case "Mark": parity = System.IO.Ports.Parity.Mark; break; case "Space": parity = System.IO.Ports.Parity.Space; break; } System.IO.Ports.StopBits stopBits = System.IO.Ports.StopBits.One; switch (StopBits.Text) { case "1.5": stopBits = System.IO.Ports.StopBits.OnePointFive; break; case "2": stopBits = System.IO.Ports.StopBits.Two; break; } System.IO.Ports.Handshake handshake = System.IO.Ports.Handshake.None; switch (Handshake.Text) { case "Hardware": handshake = System.IO.Ports.Handshake.RequestToSend; break; case "XOnXOff": handshake = System.IO.Ports.Handshake.XOnXOff; break; case "Both": handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff; break; } SerialPort sp = new SerialPort(); sp.PortName = ComList.Text; sp.BaudRate = baud; sp.DataBits = dataBits; sp.Parity = parity; sp.StopBits = stopBits; sp.Handshake = handshake; sp.NewLine = "\n"; sp.ReadTimeout = readTimeout; sp.WriteTimeout = 1000; return sp; } /// /// 从台式电桥获取测试数据 /// 通讯协议: SCPI, 参数由界面设置 /// 发送格式: 指令 + 0x0A(换行) /// 返回格式: 以回车换行结尾 /// /// 测量数据字符串, 多个值以逗号分隔; 失败返回空字符串 private string GetTestDataFromBridge() { if (ComList.Text == "") { OperateResult.AppendText("<<请先选择串口\n", Color.Red); return ""; } SerialPort sp = CreateSerialPort(); string result = ""; try { sp.Open(); //发送触发命令 *TRG sp.WriteLine("*TRG"); //等待测量完成 Thread.Sleep(500); //发送查询命令 FETCh? 获取测量数据 sp.WriteLine("FETCh?"); //读取返回数据(以回车换行结尾) result = sp.ReadLine().Trim(); sp.Close(); } catch (Exception ex) { OperateResult.AppendText("<<串口通讯异常:" + ex.Message + "\n", Color.Red); if (sp.IsOpen) sp.Close(); return ""; } return result; } /// /// 查询当前测量功能名称 /// private string GetFunctionName() { if (ComList.Text == "") return ""; SerialPort sp = CreateSerialPort(2000); string funcName = ""; try { sp.Open(); sp.WriteLine("FUNCtion?"); funcName = sp.ReadLine().Trim(); sp.Close(); } catch { if (sp.IsOpen) sp.Close(); } return funcName; } private void LoadCollectedNum() { sql.Clear(); sql.Append("select ma_code,nvl(mcd_okqty,0) mcd_okqty,ma_prodcode,pr_detail,"); sql.Append("ma_qty - nvl(mcd_okqty, 0) remain_qty from make left join makecraftdetail on "); sql.Append("mcd_maid=ma_id left join product on pr_code=ma_prodcode where ma_code='" + oMakeCode + "' and mcd_stepcode='" + User.CurrentStepCode + "'"); DataTable dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); BaseUtil.SetFormValue(Controls, dt); } private void sncode_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode != Keys.Enter) return; //1) 校验SN非空 if (sncode.Text == "") { OperateResult.AppendText("<<输入不能为空\n", Color.Red); return; } //2) 校验工步属性 if (!LogicHandler.CheckStepAttribute(Tag.ToString(), User.UserSourceCode, out oErrorMessage)) { OperateResult.AppendText(">>" + oErrorMessage + "\n", Color.Red, sncode); return; } //3) 获取工单信息 string oStatus = ""; if (!LogicHandler.GetMakeInfo(sncode.Text, out oMakeCode, out oStatus, out oErrorMessage)) { if (ms_makecode.Text == "") { OperateResult.AppendText(">>" + oErrorMessage + "\n", Color.Red, sncode); return; } } //4) CheckStepSNAndMacode 校验SN与工单 if (LogicHandler.CheckStepSNAndMacode(ms_makecode.Text == "" ? oMakeCode : ms_makecode.Text, User.UserSourceCode, sncode.Text, User.UserCode, out oMakeCode, out oMsID, out oErrorMessage)) { //查询并显示工单产品信息 sql.Clear(); sql.Append("select ms_makecode,ms_prodcode,pr_detail from makeserial left join product on "); sql.Append(" ms_prodcode = pr_code where ms_id = '" + oMsID + "'"); DataTable dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); BaseUtil.SetFormValue(this.Controls, dt); LoadCollectedNum(); OperateResult.AppendText(">>" + sncode.Text + " SN校验通过, 开始读取台式电桥数据\n", Color.Black); //5) 从台式电桥获取测试数据 string testData = GetTestDataFromBridge(); if (testData == "") { OperateResult.AppendText(">>未获取到测试数据, 请检查串口连接\n", Color.Red, sncode); return; } OperateResult.AppendText(">>电桥返回数据:" + testData + "\n", Color.Black); //6) 解析数据并插入STEPTESTDETAIL //电桥返回数据以逗号分隔多个测量值 string[] values = testData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); //尝试获取当前测量功能 string funcName = GetFunctionName(); for (int i = 0; i < values.Length; i++) { string className = funcName != "" ? funcName + (i + 1) : "测量值" + (i + 1); string testResult = values[i].Trim(); dh.ExecuteSql("insert into STEPTESTDETAIL(std_id,std_sn,std_indate,std_class,std_testtimes,std_testresult,std_badcode) values(STEPTESTDETAIL_seq.nextval,'" + sncode.Text + "',sysdate,'" + className + "','','" + testResult + "','')", "insert"); OperateResult.AppendText(">>" + className + ":" + testResult + "\n", Color.Black); } //7) 过站 SetStepResult if (LogicHandler.SetStepResult(oMakeCode, User.UserSourceCode, sncode.Text, "电桥测试", "OK", User.UserCode, out oErrorMessage)) { //提示正确返回时传递的信息 if (oErrorMessage.Contains("AFTERSUCCESS")) OperateResult.AppendText(">>" + oErrorMessage + "\n"); //刷新工单计数 LoadCollectedNum(); //记录日志 LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, oMakeCode, User.UserLineCode, User.UserSourceCode, "电桥测试", "测试数据采集成功", sncode.Text, ""); //SN核对成功 OperateResult.AppendText("<<" + sncode.Text + "测试数据采集完成, 过站成功\n", Color.Green, sncode); OperateResult.AppendText(">>请输入SN\n", Color.Black); } else { OperateResult.AppendText(">>过站失败:" + oErrorMessage + "\n", Color.Red, sncode); } //清空SN输入框, 准备下一次扫码 sncode.Text = ""; sncode.Focus(); } else { OperateResult.AppendText(">>" + oErrorMessage + "\n", Color.Red, sncode); } } } }