using HMI.Base; using HMI.Core.Entity; using HMI.Core.Manager; using HMI.Core.Util; using HMI.UI; using HMI.UI.Util; using log4net; using NationalInstruments.TestStand.Interop.API; using NationalInstruments.TestStand.Interop.UI.Ax; using Plugin.TestResult; using Plugin.TestResult_WPF.Model; using Plugin.TestResult_WPF.Util; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; namespace Plugin.TestResult_WPF { /// /// ViewControl.xaml 的交互逻辑 /// public partial class ViewControl : PluginControl { private CommonCodeParser codeParser = new CommonCodeParser(); private double TestTemperature = 60; private int TestTime = 3600; private double SaftyTemperature = 40; private double TestVoltage = 12; private double Time_Heating_Low = 300; private double Time_Heating_High = 2400; private string testSeqFile; private Scanner scannerWindow1; private Scanner scannerWindow2; /// /// 测试序列操作句柄 /// private SequenceContext SequenceContext = null; public static ILog Logger { get; private set; } private bool _mesStatus; public bool mesStatus { get => _mesStatus; set => Set(ref _mesStatus, value); } private string _produceStatus = "INIT"; public string produceStatus { get => _produceStatus; set => Set(ref _produceStatus, value); } public override void SetLogger(ILog logger) { base.SetLogger(logger); Logger = logger; } public ViewControl() { DataContext = this; InitializeComponent(); testResultView.testApp.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication); testResultView.testApp.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent); testResultView.testApp.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed); } public TestResultView View { get => testResultView; } public static string SannerIniFile { get; private set; } public override void InitFinish() { base.InitFinish(); string path = Path.Combine(BaseFolder, "Count.ini"); testResultView.SetCountIniPath(path); testResultView.InitMainGrid(); testResultView.InitTestStandEngine(); path = Path.Combine(BaseFolder, "Scanner.ini"); if (!File.Exists(path)) { File.Create(path).Close(); } SannerIniFile = path; LoadProduct(); } public override void DoClose(object sender, EventArgs e) { testResultView.ReleaseResource(); } private void axApplicationMgr_ExitApplication(object sender, EventArgs e) { } private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e) { } private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e) { try { int EventCase = Convert.ToInt32(e.uiMsg.Event); int MethodCode = Convert.ToInt16(e.uiMsg.NumericData); string strData; if (EventCase != 10014) return; if (MethodCode == 0) { /// 设置句柄 this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData; return; } if (MethodCode == 8) { /// 更新MES状态 strData = e.uiMsg.StringData; mesStatus = strData == "1"; return; } if (MethodCode == 9) { /// 更新生产状态 strData = e.uiMsg.StringData; produceStatus = strData; return; } } catch { } } private bool isLoaded; private void UserControl_Loaded(object sender, RoutedEventArgs e) { new MaskWindow(Window.GetWindow(this), (win) => { Dispatcher.Invoke(() => { try { Start_Click(null, null); Loaded -= UserControl_Loaded; } finally { win.Close(); } }); }).Info(LangUtil.Get("Ts.SequenceIsStarting")); } public void LoadProduct() { List products = ProductManager.GetProducts>() ?? new List(); this.modelSelect.Items.Clear(); List productSource = new List(); foreach (var prd in products) { this.modelSelect.Items.Add(prd.Name); productSource.Add(prd.Name); } testResultView.SetProductSource(productSource); string model = testResultView.engine.Globals.GetValString("ProductModel", 0); if (!string.IsNullOrEmpty(model)) { this.modelSelect.SelectedItem = model; testResultView.SetCurrentProduct(model); } else if (products.Count > 0) { this.modelSelect.SelectedIndex = 0; testResultView.SetCurrentProduct(products[0].Name); } } private void modelSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) { try { string currentModel = this.modelSelect.SelectedItem.ToString(); List parameters = ProductManager.GetParametersByProductName(currentModel); //MessageBox.Show("ParaFile:" + ParaFile + "ParaCount:" + this.parameterManager.Parameters.Count.ToString()); //this.TestTemperature = Convert.ToDouble(this.parameterManager.Find("TestTemperature").ParmValue); //this.TestTime = Convert.ToInt32(this.parameterManager.Find("TestTime").ParmValue); //this.TestVoltage = Convert.ToDouble(this.parameterManager.Find("TestVoltage").ParmValue); //this.SaftyTemperature = Convert.ToDouble(this.parameterManager.Find("SaftyTemperature").ParmValue); //this.Time_Heating_Low = Convert.ToDouble(this.parameterManager.Find("Time_Heat_Low").ParmValue); //this.Time_Heating_High = Convert.ToDouble(this.parameterManager.Find("Time_Heat_High").ParmValue); testResultView.testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value; testResultView.engine.Globals.SetValString("ProductModel", 0, currentModel); testResultView.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false); } catch (Exception ex) { MessageBox.Show("切换产品型号失败!" + ex.Message + ex.StackTrace); } } private void Start_Click(object sender, RoutedEventArgs e) { try { testResultView.StartTestSequence(); this.modelSelect.IsEnabled = false; this.btnStart.IsEnabled = false; this.btnStop.IsEnabled = true; } catch (Exception ex) { log.Error("Start_Click Failed.", ex); MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}"); } } private void Stop_Click(object sender, RoutedEventArgs e) { try { testResultView.StopTest(); this.modelSelect.IsEnabled = true; this.btnStart.IsEnabled = true; this.btnStop.IsEnabled = false; } catch (Exception ex) { log.Error("Stop_Click Failed.", ex); MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StopTestSequenceFailed")}: {ex.Message}"); } } private void Scan_Click_1(object sender, RoutedEventArgs e) { if (scannerWindow1 == null) { scannerWindow1 = new Scanner(this.lang("Tr.Zone1Scan")) { Tag = "Zone1" }; scannerWindow1.FinishBarcode += ScannerWindow_FinishBarcode; //scannerWindow1.Owner = Window.GetWindow(this); scannerWindow1.Closed += ScannerWindow1_Closed; scannerWindow1.Show(); } else { scannerWindow1.Activate(); } } private void Scan_Click_2(object sender, RoutedEventArgs e) { if (scannerWindow2 == null) { scannerWindow2 = new Scanner(this.lang("Tr.Zone2Scan")) { Tag = "Zone2" }; scannerWindow2.FinishBarcode += ScannerWindow_FinishBarcode; scannerWindow2.Owner = Window.GetWindow(this); scannerWindow2.Closed += ScannerWindow2_Closed; scannerWindow2.Show(); } else { scannerWindow2.Activate(); } } /// /// 扫码完成逻辑 /// /// /// private void ScannerWindow_FinishBarcode(object sender, BarcodeEventArg e) { if (this.SequenceContext == null) return; CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode); string paramName = e.name == "Zone1" ? "StationState.StartScanner_A" : "StationState.StartScanner_B"; testResultView.engine.Globals.SetValBoolean(paramName, 0, true); string positionCode = e.positionCode, snrCode = e.snrCode; //需要增加条码校验功能 //将读到的条码写入到SN中 int dutNo = Convert.ToInt16(positionCode.Split('-')[2]) - 1; string LookupStr = e.name == "Zone1" ? $"StationState.SN[{dutNo}]" : $"StationState.SN[{(dutNo + 54)}]"; //this.SequenceContext.StationGlobals.SetValString(LookupStr, 0, snrCode); //string code = this.SequenceContext.StationGlobals.GetValString(LookupStr, 0); testResultView.engine.Globals.SetValString(LookupStr, 0, snrCode); string code = testResultView.engine.Globals.GetValString(LookupStr, 0); testResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode"); } private void ScannerWindow1_Closed(object sender, EventArgs e) { scannerWindow1 = null; } private void ScannerWindow2_Closed(object sender, EventArgs e) { scannerWindow2 = null; } private void testResultView_Loaded(object sender, RoutedEventArgs e) { } /// /// 计数清零按钮事件 /// /// /// private void BtnClear_Click(object sender, RoutedEventArgs e) { testResultView.ClearNumber(); } private void ScannerSetting_Click(object sender, RoutedEventArgs e) { ScannerSetting setting = new ScannerSetting() { Owner = Window.GetWindow(this) }; setting.Open(false,"Config"); } } }