using Com.Estsh.MES.AssemblyInput; using Estsh.Client.Base; using System.Configuration; using System.Data; using System.Net; using System.Net.Sockets; using System.Text; namespace Estsh.Client.StepLibrary { public partial class YYOutPdlineInspection:StepBase { private StepLibraryAPP _app = null; private List _CheckData = null; //绑定数据 private delegate void DeleGrdBind(List dt); private int _terminalID = 0; private string _sn = ""; private int Inum = 1; //PASS间隔限制工位集合 private string _passIntervalLimit = string.Empty; //PLC信号标识 private string JYFlag = string.Empty; //静音房信号 private string RWFlag = string.Empty; //返工信号 private string FXFlag = string.Empty; //放行信号 public YYOutPdlineInspection() { InitializeComponent(); // 有用户界面的工步在初始化时需要设置为不可见 // 开始执行此工步后再置为可见 this.Visible = false; } public override bool Do() { try { // 置为可见并加载到最前端 this.Visible = true; this.BringToFront(); // 从配置文件中加载工位编号 _terminalID = Convert.ToInt32(Context["terminal_id"].ToString()); _sn = Context["serial_number"].ToString(); _app = new StepLibraryAPP(httpClient); string _PartNo = _app.GetPartNo(_sn); string rule = _app.GetRuleNo(_PartNo); string partLocation = _app.GetPartLoc(_PartNo); PlcFlow.Enabled = true; PlcFlow.Start(); // 执行父类的 Do 方法并返回 return base.Do(); } catch (Exception ex) { // 记录日志 using (StreamWriter sw = new StreamWriter("Error_Log_" + DateTime.Now.ToString("yyyyMM") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ", ex.ToString())); sw.Flush(); sw.Close(); } return false; } } public void ForeachPanelControls() { string ctrlName = "btnNGType"; for (int i = 1; i <= 16; i++) { ctrlName = "btnNGType" + i.ToString(); foreach (Control ctrl in tableLayoutPanel1.Controls) { if (ctrl is Button) { if (ctrl.Name.Equals(ctrlName)) ctrl.Text = ""; } } } } private void OutPdlineInspection_Load(object sender, EventArgs e) { _sn = Context["serial_number"].ToString(); _app = new StepLibraryAPP(httpClient); _terminalID = Convert.ToInt32(Context["terminal_id"].ToString()); //校验电检数据 _app.insertDefectData(_sn, _terminalID); ForeachPanelControls(); LoadDefect(); //拍照 Phtotograph(); // 工步执行完成后调用此方法 //Complate(this, e); } /// /// 下一页 /// /// /// private void btnNextPage_Click(object sender, EventArgs e) { Inum++; LoadDefect(); } /// /// 上一页 /// /// /// private void btnLastPage_Click(object sender, EventArgs e) { Inum--; LoadDefect(); } /// /// 加载不良 /// private void LoadDefect() { List DefectList = _app.getYYDefectList(_terminalID); int CountQty = DefectList.Count; //一页有多少行 int PageRows = 16; int PageCount = (int)Math.Ceiling((double)CountQty / (double)PageRows);//一共有多少页 int RowsEnd = 0;//终止行数 //Inum:当前页数 if (Inum < 1) { Inum++; return; } else if (Inum > PageCount) { Inum--; return; } //颜色初始化 btnNGType1.BackColor = Color.Gainsboro; btnNGType2.BackColor = Color.Gainsboro; btnNGType3.BackColor = Color.Gainsboro; btnNGType4.BackColor = Color.Gainsboro; btnNGType5.BackColor = Color.Gainsboro; btnNGType6.BackColor = Color.Gainsboro; btnNGType7.BackColor = Color.Gainsboro; btnNGType8.BackColor = Color.Gainsboro; btnNGType9.BackColor = Color.Gainsboro; btnNGType10.BackColor = Color.Gainsboro; btnNGType11.BackColor = Color.Gainsboro; btnNGType12.BackColor = Color.Gainsboro; btnNGType13.BackColor = Color.Gainsboro; btnNGType14.BackColor = Color.Gainsboro; btnNGType15.BackColor = Color.Gainsboro; btnNGType16.BackColor = Color.Gainsboro; string strInum = Inum.ToString() + "/" + PageCount.ToString(); btnInum.Text = strInum; ForeachPanelControls(); List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); for (int i = 1; i <= Inum * PageRows; i++) { int j = 0; if (Inum > 1) { j = i + 16; } else { j = i; } if (CountQty < j) { return; } string strDefect = DefectList[j - 1]["defect_desc"].ToString(); string button = "btnNGType" + i.ToString(); Button btn = (Button)this.GetType().GetField(button, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase).GetValue(this); btn.Text = strDefect; if (SNDefectLDt.Select("defect_desc" + "='" + strDefect + "'").Length > 0) { btn.BackColor = Color.Red; } else { btn.BackColor = Color.Gainsboro; } } ShowMessage(this, "Green|请检测座椅,并选择不良项!"); } /// /// 新增不良明细 /// private void operationDefect(string sn, int terminalID, string defectName, string operationType) { if (operationType.ToUpper() == "ADD") { _app.addYYSndefect(sn, terminalID, defectName); } else if ((operationType.ToUpper() == "DEL")) { _app.delYYSndefect(sn, terminalID, defectName); } } /// /// 插入或修改不良项 /// /// private void defectOperation(string btnName) { string button = btnName; foreach (Control ctrl in tableLayoutPanel1.Controls) { if (ctrl is Button) { if (ctrl.Name.Equals(button)) { if (string.IsNullOrEmpty(ctrl.Text.ToString())) { return; } if (ctrl.BackColor == Color.Gainsboro) { if (_app.getDefectDetail( _terminalID,ctrl.Text.ToString()).Count > 0) { if (ctrl.Text.ToString() == "错漏装" || ctrl.Text.ToString() == "力值NG") { YYNGCheck yyNGCheck = new YYNGCheck(_app, _sn, _terminalID, ctrl.Text.ToString()); yyNGCheck.ShowDialog(); } else { YYNGFacadeCheck yyNGFacadeCheck = new YYNGFacadeCheck(_app, _sn, _terminalID, ctrl.Text.ToString()); yyNGFacadeCheck.ShowDialog(); } if (_app.getSNDefectDetail(_sn, _terminalID, ctrl.Text.ToString()).Count > 0) { operationDefect(_sn, _terminalID, ctrl.Text.ToString(), "ADD"); ctrl.BackColor = Color.Red; ShowMessage(this, "Green|【" + ctrl.Text.ToString() + "】不良,新增成功!"); } } else { operationDefect(_sn, _terminalID, ctrl.Text.ToString(), "ADD"); ctrl.BackColor = Color.Red; ShowMessage(this, "Green|【" + ctrl.Text.ToString() + "】不良,新增成功!"); } } else if (ctrl.BackColor == Color.Red) { if (_app.getDefectDetail(_terminalID, ctrl.Text.ToString()).Count > 0) { if (ctrl.Text.ToString() == "错漏装" || ctrl.Text.ToString() == "力值NG") { YYNGCheck yyNGCheck = new YYNGCheck(_app, _sn, _terminalID, ctrl.Text.ToString()); yyNGCheck.ShowDialog(); } else { YYNGFacadeCheck yyNGFacadeCheck = new YYNGFacadeCheck(_app, _sn, _terminalID, ctrl.Text.ToString()); yyNGFacadeCheck.ShowDialog(); } if (_app.getSNDefectDetail(_sn, _terminalID, ctrl.Text.ToString()).Count > 0) { return; } else { operationDefect(_sn, _terminalID, ctrl.Text.ToString(), "DEL"); ctrl.BackColor = Color.Gainsboro; ShowMessage(this, "Green|【" + ctrl.Text.ToString() + "】不良,删除成功!"); } } else { operationDefect(_sn, _terminalID, ctrl.Text.ToString(), "DEL"); ctrl.BackColor = Color.Gainsboro; ShowMessage(this, "Green|【" + ctrl.Text.ToString() + "】不良,删除成功!"); } } else { ctrl.BackColor = Color.Yellow; } } } } } private void btnNGType1_Click(object sender, EventArgs e) { defectOperation(btnNGType1.Name); } private void btnNGType2_Click(object sender, EventArgs e) { defectOperation(btnNGType2.Name); } private void btnNGType3_Click(object sender, EventArgs e) { defectOperation(btnNGType3.Name); } private void btnNGType4_Click(object sender, EventArgs e) { defectOperation(btnNGType4.Name); } private void btnNGType5_Click(object sender, EventArgs e) { defectOperation(btnNGType5.Name); } private void btnNGType6_Click(object sender, EventArgs e) { defectOperation(btnNGType6.Name); } private void btnNGType7_Click(object sender, EventArgs e) { defectOperation(btnNGType7.Name); } private void btnNGType8_Click(object sender, EventArgs e) { defectOperation(btnNGType8.Name); } private void btnNGType9_Click(object sender, EventArgs e) { defectOperation(btnNGType9.Name); } private void btnNGType10_Click(object sender, EventArgs e) { defectOperation(btnNGType10.Name); } private void btnNGType11_Click(object sender, EventArgs e) { defectOperation(btnNGType11.Name); } private void btnNGType12_Click(object sender, EventArgs e) { defectOperation(btnNGType12.Name); } private void btnNGType13_Click(object sender, EventArgs e) { defectOperation(btnNGType13.Name); } private void btnNGType14_Click(object sender, EventArgs e) { defectOperation(btnNGType14.Name); } private void btnNGType15_Click(object sender, EventArgs e) { defectOperation(btnNGType15.Name); } private void btnNGType16_Click(object sender, EventArgs e) { defectOperation(btnNGType16.Name); } private void btnRework_Click(object sender, EventArgs e) { List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (SNDefectLDt.Count <= 0) { ShowMessage(this, "red|【" + _sn + "】没有添加不良项,请选择不良类型!"); return; } //余姚返工类型2 StopStep(2); } private void btnOk_Click(object sender, EventArgs e) { List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (SNDefectLDt.Count > 0) { ShowMessage(this, "red|【" + _sn + "】有不良项,请重新确认!"); return; } //更新条码状态为下线 _app.updateStatus(_sn); try { string tres = _app.ProdTrans(0, Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString()), 0, "C"); if (tres.ToUpper() != "OK") { ShowMessage(this, "red|" + tres + ""); } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter("ProdTrans-" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1} {2}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ProdTrans", Context["serial_number"].ToString(), ex)); sw.Flush(); sw.Close(); } } // 工步执行完成后调用此方法 Complate(this, e); } /// /// 读取PLC信号 /// /// /// private void PlcFlow_Tick(object sender, EventArgs e) { txtPhoto.Focus(); //静音 JYFlag = _app.YYReadyPlc("OPC_ReadJY", _terminalID).ToString().ToUpper(); //外观不良 RWFlag = _app.YYReadyPlc("OPC_ReadRW", _terminalID).ToString().ToUpper(); //放行 FXFlag = _app.YYReadyPlc("OPC_OK", _terminalID).ToString().ToUpper(); if (JYFlag == "TRUE") { bool retSNTravel = _app.InsertSNTravel(_sn, _terminalID, 8); } } private void WriteLog(string Message) { string logPath = AppDomain.CurrentDomain.BaseDirectory + @"\\Log"; try { if (!System.IO.Directory.Exists(logPath)) { System.IO.Directory.CreateDirectory(logPath); } string txtMsgPath = logPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; string timeStamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss-->"); using (StreamWriter sw = new StreamWriter(txtMsgPath, true)) { sw.WriteLine(timeStamp + Message.ToString()); sw.Flush(); sw.Close(); } } catch (System.Exception ex) { } } //lvf 20211118 拍照 public void Phtotograph() { List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (RWFlag.ToUpper() == "TRUE") { //按钮不合格 if (SNDefectLDt.Count <= 0) { ShowMessage(this, "Red|【" + _sn + "】未选不良明细!"); return; } } else { //按钮合格 if (SNDefectLDt.Count > 0) { _app.UpdateOPCPointValue("OPC_NG", _terminalID, "3"); ShowMessage(this, "Red|【" + _sn + "】产线不良按钮当前状态为“良品”!"); //return; } } try { // 实名发送 IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345); // 本机IP,指定的端口号 udpcSend = new UdpClient(localIpep); Thread thrSend = new Thread(SendMessage); thrSend.Start(_sn); } catch (Exception ex) { //lvf 20211101 增加记录日志 WriteLog(DateTime.Now.ToString() + "【" + _sn + "】发送条码到拍照设备失败!" + ex.ToString()); ShowMessage(this, "【" + _sn + "】发送条码到拍照设备失败!"); return; } } //拍照结果检查 public void PohotoCheck(EventArgs e) { List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (RWFlag.ToUpper() == "TRUE") { //按钮不合格 if (SNDefectLDt.Count <= 0) { ShowMessage(this, "Red|【" + _sn + "】未选不良明细!"); return; } } else { //按钮合格 if (SNDefectLDt.Count > 0) { _app.UpdateOPCPointValue("OPC_NG", _terminalID, "3"); ShowMessage(this, "Red|【" + _sn + "】产线不良按钮当前状态为“良品”!"); //return; } } ShowMessage(this, "Green|【" + _sn + "】拍照成功!"); if (SNDefectLDt.Count > 0) { if (_app.IsCurrentSN(_sn) == false) { _app.SetSNStatusNG(_sn, 1); } } else { //更新条码状态为下线 _app.updateStatus(_sn); try { string tres = _app.ProdTrans(0, Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString()), 0, "C"); if (tres.ToUpper() != "OK") { ShowMessage(this, "red|" + tres + ""); } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter("ProdTrans-" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1} {2}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ProdTrans", Context["serial_number"].ToString(), ex)); sw.Flush(); sw.Close(); } } } //更新条码状态为下线 //_app.updateStatus(_sn); Complate(this, e); } private void btnPhoto_Click(object sender, EventArgs e) { //判断拍照是否成功 List dt = _app.getPhoto(_sn, _terminalID); if (dt.Count > 0) { PohotoCheck(e); } else { ShowMessage(this, "red|【" + _sn + "】拍照失败,正在重新拍照!" + dt.Count.ToString()); //lvf 20211029 增加记录日志 WriteLog(DateTime.Now.ToString() + "【" + _sn + "】拍照失败,正在重新拍照!" + dt.Count.ToString() + "工位" + _terminalID); //重新进行拍照 Rephotograth(e); } } //重新拍照,执行拍照和校验逻辑 public void Rephotograth(EventArgs e) { List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (RWFlag.ToUpper() == "TRUE") { //按钮不合格 if (SNDefectLDt.Count <= 0) { ShowMessage(this, "Red|【" + _sn + "】未选不良明细!"); return; } } else { //按钮合格 if (SNDefectLDt.Count > 0) { _app.UpdateOPCPointValue("OPC_NG", _terminalID, "3"); ShowMessage(this, "Red|【" + _sn + "】产线不良按钮当前状态为“良品”!"); //return; } } try { // 实名发送 IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345); // 本机IP,指定的端口号 udpcSend = new UdpClient(localIpep); Thread thrSend = new Thread(SendMessage); thrSend.Start(_sn); } catch (Exception ex) { } ShowMessage(this, "Green|【" + _sn + "】照片拍摄中!"); Thread.Sleep(3000); List dt = _app.getPhoto(_sn, _terminalID); if (dt.Count > 0) { ShowMessage(this, "Green|【" + _sn + "】拍照成功!"); if (SNDefectLDt.Count > 0) { if (_app.IsCurrentSN(_sn) == false) { _app.SetSNStatusNG(_sn, 1); } } else { //更新条码状态为下线 _app.updateStatus(_sn); try { string tres = _app.ProdTrans(0, Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString()), 0, "C"); if (tres.ToUpper() != "OK") { ShowMessage(this, "red|" + tres + ""); } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter("ProdTrans-" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1} {2}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ProdTrans", Context["serial_number"].ToString(), ex)); sw.Flush(); sw.Close(); } } } //更新条码状态为下线 //_app.updateStatus(_sn); Complate(this, e); } else { ShowMessage(this, "red|【" + _sn + "】拍照失败,请重新拍照!"); WriteLog(DateTime.Now.ToString() + "【" + _sn + "】拍照失败,请重新拍照!" + dt.Count.ToString() + "工位" + _terminalID); } } /// /// 用于UDP发送的网络服务类 /// private UdpClient udpcSend; /// /// 用于UDP接收的网络服务类 /// private UdpClient udpcRecv; /// /// 发送信息 /// /// private void SendMessage(object obj) { string message = (string)obj; byte[] sendbytes = Encoding.Unicode.GetBytes(message); IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8848); // 发送到的IP地址和端口号 udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep); udpcSend.Close(); } private void txtPhoto_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar =='k') { btnPhoto_Click(sender, e); } } /// /// 不拍照 /// /// /// private void btnNoPhoto_Click(object sender, EventArgs e) { //lvf 20210427 不拍照加入密码校验 ShowMessage(this, "请输入密码!"); FrmPassword_ck frmpsd = new FrmPassword_ck(); if (frmpsd.ShowDialog() == DialogResult.OK) { if (frmpsd.Password.Trim() != ConfigurationManager.AppSettings["DNPPWD"].ToString().Trim()) { ShowMessage(this, "密码输入错误!"); return; } } else { return; } List SNDefectLDt = new DataTable(); SNDefectLDt = _app.getSNDefect(_sn, _terminalID); if (RWFlag.ToUpper() == "TRUE") { //按钮不合格 if (SNDefectLDt.Count <= 0) { ShowMessage(this, "Red|【" + _sn + "】未选不良明细!"); return; } } else { //按钮合格 if (SNDefectLDt.Count > 0) { _app.UpdateOPCPointValue("OPC_NG", _terminalID, "3"); ShowMessage(this, "Red|【" + _sn + "】产线不良按钮当前状态为“良品”!"); //return; } } if (SNDefectLDt.Count > 0) { if (_app.IsCurrentSN(_sn) == false) { _app.SetSNStatusNG(_sn, 1); } } else { //更新条码状态为下线 _app.updateStatus(_sn); try { string tres = _app.ProdTrans(0, Context["serial_number"].ToString(), Convert.ToInt32(Context["terminal_id"].ToString()), 0, "C"); if (tres.ToUpper() != "OK") { ShowMessage(this, "red|" + tres + ""); } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter("ProdTrans-" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true)) { sw.WriteLine(string.Format("{0} {1} {2}", "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ProdTrans", Context["serial_number"].ToString(), ex)); sw.Flush(); sw.Close(); } } } Complate(this, e); } } }