14 Commits

Author SHA1 Message Date
bb943740da 数据统计线程保护
设置删除工位失效bug
2025-04-30 09:21:06 +08:00
71bbea56a7 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-29 15:23:37 +08:00
6c1d86619e har error 和日志更新 2025-04-29 15:22:54 +08:00
1a84519874 Merge branch 'KM' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into KM 2025-04-28 15:38:34 +08:00
4e75b0d4da 将相机设置页面的数字框改为文本框,防止出现滚动中键数值变动的情况 2025-04-28 15:38:27 +08:00
95bc9ce3b3 提交 2025-04-28 11:30:29 +08:00
bc0ed5d574 相机格式更改 2025-04-28 09:44:35 +08:00
6a9e7e4343 更新GPU 2025-04-27 10:40:12 +08:00
f12c2f0cd9 软件ico提交 2025-04-27 10:21:45 +08:00
8e2197f46e 提交图片保存路径 2025-04-27 09:48:48 +08:00
ed53c8e5db 1.三色灯提交
2.设置重命名时带出之前名称
2025-04-27 09:26:18 +08:00
b749eb4266 提交设备状态 2025-04-25 09:03:47 +08:00
ae5c1122ed 提交 2025-04-24 16:21:10 +08:00
6973d39cad 提交bug 2025-04-24 15:45:01 +08:00
32 changed files with 1242 additions and 1001 deletions

View File

@ -3,6 +3,7 @@ using System.ComponentModel;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using AntdUI; using AntdUI;
using DH.Commons.Enums; using DH.Commons.Enums;
using DVPCameraType;
using HalconDotNet; using HalconDotNet;
using OpenCvSharp; using OpenCvSharp;
@ -47,11 +48,13 @@ namespace DH.Commons.Base
// 私有字段 + 带通知的属性与DetectionLabel风格一致 // 私有字段 + 带通知的属性与DetectionLabel风格一致
private bool _isEnabled = false; private bool _isEnabled = false;
private bool _isallPicEnabled = true;//默认全画幅 private bool _isallPicEnabled = true;//默认全画幅
private bool _isRGBEnabled = true;//默认彩色
private bool _isContinueMode = false; private bool _isContinueMode = false;
private bool _isSavePicEnabled = false; private bool _isSavePicEnabled = false;
private bool _isZoomCamera = false; private bool _isZoomCamera = false;
private string _imageSaveDirectory; private string _imageSaveDirectory;
private EnumCamType _CamType; private EnumCamType _CamType;
private dvpStreamFormat _dvpstreamFormat = dvpStreamFormat.S_RGB24;
private ImageFormat _imageFormat = ImageFormat.Jpeg; private ImageFormat _imageFormat = ImageFormat.Jpeg;
private bool _isHardwareTrigger = true; private bool _isHardwareTrigger = true;
private string _serialNumber = string.Empty; private string _serialNumber = string.Empty;
@ -71,6 +74,20 @@ namespace DH.Commons.Base
public volatile int SnapshotCount = 0; public volatile int SnapshotCount = 0;
[Category("相机设置")]
[DisplayName("图像格式")]
[Description("相机采集图像格式")]
public dvpStreamFormat DvpImageFormat
{
get => _dvpstreamFormat;
set
{
if (_dvpstreamFormat == value) return;
_dvpstreamFormat = value;
OnPropertyChanged(nameof(DvpImageFormat));
}
}
[Category("采图模式")] [Category("采图模式")]
[DisplayName("连续模式")] [DisplayName("连续模式")]
[Description("是否连续模式。true连续模式采图false触发模式采图")] [Description("是否连续模式。true连续模式采图false触发模式采图")]

View File

@ -11,6 +11,9 @@ namespace DH.Commons.Base
{ {
public class GlobalConfig : NotifyProperty public class GlobalConfig : NotifyProperty
{ {
bool _EnableVibrator=false;
bool _EnableBelt = false;
int _ClearTime=0;
string _name; string _name;
private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>(); private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>(); private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>();
@ -29,7 +32,42 @@ namespace DH.Commons.Base
} }
} }
} }
public bool EnableBelt
{
get => _EnableBelt;
set
{
if (_EnableBelt != value)
{
_EnableBelt = value;
OnPropertyChanged(nameof(EnableBelt));
}
}
}
public bool EnableVibrator
{
get => _EnableVibrator;
set
{
if (_EnableVibrator != value)
{
_EnableVibrator = value;
OnPropertyChanged(nameof(EnableVibrator));
}
}
}
public int ClearTime
{
get => _ClearTime;
set
{
if (_ClearTime != value)
{
_ClearTime = value;
OnPropertyChanged(nameof(ClearTime));
}
}
}
public BindingList<PLCItem> InitProcessList public BindingList<PLCItem> InitProcessList
{ {
get => _InitProcessList; get => _InitProcessList;

View File

@ -27,6 +27,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="DVPCameraCS64">
<HintPath>..\X64\Debug\DVPCameraCS64.dll</HintPath>
</Reference>
<Reference Include="halcondotnet"> <Reference Include="halcondotnet">
<HintPath>..\x64\Debug\halcondotnet.dll</HintPath> <HintPath>..\x64\Debug\halcondotnet.dll</HintPath>
</Reference> </Reference>

View File

@ -9,8 +9,9 @@ namespace DH.Commons.Enums
{ {
public enum EnumStatus public enum EnumStatus
{ {
, ,
, ,
,
, ,
} }

View File

@ -18,7 +18,7 @@ namespace DH.Commons.Models
/// <summary> /// <summary>
/// 当前状态 /// 当前状态
/// </summary> /// </summary>
public static EnumStatus CurrentStatus =EnumStatus.; public static EnumStatus CurrentStatus =EnumStatus.;
} }
/// <summary> /// <summary>

View File

@ -27,7 +27,7 @@ namespace DH.Devices.Camera
public bool Connected=false; public bool Connected=false;
public int m_n_dev_count = 0; public int m_n_dev_count = 0;
private DVPCamera.dvpStreamCallback ImageCallback; private DVPCamera.dvpStreamCallback ImageCallback;
public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24; // public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
public int m_CamCount = 0; public int m_CamCount = 0;
public Double m_dfDisplayCount = 0; public Double m_dfDisplayCount = 0;
@ -63,6 +63,8 @@ namespace DH.Devices.Camera
{ {
try try
{ {
if (CameraName == "Cam1")
Console.WriteLine("");
pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate); pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate);
nRet = DVPCamera.dvpOpenByUserId(CameraName, nRet = DVPCamera.dvpOpenByUserId(CameraName,
dvpOpenMode.OPEN_NORMAL, dvpOpenMode.OPEN_NORMAL,
@ -74,7 +76,7 @@ namespace DH.Devices.Camera
throw new Exception($"Create device failed:{nRet:x8}"); throw new Exception($"Create device failed:{nRet:x8}");
} }
nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)dvpStreamFormat); nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)DvpImageFormat);
if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
{ {
throw new Exception($"Set image format failed:{nRet:x8}"); throw new Exception($"Set image format failed:{nRet:x8}");
@ -156,7 +158,10 @@ namespace DH.Devices.Camera
} }
//全画幅 //全画幅
if (!IsAllPicEnabled) if (!IsAllPicEnabled)
{
SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH); SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH);
}
//// 设置 触发延迟 //// 设置 触发延迟
if (TriggerDelay > 0) if (TriggerDelay > 0)

View File

@ -85,11 +85,15 @@ namespace DH.Devices.Motion
public void NewPieces(int diskIndex, uint pieceNumber) public void NewPieces(int diskIndex, uint pieceNumber)
{ {
_taskFactory.StartNew(() => Task.Run(() =>
{ {
Thread.CurrentThread.Priority = ThreadPriority.Highest; try {
Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(diskIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
OnNewPieces?.Invoke(diskIndex, pieceNumber);
}); });
} }
public void SetResetFlag(bool isReset) public void SetResetFlag(bool isReset)

View File

@ -627,11 +627,22 @@ namespace DH.Devices.PLC
public void NewPieces(int axisIndex, uint pieceNumber) public void NewPieces(int axisIndex, uint pieceNumber)
{ {
_taskFactory.StartNew(() => //_taskFactory.StartNew(() =>
{ //{
Thread.CurrentThread.Priority = ThreadPriority.Highest; // Thread.CurrentThread.Priority = ThreadPriority.Highest;
// OnNewPieces?.Invoke(axisIndex, pieceNumber);
//});
Task.Run(() =>
{
try
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
OnNewPieces?.Invoke(axisIndex, pieceNumber);
}
catch (Exception ex) { /* 记录异常 */ }
OnNewPieces?.Invoke(axisIndex, pieceNumber);
}); });
} }
public async Task HeartbeatAsync1() public async Task HeartbeatAsync1()
@ -697,14 +708,14 @@ namespace DH.Devices.PLC
//while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit) //while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit)
while (Connected) while (Connected)
{ {
Stopwatch sw = new Stopwatch(); // Stopwatch sw = new Stopwatch();
uint tmpPieceNumber = 0; uint tmpPieceNumber = 0;
sw.Start(); // sw.Start();
// var ret = TcpNet.ReadUInt16("D1016"); // var ret = TcpNet.ReadUInt16("D1016");
var ret = TcpNet.ReadUInt32(Count); var ret = TcpNet.ReadUInt32(Count);
sw.Stop(); //sw.Stop();
if (ret.IsSuccess) if (ret.IsSuccess)
{ {
tmpPieceNumber = ret.Content; tmpPieceNumber = ret.Content;
@ -712,7 +723,7 @@ namespace DH.Devices.PLC
if (ret.IsSuccess && ret.Content > piecesCount) if (ret.IsSuccess && ret.Content > piecesCount)
{ {
sw.Start(); // sw.Start();
// Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}"); // Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}");
//LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}"); //LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}");
if (tmpPieceNumber != piecesCount + 1) if (tmpPieceNumber != piecesCount + 1)
@ -724,8 +735,8 @@ namespace DH.Devices.PLC
piecesCount = tmpPieceNumber; piecesCount = tmpPieceNumber;
//NewPieces(ai, piecesCountDic[station]); //NewPieces(ai, piecesCountDic[station]);
NewPieces(1, piecesCount); NewPieces(1, piecesCount);
sw.Stop(); // sw.Stop();
startTime = DateTime.Now; // startTime = DateTime.Now;
//if (idalarm) //if (idalarm)
//{ //{
// idalarm = false; // idalarm = false;
@ -760,6 +771,12 @@ namespace DH.Devices.PLC
//LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘"); //LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘");
//转盘使能 //转盘使能
TurnEnable(true); TurnEnable(true);
RedLight(false);
YellowLight(false);
//绿灯
GreenLight(true);
LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能"); LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能");
//开启入料监听 //开启入料监听
MonitorPieces(); MonitorPieces();
@ -822,25 +839,70 @@ namespace DH.Devices.PLC
//流程开启操作配置 //流程开启操作配置
// ProcessInitialAction(); // ProcessInitialAction();
// if (_PLC?Enabled == true) // if (_PLC?Enabled == true)
//皮带
// _PLC.Belt(true);
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置"); // LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
//计数清零
CountToZero(); bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零"); if (enableBelt == true)
{
Belt(true);
}
Thread.Sleep(1000);
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
//转盘使能
TurnEnable(true);
//转盘启动 //转盘启动
TurnStart(true); TurnStart(true);
Thread.Sleep(1000);
//计数清零
CountToZero();
Thread.Sleep(1000);
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
Thread.Sleep(200);
} }
public void StopProcess() public void StopProcess()
{ {
StatusReset(); StatusReset();
VisionPos(false); VisionPos(false);
CountToZero(); CountToZero();
bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator;
if (enableVibrator == true)
{
Vibrator(true);
}
Thread.Sleep(1000);
bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
if (enableBelt == true)
{
Belt(false);
}
Thread.Sleep(1000);
StopProcessAction(); StopProcessAction();
TurnStart(false); TurnStart(false);
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
}
public async Task ExecuteClearDelayAsync()
{
int? clearTime = ConfigModel.GlobalList?.FirstOrDefault()?.ClearTime;
if (clearTime != null)
{
TurnClear(true);
await Task.Delay(clearTime.Value * 1000);
TurnClear(false);
}
} }
public void CloseProcess() public void CloseProcess()
{ {
@ -850,7 +912,11 @@ namespace DH.Devices.PLC
TurnStart(false); TurnStart(false);
TurnEnable(false); TurnEnable(false);
StopProcessAction(); StopProcessAction();
TurnClear(false);
OpenHeartbeat(false); OpenHeartbeat(false);
GreenLight(false);
YellowLight(false);
RedLight(true);
PLCDisConnect(); PLCDisConnect();
// LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接"); // LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接");
} }
@ -1014,6 +1080,25 @@ namespace DH.Devices.PLC
WriteBool(pLCItem.Address, b); WriteBool(pLCItem.Address, b);
Thread.Sleep(30); Thread.Sleep(30);
} }
public void Belt(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "皮带");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Vibrator(bool b)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "振动盘");
if (pLCItem == null)
return;
WriteBool(pLCItem.Address, b);
Thread.Sleep(30);
}
public void Motor(bool direction, int speed, int pos) public void Motor(bool direction, int speed, int pos)
{ {
@ -1143,7 +1228,13 @@ namespace DH.Devices.PLC
elapsedTime += checkInterval; elapsedTime += checkInterval;
} }
BarrierToZero(false);
Thread.Sleep(300);
// 检查是否不在原点,如果不在,则回原点
BarrierClockwise(false);
Thread.Sleep(300);
BarrierCounterclockwise(false);
Thread.Sleep(300);
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置 // 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
BarrierSpeed(speed); BarrierSpeed(speed);
Thread.Sleep(300); Thread.Sleep(300);

