using HMI.Base; using HMI.Core.Api; using HMI.Core.Entity; using HMI.Core.Manager; using HMI.Core.Setting; using HMI.Core.Util; using HMI.LogUtil; using HMI.StdControl; using HMI.UI.Util; using log4net; using NationalInstruments.TestStand.Interop.API; using NationalInstruments.TestStand.Interop.UI.Ax; using PLCHelper; using Plugin.TestResult.Util; using Plugin.TsSupport; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Windows; using System.Windows.Controls; namespace Plugin.TestResult_WPF { /// /// ViewControl.xaml 的交互逻辑 /// public partial class ViewControl : PluginMaskControl, IAlarmHandler { private System.Timers.Timer timer; 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); } private bool enableManualDebug; public bool EnableManualDebug { get => enableManualDebug; set { if (IsRunning) { MsgBoxHelper2.Warn("请先结束自动测试"); return; } testResultView.inManualDebugMode = value; Set(ref enableManualDebug, 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.btnStop.IsEnabled = value; stdEnableMes.CbEnabled = !value; } } private bool AutoExecuteSeq = true; #region TS相关 /// /// 测试序列操作句柄 /// private SequenceContext SequenceContext = null; #endregion public ViewControl() { S7Context.Init(SystemSetting.Instance.PlcIp, SystemSetting.Instance.PlcPort); DataContext = this; timer = new System.Timers.Timer(); timer.Interval = 1000; timer.Elapsed += Timer_Elapsed; InitializeComponent(); if (testResultView.executionWrapper is TsExecutionWrapper tsWrapper) { tsWrapper.AxApplicationMgr.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication); tsWrapper.AxApplicationMgr.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent); tsWrapper.AxApplicationMgr.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed); } //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); } private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { testResultView.RefreshCooler(); } 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(); var api = S7Context.Get(RunTimeVariablePool.DEFAULT_PLC_NAME); log.Debug($"PLC {api.IpAddress}:{api.Port}"); 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; } RefreshUIConfig(); } /// /// 刷新UI配置 /// private void RefreshUIConfig() { try { /// 运行中就不管 if (IsRunning) { return; } bool enableManualDebug = ParameterManager.GetCommonParameterByName("EnableManualDebug", false); if (enableManualDebug) { FgEnableManualDebug.Visibility = Visibility.Visible; } else { FgEnableManualDebug.Visibility = Visibility.Collapsed; EnableManualDebug = false; } } catch (Exception ex) { log.Error("RefreshUIConfig Error.", ex); } } 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) { AlarmShowHelper.AddHandler(this); 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; } 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); testResultView.SetCurrentProduct(null); //string model = testResultView.executionWrapper.GetStationGlobalValue("ProductModel", 1); ////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); testResultView.executionWrapper.SetStationGlobalValue("ProductModel", 0, currentModel); testResultView.executionWrapper.CommitToDisk(false); //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; } LogHelper.Info("UI", "总启动按钮按下", out _); log.Info("总启动按钮按下"); ShowMask(() => { testResultView.StartTestSequence(); Dispatcher.Invoke(() => { IsRunning = true; }); }, (ex) => { log.Error("StartTestSequence Error.", ex); Dispatcher.Invoke(() => { MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}"); }); }, null, "请稍后..."); } 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 { bool breakStop = false; foreach (var oven in TestResultView.tables) { if (oven.IsTesting) { breakStop = true; break; } } if (breakStop) { MsgBoxHelper2.Warn(this.lang("Tr.OvenIsTesting")); return; } if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopAllTest")) != MessageBoxResult.OK) { return; } LogHelper.Info("UI", "总停止按钮按下", out _); log.Info("总停止按钮按下"); testResultView.StopTest(); /// 已经加了WaitForExit,这里可以改为false IsRunning = false; } catch (Exception ex) { log.Error("Stop_Click Failed.", ex); MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StopTestSequenceFailed")}: {ex.Message}"); } } 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.executionWrapper.SetStationGlobalValue($"SystemSetting.{e.StringValue}", 1, e.BoolValue); //testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue); } public void HandleAlarm(AlarmText alarm) { if (alarm.Level >= 4 && TestResultView.tables != null) { log.Info($"4级报警触发: [{alarm.AlarmInfo}],将停止所有炉体测试"); foreach (var oven in TestResultView.tables) { testResultView.SetStartFlag(oven.index, false); } return; } DataTable targetOven = null; foreach (var oven in TestResultView.tables) { if (alarm.AlarmInfo?.StartsWith(oven.title) == true) { targetOven = oven; break; } } if (targetOven == null) { return; } if (alarm.Level >= 3) { /// 3级以上的报警会停止测试 log.Info($"3级报警触发: [{alarm.AlarmInfo}],将停止老化炉[{targetOven.title}]测试"); testResultView.SetStartFlag(targetOven.index, false); } } public override void Active() { base.Active(); LoadProduct(); RefreshUIConfig(); } public override void OnClose(object sender, CancelEventArgs e) { if (IsRunning) { MsgBoxHelper2.Warn("请先停止老化测试!"); e.Cancel = true; } } public override void DoClose(object sender, EventArgs e) { try { timer?.Stop(); testResultView.ReleaseResource(); } catch { } } } }