From c4a3f8db90530a727ffab77c3bb5bb7d782792bf Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 25 八月 2025 15:50:27 +0800
Subject: [PATCH] 上传代码;
---
Plugin.TsExecution/TsExecution.xaml.cs | 866 ++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 672 insertions(+), 194 deletions(-)
diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 846c349..724fe97 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,10 +1,12 @@
锘縰sing HMI.Base;
using HMI.Core;
+using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Util;
-using HMI.ParameterManage;
+using HMI.MQUtil;
using HMI.UI;
+using HMI.UI.Controls;
using HMI.UI.Util;
using HMI.Util;
using log4net;
@@ -23,7 +25,7 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.DataVisualization.Charting;
-using System.Windows.Markup;
+using System.Windows.Media;
namespace Plugin.TsExecution
{
@@ -32,7 +34,6 @@
/// </summary>
public partial class TsExecution : PluginControl
{
- //private OpcInterface.OpcInterface OpcHandle = new OpcInterface.OpcInterface();
#region TestStand浜嬩欢
/// <summary>
/// TS 寮曟搸
@@ -71,6 +72,15 @@
}
}
+ private string _currentUserCode;
+
+ public string CurrentUserCode
+ {
+ get { return _currentUserCode; }
+ set { Set(ref _currentUserCode, value); }
+ }
+
+
private bool isLoadOK = false;
private Timer GCTimer;
@@ -83,6 +93,8 @@
private int socketNum = 1;
private ProductData selectedProduct;
+
+ private MSMQHelper mSMQHelper = new MSMQHelper("HMI_Alarm");
public ProductData SelectedProduct
{
@@ -113,6 +125,7 @@
private Pie pie;
private string CountIniPath;
+ private bool IsOptRequirePassword;
private bool alarmVisiable;
public bool AlarmVisiable
@@ -130,8 +143,13 @@
get => _enableMes;
set
{
- Set(ref _enableMes, value);
- WriteConfig("EnableMes", value);
+ if (RequirePassword() == true)
+ {
+ if (WriteConfig("EnableMes", value))
+ {
+ Set(ref _enableMes, value);
+ }
+ }
}
}
@@ -141,8 +159,10 @@
get => _enableCanLog;
set
{
- Set(ref _enableCanLog, value);
- WriteConfig("EnableCanLog", value);
+ if (WriteConfig("EnableCanLog", value))
+ {
+ Set(ref _enableCanLog, value);
+ }
}
}
@@ -152,11 +172,87 @@
get => _enableDebugMode;
set
{
- Set(ref _enableDebugMode, value);
- WriteConfig("EnableDebugMode", value);
+ if (RequirePassword() == true)
+ {
+ if (WriteConfig("EnableDebugMode", value))
+ {
+ Set(ref _enableDebugMode, value);
+ }
+ }
}
}
+ private bool _enableNGPause;
+ public bool EnableNGPause
+ {
+ get => _enableNGPause;
+ set
+ {
+ if (RequirePassword() == true)
+ {
+ if (WriteConfig("EnableNGPause", value))
+ {
+ Set(ref _enableNGPause, value);
+ }
+ }
+ }
+ }
+
+ private bool _enableSimpleMode;
+ public bool EnableSimpleMode
+ {
+ get => _enableSimpleMode;
+ set
+ {
+ if (WriteConfig("EnableSimpleMode", value))
+ {
+ Set(ref _enableSimpleMode, value);
+ foreach (var cell in tsSockets) cell.SetSimpleUI(value);
+ }
+ }
+ }
+
+ private bool _ui_showInfoDock;
+ public bool UI_ShowInfoDock
+ {
+ get => _ui_showInfoDock;
+ set
+ {
+ 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);
+ }
+ }
+ }
+
+ private string dataLogPath;
+ private SqliteHelper sqliteHelper;
+
+ private MQConnector mqConnector;
public TsExecution()
{
@@ -168,7 +264,6 @@
//鍒濆鍖朤estStand寮曟搸
this.InitTestStandEngine();
}
-
public override void SetBaseFolder(string folder)
{
CountIniPath = Path.Combine(folder, "Count.ini");
@@ -180,7 +275,70 @@
this.ReadCount(out int pass, out int fail);
this.DisplayCount(pass, fail);
InitProducts();
+ ReadConfig();
+ if (!File.Exists(dataLogPath))
+ {
+ SqliteHelper.CreateDatabase(dataLogPath);
+ }
+ sqliteHelper = new SqliteHelper(dataLogPath);
+ sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS serialData (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ sn TEXT NOT NULL,
+ station TEXT NOT NULL,
+ step TEXT NOT NULL,
+ limitDown TEXT,
+ limitUp TEXT,
+ unit TEXT,
+ offset TEXT,
+ value TEXT,
+ status TEXT,
+ finalStatus TEXT,
+ consumeTime TEXT,
+ totalConsumeTime TEXT,
+ time DATETIME NOT NULL);");
base.InitFinish();
+ }
+
+ 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);
+ }));
+ }
+
+ void createChildInNewThread(int index, string configFile, int probeWarn)
+ {
+ HostVisual hostVisual = new HostVisual();
+
+ UIElement content = new VisualHost(hostVisual);
+
+ System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(() =>
+ {
+ VisualTarget visualTarget = new VisualTarget(hostVisual);
+
+ var control = new SingleControl(index, configFile, probeWarn);
+ control.Arrange(new Rect(new Point(), content.RenderSize));
+
+ visualTarget.RootVisual = control;
+ tsSockets.Add(control);
+ System.Windows.Threading.Dispatcher.Run();
+ }));
+ //panel.Children.Add(content);
+
+ thread.SetApartmentState(System.Threading.ApartmentState.STA);
+ thread.IsBackground = true;
+ thread.Start();
}
/// <summary>
@@ -190,25 +348,35 @@
{
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;
legend.Padding = new PixelPadding(0);
- legend.FontSize = (float)CustomFontSizeConverter.CountFontSize(20, 300, 300);
+ legend.FontSize = (float)WidthSizeConverter.CountFontSize(20, 300, 300);
pieChart.UserInputProcessor.Disable();
pieChart.Plot.Font.Automatic();
List<PieSlice> slices = new List<PieSlice> {
- new PieSlice() { Value = 5, FillColor = Colors.Green,
- LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
+ 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,
- LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
+ new PieSlice() { Value = 2, FillColor = ScottPlot.Colors.Red,
+ LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
Label = "Fail",LegendText="Fail" } };
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()
@@ -223,10 +391,38 @@
{
this.socketNum = Convert.ToInt32(tmpNum);
}
+ string lastModel = engine?.Globals.GetValString("StationState.ProductModel", 1);
+
+ if (!string.IsNullOrEmpty(lastModel))
+ {
+ var product = Products.FirstOrDefault(p => p.Name == lastModel);
+ if (product != null)
+ {
+ SelectedProduct = product;
+ RefershUI();
+ return;
+ }
+ }
SelectedProduct = Products[0];
RefershUI();
}
SampleStatus = false;
+ }
+
+ private bool _isTesting = false;
+ public bool IsTesting
+ {
+ get { return _isTesting; }
+ set
+ {
+ Set(ref _isTesting, value);
+ Dispatcher.Invoke(() =>
+ {
+ BtnStartSeq.IsEnabled = !value;
+ BtnStopSeq.IsEnabled = value;
+ CbProduct.IsEnabled = !value;
+ });
+ }
}
/// <summary>
@@ -235,6 +431,7 @@
private void InitTsEngine()
{
AxApplicationMgr = new AxApplicationMgr();
+ AxApplicationMgr.EndExecution += AxApplicationMgr_EndExecution;
AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
AxApplicationMgr.UIMessageEvent +=
new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
@@ -245,42 +442,52 @@
((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
}
+ private void AxApplicationMgr_EndExecution(object sender, _ApplicationMgrEvents_EndExecutionEvent e)
+ {
+ ReleaseSequenceFile();
+ }
+
private void PluginControl_Loaded(object sender, RoutedEventArgs e)
{
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(() =>
{
- try
- {
- ReadConfig();
- //杩炴帴OPChandle
- //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
- //鍚姩娴嬭瘯杩涚▼
- StartSequence();
- isLoadOK = true;
- }
- 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}");
- }
- finally
- {
- win.Close();
- }
if (isLoadOK) Loaded -= PluginControl_Loaded;
});
}
@@ -310,6 +517,8 @@
SingleControl control = new SingleControl(i, CountIniPath, ProbeWarn);
panel.Children.Add(control);
tsSockets.Add(control);
+
+ //createChildInNewThread(i, CountIniPath, ProbeWarn);
}
if (tsSockets.Count == 1)
{
@@ -352,6 +561,8 @@
fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
}
+ private string csvDir;
+
/// <summary>
/// 璇诲彇閰嶇疆鏂囦欢閲岀殑鍑犱釜灞炴��
/// </summary>
@@ -359,24 +570,209 @@
/// <param name="fail"></param>
private void ReadConfig()
{
+ ParameterData value;
try
{
- var p = ParameterManager.GetCommonParameterByName("EnableMes");
- EnableMes = bool.Parse(p?.Value);
+ value = ParameterManager.GetCommonParameterByName("EnableMes");
+ _enableMes = bool.Parse(value.Value);
+ Set("EnableMes");
}
catch
{
- EnableMes = false;
+ _enableMes = false;
+ Set("EnableMes");
}
+
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("EnableNGPause");
+ _enableNGPause = bool.Parse(value.Value);
+ Set("EnableNGPause");
+ }
+ catch
+ {
+ _enableNGPause = false;
+ Set("EnableNGPause");
+ }
+
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("EnableCanLog");
+ _enableCanLog = bool.Parse(value.Value);
+ Set("EnableCanLog");
+ }
+ catch
+ {
+ _enableCanLog = false;
+ 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);
+ }
+ catch
+ {
+ EnableSimpleMode = false;
+ }
+
+ try
+ {
+ value = ParameterManager.GetCommonParameterByName("UI_ShowInfoDock");
+ 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;
+ if (!Directory.Exists(csvDir))
+ {
+ Directory.CreateDirectory(csvDir);
+ }
+ }
+ catch
+ {
+ csvDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestReport");
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("IsOptRequirePassword");
+ IsOptRequirePassword = bool.Parse(value.Value);
+ }
+ catch
+ {
+ IsOptRequirePassword = false;
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("UI_CurrentWorkorder");
+ currentWorkorder = value.Value;
+ Set("CurrentWorkorder");
+ }
+ catch
+ {
+ currentWorkorder = string.Empty;
+ Set("CurrentWorkorder");
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("TS_ShowTitleWorkorder");
+ var boo = bool.Parse(value.Value);
+ if (boo)
+ {
+ workorderPanel.Visibility = Visibility.Visible;
+ }
+ }
+ catch
+ {
+ }
+
+ try
+ {
+
+ value = ParameterManager.GetCommonParameterByName("TS_DataLogPath");
+ dataLogPath = value.Value;
+ }
+ catch
+ {
+ dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard", "DataLog.db");
+ }
+
//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));
+ //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)
+ //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);
- //this.engine.Globals.SetValBoolean($"StationState.{name}", 1, value);
+ //IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
+ try
+ {
+ if (ParameterManager.UpdateCommonParameter(name, value, out string errMsg))
+ {
+ foreach (var ts in tsSockets)
+ {
+ ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
+ }
+ 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
+ {
+ throw new Exception(errMsg);
+ }
+ }
+ catch (Exception ex)
+ {
+ MsgBoxHelper2.Error(ex.Message);
+ return false;
+ }
}
private void WriteCount(double pass, double fail)
@@ -444,18 +840,16 @@
/// </summary>
private void StartSequence()
{
+ if (!isLoadOK) return;
//MaskWindow mask = new MaskWindow();
try
{
+ engine?.Globals.SetValString("StationState.ProductModel", 1, SelectedProduct?.Name);
+ engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
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;
- this.BtnStartSeq.IsEnabled = false;
- this.BtnStopSeq.IsEnabled = true;
- });
+ IsTesting = true;
}
catch (Exception ex)
{
@@ -481,12 +875,7 @@
bool stoped = StopSequence();
if (stoped)
{
- Dispatcher.Invoke(() =>
- {
- this.CbProduct.IsEnabled = true;
- this.BtnStartSeq.IsEnabled = true;
- this.BtnStopSeq.IsEnabled = false;
- });
+ IsTesting = false;
}
}
finally
@@ -497,10 +886,6 @@
win.Close();
});
}
- //Dispatcher.Invoke(() =>
- //{
-
- //});
}
).Info(LangUtil.Get("App.SequenceIsStopping"));
}
@@ -523,11 +908,13 @@
// context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
// bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
//}
- context?.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
+ context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
}
}
if (this.execution == null) return true;
- return this.execution.WaitForEndEx(2000, true, null, null);
+
+ bool res = this.execution.WaitForEndEx(2000, true, null, null);
+ return res;
}
catch (Exception ex)
{
@@ -564,17 +951,17 @@
new MaskWindow(Window.GetWindow(this),
(win) =>
{
- Dispatcher.Invoke(() =>
+ try
{
- try
- {
- StartSequence();
- }
- finally
+ StartSequence();
+ }
+ finally
+ {
+ win.Dispatcher.Invoke(() =>
{
win.Close();
- }
- });
+ });
+ }
}).Info(LangUtil.Get("Ts.SequenceIsStarting"));
}
@@ -594,23 +981,9 @@
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
- private void AxApplicationMgr_ExecutionClosed(object sender, NationalInstruments.TestStand.Interop.UI.Ax._ApplicationMgrEvents_ExecutionClosedEvent e)
+ private void AxApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
{
- try
- {
- 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}");
- }
+ ReleaseSequenceFile();
}
public void UpdatePositionStatus(int index, string status)
@@ -619,11 +992,154 @@
this.UpdateTestCounter();
}
+ public void UpdatePositionProcessValue(int index, int value)
+ {
+ this.tsSockets[index].SetTestProcess(value);
+ }
+
+ public void PausePosition(int index)
+ {
+ this.tsSockets[index].ShowPausePanel();
+ }
+
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]);
+ }
+
+ public void SetPositionBarcode(int index, string barcode)
+ {
+ this.tsSockets[index].Barcode = barcode;
+ }
+
+ public void SavePositionCSV(int index)
+ {
+ 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 SavePositionDB(int index)
+ {
+ var socket = this.tsSockets[index];
+ var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string snr = socket.Barcode;
+
+ List<string> sqls = new List<string>();
+ foreach (var data in socket.Datasource)
+ {
+ sqls.Add($@"INSERT INTO serialData (sn,station,step,limitDown,limitUp,unit,value,status,finalStatus,consumeTime,totalConsumeTime,time) VALUES
+('{snr}','','{data.Name}','{data.LimitDown}','{data.LimitUp}','{data.Unit}','{data.Value}','{data.Result}','{socket.Status}','{data.ConsumeTime}','{socket.ElapseTime}','{time}')");
+ }
+ sqliteHelper.ExecuteBatchSql(sqls);
+ }
+
+ private void HandleUIMessage(int eventCode, int index, string strData)
+ {
+ switch (eventCode)
+ {
+ case 10002://鏇存柊娴嬭瘯鐘舵��
+ string status = strData;
+ UpdatePositionStatus(index, status);
+ break;
+
+ case 10003://鍙戦�佹祴璇曟暟鎹�
+ AddTestData(index, strData);
+ break;
+
+ case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
+ this.tsSockets[index].CurrentStep = strData;
+ break;
+
+ case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
+ this.tsSockets[index].IniTestData();
+ break;
+
+ case 10006://鍙戦�佷骇鍝佹潯鐮�
+ SetPositionBarcode(index, strData);
+ break;
+
+ case 10007://寮�濮嬫祴璇曡鏃�
+ tsSockets[index].ElapseTime = "Start Timing";
+ BtnStopSeq.IsEnabled = false;
+ break;
+
+ case 10008://鍋滄娴嬭瘯璁℃椂
+ tsSockets[index].ElapseTime = "Stop Timing";
+ BtnStopSeq.IsEnabled = true;
+ break;
+
+ case 10009:
+ //
+ break;
+
+ 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;
+
+ case 10011:
+ // write model
+
+ break;
+
+ case 10012:
+ // read model
+
+ break;
+
+ case 10013:
+ // read continue
+
+
+ break;
+
+ case 10014:
+
+ break;
+
+ case 10015:
+
+ break;
+ case 10016://鏄剧ず3D鎷兼帴鍥剧墖
+
+ break;
+ case 10017://鏇存柊娴嬭瘯璁℃椂锛岄拡瀵归儴鍒嗚鏃舵湁PLC瀹屾垚鐨勯」鐩�
+ this.tsSockets[index].ElapseTime = strData;
+ break;
+ case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
+ IsTesting = false;
+ //this.ReleaseSequenceFile();
+ break;
+ case 10030://鏄剧ず娴嬭瘯杩涘害
+ int ProcessVal = Convert.ToInt32(strData);
+ this.tsSockets[index].SetTestProcess(ProcessVal);
+ break;
+ case 10031://瀵煎嚭CSV
+ SavePositionCSV(index);
+ SavePositionDB(index);
+ break;
+ case 10032://鎸変笅鏍囨殏鍋滄祴璇�
+ this.tsSockets[index].ShowPausePanel();
+ break;
+ case 10033:
+ ShowAlarm(strData);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void ShowAlarm(string info)
+ {
+ AlarmShowHelper.ShowAlarm(info);
+ mSMQHelper.Send("Alarm", $"ATE娴嬭瘯 {info}");
}
/// <summary>
@@ -635,100 +1151,24 @@
{
try
{
- int EventCase = Convert.ToInt32(e.uiMsg.Event);
- int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
- switch (EventCase)
+ int eventCode = Convert.ToInt32(e.uiMsg.Event);
+ int index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
+ string strData = e.uiMsg.StringData;
+
+ try
{
- case 10001://浼犻�扴ocketContext
- tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
- break;
-
- case 10002://鏇存柊娴嬭瘯鐘舵��
- string status = e.uiMsg.StringData;
- UpdatePositionStatus(Index, status);
- break;
-
- case 10003://鍙戦�佹祴璇曟暟鎹�
- AddTestData(Index, e.uiMsg.StringData);
- break;
-
- case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
- this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
- break;
-
- case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
- this.tsSockets[Index].IniTestData();
- break;
-
- case 10006://鍙戦�佷骇鍝佹潯鐮�
- this.tsSockets[Index].Barcode = e.uiMsg.StringData;
- break;
-
- case 10007://寮�濮嬫祴璇曡鏃�
- tsSockets[Index].ElapseTime = "Start Timing";
- BtnStopSeq.IsEnabled = false;
- break;
-
- case 10008://鍋滄娴嬭瘯璁℃椂
- tsSockets[Index].ElapseTime = "Stop Timing";
- BtnStopSeq.IsEnabled = true;
- break;
-
- case 10009:
- //
- break;
-
- 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;
-
- case 10011:
- // write model
-
- break;
-
- case 10012:
- // read model
-
- break;
-
- case 10013:
- // read continue
-
-
- break;
-
- case 10014:
-
- break;
-
- case 10015:
-
- 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;
- case 10031://瀵煎嚭CSV
- this.tsSockets[Index].WriteToCSV(e.uiMsg.StringData);
- break;
- default:
- break;
+ log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
}
+ catch
+ {
+
+ }
+ if (eventCode == 10001)
+ {
+ tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
+ return;
+ }
+ HandleUIMessage(eventCode, index, strData);
}
catch (Exception ex)
{
@@ -750,9 +1190,15 @@
private void SetTestSeqFile(ProductData product)
{
+ if (product == null)
+ {
+ testSeqFile = null;
+ return;
+ }
string name = product.Name;
List<ParameterData> parameters = ProductManager.GetParametersByProductName(name);
testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value?.ToString();
+ StartSequence();
}
private void ClearNum()
@@ -772,13 +1218,45 @@
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);
+ try
+ {
+ StopSequence();
+ base.OnClose(sender, e);
+ }
+ catch (Exception ex)
+ {
+ log.Error("OnClose Error.", ex);
+ }
+ }
+
+ /// <summary>
+ /// 閲婃斁鎵�鏈夌殑搴忓垪鏂囦欢
+ /// </summary>
+ private bool ReleaseSequenceFile()
+ {
+ try
+ {
+ lock (this)
+ {
+ if (this.testSeq == null)
+ return true;
+ if (this.engine.ReleaseSequenceFileEx(this.testSeq, 4))
+ {
+ this.testSeq = null;
+ }
+ if (this.engine.ReleaseSequenceFileEx(this.modeSeq, 4))
+ {
+ this.modeSeq = null;
+ }
+ this.engine.UnloadAllModules();
+ return true;
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Warn("ReleaseSequenceFile Error.", ex);
+ return false;
+ }
}
private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)
--
Gitblit v1.9.1