View File

@ -32,6 +32,10 @@ namespace DH.Devices.Vision
bool res = false; bool res = false;
try try
{ {
if (!Path.GetExtension(mLInit.ModelFile).Equals(".trt", StringComparison.OrdinalIgnoreCase))
{
throw new Exception("选择的模型不是trt格式");
}
Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8); Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8);
//Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3); //Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3);

View File

@ -32,13 +32,21 @@ namespace DH.Devices.Vision
public void Init() public void Init()
{ {
//InitialQueue(); try
InitialHalconTools(); {
InitialSimboMLEnginesAsync(); //InitialQueue();
InitialHalconTools();
InitialSimboMLEnginesAsync();
// ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised;
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
// ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised;
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init();
} }
public void Stop() public void Stop()
{ {
@ -292,9 +300,16 @@ namespace DH.Devices.Vision
/// </summary> /// </summary>
private bool InitialSimboMLEnginesAsync() private bool InitialSimboMLEnginesAsync()
{ {
//深度学习 模型加载 try
var resultOK = MLLoadModel(); {
return resultOK; //深度学习 模型加载
var resultOK = MLLoadModel();
return resultOK;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} }
/// <summary> /// <summary>
/// 深度学习 模型加载 /// 深度学习 模型加载
@ -358,6 +373,7 @@ namespace DH.Devices.Vision
{ {
// LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}"); // LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}");
resultOK = false; resultOK = false;
throw new Exception(ex.Message);
} }
return resultOK; return resultOK;
@ -409,7 +425,7 @@ namespace DH.Devices.Vision
} }
MLInit mLInit; MLInit mLInit;
string inferenceDevice = "CPU"; string inferenceDevice = "CPU";
if (dc.IsEnableGPU) if (dc.ModelType== ModelType.GPU)
{ {
inferenceDevice = "GPU"; inferenceDevice = "GPU";
mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold); mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold);
@ -432,7 +448,7 @@ namespace DH.Devices.Vision
{ {
// LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}"); // LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
throw new ProcessException($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}"); throw new Exception($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.Message}");
} }
return mLEngineSet; return mLEngineSet;
} }

View File

@ -109,9 +109,6 @@
<Compile Include="Views\Sys\User\UserPage.cs" /> <Compile Include="Views\Sys\User\UserPage.cs" />
<Compile Include="Views\Sys\User\UserPage.Designer.cs" /> <Compile Include="Views\Sys\User\UserPage.Designer.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" /> <PackageReference Include="AntdUI" Version="1.8.9" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -10,7 +10,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<ApplicationIcon>assets\favicon.ico</ApplicationIcon> <ApplicationIcon>assets\logo.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
@ -23,7 +23,8 @@
<ItemGroup> <ItemGroup>
<Content Include="assets\favicon.ico" /> <Content Include="assets\logo.ico" />
<Content Include="assets\screenshots\favicon.ico" />
<Content Include="db\config.json"> <Content Include="db\config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -93,10 +94,13 @@
<ItemGroup> <ItemGroup>
<None Include="db\db.sqlite"> <None Include="assets\favicon.ico" />
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <None Include="db\db.sqlite">
</None> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ItemGroup> <!-- 仅在首次生成时复制 -->
<Condition>!Exists('$(OutputPath)\db\db.sqlite')</Condition>
</None>
</ItemGroup>
</Project> </Project>

View File

@ -53,7 +53,6 @@
dgvCamreaNums = new DataGridView(); dgvCamreaNums = new DataGridView();
panelNums = new AntdUI.Panel(); panelNums = new AntdUI.Panel();
tableLayoutNums = new TableLayoutPanel(); tableLayoutNums = new TableLayoutPanel();
dgvProductNums = new DataGridView();
tableLayoutPanel3 = new TableLayoutPanel(); tableLayoutPanel3 = new TableLayoutPanel();
lblTotalTime = new Label(); lblTotalTime = new Label();
label1 = new Label(); label1 = new Label();
@ -63,6 +62,7 @@
lblOEE_Total = new Label(); lblOEE_Total = new Label();
label10 = new Label(); label10 = new Label();
label7 = new Label(); label7 = new Label();
tagMachineStatus = new AntdUI.Tag();
panel2 = new AntdUI.Panel(); panel2 = new AntdUI.Panel();
panel1 = new AntdUI.Panel(); panel1 = new AntdUI.Panel();
segmented2 = new AntdUI.Segmented(); segmented2 = new AntdUI.Segmented();
@ -94,7 +94,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit(); ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit();
panelNums.SuspendLayout(); panelNums.SuspendLayout();
tableLayoutNums.SuspendLayout(); tableLayoutNums.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dgvProductNums).BeginInit();
tableLayoutPanel3.SuspendLayout(); tableLayoutPanel3.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
panel3.SuspendLayout(); panel3.SuspendLayout();
@ -145,9 +144,9 @@
// tabPage3 // tabPage3
// //
tabPage3.Controls.Add(panel7); tabPage3.Controls.Add(panel7);
tabPage3.Location = new Point(3, 28); tabPage3.Location = new Point(3, 3);
tabPage3.Name = "tabPage3"; tabPage3.Name = "tabPage3";
tabPage3.Size = new Size(574, 145); tabPage3.Size = new Size(574, 170);
tabPage3.TabIndex = 0; tabPage3.TabIndex = 0;
tabPage3.Text = "日志"; tabPage3.Text = "日志";
// //
@ -156,7 +155,7 @@
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(574, 145); panel7.Size = new Size(574, 170);
panel7.TabIndex = 2; panel7.TabIndex = 2;
// //
// tabMain // tabMain
@ -296,8 +295,8 @@
// //
tableLayoutNums.ColumnCount = 1; tableLayoutNums.ColumnCount = 1;
tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableLayoutNums.Controls.Add(dgvProductNums, 0, 0);
tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1); tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1);
tableLayoutNums.Controls.Add(tagMachineStatus, 0, 0);
tableLayoutNums.Dock = DockStyle.Fill; tableLayoutNums.Dock = DockStyle.Fill;
tableLayoutNums.Location = new Point(0, 0); tableLayoutNums.Location = new Point(0, 0);
tableLayoutNums.Name = "tableLayoutNums"; tableLayoutNums.Name = "tableLayoutNums";
@ -308,31 +307,6 @@
tableLayoutNums.Size = new Size(338, 101); tableLayoutNums.Size = new Size(338, 101);
tableLayoutNums.TabIndex = 8; tableLayoutNums.TabIndex = 8;
// //
// dgvProductNums
//
dgvProductNums.AllowUserToAddRows = false;
dgvProductNums.AllowUserToDeleteRows = false;
dgvProductNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgvProductNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgvProductNums.BackgroundColor = SystemColors.Control;
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, 40);
dgvProductNums.TabIndex = 10;
//
// tableLayoutPanel3 // tableLayoutPanel3
// //
tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink; tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink;
@ -447,6 +421,16 @@
label7.Text = "总计数"; label7.Text = "总计数";
label7.TextAlign = ContentAlignment.MiddleCenter; label7.TextAlign = ContentAlignment.MiddleCenter;
// //
// tagMachineStatus
//
tagMachineStatus.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Regular, GraphicsUnit.Point, 134);
tagMachineStatus.Location = new Point(3, 3);
tagMachineStatus.Name = "tagMachineStatus";
tagMachineStatus.Size = new Size(141, 44);
tagMachineStatus.TabIndex = 12;
tagMachineStatus.Text = "待机中";
tagMachineStatus.Type = AntdUI.TTypeMini.Primary;
//
// panel2 // panel2
// //
panel2.Location = new Point(511, 86); panel2.Location = new Point(511, 86);
@ -530,7 +514,7 @@
btnCreateBatchNO.Name = "btnCreateBatchNO"; btnCreateBatchNO.Name = "btnCreateBatchNO";
btnCreateBatchNO.Size = new Size(72, 35); btnCreateBatchNO.Size = new Size(72, 35);
btnCreateBatchNO.TabIndex = 21; btnCreateBatchNO.TabIndex = 21;
btnCreateBatchNO.Tag = "sys-load"; btnCreateBatchNO.Tag = "";
btnCreateBatchNO.Text = "生成批次"; btnCreateBatchNO.Text = "生成批次";
btnCreateBatchNO.Click += btnCreateBatchNO_Click; btnCreateBatchNO.Click += btnCreateBatchNO_Click;
// //
@ -719,7 +703,6 @@
((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit(); ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit();
panelNums.ResumeLayout(false); panelNums.ResumeLayout(false);
tableLayoutNums.ResumeLayout(false); tableLayoutNums.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dgvProductNums).EndInit();
tableLayoutPanel3.ResumeLayout(false); tableLayoutPanel3.ResumeLayout(false);
tableLayoutPanel3.PerformLayout(); tableLayoutPanel3.PerformLayout();
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
@ -778,10 +761,10 @@
// private Label label7; // private Label label7;
// private AntdUI.Panel pnlLog; // private AntdUI.Panel pnlLog;
private AntdUI.Label lbInBackend; private AntdUI.Label lbInBackend;
private DataGridView dgvProductNums;
private TableLayoutPanel tableLayoutPanel3; private TableLayoutPanel tableLayoutPanel3;
private AntdUI.Button btnCreateBatchNO; private AntdUI.Button btnCreateBatchNO;
private AntdUI.Input textBoxBatchNO; private AntdUI.Input textBoxBatchNO;
private AntdUI.Segmented segmented2; private AntdUI.Segmented segmented2;
public AntdUI.Tag tagMachineStatus;
} }
} }

