alielie
2025-04-10 6bcafc823e836ecd5790f87178a906333699f868
Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,20 +1,20 @@
using HMI.Base;
using HMI.Core;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Util;
using HMI.ParameterManage.Entity;
using HMI.ParameterManage.Util;
using HMI.UI;
using HMI.UI.Util;
using HMI.Util;
using NationalInstruments.TestStand.Interop.API;
using NationalInstruments.TestStand.Interop.UI.Ax;
using Panuon.WPF.UI;
using ScottPlot;
using ScottPlot.AxisLimitManagers;
using ScottPlot.Plottables;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Timers;
@@ -101,6 +101,18 @@
            }
        }
        private Pie pie;
        private string CountIniPath;
        private bool alarmVisiable;
        public bool AlarmVisiable
        {
            get => alarmVisiable;
            set
            {
                Set(ref alarmVisiable, value);
            }
        }
        public TsExecution()
        {
@@ -111,63 +123,29 @@
            InitTsEngine();
            //初始化TestStand引擎
            this.InitTestStandEngine();
        }
        public override void SetBaseFolder(string folder)
        {
            CountIniPath = Path.Combine(folder, "Count.ini");
            base.SetBaseFolder(folder);
        }
        public override void InitFinish()
        {
            this.ReadCount(out int pass, out int fail);
            this.DisplayCount(pass, fail);
            UpdateChart(pass, fail);
            InitProducts();
            base.InitFinish();
        }
        private Pie pie;
        /// <summary>
        /// 初始化Winform图表
        /// </summary>
        private void InitChart()
        {
            //ChartArea chartArea1 = new ChartArea();
            //Legend legend1 = new Legend();
            //Series series1 = new Series();
            //DataPoint dataPoint1 = new DataPoint(0D, 10D);
            //DataPoint dataPoint2 = new DataPoint(0D, 10D);
            //chart = new Chart();
            ////
            //// chart
            ////
            //this.chart.BackColor = System.Drawing.SystemColors.Control;
            //chartArea1.BackColor = System.Drawing.SystemColors.Control;
            //chartArea1.Name = "ChartArea1";
            //this.chart.ChartAreas.Add(chartArea1);
            //this.chart.Dock = System.Windows.Forms.DockStyle.Fill;
            //legend1.BackColor = System.Drawing.SystemColors.Control;
            //legend1.Name = "Legend1";
            //this.chart.Legends.Add(legend1);
            //this.chart.Location = new System.Drawing.Point(0, 0);
            //this.chart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
            //this.chart.Name = "chart";
            //this.chart.Palette = ChartColorPalette.None;
            //series1.BorderColor = System.Drawing.SystemColors.Control;
            //series1.ChartArea = "ChartArea1";
            //series1.ChartType = SeriesChartType.Pie;
            //series1.Color = System.Drawing.SystemColors.Control;
            //series1.LabelBackColor = System.Drawing.Color.White;
            //series1.Legend = "Legend1";
            //series1.Name = "Series1";
            //dataPoint1.AxisLabel = "OK";
            //dataPoint1.Color = Color.Green;
            //dataPoint1.IsVisibleInLegend = true;
            //dataPoint1.Label = "";
            //dataPoint2.AxisLabel = "NG";
            //dataPoint2.Color = Color.FromArgb(230, 0, 18);
            //series1.Points.Add(dataPoint1);
            //series1.Points.Add(dataPoint2);
            //this.chart.Series.Add(series1);
            //this.chart.Size = new System.Drawing.Size(215, 191);
            //this.chart.TabIndex = 0;
            //this.chart.Text = "chart1";
            //((System.ComponentModel.ISupportInitialize)(chart)).BeginInit();
            //chartHost.Child = chart;
            //((System.ComponentModel.ISupportInitialize)(chart)).EndInit();
            pieChart.Plot.Axes.Frameless();
            pieChart.Plot.HideGrid();
            pieChart.Plot.DataBackground.Color = Colors.Transparent;
@@ -193,12 +171,12 @@
        private void InitProducts()
        {
            Products = new ObservableCollection<ProductData>(ParameterManager.GetProducts());
            Products = ProductManager.GetProducts<ObservableCollection<ProductData>>();
            if (Products != null && Products.Count > 0)
            {
                List<ParameterData> parameters =
                    ParameterManager.GetParametersByProductName(Products[0].Name);
                string tmpNum = parameters.FirstOrDefault(p => p.Name == "SocketNum")?.Value?.ToString();
                    ParameterManager.GetCommonParameter<List<ParameterData>>();
                string tmpNum = parameters?.FirstOrDefault(p => p.Name == "SocketNum")?.Value?.ToString();
                if (!string.IsNullOrEmpty(tmpNum))
                {
                    this.socketNum = Convert.ToInt32(tmpNum);
@@ -268,16 +246,21 @@
        private void RefershUI()
        {
            if (this.tsSockets.Count == 0)
            panel.Children.Clear();
            //重新生成子面板
            for (int i = 0; i < this.socketNum; i++)
            {
                panel.Children.Clear();
                //重新生成子面板
                for (int i = 0; i < this.socketNum; i++)
                {
                    SingleControl control = new SingleControl(i, 0, 0);
                    panel.Children.Add(control);
                    tsSockets.Add(control);
                }
                SingleControl control = new SingleControl(i, CountIniPath);
                panel.Children.Add(control);
                tsSockets.Add(control);
            }
            if (tsSockets.Count == 1)
            {
                panel.Columns = 1;
            }
            else
            {
                panel.Columns = 2;
            }
        }
@@ -308,14 +291,14 @@
        /// <param name="fail">不合格数</param>
        private void ReadCount(out int pass, out int fail)
        {
            pass = 0; //Convert.ToInt32(OperateIniFile.ReadIniData("Count", "Pass", "", CountiniPath));
            fail = 0; //Convert.ToInt32(OperateIniFile.ReadIniData("Count", "Fail", "", CountiniPath));
            pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "", CountIniPath));
            fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "", CountIniPath));
        }
        private void WriteCount(int pass, int fail)
        {
            //OperateIniFile.WriteIniData("Count", "Pass", pass.ToString(), CountiniPath);
            //OperateIniFile.WriteIniData("Count", "Fail", fail.ToString(), CountiniPath);
            IniFileHelper.WriteIniData("Count", "Pass", pass.ToString(), CountIniPath);
            IniFileHelper.WriteIniData("Count", "Fail", fail.ToString(), CountIniPath);
        }
        /// <summary>
