alielie
2026-04-23 ef52fd6fd07508883dce4eb002acda59f0169e59
Plugin.TsExecution/TsExecution.xaml.cs
@@ -20,6 +20,7 @@
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
@@ -50,6 +51,8 @@
        private SequenceFile modeSeq = null;
        public AxApplicationMgr AxApplicationMgr;
        private Execution execution = null;
        private SequenceContext sequenceContext = null;
        private Chart chart;
        #endregion
@@ -101,6 +104,13 @@
            {
                Set(ref selectedProduct, value);
                CurrentProductModel = value?.Name;
                if (tsSockets != null)
                {
                    foreach (SingleControl socket in tsSockets)
                    {
                        socket.RefreshProduct(value);
                    }
                }
                SetTestSeqFile(value);
            }
        }
@@ -446,6 +456,13 @@
                SelectedProduct = tempProduct;
            }
            RefershUI();
            if (tsSockets != null)
            {
                foreach (SingleControl socket in tsSockets)
                {
                    socket.RefreshProduct(SelectedProduct);
                }
            }
            SampleStatus = false;
        }
@@ -471,24 +488,31 @@
        private void InitTsEngine()
        {
            AxApplicationMgr = TestAppManager.GetAxApplicationMgr();
            //AxApplicationMgr. += AxApplicationMgr_EndExecution;
            AxApplicationMgr.EndExecution += AxApplicationMgr_EndExecution;
            AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
            AxApplicationMgr.UIMessageEvent +=
                new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
            AxApplicationMgr.ExecutionClosed +=
                new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.AxApplicationMgr_ExecutionClosed);
            AxApplicationMgr.ExitApplication += this.AxApplicationMgr_ExitApplication;
            AxApplicationMgr.UIMessageEvent += this.AxApplicationMgr_UIMessageEvent;
            AxApplicationMgr.ExecutionClosed += this.AxApplicationMgr_ExecutionClosed;
            ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
            host.Child = AxApplicationMgr;
            ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
        }
        private volatile bool canSwitchModel = false;
        private volatile Action switchAction = null;
        private void AxApplicationMgr_EndExecution(object sender, _ApplicationMgrEvents_EndExecutionEvent e)
        {
            log.Info("AxApplicationMgr_EndExecution");
            if (ReleaseSequenceFile())
            {
                IsTesting = false;
                log.Info("Release SeqFile Success!");
                if (canSwitchModel) switchAction?.Invoke();
            }
            else
            {
@@ -594,10 +618,21 @@
        private void RefershUI()
        {
            panel.Children.Clear();
            string[] names = ParamSetting.SocketNames.Split(',');
            //重新生成子面板
            for (int i = 0; i < this.socketNum; i++)
            {
                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn);
                string name = string.Empty;
                if (i < names.Length)
                {
                    name = names[i];
                }
                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn)
                {
                    SocketName = name
                };
                panel.Children.Add(control);
                tsSockets.Add(control);
@@ -1026,8 +1061,16 @@
        /// </summary>
        private void StartSequence()
        {
            log.Info($"Start ATE Seq isLoadOK:{isLoadOK}");
            if (!isLoadOK) return;
            try
            {
                engine?.Globals.SetValBoolean("StationState.StopTest", 1, false);
            }
            catch (Exception ex)
            {
                log.Error("Reset StopTest Failed.", ex);
            }
            if (ParamSetting.EnableAutoModel)
            {
                try
@@ -1085,35 +1128,12 @@
        public void StopSequenceClick()
        {
            canSwitchModel = false;
            switchAction = null;
            ShowMask(() =>
            {
                bool stoped = StopSequence();
                if (stoped)
                {
                    IsTesting = false;
                }
            }, null, null, LangUtil.Get("App.SequenceIsStopping"));
            //new MaskWindow((WindowX)Window.GetWindow(this),
            //        (win) =>
            //        {
            //            try
            //            {
            //                bool stoped = StopSequence();
            //                if (stoped)
            //                {
            //                    IsTesting = false;
            //                }
            //            }
            //            finally
            //            {
            //                Dispatcher.Invoke(() =>
            //                {
            //                    win.Close();
            //                });
            //            }
            //        }
            //        ).Info(LangUtil.Get("App.SequenceIsStopping"));
        }
        /// <summary>
@@ -1123,23 +1143,21 @@
        {
            try
            {
                if (this.tsSockets.Count > 0)
                {
                    for (int i = 0; i < tsSockets.Count; i++)
                    {
                        var context = this.tsSockets[i].SequenceFileContext;
                        //bool val = context.StationGlobals.Exists("StationState.StopTest", 0);
                        //if (val)
                        //{
                        //    context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                        //    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                        //}
                        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
                    }
                }
                //if (this.tsSockets.Count > 0)
                //{
                //    for (int i = 0; i < tsSockets.Count; i++)
                //    {
                //        var context = this.tsSockets[i].SequenceFileContext;
                //        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
                //    }
                //}
                engine.Globals.SetValBoolean("StationState.StopTest", 1, true);
                if (this.execution == null) return true;
                bool res = this.execution.WaitForEndEx(2000, true, null, null);
                //bool res = this.execution.WaitForEndEx(-1, true, null, null);
                bool res = this.execution?.WaitForEndEx(-1, true, Type.Missing, null) == true;
                Marshal.ReleaseComObject(this.execution);
                this.execution = null;
                return res;
            }
            catch (Exception ex)
@@ -1174,6 +1192,7 @@
        private void StartClick()
        {
            canSwitchModel = true;
            ShowMask(() =>
            {
                StartSequence();
@@ -1358,7 +1377,7 @@
                    this.tsSockets[index].ElapseTime = strData;
                    break;
                case (int)UIMessageCodes.UIMsg_EndExecution://执行结束
                    IsTesting = false;
                    //IsTesting = false;
                    //this.ReleaseSequenceFile();
                    break;
                case 10030://显示测试进度
@@ -1405,11 +1424,75 @@
                case 10034:
                    CurrentProductModel = strData;
                    break;
                case 10035:
                    string[] arr_10035 = strData.Split(';');
                    int[][] points = new int[arr_10035.Length - 1][];
                    for (int i = 1; i < arr_10035.Length; i++)
                    {
                        string[] strs = arr_10035[i].Split(',');
                        points[i - 1] = new int[2] { int.Parse(strs[0]), int.Parse(strs[1]) };
                    }
                    this.tsSockets[index].DrawScreenPoints(int.Parse(arr_10035[0]), points);
                    break;
                case 10036:
                    this.tsSockets[index].ClearScreenPoint(int.Parse(strData));
                    break;
                case 10099:
                    string[] arr = strData.Split(',');
                    if (canSwitchModel) SwitchSequenceByModel(index, arr[0], arr[1]);
                    break;
                default:
                    break;
            }
        }
        private void SwitchSequenceByModel(int index, string model, string snr)
        {
            Dispatcher.Invoke(() =>
            {
                var target = Products.FirstOrDefault(e => e.Name == model);
                ShowMask(() =>
                {
                    bool stoped = StopSequence();
                    //if (stoped)
                    //{
                    //    IsTesting = false;
                    //}
                }, null, null, "换型中,请稍后...");
                if (target == null)
                {
                    MsgBoxHelper2.Warn($"请先在产品管理页面配置型号 [{model}] 的产品信息!");
                    return;
                }
                switchAction = () =>
                {
                    switchAction = null;
                    log?.Info($"尝试自动换型: {switchAction}");
                    if (canSwitchModel)
                    {
                        Dispatcher.Invoke(() =>
                        {
                            try
                            {
                                log?.Info("开始自动换型");
                                SelectedProduct = target;
                                engine?.Globals.SetValString($"CacheSNR[{index}]", 1, snr);
                                engine?.CommitGlobalsToDisk(false);
                                StartClick();
                            }
                            catch (Exception ex)
                            {
                                log?.Error("自动换型失败", ex);
                            }
                        });
                    }
                };
            });
        }
        private void ShowAlarm(AlarmText alarm)
@@ -1433,7 +1516,7 @@
                try
                {
                    log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
                    log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
                }
                catch
                {
@@ -1441,6 +1524,8 @@
                }
                if (eventCode == 10001)
                {
                    sequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
                    tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
                    return;
                }
@@ -1522,6 +1607,10 @@
            {
                lock (this)
                {
                    if (this.testSeq == null)
                    {
                        return true;
                    }
                    //execution.Abort();
                    int count = 10;
                    while (count > 0)
@@ -1531,15 +1620,18 @@
                            if (this.testSeq == null)
                                return true;
                            if (this.engine.ReleaseSequenceFileEx(this.testSeq, 4))
                            if (this.engine?.ReleaseSequenceFileEx(this.testSeq, 4) == true)
                            {
                                Marshal.ReleaseComObject(this.testSeq);
                                this.testSeq = null;
                                // GC.Collect();
                            }
                            if (this.engine.ReleaseSequenceFileEx(this.modeSeq, 4))
                            if (this.engine?.ReleaseSequenceFileEx(this.modeSeq, 4) == true)
                            {
                                Marshal.ReleaseComObject(this.modeSeq);
                                this.modeSeq = null;
                            }
                            this.engine.UnloadAllModules();
                            this.engine?.UnloadAllModules();
                            return this.testSeq == null && this.modeSeq == null;
                        }
                        catch (Exception ex)