View File

@ -57,132 +57,9 @@ namespace DHSoftware
public event Action<DateTime, object, string> OnUpdateResult; public event Action<DateTime, object, string> OnUpdateResult;
public event Action<DateTime, object, string> OnUpdateCamResult; public event Action<DateTime, object, string> OnUpdateCamResult;
private string _loginName;
public string LoginName
{
get { return _loginName; }
set
{
_loginName = value;
UpdateLabel();
}
}
private bool _ShowConfig;
public bool ShowConfig
{
get { return _ShowConfig; }
set
{
_ShowConfig = value;
UpdateConfig();
}
}
private bool _addscheme;
public bool Addscheme
{
get { return _addscheme; }
set
{
_addscheme = value;
UpdateScheme();
}
}
private bool _deletescheme;
public bool Deleteschememe
{
get { return _deletescheme; }
set
{
_deletescheme = value;
UpdateScheme();
}
}
private bool _loadscheme;
public bool Loadscheme
{
get { return _loadscheme; }
set
{
_loadscheme = value;
UpdateScheme();
}
}
private void UpdateScheme()
{
if (this.InvokeRequired)
{
this.Invoke(new Action(UpdateScheme));
return;
}
if (Loadscheme)
{
btnDeleteProject.Visible = true;
}
else
{
btnDeleteProject.Visible = false;
}
if (Addscheme)
{
btnAddProject.Visible = true;
}
else
{
btnAddProject.Visible = false;
}
if (Deleteschememe)
{
btnLoadProject.Visible = true;
}
else
{
btnLoadProject.Visible = false;
}
}
private void UpdateLabel()
{
if (lbName.InvokeRequired)
{
lbName.Invoke(new Action(UpdateLabel));
return;
}
lbName.Text = _loginName;
}
private void UpdateConfig()
{
if (ShowConfig)
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
// 恢复显示时
segmented1.Items.Insert(4, itemToHide);
}
else
{
if (segmented1.InvokeRequired)
{
segmented1.Invoke(new Action(UpdateConfig));
return;
}
segmented1.Items.Remove(itemToHide);
}
}
public List<SysPermission> ButtonPermissionList public List<SysPermission> ButtonPermissionList
{ {
set set
@ -546,67 +423,62 @@ namespace DHSoftware
#region CameraSum #region CameraSum
private void InitialCameraSumsView() private void InitialCameraSumsView()
{ {
dgvProductNums.AutoGenerateColumns = false;
dgvProductNums.DefaultCellStyle.Font = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.World); this.BeginInvoke(new MethodInvoker(delegate ()
dgvProductNums.DataSource = null;
dgvProductNums.DataSource = ProductSummaries;
dgvCamreaNums.Columns.Clear();
// 添加 CCD 列
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{ {
HeaderText = "CCD",
DataPropertyName = "CameraName"
});
// 添加 触发数 列
var TiggerCountColumn = new DataGridViewTextBoxColumn
{
HeaderText = "触发数",
DataPropertyName = "TiggerCount"
};
dgvCamreaNums.Columns.Add(TiggerCountColumn); dgvCamreaNums.Columns.Clear();
// 添加 合格 // 添加 CCD
var okColumn = new DataGridViewTextBoxColumn dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{ {
HeaderText = "合格", HeaderText = "CCD",
DataPropertyName = "OKCount" DataPropertyName = "CameraName"
}; });
okColumn.DefaultCellStyle.ForeColor = Color.Green; // 设置背景为绿色 // 添加 触发数 列
dgvCamreaNums.Columns.Add(okColumn); var TiggerCountColumn = new DataGridViewTextBoxColumn
{
HeaderText = "触发数",
DataPropertyName = "TiggerCount"
};
// 添加 不合格 列 dgvCamreaNums.Columns.Add(TiggerCountColumn);
var ngColumn = new DataGridViewTextBoxColumn
{
HeaderText = "不合格",
DataPropertyName = "NGCount"
};
ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色
dgvCamreaNums.Columns.Add(ngColumn);
// 添加 总数 // 添加 合格
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn var okColumn = new DataGridViewTextBoxColumn
{ {
HeaderText = "总数", HeaderText = "合格",
DataPropertyName = "TotalCount" DataPropertyName = "OKCount"
};
okColumn.DefaultCellStyle.ForeColor = Color.Green; // 设置背景为绿色
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 dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{ {
HeaderText = "良率", HeaderText = "总数",
DataPropertyName = "YieldStr" DataPropertyName = "TotalCount"
});
dgvCamreaNums.AutoGenerateColumns = false; });
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
} // 添加 良率 列
dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn
{
HeaderText = "良率",
DataPropertyName = "YieldStr"
});
dgvCamreaNums.AutoGenerateColumns = false;
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
})); }
#endregion #endregion
/// <summary> /// <summary>
@ -653,14 +525,16 @@ namespace DHSoftware
cam.CameraIP = cameraBase.CameraIP; cam.CameraIP = cameraBase.CameraIP;
cam.IsEnabled = cameraBase.IsEnabled; cam.IsEnabled = cameraBase.IsEnabled;
cam.IsZoomCamera = cameraBase.IsZoomCamera; cam.IsZoomCamera = cameraBase.IsZoomCamera;
cam.DvpImageFormat = cameraBase.DvpImageFormat;
cam.Exposure = cameraBase.Exposure; cam.Exposure = cameraBase.Exposure;
cam.Gain = cameraBase.Gain; cam.Gain = cameraBase.Gain;
cam.RotateImage = cameraBase.RotateImage; cam.RotateImage = cameraBase.RotateImage;
cam.IsAllPicEnabled=cameraBase.IsAllPicEnabled;
cam.ROIX= cameraBase.ROIX; cam.ROIX= cameraBase.ROIX;
cam.ROIH= cameraBase.ROIH; cam.ROIH= cameraBase.ROIH;
cam.ROIW= cameraBase.ROIW; cam.ROIW= cameraBase.ROIW;
cam.ROIY=cameraBase.ROIY; cam.ROIY=cameraBase.ROIY;
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName); cam.ImageSaveDirectory = Path.Combine("D://Projects//Images", cameraBase.CameraName);
Cameras.Add(cam); Cameras.Add(cam);
if (cameraBase.IsEnabled) if (cameraBase.IsEnabled)
{ {
@ -706,113 +580,128 @@ namespace DHSoftware
public void ConnectPLC() public void ConnectPLC()
{ {
if (ConfigModel.PLCBaseList.Count > 0) try
{ {
for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++) if (ConfigModel.PLCBaseList.Count > 0)
{ {
var plcBase = ConfigModel.PLCBaseList[i]; for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++)
if (plcBase.PLCType == EnumPLCType.XC网口 || plcBase.PLCType == EnumPLCType.XD网口)
{ {
PLC.IP = plcBase.IP; var plcBase = ConfigModel.PLCBaseList[i];
PLC.PLCType = plcBase.PLCType; if (plcBase.PLCType == EnumPLCType.XC网口 || plcBase.PLCType == EnumPLCType.XD网口)
PLC.Enable = plcBase.Enable;
PLC.PLCName = plcBase.PLCName;
PLC.PLCItemList = plcBase.PLCItemList;
PLC.Port = plcBase.Port;
PLC.OnLog -= _visionEngine_OnLog;
PLC.OnLog += _visionEngine_OnLog;
if(PLC.Enable)
{ {
PLC.PLCConnect(); PLC.IP = plcBase.IP;
Button CamLabel = new Button(); PLC.PLCType = plcBase.PLCType;
CamLabel.Name = PLC.PLCName; PLC.Enable = plcBase.Enable;
CamLabel.Text = PLC.PLCName; // 关键1必须有文本 PLC.PLCName = plcBase.PLCName;
CamLabel.AutoSize = true; PLC.PLCItemList = plcBase.PLCItemList;
CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2自动调整大小 PLC.Port = plcBase.Port;
CamLabel.Location = new Point(20 + 50 * (i + ConfigModel.CameraBaseList.Count), 12); // 关键3明确位置 PLC.OnLog -= _visionEngine_OnLog;
if (PLC.Connected) PLC.OnLog += _visionEngine_OnLog;
CamLabel.BackColor = Color.Green; // 关键4避免透明 if (PLC.Enable)
else
CamLabel.BackColor = Color.Yellow; // 关键4避免透明
CamLabel.ForeColor = Color.Black; // 关键4避免透明
//CamLabel.ForeColor = Color.Green; // 关键4避免透明
CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
// 关键5确保添加到父控件
if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
{ {
pageHeader1.Controls.Add(CamLabel); PLC.PLCConnect();
Button CamLabel = new Button();
CamLabel.Name = PLC.PLCName;
CamLabel.Text = PLC.PLCName; // 关键1必须有文本
CamLabel.AutoSize = true;
CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2自动调整大小
CamLabel.Location = new Point(20 + 50 * (i + ConfigModel.CameraBaseList.Count), 12); // 关键3明确位置
if (PLC.Connected)
CamLabel.BackColor = Color.Green; // 关键4避免透明
else
CamLabel.BackColor = Color.Yellow; // 关键4避免透明
CamLabel.ForeColor = Color.Black; // 关键4避免透明
//CamLabel.ForeColor = Color.Green; // 关键4避免透明
CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
// 关键5确保添加到父控件
if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
{
pageHeader1.Controls.Add(CamLabel);
}
} }
} }
} }
} }
} }
catch (Exception ex)
{
}
} }
FrmLog frmLog; FrmLog frmLog;
public void InitModel() public void InitModel()
{ {
Dectection.Clear(); try
_cameraRelatedDetectionDict = new();
if (ConfigModel.DetectionList.Count > 0)
{ {
for (int i = 0; i < ConfigModel.DetectionList.Count; i++) Dectection.Clear();
{ _cameraRelatedDetectionDict = new();
DetectionConfig detectionConfig = ConfigModel.DetectionList[i];
var detection = ConfigModel.DetectionList[i];
detectionConfig.CameraCollects = detection.CameraCollects;
detectionConfig.ModelconfThreshold = detection.ModelconfThreshold;
detectionConfig.ModelWidth = detection.ModelWidth;
detectionConfig.ModelHeight = detection.ModelHeight;
detectionConfig.In_lable_path = detection.In_lable_path;
detectionConfig.IsEnabled = detection.IsEnabled;
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5; if (ConfigModel.DetectionList.Count > 0)
// detectionConfig.ShowLocation.X = detection.ShowLocation.X; {
detectionConfig.ShowLocation.Y = (i + 1) / 5 + 1; for (int i = 0; i < ConfigModel.DetectionList.Count; i++)
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y; {
DetectionConfigs.Add(detectionConfig); DetectionConfig detectionConfig = ConfigModel.DetectionList[i];
var detection = ConfigModel.DetectionList[i];
detectionConfig.CameraCollects = detection.CameraCollects;
detectionConfig.ModelconfThreshold = detection.ModelconfThreshold;
detectionConfig.ModelWidth = detection.ModelWidth;
detectionConfig.ModelHeight = detection.ModelHeight;
detectionConfig.In_lable_path = detection.In_lable_path;
detectionConfig.IsEnabled = detection.IsEnabled;
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
// 优化后代码
detectionConfig.ShowLocation.X = (i % 5) + 1; // X坐标从1开始每行1-5
detectionConfig.ShowLocation.Y = (i / 5) + 1; // Y坐标从1开始每5个换行
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
DetectionConfigs.Add(detectionConfig);
}
} }
} DetectionConfigs.ForEach(detection =>
DetectionConfigs.ForEach(detection =>
{
detection.CameraCollects.ForEach(cam =>
{ {
List<string> Dets = new List<string> detection.CameraCollects.ForEach(cam =>
{
List<string> Dets = new List<string>
{ {
detection.Id detection.Id
}; };
if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId))
{ {
_cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets);
}
else
{
_cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id);
}
} }
else );
{ });
_cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); string inferenceDevice = "CPU";
}
}
);
});
string inferenceDevice = "CPU";
frmLog = new FrmLog(); frmLog = new FrmLog();
frmLog.Dock = DockStyle.Fill; frmLog.Dock = DockStyle.Fill;
pnlLog.Controls.Add(frmLog); pnlLog.Controls.Add(frmLog);
// //
_visionEngine = new SimboVisionDriver(); _visionEngine = new SimboVisionDriver();
_visionEngine.DetectionConfigs = DetectionConfigs; _visionEngine.DetectionConfigs = DetectionConfigs;
_visionEngine.LoggerHelper.LogPath = "D://PROJECTS//Logs//"; _visionEngine.LoggerHelper.LogPath = "D://PROJECTS//Logs//";
_visionEngine.LoggerHelper.LogPrefix = "Vision"; _visionEngine.LoggerHelper.LogPrefix = "Vision";
_visionEngine.OnLog += _visionEngine_OnLog; _visionEngine.OnLog += _visionEngine_OnLog;
//初始化模型 加载模型 //初始化模型 加载模型
_visionEngine.Init(); _visionEngine.Init();
CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine);
ctrlVisionRun.Dock = DockStyle.Fill; ctrlVisionRun.Dock = DockStyle.Fill;
tabImgDisplay.Controls.Add(ctrlVisionRun); tabImgDisplay.Controls.Add(ctrlVisionRun);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} }
@ -916,7 +805,7 @@ namespace DHSoftware
this.Invoke(new Action(() => this.Invoke(new Action(() =>
{ {
dgvProductNums.DataSource = new BindingList<ProductSummary>(ProductSummaries);
//if (dgvProductNums.Rows.Count > 0) //if (dgvProductNums.Rows.Count > 0)
//{ //{
@ -1072,6 +961,7 @@ namespace DHSoftware
private Thread _monitorThread; private Thread _monitorThread;
private void MainWindow_Load(object sender, EventArgs e) private void MainWindow_Load(object sender, EventArgs e)
{ {
//开启按钮监听 //开启按钮监听
// 启动所有监控线程 // 启动所有监控线程
StartAllMonitors(); StartAllMonitors();
@ -1083,6 +973,8 @@ namespace DHSoftware
{ {
if (_monitorThread == null || !_monitorThread.IsAlive) if (_monitorThread == null || !_monitorThread.IsAlive)
{ {
//关闭按钮自身功能(比如按按钮转盘自己启动等)
PLC.WriteBool("M40", true);
_isRunning = true; _isRunning = true;
_monitorThread = new Thread(MonitorPlcButtons); _monitorThread = new Thread(MonitorPlcButtons);
_monitorThread.IsBackground = true; // 后台线程 _monitorThread.IsBackground = true; // 后台线程
@ -1107,8 +999,7 @@ namespace DHSoftware
// 处理按钮状态变化 // 处理按钮状态变化
if (startPressed) if (startPressed)
{ {
PLC.TurnSpeed(0);
PLC.TurnStart(false);
HandleStartButton(); HandleStartButton();
} }
if (resetPressed) if (resetPressed)
@ -1124,7 +1015,7 @@ namespace DHSoftware
//EmergencyStop(null, null, null); //EmergencyStop(null, null, null);
} }
Thread.Sleep(50); // 降低 CPU 占用,根据实际调整轮询间隔 Thread.Sleep(150);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1144,6 +1035,7 @@ namespace DHSoftware
{ {
_monitorThread.Join(1000); // 等待线程退出 _monitorThread.Join(1000); // 等待线程退出
} }
PLC.WriteBool("M40", false);
} }
private bool _isClosing = false; // 状态标志 private bool _isClosing = false; // 状态标志
@ -1171,11 +1063,13 @@ namespace DHSoftware
{ {
camera.CameraDisConnect(); camera.CameraDisConnect();
} }
StopMonitoring();
if (PLC != null) if (PLC != null)
{ {
PLC.CloseProcess(); PLC.CloseProcess();
} }
StopMonitoring();
_visionEngine.Stop();//释放模型 _visionEngine.Stop();//释放模型
CloseWindow.Instance.Close();// 关闭提示窗口 CloseWindow.Instance.Close();// 关闭提示窗口
//Application.Exit(); //Application.Exit();
@ -1265,12 +1159,58 @@ namespace DHSoftware
private void HandleStartButton() private void HandleStartButton()
{ {
InitialCameraSumsView(); lock (_stopLock)
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候..."); {
ResetAllCameraCounts(); if (_isStopProcessing) return;
//开始流程 _isStopProcessing = true;
StartProcess(); }
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!"); try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{
InitialCameraSumsView();
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
ResetAllCameraCounts();
//开始流程
StartProcess();
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Success;
tagMachineStatus.Text = "运行中";
}));
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在运行,无需启动!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
}
} }
@ -1279,10 +1219,7 @@ namespace DHSoftware
{ {
try try
{ {
if (CurrentMachine)
{
return;
}
BatchNO = textBoxBatchNO.Text; BatchNO = textBoxBatchNO.Text;
textBoxBatchNO.ReadOnly = true; textBoxBatchNO.ReadOnly = true;
@ -1371,9 +1308,8 @@ namespace DHSoftware
//mOfflineImageTimer.Start(); //mOfflineImageTimer.Start();
#endregion #endregion
//流程执行时PLC
PLC.StartProcess();
LogAsync(DateTime.Now, LogLevel.Action, "流程启动11111111111完成");
///这里会执行完成后会造成后台线程断断续续会造成界面UI卡顿 ///这里会执行完成后会造成后台线程断断续续会造成界面UI卡顿
//var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList(); //var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList();
//if (settings != null) //if (settings != null)
@ -1417,7 +1353,8 @@ namespace DHSoftware
InitialOEEStatistic(); InitialOEEStatistic();
//流程执行时PLC
PLC.StartProcess();
CurrentMachine = true; CurrentMachine = true;
} }
catch (Exception ex) catch (Exception ex)
@ -1457,15 +1394,15 @@ namespace DHSoftware
//转盘2 的物料是不是重新覆盖之前的pDta //转盘2 的物料是不是重新覆盖之前的pDta
if (axisIndex == 1) if (axisIndex == 1)
{ {
ProductData pData = new ProductData("", pieceNumber, ProductBaseCount); ProductData pData = new ProductData(BatchNO, pieceNumber, ProductBaseCount);
_productLists[index][pieceNumber] = pData; _productLists[index][pieceNumber] = pData;
LogAsync(DateTime.Now, LogLevel.Action, $">> {axisIndex}新产品{pieceNumber}加入队列{index}----板卡计数{PieceCount}"); LogAsync(DateTime.Now, LogLevel.Action, $">> 转盘{axisIndex}新产品{pieceNumber}加入队列{index}----计数{PieceCount}");
} }
DateTime dtNow = DateTime.Now; //DateTime dtNow = DateTime.Now;
UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds); //UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds);
_ctTime = dtNow; // _ctTime = dtNow;
} }
public async Task UpdateCT(object objData, float ctTime) public async Task UpdateCT(object objData, float ctTime)
@ -1848,25 +1785,89 @@ namespace DHSoftware
} }
private void HandleStopButton() private readonly object _stopLock = new object(); // 锁对象
private bool _isStopProcessing = false; // 状态标志
private async void HandleStopButton()
{ {
if (!CurrentMachine) // 通过锁和状态标志实现双重检查
lock (_stopLock)
{ {
return; if (_isStopProcessing) return;
_isStopProcessing = true;
}
try
{
if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备待机中,无需停止!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
textBoxBatchNO.ReadOnly = false;
btnCreateBatchNO.Enabled = true;
// Cameras.Clear();
// Dectection.Clear();
// Add the code for the "停止" button click here
PLC.StopProcess();
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
LogAsync(DateTime.Now, LogLevel.Action, $"流程停止!");
await Task.Run(async () =>
{
await ExecuteClearDelayAsync();
});
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!");
}
else if (SystemModel.CurrentStatus == EnumStatus.)
{
LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!");
}
}
finally
{
lock (_stopLock)
{
_isStopProcessing = false;
}
} }
textBoxBatchNO.ReadOnly = false;
btnCreateBatchNO.Enabled = true;
// Cameras.Clear();
// Dectection.Clear();
// Add the code for the "停止" button click here
PLC.StopProcess();
CurrentMachine = false;
//sLDMotion.Stop(); //sLDMotion.Stop();
} }
private async Task ExecuteClearDelayAsync()
{
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料开始");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Warn;
tagMachineStatus.Text = "清料中";
}));
await PLC.ExecuteClearDelayAsync();
LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料完成");
SystemModel.CurrentStatus = EnumStatus.;
this.BeginInvoke(new MethodInvoker(delegate ()
{
tagMachineStatus.Type = TTypeMini.Primary;
tagMachineStatus.Text = "待机中";
}));
}
public void CalculateOEE() public void CalculateOEE()
{ {

View File

@ -156,254 +156,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -412,7 +165,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value> </value>
</data> </data>
</root> </root>

View File

@ -67,6 +67,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
@ -99,6 +101,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
UpdateStep(80, "正在加载算法模型", true); UpdateStep(80, "正在加载算法模型", true);
@ -109,6 +113,8 @@ namespace DHSoftware
catch (Exception ex) catch (Exception ex)
{ {
SystemModel.CurrentStatus = EnumStatus.; SystemModel.CurrentStatus = EnumStatus.;
MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error;
MainWindow.Instance.tagMachineStatus.Text = "异常";
Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error);
} }
UpdateStep(100, "程序初始化完成", true); UpdateStep(100, "程序初始化完成", true);

View File

@ -13,6 +13,7 @@ namespace DHSoftware.Views
InitializeComponent(); InitializeComponent();
lbTitleName.Text = TitleName; lbTitleName.Text = TitleName;
// 绑定事件 // 绑定事件
BindEventHandler(); BindEventHandler();
} }
@ -21,6 +22,12 @@ namespace DHSoftware.Views
{ {
button_ok.Click += Button_ok_Click; button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click; button_cancel.Click += Button_cancel_Click;
Load += AddCameraControl_Load;
}
private void AddCameraControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
} }
private void Button_cancel_Click(object sender, EventArgs e) private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -28,6 +28,13 @@ namespace DHSoftware.Views
{ {
button_ok.Click += Button_ok_Click; button_ok.Click += Button_ok_Click;
button_cancel.Click += Button_cancel_Click; button_cancel.Click += Button_cancel_Click;
Load += AddCubicleControl_Load;
}
private void AddCubicleControl_Load(object? sender, EventArgs e)
{
input_name.Text = CubicleName;
sltdetectionType.SelectedIndex =(int)DetectionType;
} }
private void Button_cancel_Click(object sender, EventArgs e) private void Button_cancel_Click(object sender, EventArgs e)

