Compare commits
4 Commits
dev_newtes
...
e31a890b06
Author | SHA1 | Date | |
---|---|---|---|
e31a890b06 | |||
428896dbf8 | |||
f9d472295b | |||
4765e0e5bd |
@ -343,7 +343,18 @@ namespace DH.Commons.Base
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 其他方法保持原有逻辑
|
// 其他方法保持原有逻辑
|
||||||
public Action<DateTime, CameraBase, Mat> OnHImageOutput { get; set; }
|
public MatSet CopyImageSet(MatSet srcSet)
|
||||||
|
{
|
||||||
|
MatSet imageSet = new MatSet
|
||||||
|
{
|
||||||
|
Id = srcSet.Id,
|
||||||
|
_mat = srcSet._mat.Clone(),
|
||||||
|
// ImageSaveOption = srcSet.ImageSaveOption.Copy(),
|
||||||
|
ImageTime = srcSet.ImageTime
|
||||||
|
};
|
||||||
|
return imageSet;
|
||||||
|
}
|
||||||
|
public Action<DateTime, CameraBase, MatSet> OnHImageOutput { get; set; }
|
||||||
|
|
||||||
public virtual bool CameraConnect() { return false; }
|
public virtual bool CameraConnect() { return false; }
|
||||||
|
|
||||||
|
@ -509,7 +509,7 @@ namespace DH.Commons.Base
|
|||||||
private AntList<SizeTreatParam> _sizeTreatParamList = new AntList<SizeTreatParam>();
|
private AntList<SizeTreatParam> _sizeTreatParamList = new AntList<SizeTreatParam>();
|
||||||
|
|
||||||
private CustomizedPoint _showLocation = new CustomizedPoint();
|
private CustomizedPoint _showLocation = new CustomizedPoint();
|
||||||
private string _imageSaveDirectory="D://Images";
|
private string _imageSaveDirectory= "D://PROJECTS//Images//";
|
||||||
private bool _saveOKOriginal = false;
|
private bool _saveOKOriginal = false;
|
||||||
private bool _saveNGOriginal = false;
|
private bool _saveNGOriginal = false;
|
||||||
private bool _saveOKDetect = false;
|
private bool _saveOKDetect = false;
|
||||||
|
@ -305,7 +305,7 @@ namespace DH.Commons.Base
|
|||||||
|
|
||||||
//if (InitialConfig.IsEnableLog)
|
//if (InitialConfig.IsEnableLog)
|
||||||
//{
|
//{
|
||||||
// LoggerHelper.LogAsync(msg);
|
LoggerHelper.LogAsync(msg);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ namespace DH.Commons.Base
|
|||||||
|
|
||||||
public HTuple hv_ModelID;
|
public HTuple hv_ModelID;
|
||||||
|
|
||||||
public abstract DetectStationResult RunInference(Mat originImgSet, string detectionId = null);
|
public abstract DetectStationResult RunInference(MatSet originImgSet, string detectionId = null);
|
||||||
|
|
||||||
//public abstract void SaveDetectResultAsync(DetectStationResult detectResult);
|
//public abstract void SaveDetectResultAsync(DetectStationResult detectResult);
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AntdUI" Version="1.8.9" />
|
<PackageReference Include="AntdUI" Version="1.8.9" />
|
||||||
|
@ -375,6 +375,22 @@ namespace DH.Commons.Enums
|
|||||||
[Description("异常")]
|
[Description("异常")]
|
||||||
DSExcept = 32
|
DSExcept = 32
|
||||||
}
|
}
|
||||||
|
public enum RunState
|
||||||
|
{
|
||||||
|
[ColorSelect("Gold")]
|
||||||
|
[Description("空闲")]
|
||||||
|
Idle = 1,
|
||||||
|
[ColorSelect("Lime")]
|
||||||
|
[Description("运行中")]
|
||||||
|
Running = 2,
|
||||||
|
[ColorSelect("Gray")]
|
||||||
|
[Description("停止")]
|
||||||
|
Stop = 3,
|
||||||
|
[ColorSelect("Red")]
|
||||||
|
[Description("宕机")]
|
||||||
|
Down = 99,
|
||||||
|
}
|
||||||
|
|
||||||
public enum PriorityDirection
|
public enum PriorityDirection
|
||||||
{
|
{
|
||||||
X,
|
X,
|
||||||
|
26
DH.Commons/Models/ProductSummary.cs
Normal file
26
DH.Commons/Models/ProductSummary.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DH.Commons.Models
|
||||||
|
{
|
||||||
|
public class CameraSummary
|
||||||
|
{
|
||||||
|
public string CameraName { get; set; } // 相机名称
|
||||||
|
public int TiggerCount { get; set; } //触发数
|
||||||
|
public int OKCount { get; set; } // OK 数
|
||||||
|
public int NGCount { get; set; } // NG 数
|
||||||
|
public int TotalCount => OKCount + NGCount; // 总检测数量
|
||||||
|
public string YieldStr => $"{Yield:f2} %"; // 良率(字符串形式)
|
||||||
|
public double Yield => OKCount + NGCount > 0 ? (double)OKCount / (OKCount + NGCount) * 100 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ProductSummary
|
||||||
|
{
|
||||||
|
public int ProductAmount { get; set; }
|
||||||
|
public string ResultDesc { get; set; }
|
||||||
|
public string PercentStr { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Reflection.Metadata;
|
using System.Reflection.Metadata;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
@ -372,7 +373,9 @@ namespace DH.Devices.Camera
|
|||||||
|
|
||||||
};
|
};
|
||||||
InitialImageSet(imageSet);
|
InitialImageSet(imageSet);
|
||||||
OnHImageOutput?.Invoke(DateTime.Now, this, smat);
|
|
||||||
|
var outImgSet = CopyImageSet(imageSet);
|
||||||
|
OnHImageOutput?.Invoke(DateTime.Now, this, outImgSet);
|
||||||
|
|
||||||
//存图
|
//存图
|
||||||
DisplayAndSaveOriginImage(imageSet.Id,SnapshotCount);
|
DisplayAndSaveOriginImage(imageSet.Id,SnapshotCount);
|
||||||
|
@ -368,7 +368,7 @@ namespace DH.Devices.Camera
|
|||||||
throw new NotSupportedException($"Unsupported pixel type: {pFrameInfo.enPixelType}");
|
throw new NotSupportedException($"Unsupported pixel type: {pFrameInfo.enPixelType}");
|
||||||
}
|
}
|
||||||
|
|
||||||
OnHImageOutput?.Invoke(DateTime.Now, this, cvImage);
|
//OnHImageOutput?.Invoke(DateTime.Now, this, cvImage);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -41,7 +41,7 @@ namespace DH.Devices.PLC
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
LoggerHelper.LogPath = "D://";
|
LoggerHelper.LogPath = "D://PROJECTS//Logs//";
|
||||||
LoggerHelper.LogPrefix = "PLC";
|
LoggerHelper.LogPrefix = "PLC";
|
||||||
|
|
||||||
TcpNet.IpAddress = IP;
|
TcpNet.IpAddress = IP;
|
||||||
|
@ -58,7 +58,7 @@ namespace DH.Devices.Vision
|
|||||||
//{
|
//{
|
||||||
// LogAsync(new LogMsg(dt, LogLevel.Error, msg));
|
// LogAsync(new LogMsg(dt, LogLevel.Error, msg));
|
||||||
//}
|
//}
|
||||||
public override DetectStationResult RunInference(Mat originImgSet, string detectionId = null)
|
public override DetectStationResult RunInference(MatSet originImgSet, string detectionId = null)
|
||||||
{
|
{
|
||||||
DetectStationResult detectResult = new DetectStationResult();
|
DetectStationResult detectResult = new DetectStationResult();
|
||||||
DetectionConfig detectConfig = null;
|
DetectionConfig detectConfig = null;
|
||||||
@ -78,19 +78,20 @@ namespace DH.Devices.Vision
|
|||||||
//未能获得检测配置
|
//未能获得检测配置
|
||||||
return detectResult;
|
return detectResult;
|
||||||
}
|
}
|
||||||
|
detectResult.Id = originImgSet.Id;
|
||||||
detectResult.DetectName = detectConfig.Name;
|
detectResult.DetectName = detectConfig.Name;
|
||||||
detectResult.ImageSaveDirectory=detectConfig.ImageSaveDirectory;
|
detectResult.ImageSaveDirectory=detectConfig.ImageSaveDirectory;
|
||||||
detectResult.SaveNGDetect=detectConfig.SaveNGDetect;
|
detectResult.SaveNGDetect=detectConfig.SaveNGDetect;
|
||||||
detectResult.SaveNGOriginal=detectConfig.SaveNGOriginal;
|
detectResult.SaveNGOriginal=detectConfig.SaveNGOriginal;
|
||||||
detectResult.SaveOKDetect=detectConfig.SaveOKDetect;
|
detectResult.SaveOKDetect=detectConfig.SaveOKDetect;
|
||||||
detectResult.SaveOKOriginal=detectConfig.SaveOKOriginal;
|
detectResult.SaveOKOriginal=detectConfig.SaveOKOriginal;
|
||||||
Mat OriginImage = originImgSet.Clone();
|
Mat OriginImage = originImgSet._mat.Clone();
|
||||||
detectResult.DetectionOriginImage = CopyBitmapWithLockBits(OriginImage.ToBitmap());
|
detectResult.DetectionOriginImage = CopyBitmapWithLockBits(OriginImage.ToBitmap());
|
||||||
//detectResult.DetectionOriginImage = originImgSet.Clone().ToBitmap();
|
//detectResult.DetectionOriginImage = originImgSet.Clone().ToBitmap();
|
||||||
Stopwatch sw = new Stopwatch();
|
Stopwatch sw = new Stopwatch();
|
||||||
#region 1.预处理
|
#region 1.预处理
|
||||||
sw.Start();
|
sw.Start();
|
||||||
using (Mat PreTMat = originImgSet.Clone())
|
using (Mat PreTMat = originImgSet._mat.Clone())
|
||||||
{
|
{
|
||||||
PreTreated(detectConfig, detectResult, PreTMat);
|
PreTreated(detectConfig, detectResult, PreTMat);
|
||||||
PreTreated2(detectConfig, detectResult, PreTMat);
|
PreTreated2(detectConfig, detectResult, PreTMat);
|
||||||
@ -142,7 +143,7 @@ namespace DH.Devices.Vision
|
|||||||
req.ResizeHeight = (int)detectConfig.ModelHeight;
|
req.ResizeHeight = (int)detectConfig.ModelHeight;
|
||||||
// req.LabelNames = detectConfig.GetLabelNames();
|
// req.LabelNames = detectConfig.GetLabelNames();
|
||||||
// req.Score = IIConfig.Score;
|
// req.Score = IIConfig.Score;
|
||||||
req.mImage = originImgSet.Clone();
|
req.mImage = originImgSet._mat.Clone();
|
||||||
|
|
||||||
req.in_lable_path = detectConfig.In_lable_path;
|
req.in_lable_path = detectConfig.In_lable_path;
|
||||||
|
|
||||||
@ -308,7 +309,7 @@ namespace DH.Devices.Vision
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DisplayDetectionResult(detectResult, originImgSet.Clone(), detectionId);
|
DisplayDetectionResult(detectResult, originImgSet._mat.Clone(), detectionId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,11 +12,7 @@
|
|||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AntdUI" Version="1.8.9" />
|
<PackageReference Include="AntdUI" Version="1.8.9" />
|
||||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.185" />
|
<PackageReference Include="SqlSugarCore" Version="5.1.4.185" />
|
||||||
|
559
DHSoftware/MainWindow.Designer.cs
generated
559
DHSoftware/MainWindow.Designer.cs
generated
@ -41,33 +41,28 @@
|
|||||||
tabsStas = new AntdUI.Tabs();
|
tabsStas = new AntdUI.Tabs();
|
||||||
tabPage3 = new AntdUI.TabPage();
|
tabPage3 = new AntdUI.TabPage();
|
||||||
panel7 = new Panel();
|
panel7 = new Panel();
|
||||||
panel5 = new Panel();
|
|
||||||
lblNowtime = new Label();
|
|
||||||
label8 = new Label();
|
|
||||||
lblstarttime = new Label();
|
|
||||||
label6 = new Label();
|
|
||||||
lblUPH = new Label();
|
|
||||||
label4 = new Label();
|
|
||||||
lblNum = new Label();
|
|
||||||
label2 = new Label();
|
|
||||||
pageHeader1 = new AntdUI.PageHeader();
|
|
||||||
labuph = new Label();
|
|
||||||
divider2 = new AntdUI.Divider();
|
|
||||||
tabMain = new AntdUI.TabPage();
|
tabMain = new AntdUI.TabPage();
|
||||||
panelmain = new AntdUI.Panel();
|
panelmain = new AntdUI.Panel();
|
||||||
panel2 = new AntdUI.Panel();
|
splitter2 = new AntdUI.Splitter();
|
||||||
tabImgDisplay = new AntdUI.Tabs();
|
tabImgDisplay = new AntdUI.Tabs();
|
||||||
panel4 = new AntdUI.Panel();
|
splitter1 = new AntdUI.Splitter();
|
||||||
pnlLog = new AntdUI.Panel();
|
pnlLog = new AntdUI.Panel();
|
||||||
panel6 = new AntdUI.Panel();
|
panel6 = new AntdUI.Panel();
|
||||||
lblNum2 = new Label();
|
tableLayoutstatistics = new TableLayoutPanel();
|
||||||
label12 = new Label();
|
dgvCamreaNums = new DataGridView();
|
||||||
lblNowtime2 = new Label();
|
panelNums = new AntdUI.Panel();
|
||||||
label10 = new Label();
|
tableLayoutNums = new TableLayoutPanel();
|
||||||
lblstarttime2 = new Label();
|
dgvProductNums = new DataGridView();
|
||||||
label7 = new Label();
|
tableLayoutPanel3 = new TableLayoutPanel();
|
||||||
lblUPH2 = new Label();
|
lblTotalTime = new Label();
|
||||||
label1 = new Label();
|
label1 = new Label();
|
||||||
|
label12 = new Label();
|
||||||
|
lblUPH = new Label();
|
||||||
|
lblStartTime = new Label();
|
||||||
|
lblOEE_Total = new Label();
|
||||||
|
label10 = new Label();
|
||||||
|
label7 = new Label();
|
||||||
|
panel2 = new AntdUI.Panel();
|
||||||
panel1 = new AntdUI.Panel();
|
panel1 = new AntdUI.Panel();
|
||||||
panel3 = new AntdUI.Panel();
|
panel3 = new AntdUI.Panel();
|
||||||
btnDeleteProject = new AntdUI.Button();
|
btnDeleteProject = new AntdUI.Button();
|
||||||
@ -78,12 +73,22 @@
|
|||||||
titlebar.SuspendLayout();
|
titlebar.SuspendLayout();
|
||||||
tabsStas.SuspendLayout();
|
tabsStas.SuspendLayout();
|
||||||
tabPage3.SuspendLayout();
|
tabPage3.SuspendLayout();
|
||||||
panel5.SuspendLayout();
|
|
||||||
pageHeader1.SuspendLayout();
|
|
||||||
panelmain.SuspendLayout();
|
panelmain.SuspendLayout();
|
||||||
panel2.SuspendLayout();
|
((System.ComponentModel.ISupportInitialize)splitter2).BeginInit();
|
||||||
panel4.SuspendLayout();
|
splitter2.Panel1.SuspendLayout();
|
||||||
|
splitter2.Panel2.SuspendLayout();
|
||||||
|
splitter2.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)splitter1).BeginInit();
|
||||||
|
splitter1.Panel1.SuspendLayout();
|
||||||
|
splitter1.Panel2.SuspendLayout();
|
||||||
|
splitter1.SuspendLayout();
|
||||||
panel6.SuspendLayout();
|
panel6.SuspendLayout();
|
||||||
|
tableLayoutstatistics.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit();
|
||||||
|
panelNums.SuspendLayout();
|
||||||
|
tableLayoutNums.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)dgvProductNums).BeginInit();
|
||||||
|
tableLayoutPanel3.SuspendLayout();
|
||||||
panel1.SuspendLayout();
|
panel1.SuspendLayout();
|
||||||
panel3.SuspendLayout();
|
panel3.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
@ -132,7 +137,6 @@
|
|||||||
// tabPage3
|
// tabPage3
|
||||||
//
|
//
|
||||||
tabPage3.Controls.Add(panel7);
|
tabPage3.Controls.Add(panel7);
|
||||||
tabPage3.Controls.Add(panel5);
|
|
||||||
tabPage3.Location = new Point(3, 3);
|
tabPage3.Location = new Point(3, 3);
|
||||||
tabPage3.Name = "tabPage3";
|
tabPage3.Name = "tabPage3";
|
||||||
tabPage3.Size = new Size(574, 170);
|
tabPage3.Size = new Size(574, 170);
|
||||||
@ -144,129 +148,9 @@
|
|||||||
panel7.Dock = DockStyle.Fill;
|
panel7.Dock = DockStyle.Fill;
|
||||||
panel7.Location = new Point(0, 0);
|
panel7.Location = new Point(0, 0);
|
||||||
panel7.Name = "panel7";
|
panel7.Name = "panel7";
|
||||||
panel7.Size = new Size(374, 170);
|
panel7.Size = new Size(574, 170);
|
||||||
panel7.TabIndex = 2;
|
panel7.TabIndex = 2;
|
||||||
//
|
//
|
||||||
// panel5
|
|
||||||
//
|
|
||||||
panel5.Controls.Add(lblNowtime);
|
|
||||||
panel5.Controls.Add(label8);
|
|
||||||
panel5.Controls.Add(lblstarttime);
|
|
||||||
panel5.Controls.Add(label6);
|
|
||||||
panel5.Controls.Add(lblUPH);
|
|
||||||
panel5.Controls.Add(label4);
|
|
||||||
panel5.Controls.Add(lblNum);
|
|
||||||
panel5.Controls.Add(label2);
|
|
||||||
panel5.Dock = DockStyle.Right;
|
|
||||||
panel5.Location = new Point(374, 0);
|
|
||||||
panel5.Name = "panel5";
|
|
||||||
panel5.Size = new Size(200, 170);
|
|
||||||
panel5.TabIndex = 1;
|
|
||||||
//
|
|
||||||
// lblNowtime
|
|
||||||
//
|
|
||||||
lblNowtime.AutoSize = true;
|
|
||||||
lblNowtime.Location = new Point(69, 41);
|
|
||||||
lblNowtime.Name = "lblNowtime";
|
|
||||||
lblNowtime.Size = new Size(15, 17);
|
|
||||||
lblNowtime.TabIndex = 7;
|
|
||||||
lblNowtime.Text = "0";
|
|
||||||
//
|
|
||||||
// label8
|
|
||||||
//
|
|
||||||
label8.AutoSize = true;
|
|
||||||
label8.Location = new Point(7, 41);
|
|
||||||
label8.Name = "label8";
|
|
||||||
label8.Size = new Size(56, 17);
|
|
||||||
label8.TabIndex = 6;
|
|
||||||
label8.Text = "此刻时间";
|
|
||||||
//
|
|
||||||
// lblstarttime
|
|
||||||
//
|
|
||||||
lblstarttime.AutoSize = true;
|
|
||||||
lblstarttime.Location = new Point(69, 15);
|
|
||||||
lblstarttime.Name = "lblstarttime";
|
|
||||||
lblstarttime.Size = new Size(15, 17);
|
|
||||||
lblstarttime.TabIndex = 5;
|
|
||||||
lblstarttime.Text = "0";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
label6.AutoSize = true;
|
|
||||||
label6.Location = new Point(7, 15);
|
|
||||||
label6.Name = "label6";
|
|
||||||
label6.Size = new Size(56, 17);
|
|
||||||
label6.TabIndex = 4;
|
|
||||||
label6.Text = "开始时间";
|
|
||||||
//
|
|
||||||
// lblUPH
|
|
||||||
//
|
|
||||||
lblUPH.AutoSize = true;
|
|
||||||
lblUPH.Location = new Point(70, 105);
|
|
||||||
lblUPH.Name = "lblUPH";
|
|
||||||
lblUPH.Size = new Size(15, 17);
|
|
||||||
lblUPH.TabIndex = 3;
|
|
||||||
lblUPH.Text = "0";
|
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
label4.AutoSize = true;
|
|
||||||
label4.Location = new Point(7, 105);
|
|
||||||
label4.Name = "label4";
|
|
||||||
label4.Size = new Size(33, 17);
|
|
||||||
label4.TabIndex = 2;
|
|
||||||
label4.Text = "UPH";
|
|
||||||
//
|
|
||||||
// lblNum
|
|
||||||
//
|
|
||||||
lblNum.AutoSize = true;
|
|
||||||
lblNum.Location = new Point(70, 75);
|
|
||||||
lblNum.Name = "lblNum";
|
|
||||||
lblNum.Size = new Size(15, 17);
|
|
||||||
lblNum.TabIndex = 1;
|
|
||||||
lblNum.Text = "0";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
label2.AutoSize = true;
|
|
||||||
label2.Location = new Point(7, 75);
|
|
||||||
label2.Name = "label2";
|
|
||||||
label2.Size = new Size(32, 17);
|
|
||||||
label2.TabIndex = 0;
|
|
||||||
label2.Text = "总数";
|
|
||||||
//
|
|
||||||
// pageHeader1
|
|
||||||
//
|
|
||||||
pageHeader1.Controls.Add(labuph);
|
|
||||||
pageHeader1.Controls.Add(divider2);
|
|
||||||
pageHeader1.DividerShow = true;
|
|
||||||
pageHeader1.Dock = DockStyle.Bottom;
|
|
||||||
pageHeader1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
|
||||||
pageHeader1.Location = new Point(0, 608);
|
|
||||||
pageHeader1.Name = "pageHeader1";
|
|
||||||
pageHeader1.Size = new Size(1024, 40);
|
|
||||||
pageHeader1.TabIndex = 7;
|
|
||||||
pageHeader1.Text = "UPH";
|
|
||||||
//
|
|
||||||
// labuph
|
|
||||||
//
|
|
||||||
labuph.AutoSize = true;
|
|
||||||
labuph.Location = new Point(59, 10);
|
|
||||||
labuph.Name = "labuph";
|
|
||||||
labuph.Size = new Size(64, 21);
|
|
||||||
labuph.TabIndex = 1;
|
|
||||||
labuph.Text = "100000";
|
|
||||||
//
|
|
||||||
// divider2
|
|
||||||
//
|
|
||||||
divider2.Dock = DockStyle.Top;
|
|
||||||
divider2.Location = new Point(0, 0);
|
|
||||||
divider2.Name = "divider2";
|
|
||||||
divider2.OrientationMargin = 0F;
|
|
||||||
divider2.Size = new Size(1024, 10);
|
|
||||||
divider2.TabIndex = 0;
|
|
||||||
divider2.Text = "";
|
|
||||||
//
|
|
||||||
// tabMain
|
// tabMain
|
||||||
//
|
//
|
||||||
tabMain.Location = new Point(3, 28);
|
tabMain.Location = new Point(3, 28);
|
||||||
@ -277,144 +161,289 @@
|
|||||||
//
|
//
|
||||||
// panelmain
|
// panelmain
|
||||||
//
|
//
|
||||||
|
panelmain.Controls.Add(splitter2);
|
||||||
panelmain.Controls.Add(panel2);
|
panelmain.Controls.Add(panel2);
|
||||||
panelmain.Controls.Add(panel4);
|
|
||||||
panelmain.Controls.Add(panel1);
|
panelmain.Controls.Add(panel1);
|
||||||
panelmain.Dock = DockStyle.Fill;
|
panelmain.Dock = DockStyle.Fill;
|
||||||
panelmain.Location = new Point(0, 40);
|
panelmain.Location = new Point(0, 40);
|
||||||
panelmain.Margin = new Padding(0);
|
panelmain.Margin = new Padding(0);
|
||||||
panelmain.Name = "panelmain";
|
panelmain.Name = "panelmain";
|
||||||
panelmain.Size = new Size(1024, 568);
|
panelmain.Size = new Size(1024, 631);
|
||||||
panelmain.TabIndex = 8;
|
panelmain.TabIndex = 8;
|
||||||
//
|
//
|
||||||
// panel2
|
// splitter2
|
||||||
//
|
//
|
||||||
panel2.Controls.Add(tabImgDisplay);
|
splitter2.Dock = DockStyle.Fill;
|
||||||
panel2.Dock = DockStyle.Fill;
|
splitter2.Location = new Point(0, 68);
|
||||||
panel2.Location = new Point(0, 68);
|
splitter2.Name = "splitter2";
|
||||||
panel2.Name = "panel2";
|
splitter2.Orientation = Orientation.Horizontal;
|
||||||
panel2.Size = new Size(1024, 388);
|
//
|
||||||
panel2.TabIndex = 3;
|
// splitter2.Panel1
|
||||||
panel2.Text = "panel2";
|
//
|
||||||
|
splitter2.Panel1.Controls.Add(tabImgDisplay);
|
||||||
|
//
|
||||||
|
// splitter2.Panel2
|
||||||
|
//
|
||||||
|
splitter2.Panel2.Controls.Add(splitter1);
|
||||||
|
splitter2.Size = new Size(1024, 563);
|
||||||
|
splitter2.SplitterDistance = 442;
|
||||||
|
splitter2.TabIndex = 4;
|
||||||
//
|
//
|
||||||
// tabImgDisplay
|
// tabImgDisplay
|
||||||
//
|
//
|
||||||
tabImgDisplay.Dock = DockStyle.Fill;
|
tabImgDisplay.Dock = DockStyle.Fill;
|
||||||
tabImgDisplay.Location = new Point(0, 0);
|
tabImgDisplay.Location = new Point(0, 0);
|
||||||
tabImgDisplay.Name = "tabImgDisplay";
|
tabImgDisplay.Name = "tabImgDisplay";
|
||||||
tabImgDisplay.Size = new Size(1024, 388);
|
tabImgDisplay.Size = new Size(1024, 442);
|
||||||
tabImgDisplay.Style = styleCard1;
|
tabImgDisplay.Style = styleCard1;
|
||||||
tabImgDisplay.TabIndex = 3;
|
tabImgDisplay.TabIndex = 3;
|
||||||
tabImgDisplay.Text = "tabs1";
|
tabImgDisplay.Text = "tabs1";
|
||||||
//
|
//
|
||||||
// panel4
|
// splitter1
|
||||||
//
|
//
|
||||||
panel4.Controls.Add(pnlLog);
|
splitter1.Dock = DockStyle.Fill;
|
||||||
panel4.Controls.Add(panel6);
|
splitter1.Location = new Point(0, 0);
|
||||||
panel4.Dock = DockStyle.Bottom;
|
splitter1.Name = "splitter1";
|
||||||
panel4.Location = new Point(0, 456);
|
//
|
||||||
panel4.Name = "panel4";
|
// splitter1.Panel1
|
||||||
panel4.Size = new Size(1024, 112);
|
//
|
||||||
panel4.TabIndex = 2;
|
splitter1.Panel1.Controls.Add(pnlLog);
|
||||||
panel4.Text = "panel4";
|
//
|
||||||
|
// splitter1.Panel2
|
||||||
|
//
|
||||||
|
splitter1.Panel2.Controls.Add(panel6);
|
||||||
|
splitter1.Size = new Size(1024, 117);
|
||||||
|
splitter1.SplitterDistance = 332;
|
||||||
|
splitter1.TabIndex = 3;
|
||||||
//
|
//
|
||||||
// pnlLog
|
// pnlLog
|
||||||
//
|
//
|
||||||
pnlLog.Dock = DockStyle.Fill;
|
pnlLog.Dock = DockStyle.Fill;
|
||||||
pnlLog.Location = new Point(0, 0);
|
pnlLog.Location = new Point(0, 0);
|
||||||
pnlLog.Name = "pnlLog";
|
pnlLog.Name = "pnlLog";
|
||||||
pnlLog.Size = new Size(719, 112);
|
pnlLog.Size = new Size(332, 117);
|
||||||
pnlLog.TabIndex = 2;
|
pnlLog.TabIndex = 2;
|
||||||
pnlLog.Text = "panel8";
|
pnlLog.Text = "panel8";
|
||||||
//
|
//
|
||||||
// panel6
|
// panel6
|
||||||
//
|
//
|
||||||
panel6.Controls.Add(lblNum2);
|
panel6.Controls.Add(tableLayoutstatistics);
|
||||||
panel6.Controls.Add(label12);
|
panel6.Dock = DockStyle.Fill;
|
||||||
panel6.Controls.Add(lblNowtime2);
|
panel6.Location = new Point(0, 0);
|
||||||
panel6.Controls.Add(label10);
|
|
||||||
panel6.Controls.Add(lblstarttime2);
|
|
||||||
panel6.Controls.Add(label7);
|
|
||||||
panel6.Controls.Add(lblUPH2);
|
|
||||||
panel6.Controls.Add(label1);
|
|
||||||
panel6.Dock = DockStyle.Right;
|
|
||||||
panel6.Location = new Point(719, 0);
|
|
||||||
panel6.Name = "panel6";
|
panel6.Name = "panel6";
|
||||||
panel6.Size = new Size(305, 112);
|
panel6.Size = new Size(688, 117);
|
||||||
panel6.TabIndex = 0;
|
panel6.TabIndex = 0;
|
||||||
panel6.Text = "panel6";
|
panel6.Text = "panel6";
|
||||||
//
|
//
|
||||||
// lblNum2
|
// tableLayoutstatistics
|
||||||
//
|
//
|
||||||
lblNum2.AutoSize = true;
|
tableLayoutstatistics.ColumnCount = 2;
|
||||||
lblNum2.Location = new Point(68, 92);
|
tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||||
lblNum2.Name = "lblNum2";
|
tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
||||||
lblNum2.Size = new Size(15, 17);
|
tableLayoutstatistics.Controls.Add(dgvCamreaNums, 0, 0);
|
||||||
lblNum2.TabIndex = 7;
|
tableLayoutstatistics.Controls.Add(panelNums, 1, 0);
|
||||||
lblNum2.Text = "0";
|
tableLayoutstatistics.Dock = DockStyle.Fill;
|
||||||
|
tableLayoutstatistics.Location = new Point(0, 0);
|
||||||
|
tableLayoutstatistics.Name = "tableLayoutstatistics";
|
||||||
|
tableLayoutstatistics.RowCount = 1;
|
||||||
|
tableLayoutstatistics.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||||
|
tableLayoutstatistics.Size = new Size(688, 117);
|
||||||
|
tableLayoutstatistics.TabIndex = 9;
|
||||||
//
|
//
|
||||||
// label12
|
// dgvCamreaNums
|
||||||
//
|
//
|
||||||
label12.AutoSize = true;
|
dgvCamreaNums.AllowUserToAddRows = false;
|
||||||
label12.Location = new Point(6, 92);
|
dgvCamreaNums.AllowUserToDeleteRows = false;
|
||||||
label12.Name = "label12";
|
dgvCamreaNums.AllowUserToResizeColumns = false;
|
||||||
label12.Size = new Size(44, 17);
|
dgvCamreaNums.AllowUserToResizeRows = false;
|
||||||
label12.TabIndex = 6;
|
dgvCamreaNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
||||||
label12.Text = "总计数";
|
dgvCamreaNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
|
||||||
|
dgvCamreaNums.BackgroundColor = SystemColors.Control;
|
||||||
|
dgvCamreaNums.BorderStyle = BorderStyle.None;
|
||||||
|
dgvCamreaNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
|
||||||
|
dgvCamreaNums.ColumnHeadersHeight = 25;
|
||||||
|
dgvCamreaNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
|
||||||
|
dgvCamreaNums.Dock = DockStyle.Fill;
|
||||||
|
dgvCamreaNums.Location = new Point(3, 15);
|
||||||
|
dgvCamreaNums.Margin = new Padding(3, 15, 3, 0);
|
||||||
|
dgvCamreaNums.MultiSelect = false;
|
||||||
|
dgvCamreaNums.Name = "dgvCamreaNums";
|
||||||
|
dgvCamreaNums.ReadOnly = true;
|
||||||
|
dgvCamreaNums.RowHeadersVisible = false;
|
||||||
|
dgvCamreaNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||||
|
dgvCamreaNums.Size = new Size(338, 102);
|
||||||
|
dgvCamreaNums.TabIndex = 9;
|
||||||
//
|
//
|
||||||
// lblNowtime2
|
// panelNums
|
||||||
//
|
//
|
||||||
lblNowtime2.AutoSize = true;
|
panelNums.Controls.Add(tableLayoutNums);
|
||||||
lblNowtime2.Location = new Point(68, 68);
|
panelNums.Dock = DockStyle.Fill;
|
||||||
lblNowtime2.Name = "lblNowtime2";
|
panelNums.Location = new Point(347, 3);
|
||||||
lblNowtime2.Size = new Size(15, 17);
|
panelNums.Name = "panelNums";
|
||||||
lblNowtime2.TabIndex = 5;
|
panelNums.Size = new Size(338, 111);
|
||||||
lblNowtime2.Text = "0";
|
panelNums.TabIndex = 8;
|
||||||
|
panelNums.Text = "panel4";
|
||||||
//
|
//
|
||||||
// label10
|
// tableLayoutNums
|
||||||
//
|
//
|
||||||
label10.AutoSize = true;
|
tableLayoutNums.ColumnCount = 1;
|
||||||
label10.Location = new Point(6, 68);
|
tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||||
label10.Name = "label10";
|
tableLayoutNums.Controls.Add(dgvProductNums, 0, 0);
|
||||||
label10.Size = new Size(56, 17);
|
tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1);
|
||||||
label10.TabIndex = 4;
|
tableLayoutNums.Dock = DockStyle.Fill;
|
||||||
label10.Text = "运行时间";
|
tableLayoutNums.Location = new Point(0, 0);
|
||||||
|
tableLayoutNums.Name = "tableLayoutNums";
|
||||||
|
tableLayoutNums.RowCount = 2;
|
||||||
|
tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||||
|
tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||||
|
tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
|
||||||
|
tableLayoutNums.Size = new Size(338, 111);
|
||||||
|
tableLayoutNums.TabIndex = 8;
|
||||||
//
|
//
|
||||||
// lblstarttime2
|
// dgvProductNums
|
||||||
//
|
//
|
||||||
lblstarttime2.AutoSize = true;
|
dgvProductNums.AllowUserToAddRows = false;
|
||||||
lblstarttime2.Location = new Point(68, 37);
|
dgvProductNums.AllowUserToDeleteRows = false;
|
||||||
lblstarttime2.Name = "lblstarttime2";
|
dgvProductNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
||||||
lblstarttime2.Size = new Size(15, 17);
|
dgvProductNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
|
||||||
lblstarttime2.TabIndex = 3;
|
dgvProductNums.BackgroundColor = SystemColors.Control;
|
||||||
lblstarttime2.Text = "0";
|
dgvProductNums.BorderStyle = BorderStyle.None;
|
||||||
|
dgvProductNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
|
||||||
|
dgvProductNums.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
|
||||||
|
dgvProductNums.ColumnHeadersHeight = 4;
|
||||||
|
dgvProductNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
|
||||||
|
dgvProductNums.ColumnHeadersVisible = false;
|
||||||
|
dgvProductNums.Dock = DockStyle.Fill;
|
||||||
|
dgvProductNums.Location = new Point(3, 10);
|
||||||
|
dgvProductNums.Margin = new Padding(3, 10, 3, 0);
|
||||||
|
dgvProductNums.MultiSelect = false;
|
||||||
|
dgvProductNums.Name = "dgvProductNums";
|
||||||
|
dgvProductNums.ReadOnly = true;
|
||||||
|
dgvProductNums.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
|
||||||
|
dgvProductNums.RowHeadersVisible = false;
|
||||||
|
dgvProductNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||||
|
dgvProductNums.Size = new Size(332, 45);
|
||||||
|
dgvProductNums.TabIndex = 10;
|
||||||
//
|
//
|
||||||
// label7
|
// tableLayoutPanel3
|
||||||
//
|
//
|
||||||
label7.AutoSize = true;
|
tableLayoutPanel3.ColumnCount = 4;
|
||||||
label7.Location = new Point(6, 37);
|
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||||
label7.Name = "label7";
|
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||||
label7.Size = new Size(56, 17);
|
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||||
label7.TabIndex = 2;
|
tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
|
||||||
label7.Text = "开始时间";
|
tableLayoutPanel3.Controls.Add(lblTotalTime, 1, 1);
|
||||||
|
tableLayoutPanel3.Controls.Add(label1, 2, 1);
|
||||||
|
tableLayoutPanel3.Controls.Add(label12, 0, 1);
|
||||||
|
tableLayoutPanel3.Controls.Add(lblUPH, 3, 1);
|
||||||
|
tableLayoutPanel3.Controls.Add(lblStartTime, 1, 0);
|
||||||
|
tableLayoutPanel3.Controls.Add(lblOEE_Total, 3, 0);
|
||||||
|
tableLayoutPanel3.Controls.Add(label10, 0, 0);
|
||||||
|
tableLayoutPanel3.Controls.Add(label7, 2, 0);
|
||||||
|
tableLayoutPanel3.Dock = DockStyle.Fill;
|
||||||
|
tableLayoutPanel3.Location = new Point(3, 58);
|
||||||
|
tableLayoutPanel3.Name = "tableLayoutPanel3";
|
||||||
|
tableLayoutPanel3.RowCount = 2;
|
||||||
|
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||||
|
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
||||||
|
tableLayoutPanel3.Size = new Size(332, 50);
|
||||||
|
tableLayoutPanel3.TabIndex = 11;
|
||||||
//
|
//
|
||||||
// lblUPH2
|
// lblTotalTime
|
||||||
//
|
//
|
||||||
lblUPH2.AutoSize = true;
|
lblTotalTime.AutoSize = true;
|
||||||
lblUPH2.Location = new Point(68, 11);
|
lblTotalTime.Dock = DockStyle.Fill;
|
||||||
lblUPH2.Name = "lblUPH2";
|
lblTotalTime.Location = new Point(86, 25);
|
||||||
lblUPH2.Size = new Size(15, 17);
|
lblTotalTime.Name = "lblTotalTime";
|
||||||
lblUPH2.TabIndex = 1;
|
lblTotalTime.Size = new Size(77, 25);
|
||||||
lblUPH2.Text = "0";
|
lblTotalTime.TabIndex = 15;
|
||||||
|
lblTotalTime.Text = "0";
|
||||||
|
lblTotalTime.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
//
|
//
|
||||||
// label1
|
// label1
|
||||||
//
|
//
|
||||||
label1.AutoSize = true;
|
label1.AutoSize = true;
|
||||||
label1.Location = new Point(6, 11);
|
label1.Dock = DockStyle.Fill;
|
||||||
|
label1.Location = new Point(169, 25);
|
||||||
label1.Name = "label1";
|
label1.Name = "label1";
|
||||||
label1.Size = new Size(33, 17);
|
label1.Size = new Size(77, 25);
|
||||||
label1.TabIndex = 0;
|
label1.TabIndex = 8;
|
||||||
label1.Text = "UPH";
|
label1.Text = "UPH";
|
||||||
|
label1.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// label12
|
||||||
|
//
|
||||||
|
label12.AutoSize = true;
|
||||||
|
label12.Dock = DockStyle.Fill;
|
||||||
|
label12.Location = new Point(3, 25);
|
||||||
|
label12.Name = "label12";
|
||||||
|
label12.Size = new Size(77, 25);
|
||||||
|
label12.TabIndex = 14;
|
||||||
|
label12.Text = "运行时间";
|
||||||
|
label12.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// lblUPH
|
||||||
|
//
|
||||||
|
lblUPH.AutoSize = true;
|
||||||
|
lblUPH.Dock = DockStyle.Fill;
|
||||||
|
lblUPH.Location = new Point(252, 25);
|
||||||
|
lblUPH.Name = "lblUPH";
|
||||||
|
lblUPH.Size = new Size(77, 25);
|
||||||
|
lblUPH.TabIndex = 9;
|
||||||
|
lblUPH.Text = "0";
|
||||||
|
lblUPH.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// lblStartTime
|
||||||
|
//
|
||||||
|
lblStartTime.AutoSize = true;
|
||||||
|
lblStartTime.Dock = DockStyle.Fill;
|
||||||
|
lblStartTime.Location = new Point(86, 0);
|
||||||
|
lblStartTime.Name = "lblStartTime";
|
||||||
|
lblStartTime.Size = new Size(77, 25);
|
||||||
|
lblStartTime.TabIndex = 11;
|
||||||
|
lblStartTime.Text = "0";
|
||||||
|
lblStartTime.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// lblOEE_Total
|
||||||
|
//
|
||||||
|
lblOEE_Total.AutoSize = true;
|
||||||
|
lblOEE_Total.Dock = DockStyle.Fill;
|
||||||
|
lblOEE_Total.Location = new Point(252, 0);
|
||||||
|
lblOEE_Total.Name = "lblOEE_Total";
|
||||||
|
lblOEE_Total.Size = new Size(77, 25);
|
||||||
|
lblOEE_Total.TabIndex = 13;
|
||||||
|
lblOEE_Total.Text = "0";
|
||||||
|
lblOEE_Total.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// label10
|
||||||
|
//
|
||||||
|
label10.AutoSize = true;
|
||||||
|
label10.Dock = DockStyle.Fill;
|
||||||
|
label10.Location = new Point(3, 0);
|
||||||
|
label10.Name = "label10";
|
||||||
|
label10.Size = new Size(77, 25);
|
||||||
|
label10.TabIndex = 12;
|
||||||
|
label10.Text = "开始时间";
|
||||||
|
label10.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
label7.AutoSize = true;
|
||||||
|
label7.Dock = DockStyle.Fill;
|
||||||
|
label7.Location = new Point(169, 0);
|
||||||
|
label7.Name = "label7";
|
||||||
|
label7.Size = new Size(77, 25);
|
||||||
|
label7.TabIndex = 10;
|
||||||
|
label7.Text = "总计数";
|
||||||
|
label7.TextAlign = ContentAlignment.MiddleCenter;
|
||||||
|
//
|
||||||
|
// panel2
|
||||||
|
//
|
||||||
|
panel2.Location = new Point(511, 86);
|
||||||
|
panel2.Name = "panel2";
|
||||||
|
panel2.Size = new Size(814, 364);
|
||||||
|
panel2.TabIndex = 3;
|
||||||
|
panel2.Text = "panel2";
|
||||||
//
|
//
|
||||||
// panel1
|
// panel1
|
||||||
//
|
//
|
||||||
@ -562,10 +591,9 @@
|
|||||||
//
|
//
|
||||||
// MainWindow
|
// MainWindow
|
||||||
//
|
//
|
||||||
ClientSize = new Size(1024, 648);
|
ClientSize = new Size(1024, 671);
|
||||||
ControlBox = false;
|
ControlBox = false;
|
||||||
Controls.Add(panelmain);
|
Controls.Add(panelmain);
|
||||||
Controls.Add(pageHeader1);
|
|
||||||
Controls.Add(titlebar);
|
Controls.Add(titlebar);
|
||||||
Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
Icon = (Icon)resources.GetObject("$this.Icon");
|
Icon = (Icon)resources.GetObject("$this.Icon");
|
||||||
@ -578,15 +606,23 @@
|
|||||||
titlebar.ResumeLayout(false);
|
titlebar.ResumeLayout(false);
|
||||||
tabsStas.ResumeLayout(false);
|
tabsStas.ResumeLayout(false);
|
||||||
tabPage3.ResumeLayout(false);
|
tabPage3.ResumeLayout(false);
|
||||||
panel5.ResumeLayout(false);
|
|
||||||
panel5.PerformLayout();
|
|
||||||
pageHeader1.ResumeLayout(false);
|
|
||||||
pageHeader1.PerformLayout();
|
|
||||||
panelmain.ResumeLayout(false);
|
panelmain.ResumeLayout(false);
|
||||||
panel2.ResumeLayout(false);
|
splitter2.Panel1.ResumeLayout(false);
|
||||||
panel4.ResumeLayout(false);
|
splitter2.Panel2.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)splitter2).EndInit();
|
||||||
|
splitter2.ResumeLayout(false);
|
||||||
|
splitter1.Panel1.ResumeLayout(false);
|
||||||
|
splitter1.Panel2.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)splitter1).EndInit();
|
||||||
|
splitter1.ResumeLayout(false);
|
||||||
panel6.ResumeLayout(false);
|
panel6.ResumeLayout(false);
|
||||||
panel6.PerformLayout();
|
tableLayoutstatistics.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit();
|
||||||
|
panelNums.ResumeLayout(false);
|
||||||
|
tableLayoutNums.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)dgvProductNums).EndInit();
|
||||||
|
tableLayoutPanel3.ResumeLayout(false);
|
||||||
|
tableLayoutPanel3.PerformLayout();
|
||||||
panel1.ResumeLayout(false);
|
panel1.ResumeLayout(false);
|
||||||
panel3.ResumeLayout(false);
|
panel3.ResumeLayout(false);
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
@ -595,12 +631,9 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private AntdUI.PageHeader titlebar;
|
private AntdUI.PageHeader titlebar;
|
||||||
private AntdUI.PageHeader pageHeader1;
|
|
||||||
private AntdUI.Divider divider2;
|
|
||||||
private AntdUI.Panel panelmain;
|
private AntdUI.Panel panelmain;
|
||||||
private AntdUI.Panel panel1;
|
private AntdUI.Panel panel1;
|
||||||
private AntdUI.Segmented segmented1;
|
private AntdUI.Segmented segmented1;
|
||||||
private Label labuph;
|
|
||||||
private AntdUI.Splitter splitter1;
|
private AntdUI.Splitter splitter1;
|
||||||
|
|
||||||
private AntdUI.Label lbName;
|
private AntdUI.Label lbName;
|
||||||
@ -610,30 +643,36 @@
|
|||||||
private AntdUI.Button btnLoadProject;
|
private AntdUI.Button btnLoadProject;
|
||||||
public AntdUI.Select sltProjects;
|
public AntdUI.Select sltProjects;
|
||||||
private Panel panel7;
|
private Panel panel7;
|
||||||
private Panel panel5;
|
// private Panel panel5;
|
||||||
private Label lblNum;
|
// private Label lblNum;
|
||||||
private Label label2;
|
// private Label label2;
|
||||||
private Label lblNowtime;
|
// private Label lblNowtime;
|
||||||
private Label label8;
|
// private Label label8;
|
||||||
private Label lblstarttime;
|
// private Label lblstarttime;
|
||||||
private Label label6;
|
// private Label label6;
|
||||||
private Label lblUPH;
|
// private Label lblUPH;
|
||||||
private Label label4;
|
private Label label4;
|
||||||
private AntdUI.TabPage tabPage3;
|
private AntdUI.TabPage tabPage3;
|
||||||
private AntdUI.TabPage tabMain;
|
private AntdUI.TabPage tabMain;
|
||||||
private AntdUI.Tabs tabsStas;
|
private AntdUI.Tabs tabsStas;
|
||||||
private Label label1;
|
|
||||||
private AntdUI.Panel panel2;
|
private AntdUI.Panel panel2;
|
||||||
private AntdUI.Panel panel4;
|
|
||||||
private AntdUI.Tabs tabImgDisplay;
|
private AntdUI.Tabs tabImgDisplay;
|
||||||
private AntdUI.Panel panel6;
|
private AntdUI.Panel panel6;
|
||||||
private Label lblUPH2;
|
|
||||||
private Label lblNum2;
|
|
||||||
private Label label12;
|
|
||||||
private Label lblNowtime2;
|
|
||||||
private Label label10;
|
|
||||||
private Label lblstarttime2;
|
|
||||||
private Label label7;
|
|
||||||
private AntdUI.Panel pnlLog;
|
private AntdUI.Panel pnlLog;
|
||||||
|
private AntdUI.Splitter splitter2;
|
||||||
|
private TableLayoutPanel tableLayoutstatistics;
|
||||||
|
private AntdUI.Panel panelNums;
|
||||||
|
private DataGridView dgvCamreaNums;
|
||||||
|
private TableLayoutPanel tableLayoutNums;
|
||||||
|
private Label label1;
|
||||||
|
private Label lblTotalTime;
|
||||||
|
private Label lblUPH;
|
||||||
|
private Label label12;
|
||||||
|
private Label label7;
|
||||||
|
private Label lblOEE_Total;
|
||||||
|
private Label lblStartTime;
|
||||||
|
private Label label10;
|
||||||
|
private DataGridView dgvProductNums;
|
||||||
|
private TableLayoutPanel tableLayoutPanel3;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,9 +22,11 @@ using System;
|
|||||||
using System.CodeDom;
|
using System.CodeDom;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@ -36,6 +38,7 @@ using static DH.Commons.Enums.EnumHelper;
|
|||||||
using Camera = DHSoftware.Models.Camera;
|
using Camera = DHSoftware.Models.Camera;
|
||||||
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
|
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
|
||||||
using ResultState = DH.Commons.Base.ResultState;
|
using ResultState = DH.Commons.Base.ResultState;
|
||||||
|
using Timer = System.Threading.Timer;
|
||||||
|
|
||||||
namespace DHSoftware
|
namespace DHSoftware
|
||||||
{
|
{
|
||||||
@ -43,6 +46,13 @@ namespace DHSoftware
|
|||||||
{
|
{
|
||||||
private Dictionary<string, List<string>> _cameraRelatedDetectionDict = null;
|
private Dictionary<string, List<string>> _cameraRelatedDetectionDict = null;
|
||||||
public event Action<LogMsg> OnLog;
|
public event Action<LogMsg> OnLog;
|
||||||
|
|
||||||
|
public List<CameraSummary> CameraSummaries { get; set; } = new List<CameraSummary>();
|
||||||
|
public List<ProductSummary> ProductSummaries = new List<ProductSummary>();
|
||||||
|
static object _productSummaryLock = new object();
|
||||||
|
public event Action<DateTime, object, string> OnUpdateResult;
|
||||||
|
public event Action<DateTime, object, string> OnUpdateCamResult;
|
||||||
|
|
||||||
private string _loginName;
|
private string _loginName;
|
||||||
|
|
||||||
public string LoginName
|
public string LoginName
|
||||||
@ -173,8 +183,7 @@ namespace DHSoftware
|
|||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
//refreshTimer.Start();
|
||||||
//refreshTimer.Start();
|
|
||||||
//初始化数据
|
//初始化数据
|
||||||
InitData();
|
InitData();
|
||||||
//绑定事件
|
//绑定事件
|
||||||
@ -185,6 +194,317 @@ namespace DHSoftware
|
|||||||
//userControlFrm.Dock = DockStyle.Fill;
|
//userControlFrm.Dock = DockStyle.Fill;
|
||||||
//tabPage2.Controls.Add(userControlFrm);
|
//tabPage2.Controls.Add(userControlFrm);
|
||||||
}
|
}
|
||||||
|
//#region OEE
|
||||||
|
// public event Action<RunState> OnProcessRunStateChanged;
|
||||||
|
#region INotifyPropertyChanged
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
public virtual void Set<T>(ref T field, T newValue, [CallerMemberName] string propName = null)
|
||||||
|
{
|
||||||
|
if (!field.Equals(newValue))
|
||||||
|
{
|
||||||
|
field = newValue;
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region Properties
|
||||||
|
private int uph = 0;
|
||||||
|
private int upm = 0;
|
||||||
|
|
||||||
|
private DateTime? startTime = null;
|
||||||
|
private TimeSpan runTime = new TimeSpan();
|
||||||
|
private TimeSpan idleTime = new TimeSpan();
|
||||||
|
private TimeSpan downTime = new TimeSpan();
|
||||||
|
private TimeSpan totalTime = new TimeSpan();
|
||||||
|
private int qty_OEE = 0;
|
||||||
|
private int qty_OEE_OK = 0;
|
||||||
|
private float oee = 0;
|
||||||
|
|
||||||
|
public int UPH
|
||||||
|
{
|
||||||
|
get => uph;
|
||||||
|
set => Set(ref uph, value);
|
||||||
|
}
|
||||||
|
public int UPM
|
||||||
|
{
|
||||||
|
get => upm;
|
||||||
|
set => Set(ref upm, value);
|
||||||
|
}
|
||||||
|
public DateTime? StartTime
|
||||||
|
{
|
||||||
|
get => startTime;
|
||||||
|
set => Set(ref startTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 有效运行时间
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan RunTime
|
||||||
|
{
|
||||||
|
get => runTime;
|
||||||
|
set => Set(ref runTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 空闲待机时间
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan IdleTime
|
||||||
|
{
|
||||||
|
get => idleTime;
|
||||||
|
set => Set(ref idleTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 故障宕机时间
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan DownTime
|
||||||
|
{
|
||||||
|
get => downTime;
|
||||||
|
set => Set(ref downTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 总开机时间
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan TotalTime
|
||||||
|
{
|
||||||
|
get => totalTime;
|
||||||
|
set => Set(ref totalTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float OEE
|
||||||
|
{
|
||||||
|
get => oee;
|
||||||
|
set => Set(ref oee, value);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
#region Timer
|
||||||
|
System.Threading.Timer _runTimer = null;
|
||||||
|
System.Threading.Timer _idleTimer = null;
|
||||||
|
System.Threading.Timer _downTimer = null;
|
||||||
|
System.Threading.Timer _checkIdleTimer = null;
|
||||||
|
//System.Threading.Timer _calculateTimer = null;
|
||||||
|
|
||||||
|
private RunState? currentState = null;
|
||||||
|
public RunState? CurrentState
|
||||||
|
{
|
||||||
|
get => currentState;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
if (value.Value == RunState.Running)
|
||||||
|
{
|
||||||
|
_checkIdleTimer?.Change(10 * 1000, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentState != value.Value)
|
||||||
|
{
|
||||||
|
switch (currentState)
|
||||||
|
{
|
||||||
|
case RunState.Idle:
|
||||||
|
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, false);
|
||||||
|
break;
|
||||||
|
case RunState.Down:
|
||||||
|
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (value.Value)
|
||||||
|
{
|
||||||
|
case RunState.Stop:
|
||||||
|
_runTimer?.Change(-1, -1);
|
||||||
|
_idleTimer?.Change(-1, -1);
|
||||||
|
_downTimer?.Change(-1, -1);
|
||||||
|
break;
|
||||||
|
case RunState.Running:
|
||||||
|
_idleTimer?.Change(-1, -1);
|
||||||
|
_downTimer?.Change(-1, -1);
|
||||||
|
_runTimer?.Change(0, 1000);
|
||||||
|
break;
|
||||||
|
case RunState.Idle:
|
||||||
|
_runTimer?.Change(-1, -1);
|
||||||
|
_downTimer?.Change(-1, -1);
|
||||||
|
_idleTimer?.Change(0, 1000);
|
||||||
|
|
||||||
|
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, true);
|
||||||
|
break;
|
||||||
|
case RunState.Down:
|
||||||
|
_idleTimer?.Change(-1, -1);
|
||||||
|
_runTimer?.Change(-1, -1);
|
||||||
|
_downTimer?.Change(0, 1000);
|
||||||
|
|
||||||
|
//AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentState = value;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CheckIdleTimeStart(object state)
|
||||||
|
{
|
||||||
|
if (CurrentState == RunState.Running)
|
||||||
|
{
|
||||||
|
RunTime = RunTime.Add(new TimeSpan(0, 0, 0 - 10));
|
||||||
|
IdleTime = IdleTime.Add(new TimeSpan(0, 0, 10));
|
||||||
|
|
||||||
|
CurrentState = RunState.Idle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitialOEEStatistic()
|
||||||
|
{
|
||||||
|
InitialStatisticTimers();
|
||||||
|
ResetOEETimeDistribute();
|
||||||
|
ResetProductSummaries();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResetProductSummaries()
|
||||||
|
{
|
||||||
|
ProductSummaries = new List<ProductSummary>();
|
||||||
|
}
|
||||||
|
private void InitialStatisticTimers()
|
||||||
|
{
|
||||||
|
if (_checkIdleTimer == null)
|
||||||
|
{
|
||||||
|
_checkIdleTimer = new Timer(new TimerCallback(CheckIdleTimeStart), null, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_runTimer == null)
|
||||||
|
{
|
||||||
|
_runTimer = new System.Threading.Timer(RunTimerCallBack, null, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_idleTimer == null)
|
||||||
|
{
|
||||||
|
_idleTimer = new System.Threading.Timer(IdleTimerCallBack, null, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_downTimer == null)
|
||||||
|
{
|
||||||
|
_downTimer = new System.Threading.Timer(DownTimerCallBack, null, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
StartTime = DateTime.Now;
|
||||||
|
DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0);
|
||||||
|
CurrentState = RunState.Running;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DownTimerCallBack(object state)
|
||||||
|
{
|
||||||
|
DownTime = DownTime.Add(new TimeSpan(0, 0, 1));
|
||||||
|
GetTotalTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void IdleTimerCallBack(object state)
|
||||||
|
{
|
||||||
|
IdleTime = IdleTime.Add(new TimeSpan(0, 0, 1));
|
||||||
|
GetTotalTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunTimerCallBack(object state)
|
||||||
|
{
|
||||||
|
RunTime = RunTime.Add(new TimeSpan(0, 0, 1));
|
||||||
|
GetTotalTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetTotalTime()
|
||||||
|
{
|
||||||
|
TotalTime = RunTime + IdleTime + DownTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResetOEETimeDistribute()
|
||||||
|
{
|
||||||
|
StartTime = DateTime.Now;
|
||||||
|
DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0);
|
||||||
|
|
||||||
|
ProductNum_Total = ProductNum_OK = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CloseStatisticTimers()
|
||||||
|
{
|
||||||
|
CloseTimer(ref _checkIdleTimer);
|
||||||
|
CloseTimer(ref _runTimer);
|
||||||
|
CloseTimer(ref _idleTimer);
|
||||||
|
CloseTimer(ref _downTimer);
|
||||||
|
|
||||||
|
CurrentState = RunState.Stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseTimer(ref System.Threading.Timer timer)
|
||||||
|
{
|
||||||
|
timer?.Change(-1, -1);
|
||||||
|
timer?.Dispose();
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region CameraSum
|
||||||
|
private void InitialCameraSumsView()
|
||||||
|
{
|
||||||
|
dgvProductNums.AutoGenerateColumns = false;
|
||||||
|
|
||||||
|
dgvProductNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
|
||||||
|
|
||||||
|
dgvProductNums.DataSource = null;
|
||||||
|
dgvProductNums.DataSource = ProductSummaries;
|
||||||
|
|
||||||
|
|
||||||
|
dgvCamreaNums.AutoGenerateColumns = false;
|
||||||
|
|
||||||
|
dgvCamreaNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World);
|
||||||
|
|
||||||
|
dgvCamreaNums.DataSource = null;
|
||||||
|
dgvCamreaNums.Columns.Clear();
|
||||||
|
|
||||||
|
// 添加 CCD 列
|
||||||
|
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
HeaderText = "CCD",
|
||||||
|
DataPropertyName = "CameraName"
|
||||||
|
});
|
||||||
|
|
||||||
|
// 添加 合格 列
|
||||||
|
var okColumn = new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
HeaderText = "合格",
|
||||||
|
DataPropertyName = "OKCount"
|
||||||
|
};
|
||||||
|
okColumn.DefaultCellStyle.ForeColor = Color.LightGreen; // 设置背景为绿色
|
||||||
|
dgvCamreaNums.Columns.Add(okColumn);
|
||||||
|
|
||||||
|
// 添加 不合格 列
|
||||||
|
var ngColumn = new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
HeaderText = "不合格",
|
||||||
|
DataPropertyName = "NGCount"
|
||||||
|
};
|
||||||
|
ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色
|
||||||
|
dgvCamreaNums.Columns.Add(ngColumn);
|
||||||
|
|
||||||
|
// 添加 总数 列
|
||||||
|
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
HeaderText = "总数",
|
||||||
|
DataPropertyName = "TotalCount"
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// 添加 良率 列
|
||||||
|
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
HeaderText = "良率",
|
||||||
|
DataPropertyName = "YieldStr"
|
||||||
|
});
|
||||||
|
|
||||||
|
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 窗体对象实例
|
/// 窗体对象实例
|
||||||
@ -271,7 +591,7 @@ namespace DHSoftware
|
|||||||
cam.CameraName = cameraBase.CameraName;
|
cam.CameraName = cameraBase.CameraName;
|
||||||
cam.CameraIP = cameraBase.CameraIP;
|
cam.CameraIP = cameraBase.CameraIP;
|
||||||
cam.IsEnabled = cameraBase.IsEnabled;
|
cam.IsEnabled = cameraBase.IsEnabled;
|
||||||
cam.ImageSaveDirectory = "D://Cam1//";
|
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName);
|
||||||
Cameras.Add(cam);
|
Cameras.Add(cam);
|
||||||
if(cameraBase.IsEnabled)
|
if(cameraBase.IsEnabled)
|
||||||
{
|
{
|
||||||
@ -290,7 +610,7 @@ namespace DHSoftware
|
|||||||
cam.IsEnabled = cameraBase.IsEnabled;
|
cam.IsEnabled = cameraBase.IsEnabled;
|
||||||
HKCameras.Add(cam);
|
HKCameras.Add(cam);
|
||||||
// cam.CameraConnect();
|
// cam.CameraConnect();
|
||||||
cam.OnHImageOutput += OnCameraHImageOutput;
|
//cam.OnHImageOutput += OnCameraHImageOutput;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -336,6 +656,7 @@ namespace DHSoftware
|
|||||||
detectionConfig.ModelHeight = detection.ModelHeight;
|
detectionConfig.ModelHeight = detection.ModelHeight;
|
||||||
detectionConfig.In_lable_path = detection.In_lable_path;
|
detectionConfig.In_lable_path = detection.In_lable_path;
|
||||||
detectionConfig.IsEnabled = detection.IsEnabled;
|
detectionConfig.IsEnabled = detection.IsEnabled;
|
||||||
|
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
|
||||||
|
|
||||||
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5;
|
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5;
|
||||||
// detectionConfig.ShowLocation.X = detection.ShowLocation.X;
|
// detectionConfig.ShowLocation.X = detection.ShowLocation.X;
|
||||||
@ -371,6 +692,8 @@ namespace DHSoftware
|
|||||||
//
|
//
|
||||||
_visionEngine = new SimboVisionDriver();
|
_visionEngine = new SimboVisionDriver();
|
||||||
_visionEngine.DetectionConfigs = DetectionConfigs;
|
_visionEngine.DetectionConfigs = DetectionConfigs;
|
||||||
|
_visionEngine.LoggerHelper .LogPath = "D://PROJECTS//Logs//";
|
||||||
|
_visionEngine.LoggerHelper.LogPrefix = "Vision";
|
||||||
_visionEngine.OnLog += _visionEngine_OnLog;
|
_visionEngine.OnLog += _visionEngine_OnLog;
|
||||||
//初始化模型 加载模型
|
//初始化模型 加载模型
|
||||||
_visionEngine.Init();
|
_visionEngine.Init();
|
||||||
@ -383,7 +706,7 @@ namespace DHSoftware
|
|||||||
|
|
||||||
private void _visionEngine_OnLog(LogMsg msg)
|
private void _visionEngine_OnLog(LogMsg msg)
|
||||||
{
|
{
|
||||||
OnLog?.Invoke(msg);
|
//OnLog?.Invoke(msg);
|
||||||
LogDisplay(msg);
|
LogDisplay(msg);
|
||||||
}
|
}
|
||||||
private void LogDisplay(LogMsg msg)
|
private void LogDisplay(LogMsg msg)
|
||||||
@ -416,15 +739,77 @@ namespace DHSoftware
|
|||||||
LogAsync(new LogMsg(dt, logLevel, msg));
|
LogAsync(new LogMsg(dt, logLevel, msg));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
System.Windows.Forms.Timer _refreshUITimer = new System.Windows.Forms.Timer();
|
||||||
private void BindEventHandler()
|
private void BindEventHandler()
|
||||||
{
|
{
|
||||||
btnAddProject.Click += BtnAddProject_Click;
|
btnAddProject.Click += BtnAddProject_Click;
|
||||||
btnDeleteProject.Click += BtnDeleteProject_Click;
|
btnDeleteProject.Click += BtnDeleteProject_Click;
|
||||||
btnLoadProject.Click += BtnLoadProject_Click;
|
btnLoadProject.Click += BtnLoadProject_Click;
|
||||||
LoggerHelper.LogPath = "D://";
|
LoggerHelper.LogPath = "D://PROJECTS//Logs//";
|
||||||
LoggerHelper.LogPrefix = "Process";
|
LoggerHelper.LogPrefix = "Process";
|
||||||
OnLog -= LogDisplay;
|
OnLog -= LogDisplay;
|
||||||
OnLog += LogDisplay;
|
OnLog += LogDisplay;
|
||||||
|
|
||||||
|
OnUpdateCamResult -= UpdateCamResult;
|
||||||
|
|
||||||
|
OnUpdateCamResult += UpdateCamResult;
|
||||||
|
OnUpdateResult -= UpdateResult;
|
||||||
|
OnUpdateResult += UpdateResult;
|
||||||
|
Load += (s, e) =>
|
||||||
|
{
|
||||||
|
_refreshUITimer.Interval = 1000;
|
||||||
|
_refreshUITimer.Tick += _refreshUITimer_Tick;
|
||||||
|
_refreshUITimer.Enabled = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
private void _refreshUITimer_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_refreshUITimer.Enabled = false;
|
||||||
|
|
||||||
|
if (this != null)
|
||||||
|
{
|
||||||
|
lblStartTime.Text = StartTime == null ? "" : StartTime.Value.ToString("yyyy/MM/dd HH:mm:ss");
|
||||||
|
lblTotalTime.Text = TotalTime.ToString(); // 运行时间
|
||||||
|
// lblRunTime.Text = RunTime.ToString(); // 有效时间
|
||||||
|
// lblIdleTime.Text = ProcessControl.IdleTime.ToString(); // 空闲时间
|
||||||
|
// lblDownTime.Text = ProcessControl.DownTime.ToString(); // 宕机时间
|
||||||
|
|
||||||
|
lblOEE_Total.Text = ProductNum_Total.ToString();
|
||||||
|
// lblOEE_OK.Text = ProcessControl.ProductNum_OK.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
_refreshUITimer.Enabled = true;
|
||||||
|
}
|
||||||
|
private void UpdateCamResult(DateTime updateTime, object objData, string customMessage)
|
||||||
|
{
|
||||||
|
this.Invoke(new Action(() =>
|
||||||
|
{
|
||||||
|
|
||||||
|
BindingList<CameraSummary> cameraSummaries = new BindingList<CameraSummary>(CameraSummaries);
|
||||||
|
dgvCamreaNums.DataSource = cameraSummaries;
|
||||||
|
|
||||||
|
}));
|
||||||
|
|
||||||
|
}
|
||||||
|
private void UpdateResult(DateTime updateTime, object objData, string result)
|
||||||
|
{
|
||||||
|
this.Invoke(new Action(() =>
|
||||||
|
{
|
||||||
|
|
||||||
|
dgvProductNums.DataSource = new BindingList<ProductSummary>(ProductSummaries);
|
||||||
|
|
||||||
|
//if (dgvProductNums.Rows.Count > 0)
|
||||||
|
//{
|
||||||
|
// dgvProductNums.Height = dgvProductNums.Rows[0].Height * dgvProductNums.Rows.Count + 15;
|
||||||
|
//}
|
||||||
|
//else
|
||||||
|
//{
|
||||||
|
// dgvProductNums.Height = 35;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//lblOEE_Rate.Text = ProcessControl.OEE.ToString("f2") + " %";
|
||||||
|
lblUPH.Text = UPH.ToString();
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BtnDeleteProject_Click(object? sender, EventArgs e)
|
private void BtnDeleteProject_Click(object? sender, EventArgs e)
|
||||||
@ -637,6 +1022,7 @@ namespace DHSoftware
|
|||||||
|
|
||||||
private void HandleStartButton()
|
private void HandleStartButton()
|
||||||
{
|
{
|
||||||
|
InitialCameraSumsView();
|
||||||
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
|
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
|
||||||
StartProcess();
|
StartProcess();
|
||||||
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
|
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
|
||||||
@ -647,7 +1033,7 @@ namespace DHSoftware
|
|||||||
private void StartProcess()
|
private void StartProcess()
|
||||||
{
|
{
|
||||||
ProcessstartTime = DateTime.Now;
|
ProcessstartTime = DateTime.Now;
|
||||||
lblstarttime2.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
|
lblStartTime.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
|
||||||
//计数清零
|
//计数清零
|
||||||
PieceCount = 0;
|
PieceCount = 0;
|
||||||
|
|
||||||
@ -753,7 +1139,7 @@ namespace DHSoftware
|
|||||||
|
|
||||||
//流程执行时PLC
|
//流程执行时PLC
|
||||||
PLC.StartProcess();
|
PLC.StartProcess();
|
||||||
|
InitialOEEStatistic();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -814,7 +1200,7 @@ namespace DHSoftware
|
|||||||
/// <param name="dt"></param>
|
/// <param name="dt"></param>
|
||||||
/// <param name="camera"></param>
|
/// <param name="camera"></param>
|
||||||
/// <param name="imageSet"></param>
|
/// <param name="imageSet"></param>
|
||||||
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, Mat imageSet)
|
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet)
|
||||||
{
|
{
|
||||||
//if (camera.CameraName.Equals("cam1", StringComparison.OrdinalIgnoreCase))
|
//if (camera.CameraName.Equals("cam1", StringComparison.OrdinalIgnoreCase))
|
||||||
//{
|
//{
|
||||||
@ -830,7 +1216,7 @@ namespace DHSoftware
|
|||||||
|
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
using (Mat localImageSet = imageSet.Clone()) // 复制 Mat 避免并发问题
|
//using (Mat localImageSet = imageSet._mat.Clone()) // 复制 Mat 避免并发问题
|
||||||
{
|
{
|
||||||
// imageSet?.Dispose();
|
// imageSet?.Dispose();
|
||||||
// 拍照计数与物件编号一致,查找对应的产品
|
// 拍照计数与物件编号一致,查找对应的产品
|
||||||
@ -869,16 +1255,16 @@ namespace DHSoftware
|
|||||||
}
|
}
|
||||||
|
|
||||||
//LogAsync(DateTime.Now, LogLevel.Error, $"{camera.Name} 未找到产品,编号:{productNumber},队列{index}数量:{tmpDic.Count},列表:{pnStr}");
|
//LogAsync(DateTime.Now, LogLevel.Error, $"{camera.Name} 未找到产品,编号:{productNumber},队列{index}数量:{tmpDic.Count},列表:{pnStr}");
|
||||||
localImageSet.Dispose();
|
imageSet.Dispose();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 找到产品{productNumber},队列{index}数量:{tmpDic.Count}");
|
LogAsync(DateTime.Now, LogLevel.Information, $"{camera.CameraName} 找到产品{productNumber},队列{index}数量:{tmpDic.Count}");
|
||||||
|
|
||||||
if (!_cameraRelatedDetectionDict.ContainsKey(camera.CameraName))
|
if (!_cameraRelatedDetectionDict.ContainsKey(camera.CameraName))
|
||||||
{
|
{
|
||||||
localImageSet.Dispose();
|
imageSet.Dispose();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -895,11 +1281,11 @@ namespace DHSoftware
|
|||||||
for (int i = 0; i < detectionDict.Count; i++)
|
for (int i = 0; i < detectionDict.Count; i++)
|
||||||
{
|
{
|
||||||
string detectionId = detectionDict[i];
|
string detectionId = detectionDict[i];
|
||||||
|
var tmpImgSet = camera.CopyImageSet(imageSet as MatSet);
|
||||||
|
//imageSet
|
||||||
using (Mat inferenceImage = localImageSet.Clone()) // 仅在此处克隆,确保推理过程中 Mat 有独立副本
|
// using (Mat inferenceImage = localImageSet.Clone()) // 仅在此处克隆,确保推理过程中 Mat 有独立副本
|
||||||
{
|
{
|
||||||
DetectStationResult temp1 = _visionEngine.RunInference(inferenceImage, detectionId);
|
DetectStationResult temp1 = _visionEngine.RunInference(tmpImgSet, detectionId);
|
||||||
|
|
||||||
resultStates.Add(temp1.ResultState);
|
resultStates.Add(temp1.ResultState);
|
||||||
|
|
||||||
@ -907,7 +1293,9 @@ namespace DHSoftware
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stopwatch.Stop();
|
stopwatch.Stop();
|
||||||
|
if (product.ResultCollection.Count != 0)
|
||||||
|
UpdateResultoverride(dt, camera, resultStates, totalTime, _cameraRelatedDetectionDict.Keys.Count);
|
||||||
|
|
||||||
product.InferenceOne();
|
product.InferenceOne();
|
||||||
|
|
||||||
// LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 推理完成,产品{productNumber}");
|
// LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 推理完成,产品{productNumber}");
|
||||||
@ -916,24 +1304,32 @@ namespace DHSoftware
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
UpdateResult(DateTime.Now, null, product.ProductResult.GetEnumDescription());
|
|
||||||
|
|
||||||
|
|
||||||
#region 6. 统计产品结果
|
#region 6. 统计产品结果
|
||||||
|
|
||||||
product.ProductResult = product.ResultCollection.Any(u => u.ResultState != ResultState.OK)
|
product.ProductResult = product.ResultCollection.Any(u => u.ResultState != ResultState.OK)
|
||||||
? ResultState.B_NG
|
? ResultState.B_NG
|
||||||
: ResultState.OK;
|
: ResultState.OK;
|
||||||
//if (product.ProductResult == ResultState.OK)
|
|
||||||
//{
|
|
||||||
// PLC.Blowing(productNumber, 1);
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
//{
|
|
||||||
// PLC.Blowing(productNumber, 2);
|
|
||||||
//}
|
|
||||||
product.ProductLabelCategory = product.ProductResult.GetEnumDescription();
|
product.ProductLabelCategory = product.ProductResult.GetEnumDescription();
|
||||||
product.ProductLabel = product.ProductResult.GetEnumDescription();
|
product.ProductLabel = product.ProductResult.GetEnumDescription();
|
||||||
|
UpdateResultPro(DateTime.Now, null, product.ProductResult.GetEnumDescription());
|
||||||
|
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Information, $"产品{product.PieceNumber}获取结果:{product.ProductResult} {(product.IsA2B ? "产品IsA2B" : "")}");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (product.ProductResult == ResultState.OK)
|
||||||
|
{
|
||||||
|
PLC.Blowing(productNumber, 1);
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Action, $"产品{product.PieceNumber}PLC,OK吹气");
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PLC.Blowing(productNumber, 2);
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Action, $"产品{product.PieceNumber}PLC,NG吹气");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion 6. 统计产品结果
|
#endregion 6. 统计产品结果
|
||||||
|
|
||||||
@ -985,10 +1381,7 @@ namespace DHSoftware
|
|||||||
}));
|
}));
|
||||||
//重新生成实例 销毁之前的实例
|
//重新生成实例 销毁之前的实例
|
||||||
var saveData = temp.GetProductData();
|
var saveData = temp.GetProductData();
|
||||||
using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8))
|
|
||||||
{
|
|
||||||
sw.WriteLine(logStr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
finally
|
finally
|
||||||
@ -1010,19 +1403,116 @@ namespace DHSoftware
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
public virtual void AddOKProduct(string resultStr)
|
||||||
public async Task UpdateResult(DateTime dt, object objData, string resultStr)
|
|
||||||
{
|
{
|
||||||
// CurrentState = RunState.Running;
|
if (resultStr.ToLower() == "ok")
|
||||||
|
{
|
||||||
|
ProductNum_OK++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async Task UpdateResultoverride(DateTime dt, CameraBase objData, List<ResultState> resultStr, double total, int _cameraDictCount)
|
||||||
|
{
|
||||||
|
// CurrentState = RunState.Running;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 根据相机名称找到对应的信息(假设有一个字典或其他集合保存相机相关信息)
|
||||||
|
var cameraName = objData?.CameraName; // 假设 CameraBase 有 Name 属性
|
||||||
|
if (string.IsNullOrEmpty(cameraName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("相机名称不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
lock (_cameraSummaryLock)
|
||||||
|
{
|
||||||
|
// 查找或添加相机统计项
|
||||||
|
var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == cameraName)
|
||||||
|
?? new CameraSummary { CameraName = cameraName };
|
||||||
|
|
||||||
|
if (!CameraSummaries.Contains(summary))
|
||||||
|
{
|
||||||
|
CameraSummaries.Add(summary);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resultStr.Any(u => u.ToString().ToLower() == "ok"))
|
||||||
|
{
|
||||||
|
summary.OKCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /*if (resultStr.Equals("TBD", StringComparison.OrdinalIgnoreCase))*/
|
||||||
|
{
|
||||||
|
summary.NGCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
OnUpdateCamResult?.Invoke(dt, objData, "");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateResultPro(DateTime dt, object objData, string resultStr)
|
||||||
|
{
|
||||||
|
CurrentState = RunState.Running;
|
||||||
|
|
||||||
ProductNum_Total++;
|
ProductNum_Total++;
|
||||||
//AddOKProduct(resultStr);
|
AddOKProduct(resultStr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
lock (_productSummaryLock)
|
||||||
|
{
|
||||||
|
var product = ProductSummaries.FirstOrDefault(u => u.ResultDesc == resultStr);
|
||||||
|
if (product != null)
|
||||||
|
{
|
||||||
|
product.ProductAmount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
product = new ProductSummary();
|
||||||
|
product.ResultDesc = resultStr;
|
||||||
|
product.ProductAmount = 1;
|
||||||
|
|
||||||
|
ProductSummaries.Add(product);
|
||||||
|
}
|
||||||
|
|
||||||
|
int totalNum = ProductSummaries.Sum(p => p.ProductAmount);
|
||||||
|
ProductSummaries.ForEach(p => p.PercentStr = ((double)p.ProductAmount * 100.0 / totalNum).ToString("f2") + " %");
|
||||||
|
}
|
||||||
|
|
||||||
CalculateOEE();
|
CalculateOEE();
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
OnUpdateResult?.Invoke(dt, objData, resultStr);
|
||||||
|
});
|
||||||
|
lock (_cameraSummaryLock)
|
||||||
|
{
|
||||||
|
// 查找或添加相机统计项
|
||||||
|
var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == "合计")
|
||||||
|
?? new CameraSummary { CameraName = "合计" };
|
||||||
|
|
||||||
|
summary.OKCount = ProductNum_OK;
|
||||||
|
summary.NGCount = ProductNum_Total - ProductNum_OK;
|
||||||
|
if (!CameraSummaries.Contains(summary))
|
||||||
|
{
|
||||||
|
CameraSummaries.Add(summary);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
OnUpdateCamResult?.Invoke(dt, objData, "合计");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleStopButton()
|
private void HandleStopButton()
|
||||||
@ -1035,21 +1525,33 @@ namespace DHSoftware
|
|||||||
//sLDMotion.Stop();
|
//sLDMotion.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int UPH = 0;
|
|
||||||
|
|
||||||
public void CalculateOEE()
|
public void CalculateOEE()
|
||||||
{
|
{
|
||||||
TimeSpan timeSpan = DateTime.Now - ProcessstartTime;
|
if (TotalTime.TotalHours == 0)
|
||||||
|
|
||||||
UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100;
|
|
||||||
//UPM = (int)UPH / 60;
|
|
||||||
this.BeginInvoke(new MethodInvoker(delegate ()
|
|
||||||
{
|
{
|
||||||
lblNowtime2.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
UPH = 0;
|
||||||
lblUPH2.Text = UPH.ToString();
|
UPM = 0;
|
||||||
lblNum2.Text = ProductNum_Total.ToString();
|
}
|
||||||
labuph.Text = UPH.ToString();
|
else
|
||||||
}));
|
{
|
||||||
|
UPH = (int)(ProductNum_Total / RunTime.TotalHours) + 100;
|
||||||
|
UPM = (int)UPH / 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//TimeSpan timeSpan = DateTime.Now - ProcessstartTime;
|
||||||
|
|
||||||
|
//UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100;
|
||||||
|
////UPM = (int)UPH / 60;
|
||||||
|
//this.BeginInvoke(new MethodInvoker(delegate ()
|
||||||
|
//{
|
||||||
|
// lblNowtime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||||
|
// lblUPH.Text = UPH.ToString();
|
||||||
|
// lblNum.Text = ProductNum_Total.ToString();
|
||||||
|
|
||||||
|
//}));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleResetButton()
|
private void HandleResetButton()
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
<!--
|
<!--
|
||||||
Microsoft ResX Schema
|
Microsoft ResX Schema
|
||||||
|
|
||||||
Version 2.0
|
Version 2.0
|
||||||
|
|
||||||
@ -48,7 +48,7 @@
|
|||||||
value : The object must be serialized with
|
value : The object must be serialized with
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
value : The object must be serialized with
|
value : The object must be serialized with
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
Reference in New Issue
Block a user