From 7bf89fd93bc487e8445d6d85bb527251b7371a04 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 12 五月 2025 13:14:11 +0800
Subject: [PATCH] 优化项目;
---
Plugin.TsExecution/TsExecution.xaml.cs | 476 +++++++++++++++++++++++++++++++++++++----------------------
1 files changed, 299 insertions(+), 177 deletions(-)
diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 598abec..846c349 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,26 +1,29 @@
锘縰sing 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.ParameterManage;
using HMI.UI;
using HMI.UI.Util;
+using HMI.Util;
+using log4net;
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;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.DataVisualization.Charting;
+using System.Windows.Markup;
namespace Plugin.TsExecution
{
@@ -52,6 +55,7 @@
private Chart chart;
#endregion
+ public static ILog logger { get; private set; }
private List<SingleControl> tsSockets = new List<SingleControl>();
/// <summary>
/// 鏍蜂欢妯″紡鐘舵��
@@ -90,6 +94,12 @@
}
}
+ public override void SetLogger(ILog logger)
+ {
+ base.SetLogger(logger);
+ TsExecution.logger = logger;
+ }
+
private ObservableCollection<ProductData> products;
public ObservableCollection<ProductData> Products
@@ -98,6 +108,52 @@
set
{
Set(ref products, value);
+ }
+ }
+
+ private Pie pie;
+ private string CountIniPath;
+
+ private bool alarmVisiable;
+ public bool AlarmVisiable
+ {
+ get => alarmVisiable;
+ set
+ {
+ Set(ref alarmVisiable, value);
+ }
+ }
+
+ private bool _enableMes;
+ public bool EnableMes
+ {
+ get => _enableMes;
+ set
+ {
+ Set(ref _enableMes, value);
+ WriteConfig("EnableMes", value);
+ }
+ }
+
+ private bool _enableCanLog;
+ public bool EnableCanLog
+ {
+ get => _enableCanLog;
+ set
+ {
+ Set(ref _enableCanLog, value);
+ WriteConfig("EnableCanLog", value);
+ }
+ }
+
+ private bool _enableDebugMode;
+ public bool EnableDebugMode
+ {
+ get => _enableDebugMode;
+ set
+ {
+ Set(ref _enableDebugMode, value);
+ WriteConfig("EnableDebugMode", value);
}
}
@@ -111,63 +167,27 @@
InitTsEngine();
//鍒濆鍖朤estStand寮曟搸
this.InitTestStandEngine();
- this.ReadCount(out int pass, out int fail);
- this.DisplayCount(pass, fail);
- UpdateChart(pass, fail);
- InitProducts();
}
- private Pie pie;
+ 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);
+ InitProducts();
+ base.InitFinish();
+ }
+
/// <summary>
/// 鍒濆鍖朩inform鍥捐〃
/// </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 +213,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);
@@ -234,6 +254,7 @@
{
try
{
+ ReadConfig();
//杩炴帴OPChandle
//this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
//鍚姩娴嬭瘯杩涚▼
@@ -268,16 +289,35 @@
private void RefershUI()
{
- if (this.tsSockets.Count == 0)
+ ParameterData p = ParameterManager.GetCommonParameterByName("ProbeWarn");
+ int ProbeWarn = 0;
+ if (p != null)
{
- panel.Children.Clear();
- //閲嶆柊鐢熸垚瀛愰潰鏉�
- for (int i = 0; i < this.socketNum; i++)
+ try
{
- SingleControl control = new SingleControl(i, 0, 0);
- panel.Children.Add(control);
- tsSockets.Add(control);
+ ProbeWarn = Convert.ToInt32(p.Value);
}
+ catch
+ {
+ ProbeWarn = 0;
+ }
+ }
+
+ panel.Children.Clear();
+ //閲嶆柊鐢熸垚瀛愰潰鏉�
+ for (int i = 0; i < this.socketNum; i++)
+ {
+ SingleControl control = new SingleControl(i, CountIniPath, ProbeWarn);
+ panel.Children.Add(control);
+ tsSockets.Add(control);
+ }
+ if (tsSockets.Count == 1)
+ {
+ panel.Columns = 1;
+ }
+ else
+ {
+ panel.Columns = 2;
}
}
@@ -308,14 +348,41 @@
/// <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", "0", CountIniPath));
+ fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
}
- private void WriteCount(int pass, int fail)
+ /// <summary>
+ /// 璇诲彇閰嶇疆鏂囦欢閲岀殑鍑犱釜灞炴��
+ /// </summary>
+ /// <param name="pass"></param>
+ /// <param name="fail"></param>
+ private void ReadConfig()
{
- //OperateIniFile.WriteIniData("Count", "Pass", pass.ToString(), CountiniPath);
- //OperateIniFile.WriteIniData("Count", "Fail", fail.ToString(), CountiniPath);
+ try
+ {
+ var p = ParameterManager.GetCommonParameterByName("EnableMes");
+ EnableMes = bool.Parse(p?.Value);
+ }
+ catch
+ {
+ EnableMes = false;
+ }
+ //Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableMes", "true", CountIniPath));
+ EnableCanLog = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableCanLog", "true", CountIniPath));
+ EnableDebugMode = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableDebugMode", "true", CountIniPath));
+ }
+
+ private void WriteConfig(string name, bool value)
+ {
+ IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
+ //this.engine.Globals.SetValBoolean($"StationState.{name}", 1, value);
+ }
+
+ private void WriteCount(double pass, double fail)
+ {
+ IniFileHelper.WriteIniData("Count", "Pass", pass.ToString(), CountIniPath);
+ IniFileHelper.WriteIniData("Count", "Fail", fail.ToString(), CountIniPath);
}
/// <summary>
@@ -323,9 +390,9 @@
/// </summary>
/// <param name="pass">鍚堟牸鏁�</param>
/// <param name="fail">涓嶅悎鏍兼暟</param>
- private void DisplayCount(int pass, int fail)
+ private void DisplayCount(double pass, double fail)
{
- int total = pass + fail;
+ double total = pass + fail;
double passRate;
if (total == 0)
{
@@ -339,6 +406,11 @@
this.TbFail.Text = fail.ToString();
this.TbTotal.Text = total.ToString();
this.TbPassRate.Text = string.Format("{0:0.00}", passRate) + "%";
+
+ pie.Slices[0].Value = pass;
+ pie.Slices[1].Value = fail;
+ pieChart.Refresh();
+
WriteCount(pass, fail);
}
@@ -378,7 +450,6 @@
this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 0, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
-
Dispatcher.Invoke(() =>
{
this.CbProduct.IsEnabled = false;
@@ -400,31 +471,69 @@
}
}
+ public void StopSequenceClick()
+ {
+ new MaskWindow((WindowX)Window.GetWindow(this),
+ (win) =>
+ {
+ try
+ {
+ bool stoped = StopSequence();
+ if (stoped)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ this.CbProduct.IsEnabled = true;
+ this.BtnStartSeq.IsEnabled = true;
+ this.BtnStopSeq.IsEnabled = false;
+ });
+ }
+ }
+ finally
+ {
+ Dispatcher.Invoke(() =>
+ {
+
+ win.Close();
+ });
+ }
+ //Dispatcher.Invoke(() =>
+ //{
+
+ //});
+ }
+ ).Info(LangUtil.Get("App.SequenceIsStopping"));
+ }
+
/// <summary>
/// 鍋滄娴嬭瘯搴忓垪
/// </summary>
- private void StopSequence()
+ private bool StopSequence()
{
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)
{
- tsSockets[0].SequenceFileContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
- bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
+ 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", 0, true);
+ }
}
- this.CbProduct.IsEnabled = true;
- this.BtnStartSeq.IsEnabled = true;
- this.BtnStopSeq.IsEnabled = false;
+ if (this.execution == null) return true;
+ return this.execution.WaitForEndEx(2000, true, null, null);
}
catch (Exception ex)
{
log.Error("Stop Sequence Failed.", ex);
MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StopSequenceFail")}: {ex.Message}");
+ return false;
}
}
@@ -435,10 +544,9 @@
{
case "BtnStartSeq":
StartClick();
-
break;
case "BtnStopSeq":
- StopSequence();
+ StopSequenceClick();
break;
case "BtnClearNum":
ClearNum();
@@ -505,6 +613,19 @@
}
}
+ public void UpdatePositionStatus(int index, string status)
+ {
+ this.tsSockets[index].UpdateStatus(status);
+ this.UpdateTestCounter();
+ }
+
+ public void AddTestData(int index, string data)
+ {
+ string[] TestItems = data.Split(',');
+ tsSockets[index].AddTestData(TestItems[0], TestItems[1], TestItems[2], TestItems[3],
+ TestItems[4], TestItems[5], TestItems[6]);
+ }
+
/// <summary>
/// TestStand鐢ㄦ埛浜や簰浜嬩欢
/// </summary>
@@ -512,134 +633,125 @@
/// <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://浼犻�扴ocketContext
- 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://浼犻�扴ocketContext
+ 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;
+ UpdatePositionStatus(Index, status);
+ 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://鍙戦�佹祴璇曟暟鎹�
+ AddTestData(Index, e.uiMsg.StringData);
+ 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:
+ //
+ break;
- case 10009:
- // reset the value of controls units failed/pass rate
- 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;
+ case 10031://瀵煎嚭CSV
+ this.tsSockets[Index].WriteToCSV(e.uiMsg.StringData);
+ break;
+ default:
+ break;
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Warn("Ts Event Error.", ex);
}
}
private void UpdateTestCounter()
{
- int PassNum = 0;
- int FailNum = 0;
+ double PassNum = 0;
+ double FailNum = 0;
foreach (SingleControl socket in this.tsSockets)
{
PassNum += socket.PassNum;
FailNum += socket.FailNum;
}
this.DisplayCount(PassNum, FailNum);
- UpdateChart(PassNum, FailNum);
- }
-
- private void UpdateChart(int pass, int fail)
- {
- 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();
}
@@ -649,16 +761,26 @@
{
PassAmount = 0;
FailAmount = 0;
- DisplayCount(PassAmount, FailAmount);
- UpdateChart(PassAmount, FailAmount);
//this.OpcHandle.DoFctWriteSingle("Count_Clear", "1", out string ErrMsg);
foreach (SingleControl socket in tsSockets)
{
socket.ResetCounter();
}
+ DisplayCount(PassAmount, FailAmount);
}
}
+ 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)
{
--
Gitblit v1.9.1