View File

@ -29,29 +29,30 @@
private void InitializeComponent() private void InitializeComponent()
{ {
panel3 = new AntdUI.Panel(); panel3 = new AntdUI.Panel();
btnSizeAdd = new AntdUI.Button();
button1 = new AntdUI.Button();
button2 = new AntdUI.Button();
button3 = new AntdUI.Button(); button3 = new AntdUI.Button();
button2 = new AntdUI.Button();
button1 = new AntdUI.Button();
btnSizeAdd = new AntdUI.Button();
panel4 = new AntdUI.Panel(); panel4 = new AntdUI.Panel();
pictureBox1 = new PictureBox();
panel2 = new AntdUI.Panel(); panel2 = new AntdUI.Panel();
label18 = new AntdUI.Label(); label18 = new AntdUI.Label();
swhEnable = new AntdUI.Switch(); swhEnable = new AntdUI.Switch();
label1 = new AntdUI.Label(); label1 = new AntdUI.Label();
label2 = new AntdUI.Label(); label2 = new AntdUI.Label();
label3 = new AntdUI.Label(); label3 = new AntdUI.Label();
iptExposure = new AntdUI.InputNumber(); iptExposure = new AntdUI.Input();
iptGain = new AntdUI.InputNumber(); iptGain = new AntdUI.Input();
iptRevolve = new AntdUI.Select(); iptRevolve = new AntdUI.Select();
label4 = new AntdUI.Label(); label4 = new AntdUI.Label();
sltAcquisitionMode = new AntdUI.Select(); sltAcquisitionMode = new AntdUI.Select();
label5 = new AntdUI.Label(); label5 = new AntdUI.Label();
sltTriggerMode = new AntdUI.Select(); sltTriggerMode = new AntdUI.Select();
label7 = new AntdUI.Label(); label7 = new AntdUI.Label();
iptROIX = new AntdUI.InputNumber(); iptROIX = new AntdUI.Input();
iptROIY = new AntdUI.InputNumber(); iptROIY = new AntdUI.Input();
iptROIW = new AntdUI.InputNumber(); iptROIW = new AntdUI.Input();
iptROIH = new AntdUI.InputNumber(); iptROIH = new AntdUI.Input();
label6 = new AntdUI.Label(); label6 = new AntdUI.Label();
sthPic = new AntdUI.Switch(); sthPic = new AntdUI.Switch();
label8 = new AntdUI.Label(); label8 = new AntdUI.Label();
@ -65,12 +66,13 @@
label14 = new AntdUI.Label(); label14 = new AntdUI.Label();
switch1 = new AntdUI.Switch(); switch1 = new AntdUI.Switch();
panel1 = new AntdUI.Panel(); panel1 = new AntdUI.Panel();
pictureBox1 = new PictureBox(); sltPicType = new AntdUI.Select();
label15 = new AntdUI.Label();
panel3.SuspendLayout(); panel3.SuspendLayout();
panel4.SuspendLayout(); panel4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
panel2.SuspendLayout(); panel2.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// panel3 // panel3
@ -80,51 +82,12 @@
panel3.Controls.Add(button1); panel3.Controls.Add(button1);
panel3.Controls.Add(btnSizeAdd); panel3.Controls.Add(btnSizeAdd);
panel3.Dock = DockStyle.Bottom; panel3.Dock = DockStyle.Bottom;
panel3.Location = new Point(0, 552); panel3.Location = new Point(0, 585);
panel3.Name = "panel3"; panel3.Name = "panel3";
panel3.Size = new Size(691, 59); panel3.Size = new Size(691, 59);
panel3.TabIndex = 39; panel3.TabIndex = 39;
panel3.Text = "panel3"; panel3.Text = "panel3";
// //
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button3 // button3
// //
button3.BorderWidth = 2F; button3.BorderWidth = 2F;
@ -138,16 +101,65 @@
button3.TabIndex = 46; button3.TabIndex = 46;
button3.Text = "连续触发"; button3.Text = "连续触发";
// //
// button2
//
button2.BorderWidth = 2F;
button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button2.Ghost = true;
button2.IconRatio = 0F;
button2.IconSvg = "";
button2.Location = new Point(388, 13);
button2.Name = "button2";
button2.Size = new Size(80, 38);
button2.TabIndex = 45;
button2.Text = "单次触发";
//
// button1
//
button1.BorderWidth = 2F;
button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
button1.Ghost = true;
button1.IconRatio = 0F;
button1.IconSvg = "";
button1.Location = new Point(233, 13);
button1.Name = "button1";
button1.Size = new Size(80, 38);
button1.TabIndex = 44;
button1.Text = "断开相机";
//
// btnSizeAdd
//
btnSizeAdd.BorderWidth = 2F;
btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机";
//
// panel4 // panel4
// //
panel4.Controls.Add(pictureBox1); panel4.Controls.Add(pictureBox1);
panel4.Dock = DockStyle.Fill; panel4.Dock = DockStyle.Fill;
panel4.Location = new Point(0, 0); panel4.Location = new Point(0, 0);
panel4.Name = "panel4"; panel4.Name = "panel4";
panel4.Size = new Size(691, 552); panel4.Size = new Size(691, 585);
panel4.TabIndex = 40; panel4.TabIndex = 40;
panel4.Text = "panel4"; panel4.Text = "panel4";
// //
// pictureBox1
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Dock = DockStyle.Fill;
pictureBox1.Location = new Point(0, 0);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(691, 585);
pictureBox1.TabIndex = 39;
pictureBox1.TabStop = false;
//
// panel2 // panel2
// //
panel2.Controls.Add(panel4); panel2.Controls.Add(panel4);
@ -155,7 +167,7 @@
panel2.Dock = DockStyle.Fill; panel2.Dock = DockStyle.Fill;
panel2.Location = new Point(218, 0); panel2.Location = new Point(218, 0);
panel2.Name = "panel2"; panel2.Name = "panel2";
panel2.Size = new Size(691, 611); panel2.Size = new Size(691, 644);
panel2.TabIndex = 49; panel2.TabIndex = 49;
panel2.Text = "panel2"; panel2.Text = "panel2";
// //
@ -172,7 +184,7 @@
swhEnable.CheckedText = "启用"; swhEnable.CheckedText = "启用";
swhEnable.Location = new Point(86, 9); swhEnable.Location = new Point(86, 9);
swhEnable.Name = "swhEnable"; swhEnable.Name = "swhEnable";
swhEnable.Size = new Size(94, 33); swhEnable.Size = new Size(111, 33);
swhEnable.TabIndex = 49; swhEnable.TabIndex = 49;
swhEnable.UnCheckedText = "关闭"; swhEnable.UnCheckedText = "关闭";
// //
@ -204,7 +216,7 @@
// //
iptExposure.Location = new Point(86, 136); iptExposure.Location = new Point(86, 136);
iptExposure.Name = "iptExposure"; iptExposure.Name = "iptExposure";
iptExposure.Size = new Size(94, 36); iptExposure.Size = new Size(111, 36);
iptExposure.TabIndex = 53; iptExposure.TabIndex = 53;
iptExposure.Tag = ""; iptExposure.Tag = "";
iptExposure.Text = "0"; iptExposure.Text = "0";
@ -213,7 +225,7 @@
// //
iptGain.Location = new Point(86, 179); iptGain.Location = new Point(86, 179);
iptGain.Name = "iptGain"; iptGain.Name = "iptGain";
iptGain.Size = new Size(94, 36); iptGain.Size = new Size(111, 36);
iptGain.TabIndex = 54; iptGain.TabIndex = 54;
iptGain.Text = "0"; iptGain.Text = "0";
// //
@ -223,7 +235,7 @@
iptRevolve.List = true; iptRevolve.List = true;
iptRevolve.Location = new Point(86, 222); iptRevolve.Location = new Point(86, 222);
iptRevolve.Name = "iptRevolve"; iptRevolve.Name = "iptRevolve";
iptRevolve.Size = new Size(94, 36); iptRevolve.Size = new Size(111, 36);
iptRevolve.TabIndex = 55; iptRevolve.TabIndex = 55;
// //
// label4 // label4
@ -239,7 +251,7 @@
sltAcquisitionMode.List = true; sltAcquisitionMode.List = true;
sltAcquisitionMode.Location = new Point(86, 265); sltAcquisitionMode.Location = new Point(86, 265);
sltAcquisitionMode.Name = "sltAcquisitionMode"; sltAcquisitionMode.Name = "sltAcquisitionMode";
sltAcquisitionMode.Size = new Size(94, 36); sltAcquisitionMode.Size = new Size(111, 36);
sltAcquisitionMode.TabIndex = 57; sltAcquisitionMode.TabIndex = 57;
// //
// label5 // label5
@ -255,12 +267,12 @@
sltTriggerMode.List = true; sltTriggerMode.List = true;
sltTriggerMode.Location = new Point(86, 310); sltTriggerMode.Location = new Point(86, 310);
sltTriggerMode.Name = "sltTriggerMode"; sltTriggerMode.Name = "sltTriggerMode";
sltTriggerMode.Size = new Size(94, 36); sltTriggerMode.Size = new Size(111, 36);
sltTriggerMode.TabIndex = 59; sltTriggerMode.TabIndex = 59;
// //
// label7 // label7
// //
label7.Location = new Point(3, 498); label7.Location = new Point(3, 538);
label7.Name = "label7"; label7.Name = "label7";
label7.Size = new Size(29, 23); label7.Size = new Size(29, 23);
label7.TabIndex = 60; label7.TabIndex = 60;
@ -268,34 +280,34 @@
// //
// iptROIX // iptROIX
// //
iptROIX.Location = new Point(86, 430); iptROIX.Location = new Point(86, 470);
iptROIX.Name = "iptROIX"; iptROIX.Name = "iptROIX";
iptROIX.Size = new Size(94, 37); iptROIX.Size = new Size(111, 37);
iptROIX.TabIndex = 61; iptROIX.TabIndex = 61;
iptROIX.Tag = ""; iptROIX.Tag = "";
iptROIX.Text = "0"; iptROIX.Text = "0";
// //
// iptROIY // iptROIY
// //
iptROIY.Location = new Point(86, 473); iptROIY.Location = new Point(86, 513);
iptROIY.Name = "iptROIY"; iptROIY.Name = "iptROIY";
iptROIY.Size = new Size(94, 37); iptROIY.Size = new Size(111, 37);
iptROIY.TabIndex = 62; iptROIY.TabIndex = 62;
iptROIY.Text = "0"; iptROIY.Text = "0";
// //
// iptROIW // iptROIW
// //
iptROIW.Location = new Point(86, 516); iptROIW.Location = new Point(86, 556);
iptROIW.Name = "iptROIW"; iptROIW.Name = "iptROIW";
iptROIW.Size = new Size(94, 37); iptROIW.Size = new Size(111, 37);
iptROIW.TabIndex = 63; iptROIW.TabIndex = 63;
iptROIW.Text = "0"; iptROIW.Text = "0";
// //
// iptROIH // iptROIH
// //
iptROIH.Location = new Point(86, 559); iptROIH.Location = new Point(86, 599);
iptROIH.Name = "iptROIH"; iptROIH.Name = "iptROIH";
iptROIH.Size = new Size(94, 37); iptROIH.Size = new Size(111, 37);
iptROIH.TabIndex = 64; iptROIH.TabIndex = 64;
iptROIH.Text = "0"; iptROIH.Text = "0";
// //
@ -312,13 +324,13 @@
sthPic.CheckedText = "启用"; sthPic.CheckedText = "启用";
sthPic.Location = new Point(86, 56); sthPic.Location = new Point(86, 56);
sthPic.Name = "sthPic"; sthPic.Name = "sthPic";
sthPic.Size = new Size(94, 33); sthPic.Size = new Size(111, 33);
sthPic.TabIndex = 66; sthPic.TabIndex = 66;
sthPic.UnCheckedText = "关闭"; sthPic.UnCheckedText = "关闭";
// //
// label8 // label8
// //
label8.Location = new Point(36, 430); label8.Location = new Point(36, 470);
label8.Name = "label8"; label8.Name = "label8";
label8.Size = new Size(29, 37); label8.Size = new Size(29, 37);
label8.TabIndex = 67; label8.TabIndex = 67;
@ -326,7 +338,7 @@
// //
// label9 // label9
// //
label9.Location = new Point(36, 473); label9.Location = new Point(36, 513);
label9.Name = "label9"; label9.Name = "label9";
label9.Size = new Size(29, 37); label9.Size = new Size(29, 37);
label9.TabIndex = 68; label9.TabIndex = 68;
@ -334,7 +346,7 @@
// //
// label10 // label10
// //
label10.Location = new Point(28, 516); label10.Location = new Point(28, 556);
label10.Name = "label10"; label10.Name = "label10";
label10.Size = new Size(44, 37); label10.Size = new Size(44, 37);
label10.TabIndex = 69; label10.TabIndex = 69;
@ -342,7 +354,7 @@
// //
// label11 // label11
// //
label11.Location = new Point(28, 560); label11.Location = new Point(28, 600);
label11.Name = "label11"; label11.Name = "label11";
label11.Size = new Size(44, 36); label11.Size = new Size(44, 36);
label11.TabIndex = 70; label11.TabIndex = 70;
@ -350,7 +362,7 @@
// //
// label12 // label12
// //
label12.Location = new Point(21, 362); label12.Location = new Point(21, 402);
label12.Name = "label12"; label12.Name = "label12";
label12.Size = new Size(59, 23); label12.Size = new Size(59, 23);
label12.TabIndex = 71; label12.TabIndex = 71;
@ -359,9 +371,9 @@
// sthAllPic // sthAllPic
// //
sthAllPic.CheckedText = "启用"; sthAllPic.CheckedText = "启用";
sthAllPic.Location = new Point(86, 352); sthAllPic.Location = new Point(86, 392);
sthAllPic.Name = "sthAllPic"; sthAllPic.Name = "sthAllPic";
sthAllPic.Size = new Size(94, 33); sthAllPic.Size = new Size(111, 33);
sthAllPic.TabIndex = 72; sthAllPic.TabIndex = 72;
sthAllPic.UnCheckedText = "关闭"; sthAllPic.UnCheckedText = "关闭";
// //
@ -378,12 +390,12 @@
sltCamType.List = true; sltCamType.List = true;
sltCamType.Location = new Point(86, 93); sltCamType.Location = new Point(86, 93);
sltCamType.Name = "sltCamType"; sltCamType.Name = "sltCamType";
sltCamType.Size = new Size(94, 36); sltCamType.Size = new Size(111, 36);
sltCamType.TabIndex = 74; sltCamType.TabIndex = 74;
// //
// label14 // label14
// //
label14.Location = new Point(21, 401); label14.Location = new Point(21, 441);
label14.Name = "label14"; label14.Name = "label14";
label14.Size = new Size(59, 23); label14.Size = new Size(59, 23);
label14.TabIndex = 75; label14.TabIndex = 75;
@ -392,14 +404,16 @@
// switch1 // switch1
// //
switch1.CheckedText = "启用"; switch1.CheckedText = "启用";
switch1.Location = new Point(86, 391); switch1.Location = new Point(86, 431);
switch1.Name = "switch1"; switch1.Name = "switch1";
switch1.Size = new Size(94, 33); switch1.Size = new Size(111, 33);
switch1.TabIndex = 76; switch1.TabIndex = 76;
switch1.UnCheckedText = "关闭"; switch1.UnCheckedText = "关闭";
// //
// panel1 // panel1
// //
panel1.Controls.Add(sltPicType);
panel1.Controls.Add(label15);
panel1.Controls.Add(switch1); panel1.Controls.Add(switch1);
panel1.Controls.Add(label14); panel1.Controls.Add(label14);
panel1.Controls.Add(sltCamType); panel1.Controls.Add(sltCamType);
@ -432,19 +446,25 @@
panel1.Dock = DockStyle.Left; panel1.Dock = DockStyle.Left;
panel1.Location = new Point(0, 0); panel1.Location = new Point(0, 0);
panel1.Name = "panel1"; panel1.Name = "panel1";
panel1.Size = new Size(218, 611); panel1.Size = new Size(218, 644);
panel1.TabIndex = 48; panel1.TabIndex = 48;
panel1.Text = "panel1"; panel1.Text = "panel1";
// //
// pictureBox1 // sltPicType
// //
pictureBox1.BorderStyle = BorderStyle.FixedSingle; sltPicType.List = true;
pictureBox1.Dock = DockStyle.Fill; sltPicType.Location = new Point(86, 352);
pictureBox1.Location = new Point(0, 0); sltPicType.Name = "sltPicType";
pictureBox1.Name = "pictureBox1"; sltPicType.Size = new Size(111, 36);
pictureBox1.Size = new Size(691, 552); sltPicType.TabIndex = 78;
pictureBox1.TabIndex = 39; //
pictureBox1.TabStop = false; // label15
//
label15.Location = new Point(21, 352);
label15.Name = "label15";
label15.Size = new Size(59, 36);
label15.TabIndex = 77;
label15.Text = "图片格式";
// //
// CameraControl // CameraControl
// //
@ -453,12 +473,12 @@
Controls.Add(panel2); Controls.Add(panel2);
Controls.Add(panel1); Controls.Add(panel1);
Name = "CameraControl"; Name = "CameraControl";
Size = new Size(909, 611); Size = new Size(909, 644);
panel3.ResumeLayout(false); panel3.ResumeLayout(false);
panel4.ResumeLayout(false); panel4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
panel2.ResumeLayout(false); panel2.ResumeLayout(false);
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
ResumeLayout(false); ResumeLayout(false);
} }
@ -477,18 +497,18 @@
private AntdUI.Label label1; private AntdUI.Label label1;
private AntdUI.Label label2; private AntdUI.Label label2;
private AntdUI.Label label3; private AntdUI.Label label3;
private AntdUI.InputNumber iptExposure; private AntdUI.Input iptExposure;
private AntdUI.InputNumber iptGain; private AntdUI.Input iptGain;
private AntdUI.Select iptRevolve; private AntdUI.Select iptRevolve;
private AntdUI.Label label4; private AntdUI.Label label4;
private AntdUI.Select sltAcquisitionMode; private AntdUI.Select sltAcquisitionMode;
private AntdUI.Label label5; private AntdUI.Label label5;
private AntdUI.Select sltTriggerMode; private AntdUI.Select sltTriggerMode;
private AntdUI.Label label7; private AntdUI.Label label7;
private AntdUI.InputNumber iptROIX; private AntdUI.Input iptROIX;
private AntdUI.InputNumber iptROIY; private AntdUI.Input iptROIY;
private AntdUI.InputNumber iptROIW; private AntdUI.Input iptROIW;
private AntdUI.InputNumber iptROIH; private AntdUI.Input iptROIH;
private AntdUI.Label label6; private AntdUI.Label label6;
private AntdUI.Switch sthPic; private AntdUI.Switch sthPic;
private AntdUI.Label label8; private AntdUI.Label label8;
@ -502,5 +522,7 @@
private AntdUI.Label label14; private AntdUI.Label label14;
private AntdUI.Switch switch1; private AntdUI.Switch switch1;
private AntdUI.Panel panel1; private AntdUI.Panel panel1;
private AntdUI.Select sltPicType;
private AntdUI.Label label15;
} }
} }

