| | |
| | | using HMI.Core.Util; |
| | | using HMI.MQUtil; |
| | | using HMI.UI; |
| | | using HMI.UI.Controls; |
| | | using HMI.UI.Util; |
| | | using HMI.Util; |
| | | using log4net; |
| | |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | | using System.Windows.Forms.DataVisualization.Charting; |
| | | using System.Windows.Media; |
| | | |
| | | namespace Plugin.TsExecution |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | private string tsModelPath; |
| | | private string dataLogPath; |
| | | private SqliteHelper sqliteHelper; |
| | | |
| | | private MQConnector mqConnector; |
| | | private int probeWarn; |
| | | |
| | | public TsExecution() |
| | | { |
| | |
| | | //初始化TestStand引擎 |
| | | this.InitTestStandEngine(); |
| | | } |
| | | |
| | | public override void SetBaseFolder(string folder) |
| | | { |
| | | CountIniPath = Path.Combine(folder, "Count.ini"); |
| | | base.SetBaseFolder(folder); |
| | | } |
| | | |
| | | public override void InitFinish() |
| | | private void CheckSqlHelper() |
| | | { |
| | | this.ReadCount(out int pass, out int fail); |
| | | this.DisplayCount(pass, fail); |
| | | InitProducts(); |
| | | ReadConfig(); |
| | | if (!File.Exists(dataLogPath)) |
| | | string today = DateTime.Now.ToString("yyyyMMdd"); |
| | | string dbPath = Path.Combine(dataLogPath, $"Data_{today}.db"); |
| | | if (!File.Exists(dbPath)) |
| | | { |
| | | SqliteHelper.CreateDatabase(dataLogPath); |
| | | SqliteHelper.CreateDatabase(dbPath); |
| | | } |
| | | sqliteHelper = new SqliteHelper(dataLogPath); |
| | | sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS serialData ( |
| | | 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, |
| | |
| | | consumeTime TEXT, |
| | | totalConsumeTime TEXT, |
| | | time DATETIME NOT NULL);"); |
| | | sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS testResult ( |
| | | 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);"); |
| | | try |
| | | { |
| | | sqliteHelper.ExecuteSql("alter table serialData add column 'model' TEXT default NULL;"); |
| | | } |
| | | catch |
| | | { |
| | | } |
| | | |
| | | } |
| | | |
| | | try |
| | | { |
| | | sqliteHelper.ExecuteSql("alter table serialData add column 'position' TEXT default NULL;"); |
| | | } |
| | | catch |
| | | { |
| | | |
| | | } |
| | | try |
| | | { |
| | | sqliteHelper.ExecuteSql("alter table testResult add column 'position' TEXT default NULL;"); |
| | | } |
| | | catch |
| | | { |
| | | |
| | | } |
| | | |
| | | try |
| | | { |
| | | sqliteHelper.ExecuteSql("alter table testResult add column 'status' TEXT default NULL;"); |
| | | } |
| | | catch |
| | | { |
| | | |
| | | } |
| | | |
| | | public override void InitFinish() |
| | | { |
| | | this.ReadCount(out int pass, out int fail); |
| | | this.DisplayCount(pass, fail); |
| | | ReadConfig(); |
| | | InitProducts(); |
| | | CheckSqlHelper(); |
| | | base.InitFinish(); |
| | | } |
| | | |
| | |
| | | { |
| | | 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> |
| | |
| | | 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); |
| | | |
| | | var tempProduct = Products[0]; |
| | | if (!string.IsNullOrEmpty(lastModel)) |
| | | { |
| | | var product = Products.FirstOrDefault(p => p.Name == lastModel); |
| | | if (product != null) |
| | | { |
| | | SelectedProduct = product; |
| | | RefershUI(); |
| | | return; |
| | | tempProduct = product; |
| | | } |
| | | } |
| | | SelectedProduct = Products[0]; |
| | | RefershUI(); |
| | | SelectedProduct = tempProduct; |
| | | } |
| | | RefershUI(); |
| | | SampleStatus = false; |
| | | } |
| | | |
| | |
| | | |
| | | 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(); |
| | | //重新生成子面板 |
| | | for (int i = 0; i < this.socketNum; i++) |
| | | { |
| | | SingleControl control = new SingleControl(i, CountIniPath, ProbeWarn); |
| | | SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn); |
| | | panel.Children.Add(control); |
| | | tsSockets.Add(control); |
| | | |
| | |
| | | catch |
| | | { |
| | | flag = false; |
| | | } |
| | | |
| | | try |
| | | { |
| | | value = ParameterManager.GetCommonParameterByName("SocketNum"); |
| | | if (value != null) |
| | | { |
| | | this.socketNum = int.Parse(value.Value); |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | this.socketNum = 2; |
| | | } |
| | | |
| | | if (flag) |
| | |
| | | } |
| | | catch |
| | | { |
| | | dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard", "DataLog.db"); |
| | | dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard"); |
| | | } |
| | | |
| | | try |
| | | { |
| | | |
| | | value = ParameterManager.GetCommonParameterByName("TsModelPath"); |
| | | tsModelPath = value.Value; |
| | | } |
| | | 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)) |
| | |
| | | { |
| | | 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.modeSeq = this.engine.GetSequenceFileEx(@"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq"); |
| | | 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; |
| | |
| | | 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, SelectedProduct?.Name ?? "未知产品", 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 = SelectedProduct?.Name; |
| | | |
| | | List<string> sqls = new List<string>(); |
| | | foreach (var data in socket.Datasource) |
| | | { |
| | | sqls.Add($@"INSERT INTO serialData (sn,model,station,step,limitDown,limitUp,unit,value,status,finalStatus,consumeTime,totalConsumeTime,time) VALUES |
| | | ('{snr}','{socket.Model}','','{data.Name}','{data.LimitDown}','{data.LimitUp}','{data.Unit}','{data.Value}','{data.Result}','{socket.Status}','{data.ConsumeTime}','{socket.ElapseTime}','{time}')"); |
| | | 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}')"); |
| | | } |
| | | sqls.Add($@"INSERT INTO testResult (sn,model,station,result,time,position,status) VALUES |
| | | ('{snr}','{socket.Model}','','{socket.Status}','{time}','{index}','{status}')"); |
| | | ('{snr}','{model}','','{socket.Status}','{time}','{index}','{status}')"); |
| | | sqliteHelper.ExecuteBatchSql(sqls); |
| | | } |
| | | |
| | |
| | | this.tsSockets[index].SetTestProcess(ProcessVal); |
| | | break; |
| | | case 10031://导出CSV |
| | | string[] datas = strData.Split(';'); |
| | | SavePositionCSV(index, datas[0]); |
| | | SavePositionDB(index, datas[1]); |
| | | 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 |
| | | { |
| | | 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(); |