From d1b72117058f1131046b6aa3add8e3ccfae033d8 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 10:36:07 +0800
Subject: [PATCH] docs: CAN 模拟器独立 TCP 服务进程设计规格(统一 CanDeviceDriver + 双工推送协议)
---
Plugin.TsExecution/TsExecution.xaml.cs | 1732 +++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 1,330 insertions(+), 402 deletions(-)
diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index fb1f427..06b9d39 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,15 +1,20 @@
锘縰sing HMI.Base;
using HMI.Core;
+using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Manager;
+using HMI.Core.Setting;
using HMI.Core.Util;
-using HMI.UI;
+using HMI.MQUtil;
+using HMI.Simple.Util;
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 NPOI.HSSF.UserModel;
+using NPOI.SS.UserModel;
+using OpenTap;
+using Plugin.TsSupport;
using ScottPlot;
using ScottPlot.Plottables;
using System;
@@ -18,44 +23,41 @@
using System.ComponentModel;
using System.IO;
using System.Linq;
-using System.Reflection;
-using System.Timers;
using System.Windows;
using System.Windows.Controls;
-using System.Windows.Forms.DataVisualization.Charting;
-using System.Xml.Linq;
namespace Plugin.TsExecution
{
/// <summary>
/// UserControl1.xaml 鐨勪氦浜掗�昏緫
/// </summary>
- public partial class TsExecution : PluginControl
+ public partial class TsExecution : PluginMaskControl
{
#region TestStand浜嬩欢
/// <summary>
/// TS 寮曟搸
/// </summary>
- private Engine engine = null;
+ //private Engine engine = null;
+
+ ///// <summary>
+ ///// 娴嬭瘯搴忓垪
+ ///// </summary>
+ //private SequenceFile testSeq = null;
+
+ ///// <summary>
+ ///// 娴嬭瘯妯″瀷搴忓垪
+ ///// </summary>
+ //private SequenceFile modeSeq = null;
+
+ //private Execution execution = null;
private string testSeqFile = string.Empty;
- /// <summary>
- /// 娴嬭瘯搴忓垪
- /// </summary>
- private SequenceFile testSeq = null;
- /// <summary>
- /// 娴嬭瘯妯″瀷搴忓垪
- /// </summary>
- private SequenceFile modeSeq = null;
- public AxApplicationMgr AxApplicationMgr;
- private Execution execution = null;
-
- private Chart chart;
+ private ITestExecutionWrapper testExecutionWrapper;
#endregion
public static ILog logger { get; private set; }
- private List<SingleControl> tsSockets = new List<SingleControl>();
+ public List<SingleControl> tsSockets { get; private set; } = new List<SingleControl>();
/// <summary>
/// 鏍蜂欢妯″紡鐘舵��
/// </summary>
@@ -80,7 +82,6 @@
private bool isLoadOK = false;
- private Timer GCTimer;
private int PassAmount = 0;
private int FailAmount = 0;
@@ -92,13 +93,34 @@
private ProductData selectedProduct;
+ private MSMQHelper mSMQHelper = new MSMQHelper("HMI_Alarm");
+
public ProductData SelectedProduct
{
get { return selectedProduct; }
set
{
Set(ref selectedProduct, value);
+ CurrentProductModel = value?.Name;
+ if (tsSockets != null)
+ {
+ foreach (SingleControl socket in tsSockets)
+ {
+ socket.RefreshProduct(value);
+ // socket.RefreshProbeCount(value);
+ }
+ }
SetTestSeqFile(value);
+ }
+ }
+
+ private string currentProductModel;
+ public string CurrentProductModel
+ {
+ get => currentProductModel;
+ set
+ {
+ Set(ref currentProductModel, value);
}
}
@@ -119,8 +141,13 @@
}
}
+ public List<double> FontSizeSource { get; set; } = new List<double> {
+ 10,11,12,13,14,15,16,17,18,19,20
+ };
+
private Pie pie;
private string CountIniPath;
+ private bool IsOptRequirePassword;
private bool alarmVisiable;
public bool AlarmVisiable
@@ -138,9 +165,12 @@
get => _enableMes;
set
{
- if (WriteConfig("EnableMes", value))
+ if (RequirePassword() == true)
{
- Set(ref _enableMes, value);
+ if (WriteConfig("EnableMes", value))
+ {
+ Set(ref _enableMes, value);
+ }
}
}
}
@@ -151,9 +181,12 @@
get => _enableCanLog;
set
{
- if (WriteConfig("EnableCanLog", value))
+ if (RequirePassword() == true)
{
- Set(ref _enableCanLog, value);
+ if (WriteConfig("EnableCanLog", value))
+ {
+ Set(ref _enableCanLog, value);
+ }
}
}
}
@@ -164,9 +197,12 @@
get => _enableDebugMode;
set
{
- if (WriteConfig("EnableDebugMode", value))
+ if (RequirePassword() == true)
{
- Set(ref _enableDebugMode, value);
+ if (WriteConfig("EnableDebugMode", value))
+ {
+ Set(ref _enableDebugMode, value);
+ }
}
}
}
@@ -177,9 +213,12 @@
get => _enableNGPause;
set
{
- if (WriteConfig("EnableNGPause", value))
+ if (RequirePassword() == true)
{
- Set(ref _enableNGPause, value);
+ if (WriteConfig("EnableNGPause", value))
+ {
+ Set(ref _enableNGPause, value);
+ }
}
}
}
@@ -190,10 +229,13 @@
get => _enableSimpleMode;
set
{
- if (WriteConfig("EnableSimpleMode", value))
+ if (RequirePassword() == true)
{
- Set(ref _enableSimpleMode, value);
- foreach (var cell in tsSockets) cell.SetSimpleUI(value);
+ if (WriteConfig("EnableSimpleMode", value))
+ {
+ Set(ref _enableSimpleMode, value);
+ foreach (var cell in tsSockets) cell.SetSimpleUI(value);
+ }
}
}
}
@@ -204,24 +246,85 @@
get => _ui_showInfoDock;
set
{
- if (WriteConfig("UI_ShowInfoDock", value))
+ if (RequirePassword() == true)
{
- Set(ref _ui_showInfoDock, value);
- detailPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
+ if (WriteConfig("UI_ShowInfoDock", value))
+ {
+ Set(ref _ui_showInfoDock, value);
+ detailPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
+ }
}
}
}
+ private bool autoExecuteSeq;
+ public bool AutoExecuteSeq
+ {
+ get => autoExecuteSeq;
+ set
+ {
+ Set(ref autoExecuteSeq, value);
+ }
+ }
+
+ private string currentWorkorder;
+ public string CurrentWorkorder
+ {
+ get => currentWorkorder;
+ set
+ {
+ if (WriteIni("UI_CurrentWorkorder", value))
+ {
+ Set(ref currentWorkorder, value);
+ testExecutionWrapper?.SetStationGlobalValue("StationState.WorkOrder", 1, value);
+ testExecutionWrapper?.CommitToDisk(false);
+ }
+ }
+ }
+
+ private bool _DisableScanner;
+ public bool DisableScanner
+ {
+ get => _DisableScanner;
+ set
+ {
+ if (RequirePassword() == true)
+ {
+ if (WriteConfig("DisableScanner", value))
+ {
+ Set(ref _DisableScanner, value);
+ }
+ }
+ }
+ }
+
+ private bool enableManualDebug;
+ public bool EnableManualDebug
+ {
+ get => enableManualDebug;
+ set
+ {
+ if (IsTesting)
+ {
+ MsgBoxHelper2.Warn("璇峰厛缁撴潫鑷姩娴嬭瘯");
+ return;
+ }
+ Set(ref enableManualDebug, value);
+ }
+ }
+
+ public string tsModelPath { get; private set; }
+ private string dataLogPath;
+ private SqliteHelper sqliteHelper;
+
+ private MQConnector mqConnector;
+ private int probeWarn;
public TsExecution()
{
DataContext = this;
- GCTimer = new Timer();
InitializeComponent();
InitChart();
- InitTsEngine();
- //鍒濆鍖朤estStand寮曟搸
- this.InitTestStandEngine();
}
public override void SetBaseFolder(string folder)
@@ -230,12 +333,121 @@
base.SetBaseFolder(folder);
}
+ private void CheckSqlHelper()
+ {
+ string today = DateTime.Now.ToString("yyyyMMdd");
+ string dbPath = Path.Combine(dataLogPath, $"Data_{today}.db");
+ if (!File.Exists(dbPath))
+ {
+ SqliteHelper.CreateDatabase(dbPath);
+ }
+ if (sqliteHelper == null || sqliteHelper.DataBaseFile != dbPath)
+ {
+ sqliteHelper?.Dispose();
+ sqliteHelper = new SqliteHelper(dbPath);
+ sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS serialData (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ sn TEXT NOT NULL,
+ model TEXT,
+ station TEXT NOT NULL,
+ step TEXT NOT NULL,
+ position TEXT,
+ limitDown TEXT,
+ limitUp TEXT,
+ unit TEXT,
+ offset TEXT,
+ value TEXT,
+ status TEXT,
+ finalStatus TEXT,
+ consumeTime TEXT,
+ totalConsumeTime TEXT,
+ time DATETIME NOT NULL);");
+ sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS testResult (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ sn TEXT NOT NULL,
+ model TEXT,
+ station TEXT NOT NULL,
+ position TEXT,
+ status TEXT,
+ result TEXT NOT NULL,
+ time DATETIME NOT NULL);");
+ }
+ }
+
public override void InitFinish()
{
+ InitTsEngine();
this.ReadCount(out int pass, out int fail);
this.DisplayCount(pass, fail);
+ ReadConfig();
InitProducts();
+ CheckSqlHelper();
base.InitFinish();
+
+ if (ParamSetting.EnableAutoModel)
+ {
+ selectModelPanel.Visibility = Visibility.Collapsed;
+ autoModelPanel.Visibility = Visibility.Visible;
+ CurrentProductModel = string.Empty;
+ }
+
+ try
+ {
+ UserInfo user = UserInfo.User;
+ CurrentUserCode = user?.Code;
+
+ testExecutionWrapper?.SetStationGlobalValue("StationState.OPID", 1, CurrentUserCode);
+ testExecutionWrapper?.CommitToDisk(false);
+ }
+ catch (Exception ex)
+ {
+ log.Warn("Get Login User Failed.", ex);
+ }
+ RefreshUIConfig();
+ }
+
+ /// <summary>
+ /// 鍒锋柊UI閰嶇疆
+ /// </summary>
+ private void RefreshUIConfig()
+ {
+ try
+ {
+ bool enableManualDebug = ParameterManager.GetCommonParameterByName("EnableManualDebug", false);
+ if (enableManualDebug)
+ {
+ Cb_ManualDebug.Visibility = Visibility.Visible;
+ EnableManualDebug = false;
+ }
+ else
+ {
+ Cb_ManualDebug.Visibility = Visibility.Collapsed;
+ EnableManualDebug = false;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ log.Error("RefreshUIConfig Error.", ex);
+ }
+ }
+
+ private void InitMQ()
+ {
+ mqConnector = new MQConnector("UI");
+ mqConnector.BeginReceive(HandleMQUI);
+ }
+
+ void HandleMQUI(string msg)
+ {
+ string[] arr = msg.Split('|');
+ int eventCode = int.Parse(arr[0]);
+ int index = int.Parse(arr[1]);
+ string strData = arr[2];
+ Dispatcher.BeginInvoke(new Action(() =>
+ {
+ HandleUIMessage(eventCode, index, strData);
+ }));
}
/// <summary>
@@ -245,7 +457,7 @@
{
pieChart.Plot.Axes.Frameless();
pieChart.Plot.HideGrid();
- pieChart.Plot.DataBackground.Color = Colors.Transparent;
+ pieChart.Plot.DataBackground.Color = ScottPlot.Colors.Transparent;
var legend = pieChart.Plot.ShowLegend(Alignment.UpperRight);
legend.Alignment = Alignment.UpperRight;
@@ -255,10 +467,10 @@
pieChart.Plot.Font.Automatic();
List<PieSlice> slices = new List<PieSlice> {
- new PieSlice() { Value = 5, FillColor = Colors.Green,
+ new PieSlice() { Value = 5, FillColor = ScottPlot.Colors.Green,
LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
Label = "Pass",LegendText="Pass" },
- new PieSlice() { Value = 2, FillColor = Colors.Red,
+ new PieSlice() { Value = 2, FillColor = ScottPlot.Colors.Red,
LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
Label = "Fail",LegendText="Fail" } };
@@ -266,33 +478,40 @@
pie = pieChart.Plot.Add.Pie(slices);
}
+ private bool? RequirePassword()
+ {
+ if (!IsOptRequirePassword) return true;
+ var win = new RequirePasswordWindow
+ {
+ Owner = Window.GetWindow(this)
+ };
+ return win.ShowDialog();
+ }
+
private void InitProducts()
{
Products = ProductManager.GetProducts<ObservableCollection<ProductData>>();
if (Products != null && Products.Count > 0)
{
- List<ParameterData> parameters =
- ParameterManager.GetCommonParameter<List<ParameterData>>();
- string tmpNum = parameters?.FirstOrDefault(p => p.Name == "SocketNum")?.Value?.ToString();
- if (!string.IsNullOrEmpty(tmpNum))
- {
- this.socketNum = Convert.ToInt32(tmpNum);
- }
- string lastModel = engine?.Globals.GetValString("StationState.ProductModel", 1);
-
+ string lastModel = testExecutionWrapper?.GetStationGlobalValue<string>("StationState.ProductModel", 1);
+ var tempProduct = Products[0];
if (!string.IsNullOrEmpty(lastModel))
{
var product = Products.FirstOrDefault(p => p.Name == lastModel);
- if (product != null) SelectedProduct = product;
- goto Write;
+ if (product != null)
+ {
+ tempProduct = product;
+ }
}
- goto Write;
-
- Write:
- SelectedProduct = Products[0];
- engine?.Globals.SetValString("StationState.ProductModel", 1, Products[0].Name);
-
- RefershUI();
+ SelectedProduct = tempProduct;
+ }
+ RefershUI();
+ if (tsSockets != null)
+ {
+ foreach (SingleControl socket in tsSockets)
+ {
+ socket.RefreshProduct(SelectedProduct);
+ }
}
SampleStatus = false;
}
@@ -318,135 +537,187 @@
/// </summary>
private void InitTsEngine()
{
- AxApplicationMgr = new AxApplicationMgr();
- AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
- AxApplicationMgr.UIMessageEvent +=
- new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
- AxApplicationMgr.ExecutionClosed +=
- new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.AxApplicationMgr_ExecutionClosed);
- ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
- host.Child = AxApplicationMgr;
- ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
+ if (ParamSetting.EngineType == "Tap")
+ {
+ var wrapper = new TapWrapper();
+ wrapper.RegisteUserInput(this);
+ log.Debug($"Wrapper UI is {wrapper.ui}");
+ testExecutionWrapper = wrapper;
+ }
+ else
+ {
+ testExecutionWrapper = new TeststandWrapper();
+ }
+
+ testExecutionWrapper.EndExecutionEvent += TestExecutionWrapper_EndExecutionEvent;
+ testExecutionWrapper.UIMessageEvent += TestExecutionWrapper_UIMessageEvent;
+ if (testExecutionWrapper is TeststandWrapper tsw)
+ {
+ var AxApplicationMgr = tsw.AxApplicationMgr;
+ ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
+ host.Child = AxApplicationMgr;
+ ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
+ }
+ testExecutionWrapper.Init();
}
+
+ private void TestExecutionWrapper_UIMessageEvent(object sender, UIMessageEvent e)
+ {
+ try
+ {
+ int eventCode = Convert.ToInt32(e.EventCode);
+ int index = Convert.ToInt16(e.NumberData);//SocketIndex
+ string strData = e.StrData;
+
+ try
+ {
+ log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
+ }
+ catch
+ {
+
+ }
+ if (eventCode == 10001)
+ {
+ testExecutionWrapper?.SetContext((SequenceContext)e.Data);
+ tsSockets[index].SequenceFileContext = (SequenceContext)e.Data;
+ return;
+ }
+ HandleUIMessage(eventCode, index, strData);
+ }
+ catch (Exception ex)
+ {
+ log.Warn("Ts Event Error.", ex);
+ }
+ }
+
+ private void TestExecutionWrapper_EndExecutionEvent(object sender, ExecutionEndEvent e)
+ {
+ log.Info("AxApplicationMgr_EndExecution");
+ if (ReleaseSequenceFile())
+ {
+ IsTesting = false;
+ log.Info("Release SeqFile Success!");
+ if (canSwitchModel) switchAction?.Invoke();
+ }
+ else
+ {
+ log.Warn("Release SeqFile Fail!");
+ }
+ }
+
+ private volatile bool canSwitchModel = false;
+ private volatile Action switchAction = null;
private void PluginControl_Loaded(object sender, RoutedEventArgs e)
{
- new MaskWindow((WindowX)Window.GetWindow(this),
- (win) =>
+ ShowMask(() =>
+ {
+ try
{
- try
- {
- Dispatcher.Invoke(() =>
- {
- try
- {
- UserInfo user = UserInfo.User;
- CurrentUserCode = user?.Code;
- }
- catch (Exception ex)
- {
- log.Warn("Get Login User Failed.", ex);
- }
- ReadConfig();
- });
- isLoadOK = true;
- StartSequence();
- }
- catch (Exception ex)
- {
- log.Error("TsExecution Loaded Failed.", ex);
- MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
- }
-
- try
- {
- if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
- this.GCTimer.Enabled = true;
- }
- catch (Exception ex)
- {
- log.Error("TsExecution GCTimer Start Failed", ex);
- MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
- }
-
- Dispatcher.Invoke(() =>
- {
- if (isLoadOK) Loaded -= PluginControl_Loaded;
- });
-
//Dispatcher.Invoke(() =>
//{
- // try
- // {
- // ReadConfig();
- // //杩炴帴OPChandle
- // //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
- // isLoadOK = true;
- // //鍚姩娴嬭瘯杩涚▼
- // StartSequence();
- // }
- // catch (Exception ex)
- // {
- // log.Error("TsExecution Loaded Failed.", ex);
- // MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
- // }
//});
+ isLoadOK = true;
+ if (AutoExecuteSeq) StartSequence();
}
- ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
+ catch (Exception ex)
+ {
+ log.Error("TsExecution Loaded Failed.", ex);
+ MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
+ }
+
+ Dispatcher.Invoke(() =>
+ {
+ if (isLoadOK) Loaded -= PluginControl_Loaded;
+ });
+ }, (ex) =>
+ {
+ ToastHelper.Error("Loaded Failed.");
+ log.Error("Loaded Error.", ex);
+ }, null, LangUtil.Get("App.UsercontrolIsLoading"));
+
+ //new MaskWindow((WindowX)Window.GetWindow(this),
+ // (win) =>
+ // {
+ // try
+ // {
+ // Dispatcher.Invoke(() =>
+ // {
+ // try
+ // {
+ // UserInfo user = UserInfo.User;
+ // CurrentUserCode = user?.Code;
+ // }
+ // catch (Exception ex)
+ // {
+ // log.Warn("Get Login User Failed.", ex);
+ // }
+ // });
+ // isLoadOK = true;
+ // if (AutoExecuteSeq) StartSequence();
+ // }
+ // catch (Exception ex)
+ // {
+ // log.Error("TsExecution Loaded Failed.", ex);
+ // MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
+ // }
+
+ // try
+ // {
+ // if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
+ // this.GCTimer.Enabled = true;
+ // }
+ // catch (Exception ex)
+ // {
+ // log.Error("TsExecution GCTimer Start Failed", ex);
+ // MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
+ // }
+
+ // Dispatcher.Invoke(() =>
+ // {
+ // if (isLoadOK) Loaded -= PluginControl_Loaded;
+ // });
+ // }
+ // ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
}
private void RefershUI()
{
- ParameterData p = ParameterManager.GetCommonParameterByName("ProbeWarn");
- int ProbeWarn = 0;
- if (p != null)
- {
- try
- {
- ProbeWarn = Convert.ToInt32(p.Value);
- }
- catch
- {
- ProbeWarn = 0;
- }
- }
-
panel.Children.Clear();
+ string[] names = ParamSetting.SocketNames.Split(',');
+
//閲嶆柊鐢熸垚瀛愰潰鏉�
for (int i = 0; i < this.socketNum; i++)
{
- SingleControl control = new SingleControl(i, CountIniPath, ProbeWarn);
+ string name = string.Empty;
+ if (i < names.Length)
+ {
+ name = names[i];
+ }
+
+ SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn)
+ {
+ SocketName = name
+ };
+ control.parent = this;
panel.Children.Add(control);
tsSockets.Add(control);
+
+ //createChildInNewThread(i, CountIniPath, ProbeWarn);
}
if (tsSockets.Count == 1)
{
panel.Columns = 1;
}
+ else if (tsSockets.Count > 0 && (tsSockets.Count % 3) == 0)
+ {
+ panel.Columns = 3;
+ }
else
{
panel.Columns = 2;
- }
- }
-
- /// <summary>
- /// 鍒濆鍖朤estStand寮曟搸
- /// </summary>
- private void InitTestStandEngine()
- {
- try
- {
- this.engine = this.AxApplicationMgr.GetEngine();
- this.engine.PersistBreakpoints = false;
- this.AxApplicationMgr.IsEditor = true;
- this.AxApplicationMgr.LoginOnStart = false;
- this.AxApplicationMgr.Start();
- this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
- }
- catch (Exception ex)
- {
- throw new Exception(LangUtil.Get("Ts.InitTestStandEngineFail"), ex);
}
}
@@ -459,7 +730,12 @@
{
pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "0", CountIniPath));
fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
+ var fontSize = Convert.ToDouble(IniFileHelper.ReadIniData("Config", "TableFontSize", "12", CountIniPath));
+ this.Resources["tableFontSize"] = 20d;
+ //CbFontSize.SelectedItem = fontSize;
}
+
+ private string csvDir;
/// <summary>
/// 璇诲彇閰嶇疆鏂囦欢閲岀殑鍑犱釜灞炴��
@@ -468,29 +744,118 @@
/// <param name="fail"></param>
private void ReadConfig()
{
- ParameterData value;
+ HMI.Core.Entity.ParameterData value;
+
+
+ bool flag = false;
try
{
- value = ParameterManager.GetCommonParameterByName("EnableMes");
- _enableMes = bool.Parse(value.Value);
- Set("EnableMes");
+ value = ParameterManager.GetCommonParameterByName("DefaultEnableMes");
+ if (value != null)
+ {
+ flag = bool.Parse(value.Value);
+ }
}
catch
{
- _enableMes = false;
- Set("EnableMes");
+ flag = false;
}
try
{
+ value = ParameterManager.GetCommonParameterByName("SocketNum");
+ if (value != null)
+ {
+ this.socketNum = int.Parse(value.Value);
+ }
+ }
+ catch
+ {
+ this.socketNum = 2;
+ }
+
+ if (flag)
+ {
+ EnableMes = true;
+ }
+ else
+ {
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("EnableMes");
+ if (value == null)
+ {
+ CbEnableMes.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ _enableMes = bool.Parse(value.Value);
+ Set("EnableMes");
+ }
+ }
+ catch
+ {
+ _enableMes = false;
+ Set("EnableMes");
+ }
+ }
+
+
+ try
+ {
value = ParameterManager.GetCommonParameterByName("EnableNGPause");
- _enableNGPause = bool.Parse(value.Value);
- Set("EnableNGPause");
+ if (value == null)
+ {
+ CbEnableNGPause.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ _enableNGPause = bool.Parse(value.Value);
+ Set("EnableNGPause");
+ }
}
catch
{
_enableNGPause = false;
Set("EnableNGPause");
+ }
+
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("EnableDebugMode");
+ if (value == null)
+ {
+ CbEnableDebugMode.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ _enableDebugMode = bool.Parse(value.Value);
+ Set("EnableDebugMode");
+ }
+ }
+ catch
+ {
+ _enableDebugMode = false;
+ Set("EnableDebugMode");
+ }
+
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("DisableScanner");
+ if (value == null)
+ {
+ CbDisableScanner.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ _DisableScanner = bool.Parse(value.Value);
+ Set("DisableScanner");
+ }
+ }
+ catch
+ {
+ _DisableScanner = false;
+ Set("DisableScanner");
}
try
@@ -505,22 +870,18 @@
Set("EnableCanLog");
}
- try
- {
- value = ParameterManager.GetCommonParameterByName("EnableDebugMode");
- _enableDebugMode = bool.Parse(value.Value);
- Set("EnableDebugMode");
- }
- catch
- {
- _enableDebugMode = false;
- Set("EnableDebugMode");
- }
try
{
value = ParameterManager.GetCommonParameterByName("EnableSimpleMode");
- EnableSimpleMode = bool.Parse(value.Value);
+ if (value == null)
+ {
+ CbEnableSimpleMode.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ EnableSimpleMode = bool.Parse(value.Value);
+ }
}
catch
{
@@ -530,32 +891,112 @@
try
{
value = ParameterManager.GetCommonParameterByName("UI_ShowInfoDock");
- UI_ShowInfoDock = bool.Parse(value.Value);
+ if (value == null)
+ {
+ CbUI_ShowInfoDock.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ UI_ShowInfoDock = bool.Parse(value.Value);
+ }
}
catch
{
UI_ShowInfoDock = false;
}
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("AutoExecuteSeq");
+ AutoExecuteSeq = bool.Parse(value.Value);
+ }
+ catch
+ {
+ AutoExecuteSeq = true;
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("TestReportFolder");
+ csvDir = value?.Value ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestReport");
+ if (!Directory.Exists(csvDir))
+ {
+ Directory.CreateDirectory(csvDir);
+ }
+ }
+ catch
+ {
+ csvDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestReport");
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("IsOptRequirePassword");
+ IsOptRequirePassword = value == null ? false : bool.Parse(value.Value);
+ }
+ catch
+ {
+ IsOptRequirePassword = false;
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("UI_CurrentWorkorder");
+ CurrentWorkorder = value.Value;
+ }
+ catch
+ {
+ CurrentWorkorder = string.Empty;
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("TS_ShowTitleWorkorder");
+ var boo = bool.Parse(value.Value);
+ if (boo)
+ {
+ workorderPanel.Visibility = Visibility.Visible;
+ }
+ }
+ catch
+ {
+ }
+
+ dataLogPath = ParamSetting.DataLogFolder;
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("TsModelPath");
+ tsModelPath = value?.Value ?? @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
+ }
+ catch
+ {
+ //@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq"
+ tsModelPath = @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("ProbeWarn");
+ probeWarn = int.Parse(value?.Value);
+ }
+ catch
+ {
+ probeWarn = 0;
+ }
//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 WriteToTsWhenInit()
- //{
- // foreach (var ts in tsSockets)
- // {
- // ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableMes", 1, EnableMes);
- // ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableNGPause", 1, EnableNGPause);
- // ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableCanLog", 1, EnableCanLog);
- // ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableDebugMode", 1, EnableDebugMode);
- // }
- //}
-
private bool WriteConfig(string name, bool value)
{
- //IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
try
{
if (ParameterManager.UpdateCommonParameter(name, value, out string errMsg))
@@ -563,7 +1004,33 @@
foreach (var ts in tsSockets)
{
ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
+ if (name == "EnableDebugMode" && ts?.SequenceFileContext?.Sequence != null)
+ {
+ ts.SequenceFileContext.Sequence.FailureAction =
+ value ? FailureActions.FailureAction_None : FailureActions.FailureAction_GotoCleanup;
+ }
}
+ return true;
+ }
+ else
+ {
+ throw new Exception(errMsg);
+ }
+ }
+ catch (Exception ex)
+ {
+ MsgBoxHelper2.Error(ex.Message);
+ return false;
+ }
+ }
+
+ private bool WriteIni(string name, object value)
+ {
+ //IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
+ try
+ {
+ if (ParameterManager.UpdateCommonParameter(name, value, out string errMsg))
+ {
return true;
}
else
@@ -643,56 +1110,81 @@
/// </summary>
private void StartSequence()
{
+ log.Info($"Start ATE Seq isLoadOK:{isLoadOK}");
if (!isLoadOK) return;
- //MaskWindow mask = new MaskWindow();
try
{
- 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);
- IsTesting = true;
+ testExecutionWrapper?.SetStationGlobalValue("StationState.StopTest", 1, false);
}
catch (Exception ex)
{
- Dispatcher.Invoke(() =>
- {
- log.Error("Start Sequence Failed.", ex);
- MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
- });
+ log.Error("Reset StopTest Failed.", ex);
}
- finally
+ if (ParamSetting.EnableAutoModel)
{
+ try
+ {
+ var path = ParameterManager.GetCommonParameterByName<string>("CommonMainSeq", "");
+ if (string.IsNullOrEmpty(path))
+ {
+ Dispatcher.Invoke(() =>
+ {
+ MsgBoxHelper.Error(this, $"璇峰厛璁剧疆CommonMainSeq鍙傛暟");
+ });
+ return;
+ }
+ this.testSeqFile = path;
+ testExecutionWrapper?.StartSequence(this.testSeqFile, this.tsModelPath);
+ //this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+ //this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+ //this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+ IsTesting = true;
+ }
+ catch (Exception ex)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ log.Error("Start Sequence Failed.", ex);
+ MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+ });
+ }
+ }
+ else
+ {
+ //MaskWindow mask = new MaskWindow();
+ try
+ {
+ testExecutionWrapper?.SetStationGlobalValue("StationState.ProductModel", 1, CurrentProductModel);
+ testExecutionWrapper?.CommitToDisk(false);
+ testExecutionWrapper?.StartSequence(this.testSeqFile, this.tsModelPath);
+ //this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+ //this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+ //this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+ IsTesting = true;
+ }
+ catch (Exception ex)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ log.Error("Start Sequence Failed.", ex);
+ MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+ });
+ }
+ finally
+ {
+ }
}
}
public void StopSequenceClick()
{
- new MaskWindow((WindowX)Window.GetWindow(this),
- (win) =>
- {
- try
- {
- bool stoped = StopSequence();
- if (stoped)
- {
- IsTesting = false;
- }
- }
- finally
- {
- Dispatcher.Invoke(() =>
- {
-
- win.Close();
- });
- }
- //Dispatcher.Invoke(() =>
- //{
-
- //});
- }
- ).Info(LangUtil.Get("App.SequenceIsStopping"));
+ canSwitchModel = false;
+ switchAction = null;
+ ShowMask(() =>
+ {
+ bool stoped = StopSequence();
+ }, null, null, LangUtil.Get("App.SequenceIsStopping"));
}
/// <summary>
@@ -702,22 +1194,15 @@
{
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.execution == null) return true;
- return this.execution.WaitForEndEx(2000, true, null, null);
+ testExecutionWrapper.SetStationGlobalValue("StationState.StopTest", 1, true);
+
+
+ //bool res = this.execution.WaitForEndEx(-1, true, null, null);
+ bool res = this.testExecutionWrapper.WaitForExit();
+ //if (this.execution != null)
+ // Marshal.ReleaseComObject(this.execution);
+ //this.execution = null;
+ return res;
}
catch (Exception ex)
{
@@ -751,63 +1236,257 @@
private void StartClick()
{
- new MaskWindow(Window.GetWindow(this),
- (win) =>
- {
- try
- {
- StartSequence();
- }
- finally
- {
- win.Dispatcher.Invoke(() =>
- {
- win.Close();
- });
- }
- }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
- }
-
- /// <summary>
- /// 閫�鍑哄簲鐢�
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void AxApplicationMgr_ExitApplication(object sender, EventArgs e)
- {
- //Environment.ExitCode = this.AxApplicationMgr.ExitCode;
- //this.Close();
- }
-
- /// <summary>
- /// 杩涚▼缁撴潫浜嬩欢
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void AxApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
- {
- try
+ canSwitchModel = true;
+ ShowMask(() =>
{
- if (this.testSeq == null)
- return;
- this.engine.ReleaseSequenceFileEx(this.testSeq, 0);
- this.engine.ReleaseSequenceFileEx(this.modeSeq, 0);
- this.engine.UnloadAllModules();
- this.testSeq = null;
- this.modeSeq = null;
- }
- catch (Exception ex)
- {
- log.Error("ReleaseSequenceFileEx Failed.", ex);
- MsgBoxHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("Ts.ReleaseSequenceFileFail")}: {ex.Message}");
- }
+ StartSequence();
+ }, null, null, LangUtil.Get("Ts.SequenceIsStarting"));
+ //new MaskWindow(Window.GetWindow(this),
+ // (win) =>
+ // {
+ // try
+ // {
+ // StartSequence();
+ // }
+ // catch (Exception ex) {
+
+ // }
+ // finally
+ // {
+ // win.Dispatcher.Invoke(() =>
+ // {
+ // win.Close();
+ // });
+ // }
+ // }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
}
public void UpdatePositionStatus(int index, string status)
{
- this.tsSockets[index].UpdateStatus(status);
- this.UpdateTestCounter();
+ Dispatcher.Invoke(() =>
+ {
+ this.tsSockets[index].UpdateStatus(status);
+ OnStatusPublished(index, status);
+ this.UpdateTestCounter();
+ });
}
+
+ private void OnStatusPublished(int index, string status)
+ {
+ if (ParamSetting.CustomerCode != "SOUND")
+ {
+ return;
+ }
+ if (status == "Passed" || status == "Failed")
+ {
+ SaveSOUNDExcel(index, status);
+ }
+ }
+
+ private string ConvertStatus(string status)
+ {
+ if (string.Equals(status, "passed", StringComparison.OrdinalIgnoreCase))
+ {
+ return "Pass";
+ }
+ else
+ {
+ return "Fail";
+ }
+ }
+
+ #region 妗戝痉瀹氬埗
+ private ICell CreateCell(ISheet sheet, int r, int c, ICellStyle style)
+ {
+ var row = sheet.GetRow(r);
+ if (row == null)
+ {
+ row = sheet.CreateRow(r);
+ }
+ var cell = row.GetCell(c);
+ if (cell == null)
+ {
+ cell = row.CreateCell(c);
+ }
+ if (style != null)
+ {
+ cell.CellStyle = style;
+ }
+ return cell;
+ }
+
+ private string GetOutputFolder()
+ {
+ var value = ParameterManager.GetCommonParameterByName("SOUND_Output");
+ if (value != null)
+ {
+ return value.Value;
+ }
+ return ParamSetting.DataLogFolder;
+ }
+
+ private void SaveSOUNDExcel(int index, string status)
+ {
+ lock (this)
+ {
+ try
+ {
+ string outputFolder = GetOutputFolder();
+
+ var socket = this.tsSockets[index];
+ DateTime testTime = DateTime.Now;
+ string filePath = Path.Combine(outputFolder, $"{testTime.ToString("yy-MM-dd")}_{CurrentProductModel}.xls");
+ if (!File.Exists(filePath))
+ {
+ Dictionary<string, int> columnMap = new Dictionary<string, int>();
+ HSSFWorkbook workbook = new HSSFWorkbook();
+ ISheet sheet = workbook.CreateSheet("Sheet1");
+
+ ICellStyle border = workbook.CreateCellStyle();
+ border.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.TopBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.RightBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+
+
+ ICellStyle red = workbook.CreateCellStyle();
+ red.CloneStyleFrom(border);
+ red.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
+ red.FillPattern = FillPattern.SolidForeground;
+
+ ICellStyle green = workbook.CreateCellStyle();
+ green.CloneStyleFrom(border);
+ green.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.BrightGreen.Index;
+ green.FillPattern = FillPattern.SolidForeground;
+
+ CreateCell(sheet, 1, 0, border);
+ CreateCell(sheet, 1, 1, border);
+ CreateCell(sheet, 1, 2, border);
+ CreateCell(sheet, 1, 3, border);
+ CreateCell(sheet, 1, 4, border);
+
+ CreateCell(sheet, 2, 0, border);
+ CreateCell(sheet, 2, 1, border);
+ CreateCell(sheet, 2, 2, border);
+ CreateCell(sheet, 2, 3, border);
+ CreateCell(sheet, 2, 4, border).SetCellValue("涓婇檺");
+
+ CreateCell(sheet, 3, 0, border).SetCellValue("娴嬭瘯鏃堕棿");
+ CreateCell(sheet, 3, 1, border).SetCellValue("娴嬭瘯浜�");
+ CreateCell(sheet, 3, 2, border).SetCellValue("娴嬭瘯璁惧");
+ CreateCell(sheet, 3, 3, border).SetCellValue("鏉″舰鐮�");
+ CreateCell(sheet, 3, 4, border).SetCellValue("涓嬮檺");
+
+ int column = 5;
+ int row = 4;
+
+ CreateCell(sheet, row, 0, border).SetCellValue(testTime.ToString("*HH:mm:ss*"));
+ CreateCell(sheet, row, 1, border).SetCellValue(UserInfo.User.Name);
+ CreateCell(sheet, row, 2, border).SetCellValue(ParamSetting.StationName);
+ CreateCell(sheet, row, 3, border).SetCellValue(socket.Barcode);
+ CreateCell(sheet, row, 4, status == "Passed" ? green : red).SetCellValue(ConvertStatus(status));
+
+ foreach (var data in socket.Datasource)
+ {
+ int col = column;
+ if (columnMap.ContainsKey(data.Name))
+ {
+ col = columnMap[data.Name];
+ }
+ else
+ {
+ columnMap[data.Name] = column++;
+ }
+
+ CreateCell(sheet, 1, col, border).SetCellValue(data.Name);
+ CreateCell(sheet, 2, col, border).SetCellValue(data.LimitUp);
+ CreateCell(sheet, 3, col, border).SetCellValue(data.LimitDown);
+ CreateCell(sheet, row, col, data.Result == "Failed" ? red : border).SetCellValue(data.Value);
+ }
+ using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
+ {
+ workbook.Write(fs);
+ }
+ }
+ else
+ {
+ using (FileStream fs = File.OpenRead(filePath))
+ {
+ IWorkbook workbook = new HSSFWorkbook(fs);
+ ICellStyle border = workbook.CreateCellStyle();
+ border.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
+ border.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.TopBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+ border.RightBorderColor = NPOI.HSSF.Util.HSSFColor.Black.Index;
+
+
+ ICellStyle red = workbook.CreateCellStyle();
+ red.CloneStyleFrom(border);
+ red.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
+ red.FillPattern = FillPattern.SolidForeground;
+
+ ICellStyle green = workbook.CreateCellStyle();
+ green.CloneStyleFrom(border);
+ green.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.BrightGreen.Index;
+ green.FillPattern = FillPattern.SolidForeground;
+
+ ISheet sheet = workbook.GetSheet("Sheet1");
+ Dictionary<string, int> columnMap = new Dictionary<string, int>();
+ var titleRow = sheet.GetRow(1);
+ for (int i = 0; i < titleRow.LastCellNum; i++)
+ {
+ if (!string.IsNullOrEmpty(titleRow.GetCell(i).StringCellValue))
+ {
+ columnMap[titleRow.GetCell(i).StringCellValue] = i;
+ }
+ }
+ int row = sheet.LastRowNum + 1;
+ CreateCell(sheet, row, 0, border).SetCellValue(testTime.ToString("*HH:mm:ss*"));
+ CreateCell(sheet, row, 1, border).SetCellValue(UserInfo.User.Name);
+ CreateCell(sheet, row, 2, border).SetCellValue(ParamSetting.StationName);
+ CreateCell(sheet, row, 3, border).SetCellValue(socket.Barcode);
+ CreateCell(sheet, row, 4, status == "Passed" ? green : red).SetCellValue(ConvertStatus(status));
+
+ foreach (var data in socket.Datasource)
+ {
+ int col = titleRow.LastCellNum;
+ if (columnMap.ContainsKey(data.Name))
+ {
+ col = columnMap[data.Name];
+ }
+ else
+ {
+ columnMap[data.Name] = col;
+ }
+
+ CreateCell(sheet, 1, col, border).SetCellValue(data.Name);
+ CreateCell(sheet, 2, col, border).SetCellValue(data.LimitUp);
+ CreateCell(sheet, 3, col, border).SetCellValue(data.LimitDown);
+ CreateCell(sheet, row, col, data.Result == "Failed" ? red : border).SetCellValue(data.Value);
+ }
+ using (FileStream nfs = new FileStream(filePath, FileMode.OpenOrCreate))
+ {
+ workbook.Write(nfs);
+ }
+ }
+ }
+
+ }
+ catch (Exception ex)
+ {
+ log.Error("SOUND Export Excel Data Error.", ex);
+ }
+ }
+ }
+ #endregion
public void UpdatePositionProcessValue(int index, int value)
{
@@ -826,132 +1505,310 @@
TestItems[4], TestItems[5], TestItems[6]);
}
- public void SetPositionBarcode(int index, string barcode)
+ public void SetPositionBarcode(int index, string strData)
{
- this.tsSockets[index].Barcode = barcode;
+ if (strData.Contains(";"))
+ {
+ var strs = strData.Split(';');
+ this.tsSockets[index].Barcode = strs[0];
+ this.tsSockets[index].Model = strs[1];
+ }
+ else
+ {
+ this.tsSockets[index].Barcode = strData;
+ }
}
- /// <summary>
- /// TestStand鐢ㄦ埛浜や簰浜嬩欢
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void AxApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
+ public void SavePositionCSV(int index, string csvPath)
{
- try
+ //var time = DateTime.Now;
+ //string status = this.tsSockets[index].Status == "Passed" ? "PASS" : "FAIL";
+ //string csvPath = Path.Combine(csvDir, SelectedProduct?.Name ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status,
+ // $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
+ this.tsSockets[index].WriteToCSV(csvPath);
+ }
+
+ public void SaveTemplateCSV(int index)
+ {
+ var time = DateTime.Now;
+ string status = this.tsSockets[index].Status == "Passed" ? "PASS" : "FAIL";
+ string csvPath = Path.Combine(csvDir, CurrentProductModel ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status, $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
+ this.tsSockets[index].WriteToCSV(csvPath);
+ }
+
+ public void SavePositionDB(int index, string status)
+ {
+ CheckSqlHelper();
+ var socket = this.tsSockets[index];
+ var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string snr = socket.Barcode;
+ string model = CurrentProductModel;
+
+ List<string> sqls = new List<string>();
+ foreach (var data in socket.Datasource)
{
- int EventCase = Convert.ToInt32(e.uiMsg.Event);
- int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
- string strData = e.uiMsg.StringData;
+ sqls.Add($@"INSERT INTO serialData (sn,model,station,step,position,limitDown,limitUp,unit,value,status,finalStatus,consumeTime,totalConsumeTime,time) VALUES
+('{snr}','{model}','','{data.Name}','{index}','{data.LimitDown}','{data.LimitUp}','{data.Unit}','{data.Value}','{data.Result}','{socket.Status}','{data.ConsumeTime}','{socket.ElapseTime}','{time}')");
+ }
+ sqliteHelper.ExecuteBatchSql(sqls);
- try
- {
- log.Info($"Event: {EventCase}, NumericData: {Index}, StringData: {strData}");
- }
- catch
- {
+ var ssql = $@"INSERT INTO testResult (sn,model,station,result,time,position,status) VALUES
+('{snr}','{model}','','{socket.Status}','{time}','{index}','{status}')";
+ sqliteHelper.ExecuteSql(ssql);
+ }
- }
+ private void HandleUIMessage(int eventCode, int index, string strData)
+ {
+ switch (eventCode)
+ {
+ case 10002://鏇存柊娴嬭瘯鐘舵��
+ string status = strData;
+ UpdatePositionStatus(index, status);
+ break;
- switch (EventCase)
- {
- case 10001://浼犻�扴ocketContext
- tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
- break;
+ case 10003://鍙戦�佹祴璇曟暟鎹�
+ AddTestData(index, strData);
+ break;
- case 10002://鏇存柊娴嬭瘯鐘舵��
- string status = e.uiMsg.StringData;
- UpdatePositionStatus(Index, status);
- break;
+ case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
+ this.tsSockets[index].CurrentStep = strData;
+ break;
- case 10003://鍙戦�佹祴璇曟暟鎹�
- AddTestData(Index, e.uiMsg.StringData);
- break;
+ case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
+ this.tsSockets[index].IniTestData();
+ break;
- case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
- this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
- break;
+ case 10006://鍙戦�佷骇鍝佹潯鐮�
+ Dispatcher.Invoke(() =>
+ {
+ SetPositionBarcode(index, strData);
+ });
+ break;
- case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
- this.tsSockets[Index].IniTestData();
- break;
-
- case 10006://鍙戦�佷骇鍝佹潯鐮�
- SetPositionBarcode(Index, e.uiMsg.StringData);
- break;
-
- case 10007://寮�濮嬫祴璇曡鏃�
- tsSockets[Index].ElapseTime = "Start Timing";
+ case 10007://寮�濮嬫祴璇曡鏃�
+ Dispatcher.Invoke(() =>
+ {
+ tsSockets[index].ElapseTime = "Start Timing";
BtnStopSeq.IsEnabled = false;
- break;
+ });
+ break;
- case 10008://鍋滄娴嬭瘯璁℃椂
- tsSockets[Index].ElapseTime = "Stop Timing";
+ case 10008://鍋滄娴嬭瘯璁℃椂
+ Dispatcher.Invoke(() =>
+ {
+ tsSockets[index].ElapseTime = "Stop Timing";
BtnStopSeq.IsEnabled = true;
- break;
+ });
+ break;
- case 10009:
- //
- 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://鎵ц缁撴潫
- IsTesting = false;
- // 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;
- case 10032://鎸変笅鏍囨殏鍋滄祴璇�
- this.tsSockets[Index].ShowPausePanel();
- break;
- default:
- break;
- }
+ break;
+ case 10017://鏇存柊娴嬭瘯璁℃椂锛岄拡瀵归儴鍒嗚鏃舵湁PLC瀹屾垚鐨勯」鐩�
+ Dispatcher.Invoke(() =>
+ {
+ this.tsSockets[index].ElapseTime = strData;
+ });
+ break;
+ case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
+ //IsTesting = false;
+ //this.ReleaseSequenceFile();
+ break;
+ case 10030://鏄剧ず娴嬭瘯杩涘害
+ int ProcessVal = Convert.ToInt32(strData);
+ Dispatcher.Invoke(() =>
+ {
+ this.tsSockets[index].SetTestProcess(ProcessVal);
+ });
+ break;
+ case 10031://瀵煎嚭CSV
+
+ if (ParamSetting.CustomerCode == "SOUND")
+ {
+ string[] datas = strData.Split(';');
+ this.tsSockets[index].WriteToExcel(datas[0]);
+ if (datas.Length >= 2)
+ {
+ SavePositionDB(index, datas[1]);
+ }
+ else
+ {
+ Dispatcher.Invoke(() =>
+ {
+ var sss = this.tsSockets[index].Status;
+ SavePositionDB(index, sss);
+ });
+ }
+ return;
+ }
+
+ if (string.IsNullOrEmpty(strData))
+ {
+ SaveTemplateCSV(index);
+ return;
+ }
+ try
+ {
+ string[] datas = strData.Split(';');
+ SavePositionCSV(index, datas[0]);
+ if (datas.Length >= 2)
+ {
+ SavePositionDB(index, datas[1]);
+ }
+ else
+ {
+ Dispatcher.Invoke(() =>
+ {
+ var sss = this.tsSockets[index].Status;
+ SavePositionDB(index, sss);
+ });
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Warn("10031 Error.", ex);
+ SaveTemplateCSV(index);
+ }
+ break;
+ case 10032://鎸変笅鏍囨殏鍋滄祴璇�
+ this.tsSockets[index].ShowPausePanel();
+ break;
+ case 10033:
+ var alarm = new AlarmText
+ {
+ VirtualId = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
+ AlarmInfo = strData
+ };
+ ShowAlarm(alarm);
+ break;
+ 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 100350:
+ string[] arr_100350 = strData.Split(';');
+
+ int[][] points_0 = new int[arr_100350.Length - 1][];
+
+ for (int i = 1; i < arr_100350.Length; i++)
+ {
+ if (string.IsNullOrEmpty(arr_100350[i]))
+ {
+ continue;
+ }
+ string[] strs = arr_100350[i].Split(',');
+ points_0[i - 1] = new int[2] { int.Parse(strs[0]), int.Parse(strs[1]) };
+ }
+ this.tsSockets[index].DrawNewScreenPoints(int.Parse(arr_100350[0]), points_0);
+ 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;
}
- catch (Exception ex)
+ }
+
+ private void SwitchSequenceByModel(int index, string model, string snr)
+ {
+ Dispatcher.Invoke(() =>
{
- log.Warn("Ts Event Error.", ex);
- }
+ 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;
+ testExecutionWrapper?.SetStationGlobalValue($"CacheSNR[{index}]", 1, snr);
+ testExecutionWrapper?.CommitToDisk(false);
+ StartClick();
+ }
+ catch (Exception ex)
+ {
+ log?.Error("鑷姩鎹㈠瀷澶辫触", ex);
+ }
+ });
+ }
+ };
+ });
+ }
+
+ private void ShowAlarm(AlarmText alarm)
+ {
+ AlarmShowHelper.ShowAlarm(alarm);
+ mSMQHelper.Send("Alarm", "PC", $"ATE娴嬭瘯 {alarm.AlarmInfo}", 2);
}
private void UpdateTestCounter()
@@ -974,9 +1831,12 @@
return;
}
string name = product.Name;
- List<ParameterData> parameters = ProductManager.GetParametersByProductName(name);
+ List<HMI.Core.Entity.ParameterData> parameters = ProductManager.GetParametersByProductName(name);
testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value?.ToString();
- StartSequence();
+ if (AutoExecuteSeq)
+ {
+ StartSequence();
+ }
}
private void ClearNum()
@@ -999,13 +1859,6 @@
try
{
StopSequence();
- // this.engine?.TerminateAll();
- // this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
- // this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
- // this.engine?.UnloadAllModules();
- // this.engine?.ShutDown(true);
- //this.testSeq = null;
- //this.modeSeq = null;
base.OnClose(sender, e);
}
catch (Exception ex)
@@ -1014,9 +1867,84 @@
}
}
+ public override void DoClose(object sender, EventArgs e)
+ {
+ testExecutionWrapper?.Dispose();
+ base.DoClose(sender, e);
+ }
+
+ /// <summary>
+ /// 閲婃斁鎵�鏈夌殑搴忓垪鏂囦欢
+ /// </summary>
+ private bool ReleaseSequenceFile()
+ {
+ try
+ {
+ lock (this)
+ {
+ //execution.Abort();
+ int count = 10;
+ while (count > 0)
+ {
+ try
+ {
+ return testExecutionWrapper.ReleaseSeqFile();
+ }
+ catch (Exception ex)
+ {
+ log.Warn($"ReleaseSequenceFile In {count} Times Fail.", ex);
+ count--;
+ System.Threading.Thread.Sleep(1000);
+ }
+ }
+ log.Warn($"ReleaseSequenceFile Failed.");
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Warn("ReleaseSequenceFile Error.", ex);
+ return false;
+ }
+ }
+
private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
}
+
+ private void CbFontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ if (e.AddedItems != null && e.AddedItems.Count > 0)
+ {
+ var fontSize = (double)e.AddedItems[0];
+ this.Resources["tableFontSize"] = fontSize;
+ IniFileHelper.WriteIniData("Config", "TableFontSize", fontSize.ToString(), CountIniPath);
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ private void Label_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ //workOrderEditor.Focus();
+ //workOrderEditor.IsEditing = true;
+ if (RequirePassword() == true)
+ {
+ var win = new WorkOrderWin
+ {
+ WorkOrder = CurrentWorkorder,
+ Owner = Window.GetWindow(this)
+ };
+ if (win.ShowDialog() == true)
+ {
+ CurrentWorkorder = win.WorkOrder;
+ }
+ }
+ }
}
}
\ No newline at end of file
--
Gitblit v1.9.1