View File

@ -10,6 +10,7 @@ using System.Windows.Forms;
using AntdUI; using AntdUI;
using DH.Commons.Base; using DH.Commons.Base;
using DH.Commons.Enums; using DH.Commons.Enums;
using DVPCameraType;
using static System.Windows.Forms.VisualStyles.VisualStyleElement; using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Window = AntdUI.Window; using Window = AntdUI.Window;
@ -26,9 +27,36 @@ namespace DHSoftware.Views
InitializeComponent(); InitializeComponent();
sltCamType.TextChanged += SltCamTpye_TextChanged; sltCamType.TextChanged += SltCamTpye_TextChanged;
sltPicType.TextChanged += SltPicTpye_TextChanged;
InitData(); InitData();
BindData(); BindData();
} }
private void SltPicTpye_TextChanged(object? sender, EventArgs e)
{
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
{
// 将文本转换为枚举值
if (Enum.TryParse<dvpStreamFormat>(slt.Text, out var plcType))
{
switch (plcType)
{
case dvpStreamFormat.S_RGB24:
case dvpStreamFormat.S_MONO8:
break;
default:
break;
}
}
else
{
}
}
}
private void SltCamTpye_TextChanged(object? sender, EventArgs e) private void SltCamTpye_TextChanged(object? sender, EventArgs e)
{ {
if (sender is Select slt && !string.IsNullOrEmpty(slt.Text)) if (sender is Select slt && !string.IsNullOrEmpty(slt.Text))
@ -77,6 +105,7 @@ namespace DHSoftware.Views
{ {
sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, ""); sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, "");
sltPicType.DataBindings.Add("Text", CameraBase, "DvpImageFormat", true, DataSourceUpdateMode.OnPropertyChanged, "");
sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled), sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled),
true, DataSourceUpdateMode.OnPropertyChanged); true, DataSourceUpdateMode.OnPropertyChanged);
sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled), sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled),
@ -87,22 +116,20 @@ namespace DHSoftware.Views
switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera), switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera),
true, DataSourceUpdateMode.OnPropertyChanged); true, DataSourceUpdateMode.OnPropertyChanged);
// 曝光时间绑定假设iptExposure是NumericUpDown // 曝光时间绑定假设iptExposure是NumericUpDown
iptExposure.DataBindings.Add(nameof(iptExposure.Value), CameraBase, nameof(CameraBase.Exposure),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptExposure.DataBindings.Add(nameof(iptExposure.Text), CameraBase, nameof(CameraBase.Exposure));
// 增益绑定 // 增益绑定
iptGain.DataBindings.Add(nameof(iptGain.Value), CameraBase, nameof(CameraBase.Gain),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
iptGain.DataBindings.Add(nameof(iptGain.Text), CameraBase, nameof(CameraBase.Gain));
// 旋转角度绑定 // 旋转角度绑定
iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage), iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage));
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
// ROI坐标绑定 // ROI坐标绑定
iptROIX.DataBindings.Add(nameof(iptROIX.Value), CameraBase, nameof(CameraBase.ROIX)); iptROIX.DataBindings.Add(nameof(iptROIX.Text), CameraBase, nameof(CameraBase.ROIX));
iptROIY.DataBindings.Add(nameof(iptROIY.Value), CameraBase, nameof(CameraBase.ROIY)); iptROIY.DataBindings.Add(nameof(iptROIY.Text), CameraBase, nameof(CameraBase.ROIY));
iptROIW.DataBindings.Add(nameof(iptROIW.Value), CameraBase, nameof(CameraBase.ROIW)); iptROIW.DataBindings.Add(nameof(iptROIW.Text), CameraBase, nameof(CameraBase.ROIW));
iptROIH.DataBindings.Add(nameof(iptROIH.Value), CameraBase, nameof(CameraBase.ROIH)); iptROIH.DataBindings.Add(nameof(iptROIH.Text), CameraBase, nameof(CameraBase.ROIH));
// 采集模式下拉框处理 // 采集模式下拉框处理
sltAcquisitionMode.SelectedIndexChanged += (s, e) => sltAcquisitionMode.SelectedIndexChanged += (s, e) =>
@ -126,10 +153,16 @@ namespace DHSoftware.Views
{ {
sltCamType.Items.Add(value.ToString()); sltCamType.Items.Add(value.ToString());
} }
sltPicType.Items.Clear();
foreach (dvpStreamFormat value in Enum.GetValues(typeof(dvpStreamFormat)))
{
sltPicType.Items.Add(value.ToString());
}
// 初始化下拉框选项 // 初始化下拉框选项
sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" }); sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" });
sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" }); sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" });
// 设置初始选择 // 设置初始选择
sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1; sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1;
sltTriggerMode.SelectedIndex = CameraBase.IsHardwareTrigger ? 1 : 0; sltTriggerMode.SelectedIndex = CameraBase.IsHardwareTrigger ? 1 : 0;