@@ -400,6 +383,26 @@
            }
        }
        public void StopSequenceClick()
        {
            new MaskWindow((WindowX)Window.GetWindow(this),
                    (win) =>
                    {
                        Dispatcher.Invoke(() =>
                        {
                            try
                            {
                                StopSequence();
                            }
                            finally
                            {
                                win.Close();
                            }
                        });
                    }
                    ).Info(LangUtil.Get("App.SequenceIsStopping"));
        }
        /// <summary>
        /// 停止测试序列
        /// </summary>
@@ -407,15 +410,14 @@
        {
            try
            {
                if (this.tsSockets.Count == 0)
                    return;
                if (this.tsSockets[0].SequenceFileContext == null)
                    return;
                bool val = this.tsSockets[0].SequenceFileContext.StationGlobals.Exists("StationState.StopTest", 0);
                if (val)
                if (this.tsSockets.Count > 0 && this.tsSockets[0]?.SequenceFileContext != null)
                {
                    tsSockets[0].SequenceFileContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                    bool val = this.tsSockets[0].SequenceFileContext.StationGlobals.Exists("StationState.StopTest", 0);
                    if (val)
                    {
                        tsSockets[0].SequenceFileContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                        bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                    }
                }
                this.CbProduct.IsEnabled = true;
                this.BtnStartSeq.IsEnabled = true;
@@ -435,10 +437,9 @@
            {
                case "BtnStartSeq":
                    StartClick();
                    break;
                case "BtnStopSeq":
                    StopSequence();
                    StopSequenceClick();
                    break;
                case "BtnClearNum":
                    ClearNum();
@@ -512,100 +513,106 @@
        /// <param name="e"></param>
        private void AxApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
        {
            int EventCase = Convert.ToInt32(e.uiMsg.Event);
            int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
            switch (EventCase)
            try
            {
                case 10001://传递SocketContext
                    tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
                    break;
                int EventCase = Convert.ToInt32(e.uiMsg.Event);
                int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
                switch (EventCase)
                {
                    case 10001://传递SocketContext
                        tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
                        break;
                case 10002://更新测试状态
                    string status = e.uiMsg.StringData;
                    this.tsSockets[Index].UpdateStatus(status);
                    this.UpdateTestCounter();
                    break;
                    case 10002://更新测试状态
                        string status = e.uiMsg.StringData;
                        this.tsSockets[Index].UpdateStatus(status);
                        this.UpdateTestCounter();
                        break;
                case 10003://发送测试数据
                    string[] TestItems = e.uiMsg.StringData.Split('\t');
                    tsSockets[Index].AddTestData(TestItems[0], TestItems[4], TestItems[1], TestItems[2], TestItems[3], TestItems[5]);
                    case 10003://发送测试数据
                        string[] TestItems = e.uiMsg.StringData.Split('\t');
                        tsSockets[Index].AddTestData(TestItems[0], TestItems[4], TestItems[1], TestItems[2], TestItems[3], TestItems[5]);
                    break;
                        break;
                case 10004://发送测试过程信息
                    this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
                    break;
                    case 10004://发送测试过程信息
                        this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
                        break;
                case 10005://初始化测试数据,清空测试数据
                    this.tsSockets[Index].IniTestData();
                    break;
                    case 10005://初始化测试数据,清空测试数据
                        this.tsSockets[Index].IniTestData();
                        break;
                case 10006://发送产品条码
                    this.tsSockets[Index].Barcode = e.uiMsg.StringData;
                    break;
                    case 10006://发送产品条码
                        this.tsSockets[Index].Barcode = e.uiMsg.StringData;
                        break;
                case 10007://开始测试计时
                    tsSockets[Index].ElapseTime = "Start Timing";
                    BtnStopSeq.IsEnabled = false;
                    break;
                    case 10007://开始测试计时
                        tsSockets[Index].ElapseTime = "Start Timing";
                        BtnStopSeq.IsEnabled = false;
                        break;
                case 10008://停止测试计时
                    tsSockets[Index].ElapseTime = "Stop Timing";
                    BtnStopSeq.IsEnabled = true;
                    break;
                    case 10008://停止测试计时
                        tsSockets[Index].ElapseTime = "Stop Timing";
                        BtnStopSeq.IsEnabled = true;
                        break;
                case 10009:
                    // reset the value of controls units failed/pass rate
                    break;
                    case 10009:
                        //
                        break;
                case 10010:
                    case 10010:
                    //PropertyObj.SetValBoolean("Locals.MD5_Used", 0, true);
                    //PropertyObj.SetValVariant("FileGlobals.MD5_Value", 0, MD5_DATA);
                    //PropertyObj.SetValVariant("StationGlobals.MD5", 0, MD5_DATA);
                    break;
                        //PropertyObj.SetValBoolean("Locals.MD5_Used", 0, true);
                        //PropertyObj.SetValVariant("FileGlobals.MD5_Value", 0, MD5_DATA);
                        //PropertyObj.SetValVariant("StationGlobals.MD5", 0, MD5_DATA);
                        break;
                case 10011:
                    // write model
                    case 10011:
                        // write model
                    break;
                        break;
                case 10012:
                    // read model
                    case 10012:
                        // read model
                    break;
                        break;
                case 10013:
                    // read continue
                    case 10013:
                        // read continue
                    break;
                        break;
                case 10014:
                    case 10014:
                    break;
                        break;
                case 10015:
                    case 10015:
                    break;
                case 10016://显示3D拼接图片
                        break;
                    case 10016://显示3D拼接图片
                    break;
                case 10017://更新测试计时,针对部分计时有PLC完成的项目
                    this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
                    break;
                case (int)UIMessageCodes.UIMsg_EndExecution://执行结束
                    this.BtnStartSeq.IsEnabled = true;
                    this.BtnStopSeq.IsEnabled = true;
                    // this.ReleaseSequenceFile();
                    break;
                case 10030://显示测试进度
                    int ProcessVal = Convert.ToInt32(e.uiMsg.StringData);
                    this.tsSockets[Index].SetTestProcess(ProcessVal);
                    break;
                default:
                    break;
                        break;
                    case 10017://更新测试计时,针对部分计时有PLC完成的项目
                        this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
                        break;
                    case (int)UIMessageCodes.UIMsg_EndExecution://执行结束
                        this.BtnStartSeq.IsEnabled = true;
                        this.BtnStopSeq.IsEnabled = true;
                        // this.ReleaseSequenceFile();
                        break;
                    case 10030://显示测试进度
                        int ProcessVal = Convert.ToInt32(e.uiMsg.StringData);
                        this.tsSockets[Index].SetTestProcess(ProcessVal);
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                log.Warn("Ts Event Error.", ex);
            }
        }
@@ -627,19 +634,12 @@
            pie.Slices[0].Value = pass;
            pie.Slices[1].Value = fail;
            pieChart.Refresh();
            //Dispatcher.Invoke(() => {
            //    ((System.ComponentModel.ISupportInitialize)(chart)).BeginInit();
            //    chart.Series[0].Points[0].YValues[0] = pass;
            //    chart.Series[0].Points[1].YValues[0] = fail;
            //    ((System.ComponentModel.ISupportInitialize)(chart)).EndInit();
            //});
        }
        private void SetTestSeqFile(ProductData product)
        {
            string name = product.Name;
            List<ParameterData> parameters = ParameterManager.GetParametersByProductName(name);
            List<ParameterData> parameters = ProductManager.GetParametersByProductName(name);
            testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value?.ToString();
        }
@@ -659,6 +659,17 @@
            }
        }
        public override void OnClose(object sender, CancelEventArgs e)
        {
            StopSequence();
            this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
            this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
            this.engine?.UnloadAllModules();
            this.testSeq = null;
            this.modeSeq = null;
            base.OnClose(sender, e);
        }
        private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {