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