View File

@ -55,7 +55,7 @@
this.tsmiClearLog.Name = "tsmiClearLog"; this.tsmiClearLog.Name = "tsmiClearLog";
this.tsmiClearLog.Size = new System.Drawing.Size(124, 22); this.tsmiClearLog.Size = new System.Drawing.Size(124, 22);
this.tsmiClearLog.Text = "清空日志"; this.tsmiClearLog.Text = "清空日志";
this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click); // this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click);
// //
// menuStrip1 // menuStrip1
// //

View File

@ -30,8 +30,11 @@ namespace DHSoftware.Views
#region #region
private const string SOURCE_PROCESS = "流程"; private const string SOURCE_PROCESS = "流程";
private const int LOG_NUM_LIMIT = 2000; private const int LOG_NUM_LIMIT = 2000;
private const int BATCH_SIZE = 50; // private const int BATCH_SIZE = 50;
private const int PROCESS_INTERVAL = 100; // 调整常量配置
private const int BATCH_SIZE = 100; // 从50提升到100
private const int PROCESS_INTERVAL = 200; // 从100ms调整到200ms
// private const int PROCESS_INTERVAL = 100;
private const int FIRST_COL_WIDTH = 120; private const int FIRST_COL_WIDTH = 120;
#endregion #endregion

