using Estsh.Client.Base; using Estsh.Client.Common.HttpClientUtil; using Estsh.Client.Common.ServiceUtil; using Estsh.Client.Common.Util; using log4net; using Microsoft.Extensions.Configuration; using System.Collections; using System.Configuration; using System.Data; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; namespace Estsh.Client { public partial class FrmMain : Form { /// /// admin /// private int _userID; private string _userNo; private int _factoryID; //private string _hostIP; private List _OrderData = null; private string _stationType = string.Empty; private string _sn = ""; private String ReceiveBuffer = ""; private string _OldSN = string.Empty; private IConfiguration _config; private static string LabelPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\LabelFile"); //最后一个写入的RFID内容 private string _LastRFID = string.Empty; //第一次开启程序时提示信息 private bool justOpenProgram = true; //private RF182C _RF182C = null; private bool initializeRFIDState = false; public string TAGState = string.Empty; public bool RFID_TAGState = false; public bool blWriteRFID = false; /// /// 记录日志 /// public static readonly ILog _loggerInfo = LogManager.GetLogger("MES.Logging.Info"); public static readonly ILog _loggerTrace = LogManager.GetLogger("MES.Logging.Trace"); public static readonly ILog _loggerError = LogManager.GetLogger("MES.Logging.Error"); /// /// 工位编号 /// private int _terminalID; /// /// 放空码,固定30位 /// private const string BLANK_CODE = "999999999999999999999999999999"; private string barcodeLast = ""; private int currentStatus = 0; /// /// HttpClient请求帮助类 /// private HttpClientHelper httpClient = null; /// /// 业务逻辑处理对象 /// private MesApp app = null; /// /// 执行的上下文 /// 临时的缓存变量都放在这里 /// private Hashtable _context = new Hashtable(); //扭矩枪IP地址 private string _TorqueIP = ""; private string _TorqueIP2 = ""; //PASS间隔限制工位集合 private string _passIntervalLimit = string.Empty; //PASS扫描间隔 private int _passIntervalValue = 2000; //PASS上一次成功扫描时间 public static DateTime _lastPassDatetime; public FrmMain() { InitializeComponent(); } //private static CodesoftPrinter m_csPrinter = null; /// /// 显示执行信息 /// /// 显示的信息内容 public void ShowMessage(string msg) { this.labErrorMessage.Text = msg; } public void ShowMessage(string msg, Color col) { //余姚蜂鸣 if (col == Color.Red) { OPC_FM(); } this.labErrorMessage.Text = msg; this.labErrorMessage.ForeColor = col; } public FrmMain(int factoryID, int userID, string userNo) : this() { _factoryID = factoryID; _userID = userID; _userNo = userNo; //_hostIP = hostIP; httpClient = new HttpClientHelper(); httpClient.userId = _userID; httpClient.userNo = _userNo; app = new MesApp(httpClient, _userID, _userNo); //try //{ // m_csPrinter = new CodesoftPrinter(); //} //catch (Exception ex) //{ } // 从配置文件中加载工位编号 //_terminalID = Convert.ToInt32(ConfigurationManager.AppSettings["TerminalID"]); //_terminalID = Convert.ToInt32(_config.AppSettings.Settings["TerminalID"].Value); _config = ServiceProviderHelper.GetService(); //_terminalID = Convert.ToInt32(_config.GetSection("TerminalID").Value); if (app == null) { MessageBox.Show("初始化系统连接失败,请检查服务器地址设置是否正确!"); WriteErrorLog("初始化系统连接失败,请检查服务器地址设置是否正确!", null); this.Close(); return; } else { if (!LocalCache.localData.ContainsKey("TerminalID")) { FrmReTerminal frmTerminal = new FrmReTerminal(app, _terminalID); if (frmTerminal.ShowDialog() == DialogResult.OK) { _terminalID = Convert.ToInt32(frmTerminal.Input); frmTerminal.Close(); } } else { _terminalID = Convert.ToInt32(LocalCache.localData["TerminalID"].ToString()); } var TerminalData = app.GetTerminalInfo(_terminalID); if (TerminalData == null) { MessageBox.Show(string.Format("加载工位信息失败,请检查工位编号是否正确! {0}", _terminalID)); WriteErrorLog(string.Format("加载工位信息失败,请检查工位编号是否正确! {0}", _terminalID), null); this.Close(); return; } lblTerminalName.Text = TerminalData["terminal_name"].ToString(); } } /// /// 根据工位参数判断是否要自动按照生产队列加载条码 /// private void AutoLoadSN() { _OrderData = app.GetOrderData(_terminalID); List HistoryOrderData = app.GetHistoryOrderData(_terminalID); if (httpClient.CheckDataValid(_OrderData)) { //查询到数据停止刷新数据 RefrenshProdData.Enabled = false; if (labErrorMessage.Text == "所有任务单已全部完成!") { ShowMessage("请扫描产品过程条码!", Color.Green); } CountRead(); #region 加载已完成队列 List AllOrderData = HistoryOrderData.ToList(); try { AllOrderData.AddRange(_OrderData); dgvProdList.AutoGenerateColumns = false; dgvProdList.DataSource = AllOrderData; int i = 0; // 把历史数据的背景色设置为绿色 if (httpClient.CheckDataValid(HistoryOrderData)) { for (; i < HistoryOrderData.Count; i++) { dgvProdList.Rows[i].DefaultCellStyle.BackColor = Color.LightGreen; } dgvProdList.Rows[0].Selected = false; } if (_OrderData.Count > 0) { string type = _OrderData[0]["model_type"].ToString().ToUpper().Trim(); if (type == "N") { // 把当前生产的数据背景色设置为黄色 dgvProdList.Rows[i].DefaultCellStyle.BackColor = Color.CornflowerBlue; } else { // 把当前生产的数据背景色设置为黄色 dgvProdList.Rows[i].DefaultCellStyle.BackColor = Color.Yellow; } } dgvProdList.Update(); } catch// (System.Exception ex) { } #endregion dgvProdList.AutoGenerateColumns = false; if (_OrderData.Count > 0) { txtCarNo.Text = _OrderData[0]["number"].ToString(); txtSerialNumber.Text = _OrderData[0]["serial_number"].ToString(); txtPartLocation.Text = _OrderData[0]["enum_desc"].ToString(); txtModelName.Text = _OrderData[0]["model_name"].ToString(); txtPartSpec.Text = _OrderData[0]["part_spec"].ToString(); if (_OrderData[0]["edi_id"].ToString() != "0") { txtCSN.Visible = true; lblCSN.Visible = true; txtCSN.Text = _OrderData[0]["edi_id"].ToString(); } else { txtCSN.Visible = false; lblCSN.Visible = false; } } //RefrenshProdData.Enabled = true; LoadStepParameter(); } else { ShowMessage("所有任务单已全部完成!", Color.Green); txtSN.Focus(); dgvProdList.AutoGenerateColumns = false; dgvProdList.DataSource = _OrderData; RefrenshProdData.Enabled = true; } } /// /// 刷新队列 /// private void RefreshQueue() { _OrderData = app.GetOrderData(_terminalID); List HistoryOrderData = app.GetHistoryOrderData(_terminalID); if (_OrderData.Count == 0) { RefrenshProdData.Enabled = true; } #region 加载已完成队列 List AllOrderData = HistoryOrderData.ToList(); try { AllOrderData.AddRange(_OrderData); dgvProdList.AutoGenerateColumns = false; dgvProdList.DataSource = AllOrderData; int i = 0; // 把历史数据的背景色设置为绿色 if (httpClient.CheckDataValid(HistoryOrderData)) { for (; i < HistoryOrderData.Count; i++) { dgvProdList.Rows[i].DefaultCellStyle.BackColor = Color.LightGreen; } dgvProdList.Rows[0].Selected = false; } if (_OrderData.Count > 0) { // 把当前生产的数据背景色设置为黄色 dgvProdList.Rows[i].DefaultCellStyle.BackColor = Color.Yellow; } dgvProdList.Update(); } catch// (System.Exception ex) { } #endregion if (_OrderData.Count > 0) { txtCarNo.Text = _OrderData[0]["number"].ToString(); txtSerialNumber.Text = _OrderData[0]["serial_number"].ToString(); txtPartLocation.Text = _OrderData[0]["enum_desc"].ToString(); txtModelName.Text = _OrderData[0]["model_name"].ToString(); txtPartSpec.Text = _OrderData[0]["part_spec"].ToString(); txtCSN.Text = _OrderData[0]["edi_id"].ToString(); if (_OrderData[0]["edi_id"].ToString() != "0") { txtCSN.Visible = true; lblCSN.Visible = true; txtCSN.Text = _OrderData[0]["edi_id"].ToString(); } else { txtCSN.Visible = false; lblCSN.Visible = false; } } LoadStepParameter(); } //执行按键操作xx0 private void txtSN_KeyPress(object sender, KeyPressEventArgs e) { if (string.IsNullOrEmpty(txtSN.Text.Trim())) return; if (e.KeyChar != (char)13) return; labErrorMessage.Text = ""; if (txtSN.Text.Trim().ToUpper()=="BYPASS") { //发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); txtSN.Text = ""; ShowMessage("托盘放行信号已发送!", Color.Green); return; } //释放加载的工步页面信息 //-------------------------2019-06-12------------------------------ if (step != null) { step.Dispose(); step = null; CurrentStep.Dispose(); } //mark 2019-01-24 try { string curr = app.getSerialNumberData(_OrderData[0]["serial_number"].ToString().ToUpper())[0]["current_status"].ToString(); if (app.validataLimit("GYRefTerminalList").Contains(_terminalID.ToString()) && ("9,1,8".Contains(curr))) { btnRefreshProdData_Click(null, null); } } catch { } // _sn = txtSN.Text.Trim().ToUpper(); txtSN.Text = ""; txtSNBak.Text = _sn; //poul 2019-03-21 if (_sn == "WRITETAG") { //RF182C.Write(BLANK_CODE); if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "opc_ok"))) { //发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // 记录日志 WriteLog("txtSN_KeyPress()方法" + "" + ret.ToString() + " " + _sn + "放行信号发送成功!"); } ShowMessage("写入空托盘成功!", Color.Green); return; } if (_sn == "00000") { if (step != null) { step.Dispose(); step = null; CurrentStep.Dispose(); flpSteps.Controls.Clear(); panControlArea.Controls.Clear(); panControlArea.Enabled = true; } RefreshQueue(); txtSN.Focus(); ShowMessage("任务单刷新成功!", Color.Green); } //强制放行码 passCode ="0123" ; BLANK_CODE="999999999999999999999999999999" string passCode = app.prodPass(); if (_sn == passCode || _sn == BLANK_CODE) { if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "opc_ok"))) { //发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // 记录日志 WriteLog("txtSN_KeyPress()方法"+ ""+ret.ToString()+" "+_sn + "放行信号发送成功!"); } ShowMessage("空托盘放行成功!", Color.Green); txtSN.Text = string.Empty; return; } List dt = null; if (app.IsSN(_sn)) { dt = app.snDetail(_sn); } else { ShowMessage("[" + _sn + "]输入错误,请扫描过程条码!", Color.Red); txtSN.Text = string.Empty; return; } #region 扫描间隔 2018-09-19暂时使用 //if (IsAllowPass()) //{ // _lastPassDatetime = DateTime.Now; //} //else //{ // ShowMessage("red|扫描太快,请等待!", Color.Red); // return; //} #endregion currentStatus = 0; List dtSerialNumberData = app.getSerialNumberData(_sn); currentStatus = Convert.ToInt32(dtSerialNumberData[0]["current_status"]); if (_OrderData.Count <= 0) { if (dtSerialNumberData.Count <= 0) { RefreshQueue(); txtSN.Focus(); ShowMessage("当前没有生产任务!", Color.Green); return; } else { currentStatus = Convert.ToInt32(dtSerialNumberData[0]["current_status"]); if (currentStatus != 9 && currentStatus != 1 && currentStatus != 8) { RefreshQueue(); txtSN.Focus(); ShowMessage("当前没有生产任务!", Color.Green); return; } } } if (currentStatus == 9 || currentStatus == 1 || currentStatus == 8) { if (currentStatus == 1) { ShowMessage("该条码未完成返工返修,请重新返工返修!", Color.Red); txtSN.SelectAll(); txtSN.Focus(); return; } //-----------------2019-07-09 删除(2019-07-29 贵阳返工座椅回线后,下线工位跳队列异常,所以还原) if (!_context.ContainsKey("serial_number")) { _context.Add("serial_number", _sn); } else { _context.Remove("serial_number"); _context.Add("serial_number", _sn); } //if (!_context.ContainsKey("terminal_id")) //{ // _context.Add("terminal_id", _terminalID); //} //else //{ // _context.Remove("terminal_id"); // _context.Add("terminal_id", _terminalID); //} //if (!_context.ContainsKey("station_type")) //{ // _context.Add("station_type", _stationType); //} //else //{ // _context.Remove("station_type"); // _context.Add("station_type", _stationType); //} //------------------------------------------------------- ExecuteSteps(_sn); //DoNextStep (true); return; } if (_sn.ToUpper().ToString() == "PASS") { _sn = _OrderData[0]["serial_number"].ToString().ToUpper(); } lblSerialNumber.Text = _sn; //返工操作 if (_sn.ToUpper().ToString() == "REWORK" && _sn == "C") { FrmInputBoxRework frmInputBoxRework = new FrmInputBoxRework(); if (frmInputBoxRework.ShowDialog() != DialogResult.OK) { ShowMessage("返工过程条码扫描错误!", Color.Red); txtSN.SelectAll(); txtSN.Focus(); return; } string reworkSerialNumber = frmInputBoxRework.Input; if (string.IsNullOrEmpty(reworkSerialNumber)) { ShowMessage("返工过程条码扫描错误!", Color.Red); return; } if (reworkSerialNumber != _OrderData[0]["serial_number"].ToString().ToUpper()) { ShowMessage("扫描条码与当前队列第一条不匹配!", Color.Red); txtSN.SelectAll(); txtSN.Focus(); return; } app.SetSNStatusNG(reworkSerialNumber, 1); app.UpdateViewBoard(_OrderData[0]["serial_number"].ToString().ToUpper(), _terminalID); RefreshQueue(); txtSN.Focus(); ShowMessage("绑定成功!", Color.Green); txtSN.SelectAll(); txtSN.Focus(); return; } if (_sn != _OrderData[0]["serial_number"].ToString().ToUpper()) { ShowMessage("扫描条码与当前队列不匹配!", Color.Red); txtSN.SelectAll(); txtSN.Focus(); return; } else { //回收上一次的资源 //if ( step != null ) //{ // //释放加载的工步页面信息 // step .Dispose (); // //释放完成工步的资源 // CurrentStep .Dispose (); // step = null; //} //txtSpec.Text = _OrderData.Rows[0]["part_spec"].ToString(); //txtPart.Text = _OrderData.Rows[0]["enum_desc"].ToString(); //textModel.Text = _OrderData.Rows[0]["model_desc"].ToString(); } // 只有设置为 NOT AUTO LOAD SN 时才在条码扫描后把条码加入到上下文中 //---------------------------------------2019-07-09 删除 //if (!_context.ContainsKey("serial_number")) //{ // _context.Add("serial_number", _sn); //} //else //{ // //机器人扭矩采集工位没有完成工步这一操作(亦不会刷新SN),通过此方式刷新SN // _context.Remove("serial_number"); // _context.Add("serial_number", _sn); //} //if (!_context.ContainsKey("terminal_id")) //{ // _context.Add("terminal_id", _terminalID); //} //-------------------------------------- //检查过程条码的当前流程是否正确 if (GetProcessIsNecessary(_terminalID, _sn)) { app.UpdateSNinProcessTime(_sn); bool result = CheckRoute(_sn, _terminalID); if (!result) { labErrorMessage.Text = ErrorMessage; labErrorMessage.ForeColor = Color.Red; txtSN.Text = string.Empty; return; } } else { //更新进入流程时间 app.UpdateSNinProcessTime(_sn); } // 扫描了条码并按下回车,开始处理逻辑 if (!_context.ContainsKey("serial_number")) { _context.Add("serial_number", _sn); } else { _context.Remove("serial_number"); _context.Add("serial_number", _sn); } ExecuteSteps(_sn); string stationType = app.stationType(_terminalID.ToString()); if (app.isExec("isExec") == "Y" ||string.IsNullOrEmpty( app.isExec("isExec"))) { if (stationType == "C") { //更新条码状态为下线 app.updateStatus(_sn); } } } /// /// 所有的工步信息列表 /// List _steps = new List(); /// /// 当前正在执行的工步编号 /// int _stepIndex = 0; /// /// 当前正在执行的前台界面工步编号,以此判断步骤是否往下 /// int _stepAction = 2; /// /// 是否开始第一个工步操作 /// bool isBeginWork = false; bool isBeginTiming = false; /// /// 记录工步的等待时间及操作时间 /// DateTime eachWaitTime = DateTime.Now; DateTime eachActionTime = DateTime.Now; double waitSeconds = 0; double actionSeconds = 0; int RouteWaitSeconds = 0; int RouteActionSeconds = 0; /// /// 工步执行步骤相关信息 /// List StepData = null; StepBase CurrentStep = new StepBase(); StepBase step = null; /// /// 工步完成后是否释放工步页面加载信息 /// private bool stepDispose = false; /// /// 执行本工位的逻辑 /// /// private void ExecuteSteps(string sn) { try { // 获取工步信息 StepData = app.GetRouteStepBySNAndTerminal(sn, _terminalID); if (!httpClient.CheckDataValid(StepData)) { ShowMessage("此工位没有配置工步,请联系相关人员!", Color.Red); WriteErrorLog(string.Format("此工位没有配置工步,请联系相关人员!条码:{0},工位编号:{1}", sn, _terminalID), null); return; } // 清除上一次的工步信息 try { _steps.Clear(); _stepIndex = 0; _stepAction = 2; } catch { _stepIndex = 0; _stepAction = 2; } flpSteps.Controls.Clear(); panControlArea.Controls.Clear(); panControlArea.Enabled = true; // 筛选出带界面的工步信息 dynamic Rows = StepData.FirstOrDefault("action=0"); if (Rows != null && Rows.Length > 0) { #region 创建步进符号 Button btnStepSpec = new Button(); btnStepSpec.FlatStyle = FlatStyle.Popup; btnStepSpec.Height = 40; btnStepSpec.Width = 100; btnStepSpec.Text = "步骤"; btnStepSpec.Font = new Font("微软雅黑", 13, FontStyle.Bold); btnStepSpec.Enabled = false; flpSteps.Controls.Add(btnStepSpec); #endregion for (int i = 0; i < Rows.Length; i++) { // 生成按钮并加到左侧的列表中 Button button = new Button(); button.Name = string.Format("btnStepTag{0}", i + 1); button.FlatStyle = FlatStyle.Popup; button.BackColor = Color.Green; button.Font = new Font("微软雅黑", 25, FontStyle.Bold); button.Height = 50; button.Width = 100; button.ForeColor = Color.White; button.Text = (i + 1).ToString(); flpSteps.Controls.Add(button); } } foreach (var dr in StepData) { string DllName = dr["dll_name"].ToString(); string ClassName = dr["class_name"].ToString(); if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DllName))) { MessageBox.Show(string.Format("未找到文件 {0} !", DllName)); WriteErrorLog(string.Format("未找到文件 {0} !", DllName), null); return; } Assembly assembly = Assembly.LoadFrom( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DllName)); if (assembly == null) { MessageBox.Show( string.Format( "加载 DLL: {0} 错误!", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DllName))); WriteErrorLog(string.Format( "加载 DLL: {0} 错误!", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DllName)), null); return; } try { step = assembly.CreateInstance( ClassName, false, BindingFlags.Default, null, null, null, null) as StepBase; if (step == null) { MessageBox.Show(string.Format("创建对象失败!类名:{0}", ClassName)); WriteErrorLog(string.Format("创建对象失败!类名:{0}", ClassName), null); return; } // 初始化工步 step.InitContext(_context, httpClient, this); //step.OnAction += new StepBase.ActionEventHandler(step_OnAction); step.OnComplated += new StepBase.ComplateEventHandler(step_OnComplated); step.OnFailed += new StepBase.ErrorEventHandler(step_OnFailed); step.OnShowMessage += new StepBase.ShowMessageEventHandler(step_OnShowMessage); step.OnStopStep += new StepBase.StopStepEventHandler(step_OnStopStep); step.Name = dr["class_name"].ToString().Trim(); step.Dock = DockStyle.Fill; step.action = Convert.ToInt32(dr["action"]); // 需要交互的工步才显示 if (Convert.ToInt32(dr["action"]) == 0) { // 把工步添加到窗口 panControlArea.Controls.Add(step); } // 把工步添加到工步列表中 _steps.Add(step); } catch (Exception ex) { MessageBox.Show(ex.ToString()); MessageBox.Show("创建对象失败,请检查类名是否包含命名空间,并继承自 StepBase 类!"); WriteErrorLog("创建对象失败,请检查类名是否包含命名空间,并继承自 StepBase 类!", ex); } } lblmag.Text = ""; // 执行第一个工步 // 第一个一个工步的执行 CurrentStep = _steps[_stepIndex]; _steps[_stepIndex++].Do(); isBeginTiming = true; //开始执行设置工步1为正在执行中 //flpSteps.Controls[1].ForeColor = Color.Black; } catch (Exception ex) { ShowMessage("系统出现异常!", Color.Red); // 记录日志 WriteLog(" " + ex.ToString()); } } /// /// 工步开始执行时调用,记录工步等待时间及操作时间 /// /// /// void step_OnAction(object sender, EventArgs e) { DateTime wait_time = DateTime.Now; waitSeconds = wait_time.Subtract(eachWaitTime).TotalMilliseconds; eachWaitTime = wait_time; //节拍时间 int ct = app.GetJPHTime(_terminalID); //修正进入倒计时后再更改颜色 lblActionTitle.BackColor = Color.Green; lblWaitTime.BackColor = Color.Green; RouteWaitSeconds = ct; lblWaitTime.Text = ct.ToString(); RouteActionSeconds = ct; timerRefrensh.Enabled = true; } //工步完成xx1 void step_OnComplated(object sender, EventArgs e) { try { DateTime action_time = DateTime.Now; actionSeconds = action_time.Subtract(eachWaitTime).TotalMilliseconds; eachWaitTime = action_time; int route_id = 0, step_id = 0, seq = 0; dynamic drRouteStep = StepData.FirstOrDefault("class_name = '" + CurrentStep.Name + "'"); if (drRouteStep.Length > 0) { route_id = Convert.ToInt32(drRouteStep[0]["route_id"]); step_id = Convert.ToInt32(drRouteStep[0]["step_id"]); seq = Convert.ToInt32(drRouteStep[0]["seq"]); } lock (app) { if (_stepIndex == _steps.Count) { //整个工序耗时记录 int subSeconds = RouteActionSeconds - Convert.ToInt32(lblWaitTime.Text); } } // 工步执行完成 if (_stepIndex == _steps.Count) { AllStepComplated(); } else { //-------------------------2017-04-14------------------------------ CurrentStep.Dispose(); //-------------------------2017-04-14------------------------------ _stepIndex++; DoNextStep(true); } } catch (Exception ex) { // 记录日志 WriteLog(" " + ex.ToString()); } } private void AllStepComplated() { if (GetProcessIsNecessary(_terminalID, _sn)) { app.UpdateSNoutProcessTime(_sn); bool result = RouteGO(_sn, _terminalID); if (!result) { labErrorMessage.Text = ErrorMessage; labErrorMessage.ForeColor = Color.Red; txtSN.Text = string.Empty; return; } } else { snTravel(); } if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "opc_ok"))) { string planCode = app.validataLimit("PlanCode"); string partLoc = app.getPartLocation(_sn); if (planCode == "GY" && partLoc == "0A") { //贵阳三排是双托盘(托盘上的第一个产品完成后不发送放行信号),需要特殊处理 } else { //发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); } // 记录日志 WriteLog("" + "条码:" + _sn + " 放行信号已发送!"); if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 lblOPC.Text = _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData[0]["enum_desc"].ToString() + "-" + "已放行"; } else { lblOPC.Text = _sn + "-" + _OrderData[0]["enum_desc"].ToString() + "-" + "已放行"; } lblOPC.ForeColor = Color.Green; } //更新队列 if (currentStatus != 9 && currentStatus != 8) { string _seq = _OrderData[0]["seq"].ToString(); bool _updateT = app.UpdateTerminalPoint(_seq, _terminalID); } //累加计数器值 CountAdd(); if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 ShowMessage("流水号:[" + _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData[0]["enum_desc"].ToString() + "]操作已完成,请继续操作!", Color.Green); dddd(_sn.Substring(_sn.IndexOf("T") + 1, 12)); } else { ShowMessage("流水号:[" + _sn + "-" + _OrderData[0]["enum_desc"].ToString() + "]操作已完成,请继续操作!", Color.Green); } //释放加载的工步页面信息 //-------------------------2017-04-14------------------------------ //timerRefrensh.Enabled = false; _context.Clear(); try { //释放工步定时器 CurrentStep.TickDispose(); } catch { } txtSN.Text = string.Empty; txtSN.Focus(); panControlArea.Controls.Clear(); panControlArea.Enabled = false; _sn = ""; _steps = new List(); flpSteps.Controls.Clear(); try { if (step != null) { step.Dispose(); } CurrentStep.Dispose(); } catch { } RefreshQueue(); //-------------------------2017-04-14------------------------------ } //进行下一个工步操作xx2 private void DoNextStep(bool isSucess) { try { string _stepName = CurrentStep.Name; dynamic drStep = StepData.FirstOrDefault("class_name='" + _stepName.ToString() + "'"); if (drStep.Length > 0) { int next_seq = 0; if (isSucess) { next_seq = Convert.ToInt32(drStep[0]["next_seq"]); } else { next_seq = Convert.ToInt32(drStep[0]["fail_seq"]); } dynamic drNextStep = StepData.FirstOrDefault("seq=" + next_seq + ""); if (drNextStep.Length > 0) { string class_name = drNextStep[0]["class_name"].ToString().Trim(); Predicate next = delegate(StepBase step) { return step.Name.Equals(class_name); }; CurrentStep = _steps.Find(next); CurrentStep.Do(); //判断是否前台界面,设置步骤往下执行 if (_stepAction < flpSteps.Controls.Count) { flpSteps.Controls[_stepAction - 1].ForeColor = Color.White; flpSteps.Controls[_stepAction].ForeColor = Color.Black; _stepAction++; } } else { AllStepComplated(); #region //ShowMessage("所有工步执行完成,请继续下一个操作!", Color.Green); //WriteInfoLog("所有工步执行完成,请继续下一个操作!"); //app.UpdateSNoutProcessTime(_sn); //if (GetProcessIsNecessary(_terminalID, _sn)) //{ // bool result = RouteGO(_sn, _terminalID); // if (!result) // { // labErrorMessage.Text = ErrorMessage; // labErrorMessage.ForeColor = Color.Red; // txtSN.Text = string.Empty; // return; // } //} //else //{ // snTravel(); //} //if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "opc_ok"))) //{ // ////发送OPC放行信号 // //app.UpdatePLC("OPC_OK", _terminalID, "TRUE"); // ////发送OPC放行信号 // bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // // 记录日志 // using (StreamWriter sw = new StreamWriter("PLC_Log-" + DateTime.Now.ToString("yyyy-MM") + ".txt", true)) // { // sw.WriteLine(string.Format("{0}", "[" // + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") // + "] 条码:" + _sn + " 放行信号已发送!")); // sw.Flush(); // sw.Close(); // } // if (app.validataList("SNCutCheck") == "Y") // { // //余姚工厂使用 // lblOPC.Text = _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData.Rows[0]["enum_desc"].ToString() + "-" + "已放行"; // } // else // { // lblOPC.Text = _sn + "-" + _OrderData.Rows[0]["enum_desc"].ToString() + "-" + "已放行"; // } // lblOPC.ForeColor = Color.Green; //} ////工位操作计时器停止 //timerRefrensh.Enabled = false; //_context.Clear(); ////释放加载的工步页面信息 ////step.Dispose(); ////----------------------------------2019-07-09 //panControlArea.Controls.Clear(); //panControlArea.Enabled = false; //txtSN.Text = string.Empty; //txtSN.Focus(); ////更新队列 //if (currentStatus != 9 || currentStatus != 8) //{ // string _seq = _OrderData.Rows[0]["seq"].ToString(); // bool _updateT = app.UpdateTerminalPoint(_seq, _terminalID); //} ////累加计数器值 //CountAdd(); ////-------------------------2017-04-14------------------------------ //step.Dispose(); //CurrentStep.Dispose(); ////-------------------------2017-04-14------------------------------ //RefreshQueue(); //if (app.validataList("SNCutCheck") == "Y") //{ // //余姚工厂使用 // ShowMessage("流水号" + _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData.Rows[0]["enum_desc"].ToString() + "上一个已完成,请继续操作!", Color.Green); // dddd(_sn.Substring(_sn.IndexOf("T") + 1, 12)); //} //else //{ // ShowMessage("流水号" + _sn + "-" + _OrderData.Rows[0]["enum_desc"].ToString() + "上一个已完成,请继续操作!", Color.Green); //} #endregion } } } catch (Exception ex) { // 记录日志 WriteLog(" " + ex.ToString()); } } /// /// 添加工位显示完成信息 /// /// private void dddd(string text) { Label lblTitle = new Label(); lblTitle.Name = "lblmag"; lblTitle.Dock = System.Windows.Forms.DockStyle.Fill; lblTitle.Font = new System.Drawing.Font("宋体", 150F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); lblTitle.ForeColor = Color.Black; lblTitle.Location = new System.Drawing.Point(0, 0); lblTitle.Size = new System.Drawing.Size(709, 652); //lblTitle.TabIndex = 0; lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; lblTitle.Text = text + " 已完成"; panControlArea.Controls.Add(lblTitle); } /// /// 计算节拍是正数还是负数 /// private bool minus = false; private void timerRefrensh_Tick(object sender, EventArgs e) { try { int waitSeconds = Convert.ToInt32(lblWaitTime.Text); if (lblWaitTime.Text != "0" && !minus) { lblWaitTime.Text = (waitSeconds - 1).ToString(); lblWaitTime.BackColor = Color.Green; lblActionTitle.BackColor = Color.Green; } else { minus = true; lblWaitTime.Text = (waitSeconds + 1).ToString(); lblWaitTime.BackColor = Color.Red; lblActionTitle.BackColor = Color.Red; } } catch (Exception ex) { ShowMessage("计时器报错---" + ex.Message); WriteErrorLog("计时器报错---" + ex.Message, ex); } } /// /// 显示工步的信息 /// /// /// void step_OnShowMessage(object sender, string msg) { // 显示工步的信息 string split = "|"; string[] array = null; array = msg.Split(split.ToCharArray()); if (array.Length > 1) { if (array[0].ToUpper() == "RED") { OPC_FM();//余姚蜂鸣 this.labErrorMessage.ForeColor = Color.Red; } else if (array[0].ToUpper() == "GREEN") { this.labErrorMessage.ForeColor = Color.Green; } else { this.labErrorMessage.ForeColor = Color.Black; } this.labErrorMessage.Text = array[1]; } else { this.labErrorMessage.ForeColor = Color.Black; this.labErrorMessage.Text = msg; } WriteInfoLog(msg); } /// /// 工步停止 /// /// /// void step_OnStopStep(int type) { if (type == 1) { //返工处理 //2019-08-03Mark防止同一个条码进行两次返修 app.SetSNStatusNG(_context["serial_number"].ToString().ToUpper(), 1); ///2019-1-25Mark贵阳终检标记不良不更新SEQ if (!app.validataLimit("GYInReworkNOseqList").Contains(_terminalID.ToString())) { app.UpdateViewBoard(_OrderData[0]["serial_number"].ToString().ToUpper(), _terminalID); } ShowMessage("条码【" + _context["serial_number"].ToString().ToUpper() + "】不良绑定成功!", Color.Green); RefreshQueue(); txtSN.Focus(); txtSN.SelectAll(); txtSN.Focus(); step.Dispose(); try { step = null; } catch { } CurrentStep.Dispose(); //写返工信号到PLC app.UpdateOPCPointValue("OPC_ReWork", _terminalID, "TRUE"); // 记录日志 WriteLog(" " +_OrderData[0]["serial_number"].ToString().ToUpper() + " 写入成功!"); if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "OPC_OK"))) { ////发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // 记录日志 WriteLog(" "+" 条码:" + _sn + " 放行信号已发送!"); if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 lblOPC.Text = _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + "已放行"; } else { lblOPC.Text = _sn + "-" + "已放行"; } lblOPC.ForeColor = Color.Green; } return; } if (type == 2) //余姚 { RefreshQueue(); txtSN.Focus(); ShowMessage("条码【" + _OrderData[0]["serial_number"].ToString().ToUpper() + "】不良绑定成功!", Color.Green); txtSN.SelectAll(); txtSN.Focus(); step.Dispose(); try { step = null; } catch { } CurrentStep.Dispose(); panControlArea.Controls.Clear(); panControlArea.Enabled = true; if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 lblOPC.Text = _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + "已放行"; } else { lblOPC.Text = _sn + "-" + "已放行"; } lblOPC.ForeColor = Color.Green; return; //if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "OPC_OK"))) //{ // ////发送OPC放行信号 // bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // // 记录日志 // using (StreamWriter sw = new StreamWriter("PLC_Log-" + DateTime.Now.ToString("yyyy-MM") + ".txt", true)) // { // sw.WriteLine(string.Format("{0}", "[" // + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") // + "] 条码:" + _context["serial_number"].ToString() + " 放行信号已发送!")); // sw.Flush(); // sw.Close(); // } // if (app.validataList("SNCutCheck") == "Y") // { // //余姚工厂使用 // lblOPC.Text = _context["serial_number"].ToString().Substring(_context["serial_number"].ToString().IndexOf("T") + 1, 12) + "-" + "已放行"; // } // else // { // lblOPC.Text = _context["serial_number"].ToString() + "-" + "已放行"; // } // lblOPC.ForeColor = Color.Green; //} } } /// /// 工步完成事件 /// void step_OnFailed(object sender, EventArgs e) { // 预留方法,暂不使用 //throw new NotImplementedException(); DoNextStep(false); } /// /// 解锁 /// /// /// private void btnJumpStep_Click(object sender, EventArgs e) { try { if (_OrderData.Count <= 0) { ShowMessage("当前没有生产队列,不能进行解锁操作!", Color.Red); return; } ShowMessage("请输入密码!", Color.Green); FrmPassword frmPassword = new FrmPassword(); if (frmPassword.ShowDialog() == DialogResult.OK) { string SysPWD = app.GetJupStepPassword(_terminalID); if (frmPassword.Password.Trim() != SysPWD.Trim()) { ShowMessage("密码输入错误!", Color.Red); txtSN.Focus(); return; } else { // 插入解锁记录 _sn = _OrderData[0]["serial_number"].ToString(); app.InsertUnlock(_terminalID.ToString(), _sn); AllStepComplated(); ShowMessage("条码:" + _sn + "任务单已经跳过此工位!", Color.Green); } } } catch { } } /// /// 主窗体界面 /// /// /// private void FrmMain_Load(object sender, EventArgs e) { lblVersion.Text = "V" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); lblWaitTime.Text = "0"; WriteInfoLog("程序启动!"); btnUser.Text = app.GetUserInfo(_userNo)[0]["emp_no"].ToString() + "\n\r" + app.GetUserInfo(_userNo)[0]["emp_name"].ToString(); if (string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "OPC_ReadSN"))) { ReadSN.Enabled = false; } _stationType = app.stationType(_terminalID.ToString()); if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "StartWriteRFID"))) { bunWrite.Enabled = true; } else { bunWrite.Enabled = false; } RefreshQueue(); //RefrenshProdData.Enabled = true; //RefrenshProdData.Start(); //---------------------2019-07-09 删除 //if (!_context.ContainsKey("station_type")) //{ // _context.Add("station_type", _stationType); //} //else //{ // _context.Remove("station_type"); // _context.Add("station_type", _stationType); //} //-------------------------------------------------- #region 2019-01-04 开启使用 //DataTable RFIDIP = app.GetRFIDIP(_terminalID, "RFID_IP"); //if (RFIDIP != null && RFIDIP.Rows.Count > 0) //{ // string paramName = RFIDIP.Rows[0]["param_value"].ToString(); // string[] str = paramName.Split(':'); // string rfidIP = str[0].ToString(); // int port = Convert.ToInt32(str[1]); // _RF182C = new RF182C(); // bool connectionStatus = _RF182C.Connect(rfidIP, port); // if (connectionStatus == true) // { // bool initializeState = _RF182C.Initialization(); // if (initializeState == true) // { // lblRFIDState.Text = "RFID连接成功"; // lblRFIDState.ForeColor = Color.Green; // initializeRFIDState = true; // } // else // { // lblRFIDState.Text = "RFID连接失败"; // lblRFIDState.ForeColor = Color.Red; // initializeRFIDState = false; // } // if (!_context.ContainsKey("initializeRFIDState")) // { // _context.Add("initializeRFIDState", initializeRFIDState); // } // else // { // _context.Remove("initializeRFIDState"); // _context.Add("initializeRFIDState", initializeRFIDState); // } // } // else // { // lblRFIDState.Text = "RFID连接失败"; // lblRFIDState.ForeColor = Color.Red; // initializeRFIDState = false; // if (!_context.ContainsKey("initializeRFIDState")) // { // _context.Add("initializeRFIDState", initializeRFIDState); // } // else // { // _context.Remove("initializeRFIDState"); // _context.Add("initializeRFIDState", initializeRFIDState); // } // } //} #endregion tsmFullScreen_Click(null, null); } #region 记录日志信息 /// /// 写入日志信息 /// /// private void WriteInfoLog(string message) { if (_loggerInfo.IsInfoEnabled) { _loggerInfo.Info(message); } } private void WriteTraceLog(string message) { if (_loggerTrace.IsWarnEnabled) { _loggerTrace.Warn(message); } } private void WriteErrorLog(string message, Exception ex) { if (_loggerError.IsErrorEnabled) { _loggerError.Error(message, ex); } } #endregion private void ServerDateTime_Tick(object sender, EventArgs e) { //lblDateTime.Text = "系统当前时间:" + app.GetServerTime().ToString("yyyy-MM-dd HH:mm"); try { #region 2019-01-04 开启使用 if (initializeRFIDState == true) { //_RF182C.ParseBuffer(); //if (_RF182C.TagState == true) //{ // lblTagState.Text = "检测到TAG"; // lblTagState.ForeColor = Color.Green; // RFID_TAGState = true; // if (!_context.ContainsKey("TAGState")) // { // _context.Add("TAGState", RFID_TAGState); // } // else // { // _context.Remove("TAGState"); // _context.Add("TAGState", RFID_TAGState); // } // DataTable RFIDOperationType = app.GetRFIDOperationType(_terminalID, "RFID_IP"); // string perationType = ""; // if (RFIDOperationType.Rows.Count > 0) // { // perationType = RFIDOperationType.Rows[0]["operation_type"].ToString(); // } // if (perationType.ToUpper().ToString() == "READ") // { // RF182C.read(); // if (barcodeLast != RF182C.BarCode) // { // if (!string.IsNullOrEmpty(RF182C.BarCode)) // { // barcodeLast = RF182C.BarCode; // txtSN.Text = RF182C.BarCode; // txtSN_KeyPress(null, new KeyPressEventArgs((char)13)); // txtSN.Text = ""; // } // else // { // //ShowMessage("读取条码失败!", Color.Red); // txtSN.Text = ""; // } // } // else // { // return; // } // } //} //else //{ // //barcodeLast = ""; 未检测到到TAG,读取条码清空 // lblTagState.Text = "未检测到TAG"; // lblTagState.ForeColor = Color.Yellow; // RFID_TAGState = false; // if (!_context.ContainsKey("TAGState")) // { // _context.Add("TAGState", RFID_TAGState); // } // else // { // _context.Remove("TAGState"); // _context.Add("TAGState", RFID_TAGState); // } //} } else { //给生产线PLC发送心跳信号 bool PLCHeartbeat = app.heartBeat(_terminalID.ToString() + "PLCHeartbeat"); if (PLCHeartbeat && "100003,100012,".Contains(_terminalID.ToString())) { app.sendHeartBeat(_terminalID.ToString() + "PLCHeartbeat"); } //读取托盘到位信号 TAGState = app.ReadyPlc("OPC_TAGState", _terminalID).ToString().ToUpper(); if (TAGState == "TRUE") { lblTagState.Text = "检测到TAG"; lblTagState.ForeColor = Color.Green; if (!_context.ContainsKey("TAGState")) { _context.Add("TAGState", TAGState); } else { _context.Remove("TAGState"); _context.Add("TAGState", TAGState); } } else { lblTagState.Text = "未检测到TAG"; lblTagState.ForeColor = Color.Red; if (!_context.ContainsKey("TAGState")) { _context.Add("TAGState", TAGState); } else { _context.Remove("TAGState"); _context.Add("TAGState", TAGState); } } } #endregion } catch { //ServerDateTime .Enabled = false; TAGState = "False"; return; } } /// /// 读取RFID条码 /// /// /// private void ReadSN_Tick(object sender, EventArgs e) { try { ReadSN.Enabled = false; string planCode = app.validataLimit("PlanCode"); string partLoc = app.getPartLocation(_sn); if (planCode == "GY" && partLoc == "0B") //贵阳三排是双托盘(托盘上的第二个产品不需要读取RFID),需要特殊处理 { return; } //if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "OPC_ReadSN"))) //{ bool TAGStates = false; if (!string.IsNullOrEmpty(TAGState.ToString())) { TAGStates = Convert.ToBoolean(TAGState.ToString()); } if (TAGStates == false) { //ShowMessage("托盘未到位!", Color.Red); } else { string SN = app.ReadyPlc("OPC_ReadSN", _terminalID).ToString().Trim().ToUpper(); if (!string.IsNullOrEmpty(SN)) { if (_OldSN != SN) { _OldSN = SN; txtSN.Text = SN; //执行回车 txtSN_KeyPress(null, new KeyPressEventArgs((char)13)); txtSN.Text = ""; } else { txtSN.Text = ""; return; } } else { //ShowMessage("读取条码失败!", Color.Red); //return; } } //} //else //{ // return; //} } catch (Exception ex) { // 记录日志 WriteLog(" " + ex.ToString()); return; } finally { ReadSN.Enabled = true; } } /// /// 刷新队列 /// /// /// private void RefrenshProdData_Tick(object sender, EventArgs e) { try { RefrenshProdData.Enabled = false; RefrenshProdData.Stop(); if (step == null) { txtSN.Focus(); txtSN.SelectAll(); } AutoLoadSN(); //RefrenshProdData.Enabled = false; //RefrenshProdData.Stop(); } catch { RefrenshProdData.Enabled = true; RefrenshProdData.Start(); } } /// /// 添加上下文参数 /// private void LoadStepParameter() { bool ShowABTest = app.GetTerminalParams(_terminalID, "ShowABTest") == "Y"; bool ShowCharge = app.GetTerminalParams(_terminalID, "ShowCharge") == "Y"; // 添加上下文参数 if (!_context.ContainsKey("station_type")) { _context.Add("station_type", _stationType); } else { _context.Remove("station_type"); _context.Add("station_type", _stationType); } //if (!_context.ContainsKey("m_csPrinter")) //{ // _context.Add("m_csPrinter", m_csPrinter); //} //else //{ // _context.Remove("m_csPrinter"); // _context.Add("m_csPrinter", m_csPrinter); //} //if (!_context.ContainsKey("serial_number")) //{ // _context.Add("serial_number", _sn); //} //else //{ // _context.Remove("serial_number"); // _context.Add("serial_number", _sn); //} if (!_context.ContainsKey("terminal_id")) { _context.Add("terminal_id", _terminalID); } else { _context.Remove("terminal_id"); _context.Add("terminal_id", _terminalID); } if (!_context.ContainsKey("ShowABTest")) { _context.Add("ShowABTest", ShowABTest.ToString()); } else { _context.Remove("ShowABTest"); _context.Add("ShowABTest", ShowABTest.ToString()); } if (!_context.ContainsKey("ShowCharge")) { _context.Add("ShowCharge", ShowCharge.ToString()); } else { _context.Remove("ShowCharge"); _context.Add("ShowCharge", ShowCharge.ToString()); } if (!_context.ContainsKey("TAGState")) { _context.Add("TAGState", TAGState); } else { _context.Remove("TAGState"); _context.Add("TAGState", TAGState); } if (!_context.ContainsKey("initializeRFIDState")) { _context.Add("initializeRFIDState", initializeRFIDState); } else { _context.Remove("initializeRFIDState"); _context.Add("initializeRFIDState", initializeRFIDState); } //添加mes_step_params中配置的数据 List StepParams = app.GetStepParams(); foreach (var dr in StepParams) { if (!_context.ContainsKey(dr["param_name"].ToString())) { _context.Add(dr["param_name"].ToString(), dr["param_value"].ToString()); } else { _context.Remove(dr["param_name"].ToString()); _context.Add(dr["param_name"].ToString(), dr["param_value"].ToString()); } } if (_OrderData.Count > 0) { if (!_context.ContainsKey("serial_number")) { _context.Add("serial_number", _OrderData[0]["serial_number"].ToString()); } else { _context.Remove("serial_number"); _context.Add("serial_number", _OrderData[0]["serial_number"].ToString()); } if (_stationType == "A") { txtSN.Text = _context["serial_number"].ToString(); txtSN_KeyPress(null, new KeyPressEventArgs((char)13)); } else { string planCode = app.validataLimit("PlanCode"); string partLoc = app.getPartLocation(_context["serial_number"].ToString()); if (planCode == "GY" && partLoc == "0B") //贵阳三排是双托盘(托盘上的第二个产品自动触发扫描),需要特殊处理 { txtSN.Text = _context["serial_number"].ToString(); txtSN_KeyPress(null, new KeyPressEventArgs((char)13)); } } } } private void txtSN_Enter(object sender, EventArgs e) { txtSN.SelectAll(); txtSN.BackColor = Color.PeachPuff; } private void txtSN_Leave(object sender, EventArgs e) { txtSN.BackColor = Color.White; } /// /// 计数 /// /// /// private void btnPrdCount_Click(object sender, EventArgs e) { txtSN.SelectAll(); txtSN.Focus(); //让用户确认 if (MessageBox.Show(string.Format(" 确定初始计数器吗? "), "信息提示", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.No) { return; } labPrdCount.Text = "0"; try { StreamWriter sw = new StreamWriter("InPdlineCount.txt"); sw.Write("0"); sw.Flush(); sw.Close(); } catch { ShowMessage("计数器更新错误,未知!", Color.Red); } } /// /// 计数器更新 /// private void CountRead() { //try //{ // if (File.Exists("InPdlineCount.txt")) // { // FileStream fs = new FileStream(@"InPdlineCount.txt", FileMode.Open); // StreamReader sr = new StreamReader(fs); // string content = sr.ReadToEnd(); //一次性读取全部数据 // btnPrdCount.Text = content; // fs.Close(); // sr.Close(); // } // else // { // btnPrdCount.Text = "0"; // } //} //catch //{ // btnPrdCount.Text = "0"; // ShowMessage("计数器更新错误,未知!"); //} //mark 2019-01-24 try { //获取班别 string ShiftID = app.getShiftID(); int dataQty = 0; if (ShiftID == "1001") { dataQty = 0; } else if (ShiftID == "1002") { dataQty = 1; } labPrdCount.Text = app.getActualQty(dataQty, ShiftID, _terminalID); } catch { labPrdCount.Text = "0"; ShowMessage("计数器更新错误,未知!", Color.Red); } } /// /// 计数器更新 /// private void CountAdd() { try { //获取班别 string ShiftID = app.getShiftID(); int dataQty = 0; if (ShiftID == "1001") { dataQty = 0; } else if (ShiftID == "1002") { dataQty = 1; } labPrdCount.Text = app.getActualQty(dataQty, ShiftID, _terminalID); } catch { labPrdCount.Text = "0"; ShowMessage("计数器更新错误,未知!", Color.Red); } } /// /// 补打 /// /// /// private void btnReprint_Click(object sender, EventArgs e) { FrmPassword frmPassword = new FrmPassword(); if (frmPassword.ShowDialog() == DialogResult.OK) { string SysPWD = app.GetSNReprintPassword(); if (frmPassword.Password.Trim() == SysPWD.Trim()) { FrmReprint frmReprint = new FrmReprint(app); frmReprint.ShowDialog(); } else { MessageBox.Show("密码错误!"); } } } /// /// 全屏显示 /// /// /// private void tsmFullScreen_Click(object sender, EventArgs e) { if (this.WindowState != FormWindowState.Maximized) { //this.ShowInTaskbar = false; //this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; } } /// /// 退出全屏 /// /// /// private void tsmQuitFullScreen_Click(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Maximized) { this.ShowInTaskbar = true; this.FormBorderStyle = FormBorderStyle.Sizable; // 把窗体设置为与屏幕一样大 this.Bounds = Screen.PrimaryScreen.Bounds; this.WindowState = FormWindowState.Normal; // 重新加载数据,否则DataGridView的背景色着色会丢失 //LoadData(); } } /// /// 处理按键 /// /// /// /// protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) { int WM_KEYDOWN = 256; int WM_SYSKEYDOWN = 260; if (msg.Msg == WM_KEYDOWN | msg.Msg == WM_SYSKEYDOWN) { switch (keyData) { // ESC 退出全屏 case Keys.Escape: tsmQuitFullScreen_Click(null, null); break; // F5 全屏 case Keys.F5: tsmFullScreen_Click(null, null); break; } } return false; } /// /// 任务单刷新 /// /// /// private void btnRefreshProdData_Click(object sender, EventArgs e) { if (step != null) { step.Dispose(); step = null; CurrentStep.Dispose(); flpSteps.Controls.Clear(); panControlArea.Controls.Clear(); panControlArea.Enabled = true; } barcodeLast = ""; RefreshQueue(); txtSN.Focus(); ShowMessage("任务单刷新成功!", Color.Green); ReadSN.Enabled = true; } /// /// 退出系统 /// /// /// private void btnEXIT_Click(object sender, EventArgs e) { string printName = "lppa"; KillProcess(printName); //关闭打印进程 if (MessageBox.Show("确定退出系统?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { System.Environment.Exit(System.Environment.ExitCode); this.Dispose(false); this.Close(); } txtSN.Focus(); } /// /// 错误信息 /// public string ErrorMessage { get; private set; } #region 流程管控 /// /// 检查过程条码的当前流程是否正确 /// /// 过程条码 /// 工位 ID /// 流程是否正确 public bool CheckRoute(string sn, int terminalID) { ErrorMessage = string.Empty; var SNRow = GetSerialNumberData(sn); if (SNRow == null) { ErrorMessage = "条码 " + sn + " 不存在"; return false; } int routeID = Convert.ToInt32(SNRow["route_id"].ToString()); if (routeID == 0) { ErrorMessage = "未查询到 " + sn + " 对应的流程"; return false; } int status = Convert.ToInt32(SNRow["current_status"]); if (status == 1) { ErrorMessage = "条码 " + sn + " 属于不良品"; return false; } int ProcessID = GetProcessID(terminalID); if (ProcessID == 0) { ErrorMessage = "未查询到 " + terminalID + " 对应的制程编号"; return false; } int LastProcessID = GetRouteLastProcessID(routeID); if (LastProcessID == 0) { ErrorMessage = "获取流程 " + routeID + " 的最后一站失败"; return false; } int FirstProcessID = GetRouteFirstProcessID(routeID); if (FirstProcessID == 0) { ErrorMessage = "获取流程 " + routeID + " 的第一站失败"; return false; } // 上线 if (ProcessID == FirstProcessID) { if (SNRow["process_id"].ToString() != "0") { ErrorMessage = "条码已经上线," + sn; return false; } } // 条码的当前制程 int CurrentProcessID = Convert.ToInt32(SNRow["process_id"]); if (!CheckRouteProcessID(routeID, ProcessID, CurrentProcessID)) { string CurrentProcessName = GetProcessName(CurrentProcessID); if (CurrentProcessID == 0) CurrentProcessName = "待上线"; ErrorMessage = "流程错误,最后工站: " + CurrentProcessName; return false; } // 下线 if (ProcessID == LastProcessID) { if (SNRow["next_process"].ToString() == "0" && SNRow["process_id"].ToString() != "0") { ErrorMessage = "条码已经下线," + sn; return false; } } return true; } /// /// 良品,走到下一个流程 /// /// 过程条码 /// 工站编号 /// 执行结果 public bool RouteGO(string sn, int terminalID) { var SNRow = GetSerialNumberData(sn); if (SNRow == null) { ErrorMessage = "条码 " + sn + " 不存在"; return false; } int routeID = Convert.ToInt32(SNRow["route_id"].ToString()); if (routeID == 0) { ErrorMessage = "未查询到 " + sn + " 对应的流程"; return false; } int status = Convert.ToInt32(SNRow["current_status"]); if (status == 1) { ErrorMessage = "条码 " + sn + " 属于不良品"; return false; } int ProcessID = GetProcessID(terminalID); if (ProcessID == 0) { ErrorMessage = "未查询到 " + terminalID + " 对应的制程编号"; return false; } int LastProcessID = GetRouteLastProcessID(routeID); if (LastProcessID == 0) { ErrorMessage = "获取流程 " + routeID + " 的最后一站失败"; return false; } int FirstProcessID = GetRouteFirstProcessID(routeID); if (FirstProcessID == 0) { ErrorMessage = "获取流程 " + routeID + " 的第一站失败"; return false; } // 上线 if (ProcessID == FirstProcessID) { if (SNRow["process_id"].ToString() != "0") { ErrorMessage = "条码已经上线," + sn; return false; } return SNGo(sn, terminalID, routeID, ProcessID, 0); } // 条码的当前制程 int CurrentProcessID = Convert.ToInt32(SNRow["process_id"]); if (!CheckRouteProcessID(routeID, ProcessID, CurrentProcessID)) { string CurrentProcessName = GetProcessName(CurrentProcessID); if (CurrentProcessID == 0) CurrentProcessName = "待上线"; ErrorMessage = "流程错误,最后工站: " + CurrentProcessName; return false; } // 下线 if (ProcessID == LastProcessID) { if (SNRow["next_process"].ToString() == "0" && SNRow["process_id"].ToString() != "0") { ErrorMessage = "条码已经下线," + sn; return false; } return SNGo(sn, terminalID, routeID, ProcessID, 2); } // 下一站 return SNGo(sn, terminalID, routeID, ProcessID, 1); } /// /// 更新条码相关的数据 /// /// 条码 /// 工站编号 /// 流程编号 /// 制程编号 /// 状态, 0=上线,1=下一站,2=下线 /// 是否更新成功 private bool SNGo(string sn, int terminalID, int routeID, int ProcessID, int status) { List SqlStrings = new List(); List> Parameters = new List>(); string Sql; Dictionary Params = new Dictionary(1); // 更新条码状态 Sql = GetSqlForUpdateSNStatus(sn, terminalID, routeID, ProcessID, status == 2); if (string.IsNullOrEmpty(Sql)) return false; SqlStrings.Add(Sql); Parameters.Add(Params); // 插入历史记录 SqlStrings.Add("insert into g_sn_travel select * from g_sn_status where serial_number=@sn"); Params.Add("@sn", sn); Parameters.Add(Params); if (status != 1) { int WorkorderID = GetWorkorderIDBySN(sn); if (WorkorderID == -1) return false; // 更新工单的上线时间 SqlStrings.Add(GetSqlForUpdateWorkorder(WorkorderID, status == 0)); Params = new Dictionary(1); Params.Add("@workorder_id", WorkorderID); Parameters.Add(Params); } // 由事务批次执行方式改为单个 SQL 执行,解决偶发性死锁的问题 for (int i = 0; i < SqlStrings.Count; i++) { httpClient.Execute(SqlStrings[i], Parameters[i]); } return true; } /// /// 获取更新工单的 SQL 语句(带有 @workorder_id 变量,需要填充) /// /// 工单编号 /// true=上线时间,false=下线时间 /// UPDATE SQL 语句 private string GetSqlForUpdateWorkorder(int workorderID, bool inPDLine) { Dictionary Values = new Dictionary(); DateTime time = app.GetServerTime(); // 上线 if (inPDLine) { Values.Add("in_pdline_ymd", time.ToString("yyyy-MM-dd")); Values.Add("in_pdline_hms", time.ToString("HH:mm:ss")); } else // 下线 { Values.Add("out_pdline_ymd", time.ToString("yyyy-MM-dd")); Values.Add("out_pdline_hms", time.ToString("HH:mm:ss")); } return app.Update("g_workorder", Values, " where ruid=@workorder_id", false); } /// /// 根据过程条码查询对应的工单编号 /// /// 过程条码 /// 工单编号 private int GetWorkorderIDBySN(string sn) { string SqlString = "select c.ruid from g_sn_status a, g_workorder_detail b, g_workorder c " + "where a.wo_detail_id=b.ruid and b.workorder_id=c.ruid and a.serial_number=@sn"; Dictionary Params = new Dictionary(1); Params.Add("@sn", sn); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) { StringBuilder SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("select b.ruid from g_sn_status a, g_workorder_base b "); SqlStringBuilder.Append("where a.workorder=b.workorder_no and a.serial_number=@sn "); dt = httpClient.GetEntityList(SqlStringBuilder.ToString(), Params); if (!CheckDataTableInvalid(dt)) { ErrorMessage = "根据过程条码查询工单编号失败, " + sn; return -1; } } return Convert.ToInt32(dt[0][0].ToString()); } /// /// 获取更新过程条码的 SQL 语句(带有 @sn 变量,需要填充) /// /// 过程条码 /// 工站编号 /// 流程编号 /// 制程编号 /// 下线标志,下线时 next_process = 0 /// UPDATE SQL 语句 private string GetSqlForUpdateSNStatus(string sn, int terminalID, int routeID, int ProcessID, bool isOutPDLine) { List TerminalData = GetTerminalData(terminalID); if (!CheckDataTableInvalid(TerminalData)) { ErrorMessage = "UpdateSNStatus(), 获取工站数据失败"; return string.Empty; } Dictionary Values = new Dictionary(); Values.Add("pdline_id", Convert.ToInt32(TerminalData[0]["pdline_id"].ToString())); Values.Add("stage_id", Convert.ToInt32(TerminalData[0]["stage_id"].ToString())); Values.Add("terminal_id", terminalID); Values.Add("process_id", ProcessID); Values.Add("in_process_time", GetOutProcessTime(sn)); Values.Add("out_process_time", app.GetServerTime().ToString()); if (isOutPDLine) Values.Add("next_process", 0); else Values.Add("next_process", GetRouteNextProcessID(routeID, ProcessID)); return app.Update("g_sn_status", Values, " where serial_number=@sn", false); } /// /// 获取工站数据 /// /// 工站编号 /// 工站数据 private List GetTerminalData(int terminalID) { string SqlString = "select * from sys_terminal where terminal_id=@terminal_id"; Dictionary Params = new Dictionary(1); Params.Add("@terminal_id", terminalID); return httpClient.GetEntityList(SqlString, Params); } /// /// 获取过程条码的出站时间 /// /// 过程条码 /// 出站时间 private string GetOutProcessTime(string sn) { string SqlString = "select out_process_time from g_sn_status where serial_number=@sn"; Dictionary Params = new Dictionary(1); Params.Add("@sn", sn); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return string.Empty; return dt[0][0].ToString(); } /// /// 获取流程中下一站的 ID /// /// 流程编号 /// 当前站的 process id /// 下一站的 process id public int GetRouteNextProcessID(int routeID, int processID) { string SqlString = "select next_process_id from sys_route_detail where route_id=@route_id and process_id=@process_id"; Dictionary Params = new Dictionary(1); Params.Add("@route_id", routeID); Params.Add("@process_id", processID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return 0; return Convert.ToInt32(dt[0][0].ToString()); } /// /// 获取过程条码的信息 /// /// 过程条码 /// 过程条码信息 public dynamic GetSerialNumberData(string sn) { string SqlString = "select * from g_sn_status where serial_number=@serial_number"; Dictionary Params = new Dictionary(1); Params.Add("@serial_number", sn); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return null; return dt[0]; } /// /// 检查数据表是否有效 /// /// /// public bool CheckDataTableInvalid(List dt) { if (dt == null) return false; if (dt.Count == 0) return false; return true; } /// /// 根据 TerminalID 获取 ProcessID /// /// Terminal ID /// Process ID public int GetProcessID(int terminalID) { string SqlString = "select process_id from sys_terminal where terminal_id=@terminal_id"; Dictionary Params = new Dictionary(1); Params.Add("@terminal_id", terminalID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return 0; return Convert.ToInt32(dt[0][0].ToString()); } /// /// 获取流程中最后一站的 ID /// /// 流程编号 /// 最后一站的 process id public int GetRouteLastProcessID(int routeID) { string SqlString = "select top 1 next_process_id from sys_route_detail where route_id=@route_id order by seq desc"; Dictionary Params = new Dictionary(1); Params.Add("@route_id", routeID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return 0; return Convert.ToInt32(dt[0][0].ToString()); } /// /// 获取流程中第一站的 ID /// /// 流程编号 /// 第一站的 process id public int GetRouteFirstProcessID(int routeID) { string SqlString = "select top 1 next_process_id from sys_route_detail where route_id=@route_id order by seq"; Dictionary Params = new Dictionary(1); Params.Add("@route_id", routeID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return 0; return Convert.ToInt32(dt[0][0].ToString()); } /// /// 判断当前的制程是否在流程允许通过的范围内 /// /// 流程编号 /// 工站对应的制程编号 /// 条码对应的制程编号 /// 是否可以通过 public bool CheckRouteProcessID(int routeID, int processID, int currentProcessID) { string SqlString = "select process_id from sys_route_detail where route_id=@route_id and next_process_id=@process_id and result=0 order by seq"; Dictionary Params = new Dictionary(2); Params.Add("@route_id", routeID); Params.Add("@process_id", processID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return false; int PreviousProcessID = Convert.ToInt32(dt[0][0].ToString()); if (IsNecessaryProcess(routeID, PreviousProcessID)) { if (currentProcessID == PreviousProcessID) return true; else return false; } else { if (currentProcessID == PreviousProcessID) return true; } return CheckRouteProcessID(routeID, PreviousProcessID, currentProcessID); } /// /// 判断流程中的某一制程是否为 必须经过 制程 /// /// 流程编号 /// 制程编号 /// true=必须,false=不必须 public bool IsNecessaryProcess(int routeID, int processID) { string SqlString = "select necessary from sys_route_detail where route_id=@route_id and next_process_id=@process_id and result=0 order by seq"; Dictionary Params = new Dictionary(2); Params.Add("@route_id", routeID); Params.Add("@process_id", processID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return false; return dt[0][0].ToString() == "Y" ? true : false; } /// /// 获取制程名称 /// /// 制程编号 /// 制程名称 public string GetProcessName(int processID) { string SqlString = "select process_name from sys_process where process_id=@process_id"; Dictionary Params = new Dictionary(1); Params.Add("@process_id", processID); List dt = httpClient.GetEntityList(SqlString, Params); if (!CheckDataTableInvalid(dt)) return string.Empty; return dt[0][0].ToString(); } /// /// 添加过站信息 /// public void snTravel() { //更新工位ID,为过站信息提供TerminalID bool ret2 = app.UpdateSNTerminal(_terminalID, _sn); //插入过站信息 bool ret3 = app.InsertSNTravel(_sn); } /// /// 根据工位ID和条码查询当前工位是否需要流程管控 /// /// /// /// public bool GetProcessIsNecessary(int terminalID, string sn) { StringBuilder querySen = new StringBuilder(1024); querySen.AppendLine("SELECT necessary "); querySen.AppendLine("FROM dbo.sys_route_detail "); querySen.AppendLine("WHERE next_process_id = ( SELECT process_id "); querySen.AppendLine(" FROM sys_terminal "); querySen.AppendLine(" WHERE terminal_id = @terminal_id "); querySen.AppendLine(" ) "); querySen.AppendLine(" AND route_id = ( SELECT route_id "); querySen.AppendLine(" FROM dbo.g_sn_status "); querySen.AppendLine(" WHERE serial_number = @sn "); querySen.AppendLine(" ) "); Dictionary Params = new Dictionary(2); Params.Add("@terminal_id", terminalID); Params.Add("@sn", sn); List dt = httpClient.GetEntityList(querySen.ToString(), Params); if (!CheckDataTableInvalid(dt)) return false; return dt[0][0].ToString().ToUpper() == "Y" ? true : false; } #endregion private void dgvProdList_SelectionChanged(object sender, EventArgs e) { //dgvProdList.ClearSelection(); txtSN.Focus(); } /// /// 工步解锁 /// /// /// private void btnSkipStep_Click(object sender, EventArgs e) { try { if (flpSteps.Controls.Count < 1) { ShowMessage("工步未加载!", Color.Red); return; } if (_steps == null) { ShowMessage("工步未加载!", Color.Red); return; } ShowMessage("请输入密码!", Color.Green); FrmPassword frmPassword = new FrmPassword(); if (frmPassword.ShowDialog() == DialogResult.OK) { string SysPWD = app.GetJupStepPassword(_terminalID); if (frmPassword.Password.Trim() != SysPWD.Trim()) { ShowMessage("密码输入错误!", Color.Red); txtSN.Focus(); return; } // 插入解锁记录 string _sn = _OrderData[0]["serial_number"].ToString(); app.InsertUnlock(_terminalID.ToString(), _sn, "工步解锁"); ShowMessage("条码:" + _sn + "工步解锁成功!", Color.Green); DoNextStep(true); } } catch { } } /// /// 重置RFID /// /// /// private void btnResetRFID_Click(object sender, EventArgs e) { try { //_RF182C.Disconnect(); //DataTable RFIDIP = app.GetRFIDIP(_terminalID, "RFID_IP"); //if (RFIDIP != null && RFIDIP.Rows.Count > 0) //{ // string paramName = RFIDIP.Rows[0]["param_value"].ToString(); // string[] str = paramName.Split(':'); // string rfidIP = str[0].ToString(); // int port = Convert.ToInt32(str[1]); // _RF182C = new RF182C(); // bool connectionStatus = _RF182C.Connect(rfidIP, port); // if (connectionStatus == true) // { // bool initializeState = _RF182C.Initialization(); // if (initializeState == true) // { // lblRFIDState.Text = "RFID连接成功"; // lblRFIDState.ForeColor = Color.Green; // initializeRFIDState = true; // } // else // { // lblRFIDState.Text = "RFID连接失败"; // lblRFIDState.ForeColor = Color.Red; // initializeRFIDState = false; // } // if (!_context.ContainsKey("initializeRFIDState")) // { // _context.Add("initializeRFIDState", initializeRFIDState); // } // else // { // _context.Remove("initializeRFIDState"); // _context.Add("initializeRFIDState", initializeRFIDState); // } // ShowMessage("RFID重置成功!", Color.Green); // } // else // { // lblRFIDState.Text = "RFID连接失败"; // lblRFIDState.ForeColor = Color.Red; // initializeRFIDState = false; // if (!_context.ContainsKey("initializeRFIDState")) // { // _context.Add("initializeRFIDState", initializeRFIDState); // } // else // { // _context.Remove("initializeRFIDState"); // _context.Add("initializeRFIDState", initializeRFIDState); // } // ShowMessage("RFID重置失败!", Color.Red); // lblRFIDState.ForeColor = Color.Red; // initializeRFIDState = false; // } //} } catch { ShowMessage("RFID重置失败!", Color.Red); lblRFIDState.Text = "RFID连接失败"; lblRFIDState.ForeColor = Color.Red; initializeRFIDState = false; } } /// /// 切换工位 /// /// /// private void lblTerminalName_DoubleClick(object sender, EventArgs e) { FrmPassword frmPassword = new FrmPassword(); if (frmPassword.ShowDialog() == DialogResult.OK) { string SysPWD = app.GetSNReprintPassword(); if (frmPassword.Password.Trim() == SysPWD.Trim()) { FrmReTerminal frmTerminal = new FrmReTerminal(app, _terminalID); //frmReprint.ShowDialog(); if (frmTerminal.ShowDialog() == DialogResult.OK) { string terminalId = frmTerminal.Input; // Todo 需要把内容写入配置,如何操作。暂时注释掉。 //_config.GetSection("TerminalID").Value = terminalId.ToString(); //_config.Save(ConfigurationSaveMode.Modified); //ConfigurationManager.RefreshSection("appSettngs"); //LoadStepParameter(); _terminalID = Convert.ToInt32(terminalId); if (!_context.ContainsKey("terminal_id")) { _context.Add("terminal_id", _terminalID); } else { _context.Remove("terminal_id"); _context.Add("terminal_id", _terminalID); } frmTerminal.Close(); string userNo = btnUser.Text.ToString(); this.Hide(); //先隐藏主窗体 FrmMain frmain = new FrmMain(100001, _userID, _userNo); //重新实例化此窗体 frmain.ShowDialog();//已模式窗体的方法重新打开 this.Close();//原窗体关闭 } } else { MessageBox.Show("密码错误!"); } } } /// /// 切换用户 /// /// /// private void btReplaceUser_Click(object sender, EventArgs e) { this.Hide(); Login frmlogin = new Login(); frmlogin.ShowDialog(); } /// /// 注销 /// /// /// private void btCancel_Click(object sender, EventArgs e) { if (MessageBox.Show("是否确定关闭电脑?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { ProcessStartInfo ps = new ProcessStartInfo(); ps.FileName = "shutdown.exe"; ps.Arguments = "-s -t 1"; Process.Start(ps); } else { return; } } //关闭程序 private void FrmMain_FormClosed(object sender, FormClosedEventArgs e) { //if (null != m_csPrinter) //{ // //m_csPrinter.Quit(); // m_csPrinter = null; //} string printName = "lppa"; KillProcess(printName); //关闭打印进程 System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close(); } private void txtSerialNumber_DoubleClick(object sender, EventArgs e) { if (txtCarNo.SelectedText != "") Clipboard.SetDataObject(txtCarNo.SelectedText); } /// /// 扫描间隔时间 /// /// private bool IsAllowPass() { //PASS码两次扫描时间 try { _passIntervalValue = Convert.ToInt32(app.validataLimit("PassIntervalValue")); } catch { _passIntervalValue = 2000; } //PASS码间隔限制工位集合 _passIntervalLimit = app.validataLimit("PassIntervalLimit"); //如果不在限制的工位集合范围则返回TRUE if (_passIntervalLimit.IndexOf(_terminalID.ToString() + ",") < 0) { return true; } try { TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); TimeSpan ts2 = new TimeSpan(_lastPassDatetime.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); long diffValue = Convert.ToInt64(ts.TotalMilliseconds); if (diffValue >= _passIntervalValue) { return true; } } catch { return true; } return false; } /// /// 指定工位开启写入RFID 参数设置在sys_terminal_params /// /// /// private void butWrite_Click(object sender, EventArgs e) { if (blWriteRFID == true) { blWriteRFID = false; app.UpWriteRFID(_terminalID, 1011, "N"); bunWrite.Text = "写入RFID (关)"; ShowMessage("关闭写入RFID成功!", Color.Green); } else if (blWriteRFID == false) { blWriteRFID = true; app.UpWriteRFID(_terminalID, 1011, "Y"); bunWrite.Text = "写入RFID (开)"; ShowMessage("开启写入RFID成功!", Color.Green); } } /// /// 关闭进程 /// /// 进程名 private void KillProcess(string processName) { Process[] myproc = Process.GetProcesses(); foreach (Process item in myproc) { if (item.ProcessName == processName) { item.Kill(); } } } /// ///余姚蜂鸣信号 /// private void OPC_FM() { if (app.validataList("OPC_FM") == "Y") { if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "OPC_FM"))) { bool ret = app.UpdateOPCPointValue("OPC_FM", _terminalID, "TRUE"); } } } /// /// 工步解锁 /// /// private void StepUnlock(bool isSucess) { try { string _stepName = CurrentStep.Name; dynamic drStep = StepData.FirstOrDefault("class_name='" + _stepName.ToString() + "'"); if (drStep.Length > 0) { int next_seq = 0; if (isSucess) { next_seq = Convert.ToInt32(drStep[0]["next_seq"]); } else { next_seq = Convert.ToInt32(drStep[0]["fail_seq"]); } dynamic drNextStep = StepData.FirstOrDefault("seq=" + next_seq + ""); if (drNextStep.Length > 0) { string class_name = drNextStep[0]["class_name"].ToString().Trim(); Predicate next = delegate(StepBase step) { return step.Name.Equals(class_name); }; CurrentStep = _steps.Find(next); CurrentStep.Do(); //判断是否前台界面,设置步骤往下执行 if (_stepAction < flpSteps.Controls.Count) { flpSteps.Controls[_stepAction - 1].ForeColor = Color.White; flpSteps.Controls[_stepAction].ForeColor = Color.Black; _stepAction++; } } else { ShowMessage("所有工步执行完成,请继续下一个操作!", Color.Green); WriteInfoLog("所有工步执行完成,请继续下一个操作!"); app.UpdateSNoutProcessTime(_sn); if (GetProcessIsNecessary(_terminalID, _sn)) { bool result = RouteGO(_sn, _terminalID); if (!result) { labErrorMessage.Text = ErrorMessage; labErrorMessage.ForeColor = Color.Red; txtSN.Text = string.Empty; return; } } else { snTravel(); } if (!string.IsNullOrEmpty(app.GetTerminalParams(_terminalID, "opc_ok"))) { ////发送OPC放行信号 //app.UpdatePLC("OPC_OK", _terminalID, "TRUE"); ////发送OPC放行信号 bool ret = app.UpdateOPCPointValue("OPC_OK", _terminalID, "TRUE"); // 记录日志 WriteLog(""+"条码:" + _sn +" 放行信号已发送!"); if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 lblOPC.Text = _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData[0]["enum_desc"].ToString() + "-" + "已放行"; } else { lblOPC.Text = _sn + "-" + _OrderData[0]["enum_desc"].ToString() + "-" + "已放行"; } lblOPC.ForeColor = Color.Green; } //工位操作计时器停止 timerRefrensh.Enabled = false; _context.Clear(); //释放加载的工步页面信息 //step.Dispose(); //----------------------------------2019-07-09 panControlArea.Controls.Clear(); panControlArea.Enabled = false; txtSN.Text = string.Empty; txtSN.Focus(); //更新队列 if (currentStatus != 9 || currentStatus != 8) { string _seq = _OrderData[0]["seq"].ToString(); bool _updateT = app.UpdateTerminalPoint(_seq, _terminalID); } //累加计数器值 CountAdd(); //-------------------------2017-04-14------------------------------ step.Dispose(); CurrentStep.Dispose(); //-------------------------2017-04-14------------------------------ RefreshQueue(); if (app.validataList("SNCutCheck") == "Y") { //余姚工厂使用 ShowMessage("流水号" + _sn.Substring(_sn.IndexOf("T") + 1, 12) + "-" + _OrderData[0]["enum_desc"].ToString() + "上一个已完成,请继续操作!", Color.Green); dddd(_sn.Substring(_sn.IndexOf("T") + 1, 12)); } else { ShowMessage("流水号" + _sn + "-" + _OrderData[0]["enum_desc"].ToString() + "上一个已完成,请继续操作!", Color.Green); } } } } catch (Exception ex) { WriteLog(" " +ex.ToString()); } } /// /// 切换扭矩枪 /// /// /// private void btnCutTorque_Click(object sender, EventArgs e) { //FrmPassword frmPassword = new FrmPassword(); //if (frmPassword.ShowDialog() == DialogResult.OK) //{ // string SysPWD = app.GetPwd("CutTorQue"); // if (frmPassword.Password.Trim() == SysPWD.Trim()) // { // FrmCutTorque frmcuttorque = new FrmCutTorque(app, _terminalID, lblTerminalName.Text); // frmcuttorque.ShowDialog(); // } // else // { // MessageBox.Show("密码错误!"); // } //} } /// /// 记录日志 /// /// 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) { } } /// /// 删除七天前的日志文件 /// /// 日志路径 /// 天 public static void DeleteWeeks(string path, int day)//day = 7 { DateTime NowDate = DateTime.Now; DirectoryInfo yourFolder = new DirectoryInfo(path); //删除当前文件夹内文件 FileInfo[] files = yourFolder.GetFiles(); foreach (FileInfo file in files) { try { TimeSpan timespan = NowDate - file.CreationTime; double t = timespan.TotalDays;//可以改为小时、分钟级别 if (t >= day) { File.Delete(file.FullName); } } catch (Exception ex) { } } //递归删除子文件夹内文件 foreach (DirectoryInfo inFolder in yourFolder.GetDirectories()) { DeleteWeeks(inFolder.FullName, day); } } } }