using HMI.Base; using HMI.Core.Entity; using HMI.Core.Manager; using HMI.Core.Util; using HMI.StdControl; using HMI.UI; using HMI.UI.Util; using log4net; using NationalInstruments.TestStand.Interop.API; using NationalInstruments.TestStand.Interop.UI.Ax; using Plugin.TestResult_WPF.Model; using Plugin.TestResult_WPF.Util; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; namespace Plugin.TestResult_WPF { /// /// ViewControl.xaml 的交互逻辑 /// public partial class ViewControl : PluginMaskControl { 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 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); } private string _fileName; public string FileName { get => _fileName; set => Set(ref _fileName, value); } public override void SetLogger(ILog logger) { base.SetLogger(logger); Logger = logger; } private bool isRunning = false; public bool IsRunning { get => isRunning; set { Set(ref isRunning, value); testResultView.IsRunning = value; this.modelSelect.IsEnabled = !value; this.btnStart.IsEnabled = !value; this.btnStop.IsEnabled = value; } } private bool AutoExecuteSeq = true; 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(); try { var value = ParameterManager.GetCommonParameterByName("AutoExecuteSeq"); AutoExecuteSeq = bool.Parse(value.Value); } catch { AutoExecuteSeq = true; } try { var value = ParameterManager.GetCommonParameterByName("BurnInMainSeq"); testResultView.testSeqFile = value.Value; FileName = Path.GetFileName(value.Value); } catch { testResultView.testSeqFile = string.Empty; FileName = string.Empty; } } public override void DoClose(object sender, EventArgs e) { try { testResultView.ReleaseResource(); } catch { } } 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; try { log.Debug($"EventCase: {EventCase}, MethodCode: {MethodCode}, StrData: {e.uiMsg.StringData}"); } catch { } if (EventCase == 8) { IsRunning = false; return; } 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) { if (AutoExecuteSeq) { ShowMask(() => { Dispatcher.BeginInvoke(new Action(() => { Start_Click(null, null); }), System.Windows.Threading.DispatcherPriority.Background); }, (ex) => { ToastHelper.Error("Loaded Failed."); log.Error("Loaded Failed.", ex); }, "请稍后", LangUtil.Get("Ts.SequenceIsStarting")); } else { IsRunning = false; } Loaded -= UserControl_Loaded; //new MaskWindow(Window.GetWindow(this), (win) => //{ // try // { // Dispatcher.BeginInvoke(new Action(() => // { // Start_Click(null, null); // Loaded -= UserControl_Loaded; // })); // } // finally // { // Dispatcher.Invoke(() => // { // win.Close(); // }); // } //}).Info(LangUtil.Get("Ts.SequenceIsStarting"), 100); //ShowMask(() => //{ // Dispatcher.BeginInvoke(new Action(() => // { // System.Threading.Thread.Sleep(100); // Start_Click(null, null); // Loaded -= UserControl_Loaded; // })); //}, (ex) => //{ // log.Error("Loaded Error.", ex); // Dispatcher.BeginInvoke(new Action(() => // { // MsgBoxHelper.Error(Window.GetWindow(this), ex.Message); // })); //}, "请稍后", 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", 1); 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 { if (string.IsNullOrEmpty(testResultView.testSeqFile)) { MsgBoxHelper2.Warn("请先设置BurnInMainSeq属性!"); IsRunning = false; return; } testResultView.StartTestSequence(); IsRunning = 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(); IsRunning = false; } catch (Exception ex) { log.Error("Stop_Click Failed.", ex); MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StopTestSequenceFailed")}: {ex.Message}"); } } 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) { Plugin.TestResult.ScannerSetting setting = new Plugin.TestResult.ScannerSetting() { Owner = Window.GetWindow(this) }; setting.Open(false, "Config"); } private void StdEnableMes_ValueChanged(object sender, StdUIEventArg e) { testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue); } } }