View File

@ -28,7 +28,7 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine(); AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine();
tabs1 = new AntdUI.Tabs(); tabs1 = new AntdUI.Tabs();
tabPage6 = new AntdUI.TabPage(); tabPage6 = new AntdUI.TabPage();
tabPage1 = new AntdUI.TabPage(); tabPage1 = new AntdUI.TabPage();
@ -56,7 +56,16 @@
panel5 = new AntdUI.Panel(); panel5 = new AntdUI.Panel();
btnStopResetDelete = new AntdUI.Button(); btnStopResetDelete = new AntdUI.Button();
btnStopResetAdd = new AntdUI.Button(); btnStopResetAdd = new AntdUI.Button();
panel6 = new AntdUI.Panel();
panel7 = new AntdUI.Panel();
uiLabel1 = new Sunny.UI.UILabel();
swhEnableVibrator = new AntdUI.Switch();
swhEnableBelt = new AntdUI.Switch();
uiLabel2 = new Sunny.UI.UILabel();
uiLabel3 = new Sunny.UI.UILabel();
iptClearTime = new AntdUI.Input();
tabs1.SuspendLayout(); tabs1.SuspendLayout();
tabPage6.SuspendLayout();
tabPage1.SuspendLayout(); tabPage1.SuspendLayout();
panel1.SuspendLayout(); panel1.SuspendLayout();
tabPage2.SuspendLayout(); tabPage2.SuspendLayout();
@ -67,6 +76,7 @@
panel4.SuspendLayout(); panel4.SuspendLayout();
tabPage5.SuspendLayout(); tabPage5.SuspendLayout();
panel5.SuspendLayout(); panel5.SuspendLayout();
panel6.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
// tabs1 // tabs1
@ -81,13 +91,14 @@
tabs1.Pages.Add(tabPage4); tabs1.Pages.Add(tabPage4);
tabs1.Pages.Add(tabPage5); tabs1.Pages.Add(tabPage5);
tabs1.Size = new Size(898, 530); tabs1.Size = new Size(898, 530);
tabs1.Style = styleLine1; tabs1.Style = styleLine2;
tabs1.TabIndex = 26; tabs1.TabIndex = 26;
tabs1.Text = "tabs1"; tabs1.Text = "tabs1";
tabs1.SelectedIndex = 1;
// //
// tabPage6 // tabPage6
// //
tabPage6.Controls.Add(panel7);
tabPage6.Controls.Add(panel6);
tabPage6.Location = new Point(3, 28); tabPage6.Location = new Point(3, 28);
tabPage6.Name = "tabPage6"; tabPage6.Name = "tabPage6";
tabPage6.Size = new Size(892, 499); tabPage6.Size = new Size(892, 499);
@ -372,6 +383,86 @@
btnStopResetAdd.Type = AntdUI.TTypeMini.Primary; btnStopResetAdd.Type = AntdUI.TTypeMini.Primary;
btnStopResetAdd.WaveSize = 0; btnStopResetAdd.WaveSize = 0;
// //
// panel6
//
panel6.Controls.Add(iptClearTime);
panel6.Controls.Add(uiLabel3);
panel6.Controls.Add(swhEnableBelt);
panel6.Controls.Add(uiLabel2);
panel6.Controls.Add(swhEnableVibrator);
panel6.Controls.Add(uiLabel1);
panel6.Dock = DockStyle.Left;
panel6.Location = new Point(0, 0);
panel6.Name = "panel6";
panel6.Size = new Size(427, 499);
panel6.TabIndex = 0;
panel6.Text = "panel6";
//
// panel7
//
panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(427, 0);
panel7.Name = "panel7";
panel7.Size = new Size(465, 499);
panel7.TabIndex = 1;
panel7.Text = "panel7";
//
// uiLabel1
//
uiLabel1.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel1.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel1.Location = new Point(28, 36);
uiLabel1.Name = "uiLabel1";
uiLabel1.Size = new Size(63, 23);
uiLabel1.TabIndex = 0;
uiLabel1.Text = "振动盘";
//
// swhEnableVibrator
//
swhEnableVibrator.CheckedText = "启用";
swhEnableVibrator.Location = new Point(97, 26);
swhEnableVibrator.Name = "swhEnableVibrator";
swhEnableVibrator.Size = new Size(94, 33);
swhEnableVibrator.TabIndex = 50;
swhEnableVibrator.UnCheckedText = "关闭";
//
// swhEnableBelt
//
swhEnableBelt.CheckedText = "启用";
swhEnableBelt.Location = new Point(97, 82);
swhEnableBelt.Name = "swhEnableBelt";
swhEnableBelt.Size = new Size(94, 33);
swhEnableBelt.TabIndex = 52;
swhEnableBelt.UnCheckedText = "关闭";
//
// uiLabel2
//
uiLabel2.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel2.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel2.Location = new Point(28, 92);
uiLabel2.Name = "uiLabel2";
uiLabel2.Size = new Size(63, 23);
uiLabel2.TabIndex = 51;
uiLabel2.Text = "皮带";
//
// uiLabel3
//
uiLabel3.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
uiLabel3.ForeColor = Color.FromArgb(48, 48, 48);
uiLabel3.Location = new Point(17, 142);
uiLabel3.Name = "uiLabel3";
uiLabel3.Size = new Size(74, 23);
uiLabel3.TabIndex = 53;
uiLabel3.Text = "清料时间";
//
// iptClearTime
//
iptClearTime.Location = new Point(97, 131);
iptClearTime.Name = "iptClearTime";
iptClearTime.Size = new Size(94, 43);
iptClearTime.TabIndex = 54;
iptClearTime.Text = "0";
//
// GlobalControl // GlobalControl
// //
AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleDimensions = new SizeF(7F, 17F);
@ -380,6 +471,7 @@
Name = "GlobalControl"; Name = "GlobalControl";
Size = new Size(898, 530); Size = new Size(898, 530);
tabs1.ResumeLayout(false); tabs1.ResumeLayout(false);
tabPage6.ResumeLayout(false);
tabPage1.ResumeLayout(false); tabPage1.ResumeLayout(false);
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
tabPage2.ResumeLayout(false); tabPage2.ResumeLayout(false);
@ -390,6 +482,7 @@
panel4.ResumeLayout(false); panel4.ResumeLayout(false);
tabPage5.ResumeLayout(false); tabPage5.ResumeLayout(false);
panel5.ResumeLayout(false); panel5.ResumeLayout(false);
panel6.ResumeLayout(false);
ResumeLayout(false); ResumeLayout(false);
} }
@ -421,5 +514,13 @@
private AntdUI.Button btnAdd; private AntdUI.Button btnAdd;
private AntdUI.Button btnDelete; private AntdUI.Button btnDelete;
private AntdUI.TabPage tabPage6; private AntdUI.TabPage tabPage6;
private AntdUI.Panel panel7;
private AntdUI.Panel panel6;
private Sunny.UI.UILabel uiLabel1;
private AntdUI.Switch swhEnableBelt;
private Sunny.UI.UILabel uiLabel2;
private AntdUI.Switch swhEnableVibrator;
private Sunny.UI.UILabel uiLabel3;
private AntdUI.Input iptClearTime;
} }
} }

View File

@ -691,7 +691,10 @@ namespace DHSoftware.Views
private void InitData() private void InitData()
{ {
// 启用状态绑定
swhEnableVibrator.DataBindings.Add("Checked", global, "EnableVibrator", true, DataSourceUpdateMode.OnPropertyChanged);
swhEnableBelt.DataBindings.Add("Checked", global, "EnableBelt", true, DataSourceUpdateMode.OnPropertyChanged);
iptClearTime.DataBindings.Add("Text", global, "ClearTime", true, DataSourceUpdateMode.OnPropertyChanged);
TableInitProcess.Columns = new ColumnCollection() { TableInitProcess.Columns = new ColumnCollection() {
new ColumnCheck("Selected"){Fixed = true}, new ColumnCheck("Selected"){Fixed = true},

View File

@ -7,6 +7,7 @@ using DH.Commons.Base;
using DH.RBAC.Model.Sys; using DH.RBAC.Model.Sys;
using System.Reflection; using System.Reflection;
using ScrollBar = AntdUI.ScrollBar; using ScrollBar = AntdUI.ScrollBar;
using DH.Commons.Enums;
namespace DHSoftware.Views namespace DHSoftware.Views
{ {
@ -59,6 +60,19 @@ namespace DHSoftware.Views
switch (clickedItem.PARENTITEM.Text) switch (clickedItem.PARENTITEM.Text)
{ {
case "相机设置": case "相机设置":
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-cameraset")
{
b = true;
break;
}
}
}
if (!b) { AntdUI.Message.warn(this, $"对不起,无权限访问相机设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -99,6 +113,19 @@ namespace DHSoftware.Views
break; break;
case "工位设置": case "工位设置":
bool b1 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-stationset")
{
b1 = true;
break;
}
}
}
if (!b1) { AntdUI.Message.warn(this, $"对不起,无权限访问工位设置!", autoClose: 3); return; }
// 检查是否已存在同名 TabPage // 检查是否已存在同名 TabPage
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
@ -146,6 +173,19 @@ namespace DHSoftware.Views
break; break;
case "运控设置": case "运控设置":
bool b2 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-motionset")
{
b2 = true;
break;
}
}
}
if (!b2) { AntdUI.Message.warn(this, $"对不起,无权限访问运控设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -185,6 +225,19 @@ namespace DHSoftware.Views
} }
break; break;
case "其他设置": case "其他设置":
bool b3 = false;
if (ButtonPermissionList.Count > 0)
{
foreach (var item in ButtonPermissionList)
{
if (item.EnCode == "sys-globalset")
{
b3 = true;
break;
}
}
}
if (!b3) { AntdUI.Message.warn(this, $"对不起,无权限访问其他设置!", autoClose: 3); return; }
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -329,15 +382,30 @@ namespace DHSoftware.Views
} }
return null; return null;
} }
private List<SysPermission> _buttonPermissionList = new List<SysPermission>();
private readonly object _permissionLock = new object();
/// <summary>
/// 按钮权限列表(线程安全)
/// </summary>
public List<SysPermission> ButtonPermissionList public List<SysPermission> ButtonPermissionList
{ {
get
{
lock (_permissionLock)
{
return new List<SysPermission>(_buttonPermissionList); // 返回副本避免外部修改
}
}
set set
{ {
List<SysPermission> list = value; lock (_permissionLock)
SetPermission(list, this.Controls); {
_buttonPermissionList = value ?? new List<SysPermission>();
SetPermission(_buttonPermissionList, this.Controls); // 应用权限到控件
}
} }
} }
private void SetPermission(List<SysPermission> list, Control.ControlCollection controls) private void SetPermission(List<SysPermission> list, Control.ControlCollection controls)
{ {
foreach (Control control in controls) foreach (Control control in controls)
@ -453,7 +521,19 @@ namespace DHSoftware.Views
{ {
if (e.Button == MouseButtons.Right) if (e.Button == MouseButtons.Right)
{ {
bool b = false;
if (ButtonPermissionList.Count > 0)
{
foreach(var item in ButtonPermissionList)
{
if (item.EnCode == "sys-setright")
{
b= true;
break;
}
}
}
if (!b) { return; }
var menu = sender as Menu; var menu = sender as Menu;
if (menu == null) return; if (menu == null) return;
@ -491,6 +571,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK) if (result == DialogResult.OK)
{ {
menu1.Remove(clickedItem); menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -503,7 +584,7 @@ namespace DHSoftware.Views
return; return;
} }
} }
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
} }
break; break;
@ -515,7 +596,8 @@ namespace DHSoftware.Views
{ {
Size = new Size(300, 200), Size = new Size(300, 200),
// 传递当前名称到表单 // 传递当前名称到表单
CubicleName = originalName CubicleName = originalName,
}; };
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -577,6 +659,7 @@ namespace DHSoftware.Views
if (result == DialogResult.OK) if (result == DialogResult.OK)
{ {
menu1.Remove(clickedItem); menu1.Remove(clickedItem);
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
@ -595,12 +678,14 @@ namespace DHSoftware.Views
case "重命名": case "重命名":
// 保存原始名称用于查找 // 保存原始名称用于查找
string originalName = clickedItem.Text; string originalName = clickedItem.Text;
EnumDetectionType enumDetectionType= ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)).DetectionType;
var form = new AddCubicleControl(this, "重命名工位操作") var form = new AddCubicleControl(this, "重命名工位操作")
{ {
Size = new Size(300, 500), Size = new Size(300, 500),
// 传递当前名称到表单 // 传递当前名称到表单
CubicleName = originalName CubicleName = originalName,
DetectionType = enumDetectionType
}; };
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
@ -624,6 +709,7 @@ namespace DHSoftware.Views
var detection = ConfigModel.DetectionList.FirstOrDefault(c => var detection = ConfigModel.DetectionList.FirstOrDefault(c =>
c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)); c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase));
detection.Name = newName; detection.Name = newName;
detection.DetectionType = form.DetectionType;
foreach (var tab in tabs1.Pages) foreach (var tab in tabs1.Pages)
{ {
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}") if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}")

View File

@ -462,7 +462,6 @@
// //
iptBarrierPos.Location = new Point(284, 0); iptBarrierPos.Location = new Point(284, 0);
iptBarrierPos.Name = "iptBarrierPos"; iptBarrierPos.Name = "iptBarrierPos";
iptBarrierPos.ReadOnly = true;
iptBarrierPos.Size = new Size(175, 43); iptBarrierPos.Size = new Size(175, 43);
iptBarrierPos.TabIndex = 20; iptBarrierPos.TabIndex = 20;
iptBarrierPos.Text = "0"; iptBarrierPos.Text = "0";

View File

@ -175,7 +175,7 @@ namespace DHSoftware.Views
AntdUI.Message.warn(this, "挡料电机速度值无效"); AntdUI.Message.warn(this, "挡料电机速度值无效");
return; return;
} }
if (!int.TryParse(iptBarrierPos.Text, out int barrierPos) || speed == 0) if (!int.TryParse(iptBarrierPos.Text, out int barrierPos) || barrierPos == 0)
{ {
AntdUI.Message.warn(this, "挡料电机位置值无效"); AntdUI.Message.warn(this, "挡料电机位置值无效");
return; return;

View File

@ -120,254 +120,7 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn
H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE
u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E
u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D
uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -376,7 +129,159 @@
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/
AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA
D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/
AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A
H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAA=
</value> </value>
</data> </data>
</root> </root>

BIN
DHSoftware/assets/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.