Compare commits
19 Commits
43e7f3009d
...
KM
Author | SHA1 | Date | |
---|---|---|---|
|
bb943740da | ||
|
71bbea56a7 | ||
|
6c1d86619e | ||
1a84519874 | |||
4e75b0d4da | |||
|
95bc9ce3b3 | ||
|
bc0ed5d574 | ||
|
6a9e7e4343 | ||
f12c2f0cd9 | |||
8e2197f46e | |||
ed53c8e5db | |||
|
b749eb4266 | ||
|
ae5c1122ed | ||
|
6973d39cad | ||
77b75050b2 | |||
99226f4cb0 | |||
|
158557e046 | ||
|
33e94b92f9 | ||
74051a4287 |
@@ -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,10 +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 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;
|
||||||
@@ -59,7 +63,7 @@ namespace DH.Commons.Base
|
|||||||
private string _computerIP = string.Empty;
|
private string _computerIP = string.Empty;
|
||||||
private bool _isDirectHardwareTrigger = false;
|
private bool _isDirectHardwareTrigger = false;
|
||||||
private float _gain =6;
|
private float _gain =6;
|
||||||
private float _rotateImage = 0;
|
private int _rotateImage = 0;
|
||||||
private float _exposure = 200;
|
private float _exposure = 200;
|
||||||
private float _triggerDelay = 0;
|
private float _triggerDelay = 0;
|
||||||
private decimal _roiX = 0;
|
private decimal _roiX = 0;
|
||||||
@@ -70,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:触发模式采图")]
|
||||||
@@ -83,6 +101,16 @@ namespace DH.Commons.Base
|
|||||||
OnPropertyChanged(nameof(IsContinueMode));
|
OnPropertyChanged(nameof(IsContinueMode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public bool IsZoomCamera
|
||||||
|
{
|
||||||
|
get => _isZoomCamera;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_isZoomCamera == value) return;
|
||||||
|
_isZoomCamera = value;
|
||||||
|
OnPropertyChanged(nameof(IsZoomCamera));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual bool IsEnabled
|
public virtual bool IsEnabled
|
||||||
{
|
{
|
||||||
@@ -245,7 +273,7 @@ namespace DH.Commons.Base
|
|||||||
[Category("图像旋转")]
|
[Category("图像旋转")]
|
||||||
[DisplayName("默认旋转")]
|
[DisplayName("默认旋转")]
|
||||||
[Description("默认旋转,相机开启后默认不旋转")]
|
[Description("默认旋转,相机开启后默认不旋转")]
|
||||||
public virtual float RotateImage
|
public virtual int RotateImage
|
||||||
{
|
{
|
||||||
get => _rotateImage;
|
get => _rotateImage;
|
||||||
set
|
set
|
||||||
|
@@ -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;
|
||||||
|
@@ -1,18 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DH.Commons.Base
|
namespace DH.Commons.Base
|
||||||
{
|
{
|
||||||
[Serializable]
|
|
||||||
public class VisualLocalization
|
public class VisualLocalization
|
||||||
{
|
{
|
||||||
// 必须包含公共无参构造函数
|
// 配置属性
|
||||||
public VisualLocalization() { }
|
|
||||||
|
|
||||||
public string CameraName { get; set; }
|
public string CameraName { get; set; }
|
||||||
public string ModelPath { get; set; }
|
public string ModelPath { get; set; }
|
||||||
public string ImgPath { get; set; }
|
public string ImgPath { get; set; }
|
||||||
@@ -20,45 +16,65 @@ namespace DH.Commons.Base
|
|||||||
public string Direction { get; set; }
|
public string Direction { get; set; }
|
||||||
public string Speed { get; set; }
|
public string Speed { get; set; }
|
||||||
|
|
||||||
// 保存到文件
|
public string MSpeed { get; set; }
|
||||||
public void SaveToFile(string filePath)
|
|
||||||
|
// 配置文件路径
|
||||||
|
private const string ConfigFile = "VisualConfigs.json";
|
||||||
|
private static readonly object _fileLock = new object();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存当前配置(存在则更新,不存在则新增)
|
||||||
|
/// </summary>
|
||||||
|
public void Save()
|
||||||
{
|
{
|
||||||
try
|
lock (_fileLock)
|
||||||
|
{
|
||||||
|
var list = LoadAll();
|
||||||
|
var existing = list.FirstOrDefault(c => c.CameraName == CameraName);
|
||||||
|
|
||||||
|
if (existing != null)
|
||||||
|
{
|
||||||
|
// 更新现有配置
|
||||||
|
existing.ModelPath = ModelPath;
|
||||||
|
existing.ImgPath = ImgPath;
|
||||||
|
existing.Threshold = Threshold;
|
||||||
|
existing.Direction = Direction;
|
||||||
|
existing.Speed = Speed;
|
||||||
|
existing.MSpeed = MSpeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list.Add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
SaveAll(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取全部配置列表
|
||||||
|
/// </summary>
|
||||||
|
public static List<VisualLocalization> LoadAll()
|
||||||
|
{
|
||||||
|
lock (_fileLock)
|
||||||
|
{
|
||||||
|
if (!File.Exists(ConfigFile)) return new List<VisualLocalization>();
|
||||||
|
|
||||||
|
var json = File.ReadAllText(ConfigFile);
|
||||||
|
return JsonSerializer.Deserialize<List<VisualLocalization>>(json)
|
||||||
|
?? new List<VisualLocalization>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SaveAll(List<VisualLocalization> list)
|
||||||
{
|
{
|
||||||
var options = new JsonSerializerOptions
|
var options = new JsonSerializerOptions
|
||||||
{
|
{
|
||||||
WriteIndented = true, // 美化格式
|
WriteIndented = true,
|
||||||
IgnoreNullValues = true // 忽略空值
|
IgnoreNullValues = true
|
||||||
};
|
};
|
||||||
|
|
||||||
string json = JsonSerializer.Serialize(this, options);
|
File.WriteAllText(ConfigFile, JsonSerializer.Serialize(list, options));
|
||||||
File.WriteAllText(filePath, json);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"保存失败: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从文件加载
|
|
||||||
public static VisualLocalization LoadFromFile(string filePath)
|
|
||||||
{
|
|
||||||
if (!File.Exists(filePath))
|
|
||||||
throw new FileNotFoundException("文件不存在", filePath);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string json = File.ReadAllText(filePath);
|
|
||||||
return JsonSerializer.Deserialize<VisualLocalization>(json);
|
|
||||||
}
|
|
||||||
catch (JsonException ex)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"JSON解析错误: {ex.Message}");
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"文件读取失败: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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>
|
||||||
|
@@ -9,8 +9,9 @@ namespace DH.Commons.Enums
|
|||||||
{
|
{
|
||||||
public enum EnumStatus
|
public enum EnumStatus
|
||||||
{
|
{
|
||||||
未运行,
|
待机中,
|
||||||
运行中,
|
运行中,
|
||||||
|
清料中,
|
||||||
警告,
|
警告,
|
||||||
异常
|
异常
|
||||||
}
|
}
|
||||||
@@ -115,7 +116,16 @@ namespace DH.Commons.Enums
|
|||||||
NG脉冲,
|
NG脉冲,
|
||||||
状态复位,
|
状态复位,
|
||||||
启用定位,
|
启用定位,
|
||||||
定位完成脉冲值
|
定位完成脉冲值,
|
||||||
|
相机步进原点,
|
||||||
|
相机步进位置,
|
||||||
|
相机步进速度,
|
||||||
|
相机步进顺时针,
|
||||||
|
相机步进逆时针,
|
||||||
|
点动相机步进,
|
||||||
|
点动挡杆步进,
|
||||||
|
相机步进实时位置,
|
||||||
|
挡料电机实时位置
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,117 +1,169 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using Newtonsoft.Json;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DH.Commons.Helper
|
namespace DH.Commons.Helper
|
||||||
{
|
{
|
||||||
public static class SchemeHelper
|
public static class SchemeHelper
|
||||||
{
|
{
|
||||||
private const string SchemesKey = "Schemes";
|
private const string DefaultSchemeName = "默认方案";
|
||||||
private const string CurrentSchemeKey = "CurrentScheme";
|
private static readonly string ConfigFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "schemes.json");
|
||||||
private const char Separator = '|';
|
|
||||||
|
/// <summary>
|
||||||
|
/// 方案配置数据结构
|
||||||
|
/// </summary>
|
||||||
|
private class SchemeConfig
|
||||||
|
{
|
||||||
|
public List<string> Schemes { get; set; } = new List<string>();
|
||||||
|
public string CurrentScheme { get; set; } = DefaultSchemeName;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化配置(首次运行时调用)
|
/// 初始化配置(首次运行时调用)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void Initialize()
|
public static void Initialize()
|
||||||
{
|
{
|
||||||
// 如果Schemes不存在,创建空键
|
if (!File.Exists(ConfigFilePath))
|
||||||
if (!SystemConfigHelper.KeyExists(SchemesKey))
|
|
||||||
{
|
{
|
||||||
SystemConfigHelper.SetValue(SchemesKey, "");
|
var defaultConfig = new SchemeConfig
|
||||||
}
|
|
||||||
|
|
||||||
// 如果CurrentScheme不存在,创建空键
|
|
||||||
if (!SystemConfigHelper.KeyExists(CurrentSchemeKey))
|
|
||||||
{
|
{
|
||||||
SystemConfigHelper.SetValue(CurrentSchemeKey, "");
|
Schemes = new List<string> { DefaultSchemeName },
|
||||||
|
CurrentScheme = DefaultSchemeName
|
||||||
|
};
|
||||||
|
SaveConfig(defaultConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取所有方案(自动处理空值)
|
/// 获取所有方案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<string> GetAllSchemes()
|
public static List<string> GetAllSchemes()
|
||||||
{
|
{
|
||||||
var schemeString = SystemConfigHelper.GetValue(SchemesKey, "");
|
var config = LoadConfig();
|
||||||
return string.IsNullOrEmpty(schemeString)
|
return config.Schemes ?? new List<string>();
|
||||||
? new List<string>()
|
|
||||||
: new List<string>(schemeString.Split(Separator));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加新方案(自动初始化处理)
|
/// 添加新方案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void AddScheme(string schemeName)
|
public static void AddScheme(string schemeName)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(schemeName))
|
if (string.IsNullOrWhiteSpace(schemeName))
|
||||||
throw new ArgumentException("方案名称无效");
|
throw new ArgumentException("方案名称无效");
|
||||||
|
|
||||||
var schemes = GetAllSchemes();
|
var config = LoadConfig();
|
||||||
|
|
||||||
if (schemes.Contains(schemeName))
|
if (config.Schemes.Contains(schemeName))
|
||||||
throw new InvalidOperationException($"方案 {schemeName} 已存在");
|
throw new InvalidOperationException($"方案 {schemeName} 已存在");
|
||||||
|
|
||||||
schemes.Add(schemeName);
|
config.Schemes.Add(schemeName);
|
||||||
SaveSchemes(schemes);
|
SaveConfig(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置当前方案(空值安全处理)
|
/// 设置当前方案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void SetCurrentScheme(string schemeName)
|
public static void SetCurrentScheme(string schemeName)
|
||||||
{
|
{
|
||||||
var schemes = GetAllSchemes();
|
var config = LoadConfig();
|
||||||
|
|
||||||
if (!schemes.Contains(schemeName))
|
if (!config.Schemes.Contains(schemeName))
|
||||||
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
|
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
|
||||||
|
|
||||||
SystemConfigHelper.SetValue(CurrentSchemeKey, schemeName);
|
config.CurrentScheme = schemeName;
|
||||||
|
SaveConfig(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取当前方案(默认值处理)
|
/// 获取当前方案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetCurrentScheme()
|
public static string GetCurrentScheme()
|
||||||
{
|
{
|
||||||
var current = SystemConfigHelper.GetValue(CurrentSchemeKey, "");
|
var config = LoadConfig();
|
||||||
return !string.IsNullOrEmpty(current) ? current : "默认方案";
|
return !string.IsNullOrEmpty(config.CurrentScheme)
|
||||||
|
? config.CurrentScheme
|
||||||
|
: DefaultSchemeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SaveSchemes(List<string> schemes)
|
|
||||||
{
|
|
||||||
var schemeString = schemes.Count > 0
|
|
||||||
? string.Join(Separator.ToString(), schemes)
|
|
||||||
: "";
|
|
||||||
SystemConfigHelper.SetValue(SchemesKey, schemeString);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 删除指定方案(自动同步当前方案状态)
|
/// 删除指定方案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="schemeName">要删除的方案名称</param>
|
|
||||||
/// <exception cref="ArgumentException">当方案名称为空时抛出</exception>
|
|
||||||
/// <exception cref="KeyNotFoundException">当方案不存在时抛出</exception>
|
|
||||||
public static void DeleteScheme(string schemeName)
|
public static void DeleteScheme(string schemeName)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(schemeName))
|
if (string.IsNullOrWhiteSpace(schemeName))
|
||||||
throw new ArgumentException("方案名称无效");
|
throw new ArgumentException("方案名称无效");
|
||||||
|
|
||||||
var schemes = GetAllSchemes();
|
var config = LoadConfig();
|
||||||
|
|
||||||
if (!schemes.Contains(schemeName))
|
if (!config.Schemes.Contains(schemeName))
|
||||||
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
|
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
|
||||||
|
|
||||||
// 删除前检查是否是当前方案
|
// 如果是当前方案,需要先切换
|
||||||
bool isCurrent = GetCurrentScheme() == schemeName;
|
if (config.CurrentScheme == schemeName)
|
||||||
|
{
|
||||||
|
var otherScheme = config.Schemes.FirstOrDefault(s => s != schemeName);
|
||||||
|
if (otherScheme != null)
|
||||||
|
{
|
||||||
|
config.CurrentScheme = otherScheme;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
config.CurrentScheme = DefaultSchemeName;
|
||||||
|
if (!config.Schemes.Contains(DefaultSchemeName))
|
||||||
|
{
|
||||||
|
config.Schemes.Add(DefaultSchemeName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 执行删除操作
|
config.Schemes.Remove(schemeName);
|
||||||
schemes.Remove(schemeName);
|
SaveConfig(config);
|
||||||
SaveSchemes(schemes);
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载配置文件
|
||||||
|
/// </summary>
|
||||||
|
private static SchemeConfig LoadConfig()
|
||||||
|
{
|
||||||
|
if (!File.Exists(ConfigFilePath))
|
||||||
|
{
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string json = File.ReadAllText(ConfigFilePath);
|
||||||
|
return JsonConvert.DeserializeObject<SchemeConfig>(json) ?? new SchemeConfig();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// 如果读取失败,返回默认配置
|
||||||
|
return new SchemeConfig
|
||||||
|
{
|
||||||
|
Schemes = new List<string> { DefaultSchemeName },
|
||||||
|
CurrentScheme = DefaultSchemeName
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存配置文件
|
||||||
|
/// </summary>
|
||||||
|
private static void SaveConfig(SchemeConfig config)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string json = JsonConvert.SerializeObject(config, Formatting.Indented);
|
||||||
|
File.WriteAllText(ConfigFilePath, json);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 处理保存失败的情况
|
||||||
|
throw new InvalidOperationException("保存方案配置失败", ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -18,7 +18,7 @@ namespace DH.Commons.Models
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前状态
|
/// 当前状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static EnumStatus CurrentStatus =EnumStatus.未运行;
|
public static EnumStatus CurrentStatus =EnumStatus.待机中;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -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)
|
||||||
@@ -350,14 +355,7 @@ namespace DH.Devices.Camera
|
|||||||
public int ImageCallbackFunc(uint handle, dvpStreamEvent _event, IntPtr pContext, ref dvpFrame refFrame, IntPtr pBuffer)
|
public int ImageCallbackFunc(uint handle, dvpStreamEvent _event, IntPtr pContext, ref dvpFrame refFrame, IntPtr pBuffer)
|
||||||
{
|
{
|
||||||
Mat cvImage = new Mat();
|
Mat cvImage = new Mat();
|
||||||
if (this.CameraName.Equals("Cam1"))
|
|
||||||
{
|
|
||||||
Console.WriteLine();
|
|
||||||
}
|
|
||||||
if (this.CameraName.Equals("Cam2"))
|
|
||||||
{
|
|
||||||
Console.WriteLine();
|
|
||||||
}
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -387,11 +385,30 @@ namespace DH.Devices.Camera
|
|||||||
cvImage = Mat.FromPixelData(nHeight, nWidth, MatType.CV_8UC1, pBuffer);
|
cvImage = Mat.FromPixelData(nHeight, nWidth, MatType.CV_8UC1, pBuffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mat smat = cvImage.Clone();
|
Mat smat = cvImage.Clone();
|
||||||
|
Mat rotated = new Mat(); // 显式创建输出对象
|
||||||
|
|
||||||
|
switch (RotateImage)
|
||||||
|
{
|
||||||
|
case 90:
|
||||||
|
Cv2.Rotate(smat, rotated, RotateFlags.Rotate90Clockwise);
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
Cv2.Rotate(smat, rotated, RotateFlags.Rotate180);
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
Cv2.Rotate(smat, rotated, RotateFlags.Rotate90Counterclockwise);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rotated = smat.Clone(); // 无旋转时保持原图
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
var imageSet = new MatSet
|
var imageSet = new MatSet
|
||||||
{
|
{
|
||||||
|
|
||||||
_mat = smat,
|
_mat = rotated,
|
||||||
|
|
||||||
};
|
};
|
||||||
InitialImageSet(imageSet);
|
InitialImageSet(imageSet);
|
||||||
|
@@ -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(() =>
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
||||||
|
|
||||||
OnNewPieces?.Invoke(diskIndex, pieceNumber);
|
OnNewPieces?.Invoke(diskIndex, pieceNumber);
|
||||||
|
}
|
||||||
|
catch (Exception ex) { /* 记录异常 */ }
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public void SetResetFlag(bool isReset)
|
public void SetResetFlag(bool isReset)
|
||||||
|
@@ -11,6 +11,7 @@ using System.Threading.Tasks;
|
|||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using DH.Commons.Base;
|
using DH.Commons.Base;
|
||||||
using DH.Commons.Enums;
|
using DH.Commons.Enums;
|
||||||
|
using DH.Commons.Helper;
|
||||||
using DH.Commons.Models;
|
using DH.Commons.Models;
|
||||||
using HslCommunication;
|
using HslCommunication;
|
||||||
using HslCommunication.Enthernet;
|
using HslCommunication.Enthernet;
|
||||||
@@ -37,6 +38,8 @@ namespace DH.Devices.PLC
|
|||||||
public event Action<LogMsg> OnLog;
|
public event Action<LogMsg> OnLog;
|
||||||
private XinJETcpNet TcpNet = new XinJETcpNet();
|
private XinJETcpNet TcpNet = new XinJETcpNet();
|
||||||
|
|
||||||
|
private TaskFactory _taskFac = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning);
|
||||||
|
|
||||||
public override bool PLCConnect()
|
public override bool PLCConnect()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -82,7 +85,7 @@ namespace DH.Devices.PLC
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Connected = false;
|
Connected = false;
|
||||||
LogAsync(DateTime.Now, LogLevel.Error, $"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}");
|
LogAsync(DateTime.Now, LogLevel.Error, $"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}");
|
||||||
@@ -258,7 +261,8 @@ namespace DH.Devices.PLC
|
|||||||
public override bool ReadBool(string address)
|
public override bool ReadBool(string address)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{ if (Connected)
|
{
|
||||||
|
if (Connected)
|
||||||
{
|
{
|
||||||
// 读取Bool变量
|
// 读取Bool变量
|
||||||
var result = TcpNet.ReadBool(address);
|
var result = TcpNet.ReadBool(address);
|
||||||
@@ -534,7 +538,7 @@ namespace DH.Devices.PLC
|
|||||||
/// <param name="waitForReply">是否等待回复</param>
|
/// <param name="waitForReply">是否等待回复</param>
|
||||||
public override bool WriteBool(string address, bool writeValue, bool waitForReply = true)
|
public override bool WriteBool(string address, bool writeValue, bool waitForReply = true)
|
||||||
{
|
{
|
||||||
if(Connected)
|
if (Connected)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(address))
|
if (string.IsNullOrEmpty(address))
|
||||||
{
|
{
|
||||||
@@ -617,28 +621,74 @@ namespace DH.Devices.PLC
|
|||||||
/// int,int 轴号 捕获位置
|
/// int,int 轴号 捕获位置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event Action<int, uint> OnNewPieces;
|
public event Action<int, uint> OnNewPieces;
|
||||||
|
private System.Threading.Timer timer;
|
||||||
|
private System.Threading.TimerCallback timerCallback;
|
||||||
|
|
||||||
|
|
||||||
public void NewPieces(int axisIndex, uint pieceNumber)
|
public void NewPieces(int axisIndex, uint pieceNumber)
|
||||||
{
|
{
|
||||||
_taskFactory.StartNew(() =>
|
//_taskFactory.StartNew(() =>
|
||||||
|
//{
|
||||||
|
// Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
||||||
|
|
||||||
|
// OnNewPieces?.Invoke(axisIndex, pieceNumber);
|
||||||
|
//});
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
||||||
|
|
||||||
OnNewPieces?.Invoke(axisIndex, pieceNumber);
|
OnNewPieces?.Invoke(axisIndex, pieceNumber);
|
||||||
|
}
|
||||||
|
catch (Exception ex) { /* 记录异常 */ }
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public async Task HeartbeatAsync1()
|
public async Task HeartbeatAsync1()
|
||||||
{
|
{
|
||||||
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "心跳地址");
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "心跳地址");
|
||||||
while (Connected)
|
#if false
|
||||||
{
|
|
||||||
|
|
||||||
|
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
|
||||||
if (pLCItem == null)
|
if (pLCItem == null)
|
||||||
return;
|
return;
|
||||||
|
while (Connected)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Information, $"心跳\t");
|
||||||
|
|
||||||
WriteBool(pLCItem.Address, true);
|
WriteBool(pLCItem.Address, true);
|
||||||
await Task.Delay(900); // 非阻塞,等待1秒
|
await Task.Delay(2000); // 非阻塞,等待1秒
|
||||||
}
|
}
|
||||||
|
catch (Exception ex) { }
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
timerCallback = (object? state) =>
|
||||||
|
{
|
||||||
|
timer.Change(2000, 2000);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
//WriteBool(pLCItem.Address, true);
|
||||||
|
WriteBool("M31", true);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Error, $"心跳:{ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
timer = new System.Threading.Timer(
|
||||||
|
timerCallback, null, 0, 2000);
|
||||||
|
|
||||||
|
timer.Change(2000, 2000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 入料监听
|
/// 入料监听
|
||||||
@@ -647,7 +697,7 @@ namespace DH.Devices.PLC
|
|||||||
private void MonitorPiecesImpl()
|
private void MonitorPiecesImpl()
|
||||||
{
|
{
|
||||||
|
|
||||||
PLCItem pLCItem= PLCItemList.FirstOrDefault(u => u.Name == "产品计数");
|
PLCItem pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "产品计数");
|
||||||
if (pLCItem == null)
|
if (pLCItem == null)
|
||||||
return;
|
return;
|
||||||
string Count = pLCItem.Address;
|
string Count = pLCItem.Address;
|
||||||
@@ -658,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;
|
||||||
@@ -673,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)
|
||||||
@@ -685,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;
|
||||||
@@ -695,7 +745,7 @@ namespace DH.Devices.PLC
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep(1);
|
Thread.Sleep(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -721,12 +771,20 @@ 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();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void StartProcess()
|
public void StartProcess()
|
||||||
{
|
{
|
||||||
//状态复位
|
//状态复位
|
||||||
@@ -737,14 +795,115 @@ namespace DH.Devices.PLC
|
|||||||
// LogAsync(DateTime.Now, LogLevel.Information, $"关闭定位");
|
// LogAsync(DateTime.Now, LogLevel.Information, $"关闭定位");
|
||||||
//写入流程启动点位配置
|
//写入流程启动点位配置
|
||||||
StartProcessAction();
|
StartProcessAction();
|
||||||
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
|
PLCItem? pLCItem = ConfigModel.GlobalList?
|
||||||
//计数清零
|
.FirstOrDefault()?
|
||||||
CountToZero();
|
.StartProcessList?
|
||||||
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
|
.Where(it => it.Name == "挡料电机回原点速度").FirstOrDefault();
|
||||||
//转盘启动
|
if (pLCItem == null)
|
||||||
TurnStart(true);
|
{
|
||||||
|
throw new Exception($"未找到挡料电机回原点速度地址,请检查该地址是否存在于点位表!");
|
||||||
|
}
|
||||||
|
PLCItem? pLCItem1 = ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?
|
||||||
|
.Where(it => it.Name == "挡料电机位置").FirstOrDefault();
|
||||||
|
if (pLCItem1 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"未找到挡料电机位置地址,请检查该地址是否存在于点位表!");
|
||||||
|
}
|
||||||
|
FeedingMotor(true, Convert.ToInt32(pLCItem.Value), Convert.ToInt32(pLCItem1.Value));
|
||||||
|
|
||||||
|
|
||||||
|
PLCItem? pLCItemmontor = ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?
|
||||||
|
.Where(it => it.Name == "相机步进速度").FirstOrDefault();
|
||||||
|
if (pLCItemmontor == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"未找到相机步进速度地址,请检查该地址是否存在于点位表!");
|
||||||
|
}
|
||||||
|
PLCItem? pLCItemmontor1 = ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?
|
||||||
|
.Where(it => it.Name == "相机步进位置").FirstOrDefault();
|
||||||
|
if (pLCItemmontor1 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"未找到相机步进位置地址,请检查该地址是否存在于点位表!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Motor(true, Convert.ToInt32(pLCItemmontor.Value), Convert.ToInt32(pLCItemmontor1.Value));
|
||||||
|
// if (_PLCConfig?.Enable == true)
|
||||||
|
//挡料电机操作
|
||||||
|
// _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection);
|
||||||
|
|
||||||
|
//流程开启操作配置
|
||||||
|
// ProcessInitialAction();
|
||||||
|
// if (_PLC?Enabled == true)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
|
||||||
|
|
||||||
|
bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt;
|
||||||
|
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);
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
//计数清零
|
||||||
|
CountToZero();
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
|
||||||
|
|
||||||
|
Thread.Sleep(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopProcess()
|
||||||
|
{
|
||||||
|
StatusReset();
|
||||||
|
VisionPos(false);
|
||||||
|
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();
|
||||||
|
TurnStart(false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
{
|
{
|
||||||
StatusReset();
|
StatusReset();
|
||||||
@@ -752,7 +911,12 @@ namespace DH.Devices.PLC
|
|||||||
CountToZero();
|
CountToZero();
|
||||||
TurnStart(false);
|
TurnStart(false);
|
||||||
TurnEnable(false);
|
TurnEnable(false);
|
||||||
|
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断开连接");
|
||||||
}
|
}
|
||||||
@@ -827,6 +991,7 @@ namespace DH.Devices.PLC
|
|||||||
if (pLCItem == null)
|
if (pLCItem == null)
|
||||||
return;
|
return;
|
||||||
WriteBool(pLCItem.Address, b);
|
WriteBool(pLCItem.Address, b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -839,6 +1004,7 @@ namespace DH.Devices.PLC
|
|||||||
if (pLCItem == null)
|
if (pLCItem == null)
|
||||||
return;
|
return;
|
||||||
WriteUInt16(pLCItem.Address, (ushort)speed);
|
WriteUInt16(pLCItem.Address, (ushort)speed);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -850,7 +1016,6 @@ namespace DH.Devices.PLC
|
|||||||
if (DiskRunItem == null)
|
if (DiskRunItem == null)
|
||||||
return;
|
return;
|
||||||
WriteBool(DiskRunItem.Address, b);
|
WriteBool(DiskRunItem.Address, b);
|
||||||
Thread.Sleep(30);
|
|
||||||
piecesCount = 0;
|
piecesCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,101 +1081,199 @@ namespace DH.Devices.PLC
|
|||||||
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)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
int timeout = 60000;
|
||||||
|
int elapsedTime = 0;
|
||||||
|
int checkInterval = 100;
|
||||||
|
MotorToZero(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
|
||||||
|
MotorClockwise(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
MotorCounterclockwise(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
|
||||||
|
MotorSpeed(speed); // 速度
|
||||||
|
Thread.Sleep(300);
|
||||||
|
// 发送回原点指令
|
||||||
|
MotorToZero(true);
|
||||||
|
Thread.Sleep(1000); // 给设备一些时间响应
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 等待回到原点
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (elapsedTime >= timeout)
|
||||||
|
{
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Error, $"超时");
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ReadMotorRealPos() == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Thread.Sleep(checkInterval);
|
||||||
|
elapsedTime += checkInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
MotorToZero(false);
|
||||||
|
Thread.Sleep(200);
|
||||||
|
MotorClockwise(false);
|
||||||
|
Thread.Sleep(200);
|
||||||
|
MotorCounterclockwise(false);
|
||||||
|
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
|
||||||
|
// MotorSpeed(speed);
|
||||||
|
|
||||||
|
Thread.Sleep(300);
|
||||||
|
MotorPos(pos); // 目标位置
|
||||||
|
Thread.Sleep(300);
|
||||||
|
if (direction)
|
||||||
|
{
|
||||||
|
MotorClockwise(true); // 顺时针转动
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MotorCounterclockwise(true); // 逆时针转动
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int timeout1 = 60000;
|
||||||
|
int elapsedTime1 = 0;
|
||||||
|
int checkInterval1 = 100;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (elapsedTime1 >= timeout1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ReadMotorRealPos() == pos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Thread.Sleep(checkInterval1);
|
||||||
|
elapsedTime1 += checkInterval1;
|
||||||
|
}
|
||||||
|
Thread.Sleep(1500);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 挡料电机操作
|
/// 挡料电机操作
|
||||||
/// true: 顺时针
|
/// true: 顺时针
|
||||||
/// False: 逆时针
|
/// False: 逆时针
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="u"></param>
|
/// <param name="u"></param>
|
||||||
public void FeedingMotor( bool direction)
|
public void FeedingMotor(bool direction, int speed, int pos)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
// 设置最大等待时间,假设为 3 秒
|
int timeout = 10000;
|
||||||
int timeout = 3000;
|
|
||||||
int elapsedTime = 0;
|
int elapsedTime = 0;
|
||||||
int checkInterval = 100; // 每次检查等待 100ms
|
int checkInterval = 100;
|
||||||
|
|
||||||
PLCItem pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点");
|
|
||||||
if (pLCItem == null)
|
|
||||||
return;
|
|
||||||
PLCItem zerospeeditem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点速度");
|
|
||||||
if (zerospeeditem == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PLCItem CunSpeed = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机速度");
|
|
||||||
if (CunSpeed == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PLCItem CunClockwiseItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机顺时针");
|
|
||||||
if (CunClockwiseItem == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PLCItem CunCounterclockwiseItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机逆时针");
|
|
||||||
if (CunCounterclockwiseItem == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PLCItem CunPosItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机位置");
|
|
||||||
if (CunPosItem == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
string CunToZero = pLCItem.Type + pLCItem.Address;
|
|
||||||
string CunToZeroSpeed = zerospeeditem.Type + zerospeeditem.Address;
|
|
||||||
string CunSpeedadress = CunSpeed.Type + CunSpeed.Address;
|
|
||||||
string CunClockwise = CunClockwiseItem.Type + CunClockwiseItem.Address;
|
|
||||||
string CunCounterclockwise = CunCounterclockwiseItem.Type + CunCounterclockwiseItem.Address;
|
|
||||||
string CunPos = CunPosItem.Type + CunPosItem.Address;
|
|
||||||
UInt16 zerospeed = UInt16.Parse(zerospeeditem.Value);
|
|
||||||
UInt16 cunSpeed = UInt16.Parse(CunSpeed.Value);
|
|
||||||
UInt16 u = UInt16.Parse(CunPosItem.Value);
|
|
||||||
// WriteBool(CountToZero, true);
|
|
||||||
|
|
||||||
|
BarrierToZero(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
// 检查是否不在原点,如果不在,则回原点
|
// 检查是否不在原点,如果不在,则回原点
|
||||||
if (!ReadBool(CunToZero))
|
BarrierClockwise(false);
|
||||||
{
|
Thread.Sleep(300);
|
||||||
WriteUInt16(CunToZeroSpeed, zerospeed); // 速度
|
BarrierCounterclockwise(false);
|
||||||
Thread.Sleep(30);
|
Thread.Sleep(300);
|
||||||
|
BarrierToZeroSpeed(speed); // 速度
|
||||||
|
Thread.Sleep(300);
|
||||||
// 发送回原点指令
|
// 发送回原点指令
|
||||||
WriteBool(CunToZero, true);
|
BarrierToZero(true);
|
||||||
Thread.Sleep(1000); // 给设备一些时间响应
|
Thread.Sleep(300); // 给设备一些时间响应
|
||||||
|
|
||||||
// 等待回到原点
|
// 等待回到原点
|
||||||
while (!ReadBool(CunToZero))
|
while (true)
|
||||||
{
|
{
|
||||||
if (elapsedTime >= timeout)
|
if (elapsedTime >= timeout)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ReadBarrierRealPos() == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
Thread.Sleep(checkInterval);
|
Thread.Sleep(checkInterval);
|
||||||
elapsedTime += checkInterval;
|
elapsedTime += checkInterval;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
BarrierToZero(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
// 检查是否不在原点,如果不在,则回原点
|
||||||
|
BarrierClockwise(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
BarrierCounterclockwise(false);
|
||||||
|
Thread.Sleep(300);
|
||||||
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
|
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
|
||||||
|
BarrierSpeed(speed);
|
||||||
|
Thread.Sleep(300);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WriteUInt16(CunSpeedadress,cunSpeed);
|
|
||||||
Thread.Sleep(2000);
|
|
||||||
string dir = string.Empty;
|
|
||||||
if (direction)
|
if (direction)
|
||||||
{
|
{
|
||||||
WriteBool(CunClockwise, true); // 顺时针转动
|
BarrierClockwise(true); // 顺时针转动
|
||||||
dir = "顺时针";
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WriteBool(CunCounterclockwise, true); // 逆时针转动
|
BarrierCounterclockwise(true); // 逆时针转动
|
||||||
dir = "逆时针";
|
|
||||||
}
|
|
||||||
Thread.Sleep(30);
|
|
||||||
WriteUInt16(CunPos, u); // 目标位置
|
|
||||||
Thread.Sleep(2000);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Thread.Sleep(300);
|
||||||
|
BarrierPos(pos); // 目标位置
|
||||||
|
Thread.Sleep(300);
|
||||||
|
int timeout1 = 10000;
|
||||||
|
int elapsedTime1 = 0;
|
||||||
|
int checkInterval1 = 100;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (elapsedTime1 >= timeout1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ReadBarrierRealPos() == pos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Thread.Sleep(checkInterval1);
|
||||||
|
elapsedTime1 += checkInterval1;
|
||||||
|
}
|
||||||
|
Thread.Sleep(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 转盘清料
|
/// 转盘清料
|
||||||
@@ -1039,7 +1302,8 @@ namespace DH.Devices.PLC
|
|||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
//开启心跳
|
//开启心跳
|
||||||
Task.Run(async () => await HeartbeatAsync1());
|
//Task.Run(async () => await HeartbeatAsync1());
|
||||||
|
_taskFac.StartNew(async () => await HeartbeatAsync1());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1052,16 +1316,241 @@ namespace DH.Devices.PLC
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读取定位脉冲
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
|
||||||
public int ReadVisionPos()
|
public int ReadVisionPos()
|
||||||
{
|
{
|
||||||
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "定位完成脉冲值");
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "定位完成脉冲值");
|
||||||
if (pLCItem == null)
|
if (pLCItem == null)
|
||||||
return 0;
|
return 0;
|
||||||
int value = ReadInt32(pLCItem.Address);
|
int value = ReadInt32(pLCItem.Address);
|
||||||
Thread.Sleep(10);
|
Thread.Sleep(100);
|
||||||
return Math.Abs(value);
|
return Math.Abs(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆回原点
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierToZero(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(pLCItem.Address, b);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 变焦相机回原点
|
||||||
|
/// </summary>
|
||||||
|
public void ZoomcameraToZero(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "步进电机回原点");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(pLCItem.Address, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读取挡料电机实时位置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public int ReadBarrierRealPos()
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机实时位置");
|
||||||
|
if (pLCItem == null)
|
||||||
|
{
|
||||||
|
throw new Exception("未找到挡料电机实时位置点位");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReadInt16(pLCItem.Address);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 读取 挡杆回原点状态
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
|
||||||
|
public bool ReadBarrierToZero()
|
||||||
|
{
|
||||||
|
//PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点");
|
||||||
|
//if (pLCItem == null)
|
||||||
|
//{
|
||||||
|
// throw new Exception("未找到挡料电机回原点点位");
|
||||||
|
//}
|
||||||
|
//挡料电机传感器感应点
|
||||||
|
return ReadBool("X11");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆回原点速度
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierToZeroSpeed(int speed)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点速度");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteInt32(pLCItem.Address, speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆位置
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierPos(int value)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机位置");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteInt16(pLCItem.Address, (short)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆速度
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierSpeed(int value)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机速度");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteUInt32(pLCItem.Address, (uint)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆顺时针
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierClockwise(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机顺时针");
|
||||||
|
if (DiskRunItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(DiskRunItem.Address, b);
|
||||||
|
Thread.Sleep(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 挡杆逆时针
|
||||||
|
/// </summary>
|
||||||
|
public void BarrierCounterclockwise(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机逆时针");
|
||||||
|
if (DiskRunItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(DiskRunItem.Address, b);
|
||||||
|
Thread.Sleep(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进电机回原点
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="b"></param>
|
||||||
|
public void MotorToZero(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进原点");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(pLCItem.Address, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读取相机步进电机回原点状态
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
public bool ReadMotorToZero()
|
||||||
|
{
|
||||||
|
//PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进原点");
|
||||||
|
//if (pLCItem == null)
|
||||||
|
//{
|
||||||
|
// throw new Exception("未找到挡料电机回原点点位");
|
||||||
|
//}
|
||||||
|
//return ReadBool(pLCItem.Address);
|
||||||
|
return ReadBool("X10");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进电机位置
|
||||||
|
/// </summary>
|
||||||
|
/// <param></param>
|
||||||
|
public void MotorPos(int value)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进位置");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteInt32(pLCItem.Address, (ushort)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public int ReadMotorRealPos()
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进实时位置");
|
||||||
|
if (pLCItem == null)
|
||||||
|
{
|
||||||
|
throw new Exception("未找到相机步进实时位置");
|
||||||
|
}
|
||||||
|
return ReadInt32(pLCItem.Address);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进电机速度
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="b"></param>
|
||||||
|
public void MotorSpeed(int speed)
|
||||||
|
{
|
||||||
|
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进速度");
|
||||||
|
if (pLCItem == null)
|
||||||
|
return;
|
||||||
|
WriteInt32(pLCItem.Address, speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进顺时针
|
||||||
|
/// </summary>
|
||||||
|
public void MotorClockwise(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进顺时针");
|
||||||
|
if (DiskRunItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(DiskRunItem.Address, b);
|
||||||
|
Thread.Sleep(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进逆时针
|
||||||
|
/// </summary>
|
||||||
|
public void MotorCounterclockwise(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进逆时针");
|
||||||
|
if (DiskRunItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(DiskRunItem.Address, b);
|
||||||
|
Thread.Sleep(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 相机步进点动
|
||||||
|
/// </summary>
|
||||||
|
public void MotorTest(bool b)
|
||||||
|
{
|
||||||
|
PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "点动相机步进");
|
||||||
|
if (DiskRunItem == null)
|
||||||
|
return;
|
||||||
|
WriteBool(DiskRunItem.Address, b);
|
||||||
|
Thread.Sleep(30);
|
||||||
|
}
|
||||||
|
|
||||||
public void LogAsync(LogMsg msg)
|
public void LogAsync(LogMsg msg)
|
||||||
{
|
{
|
||||||
msg.MsgSource = "PLC";
|
msg.MsgSource = "PLC";
|
||||||
|
@@ -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);
|
||||||
|
@@ -31,6 +31,8 @@ namespace DH.Devices.Vision
|
|||||||
public List<SimboStationMLEngineSet> SimboStationMLEngineList = new List<SimboStationMLEngineSet>();
|
public List<SimboStationMLEngineSet> SimboStationMLEngineList = new List<SimboStationMLEngineSet>();
|
||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
//InitialQueue();
|
//InitialQueue();
|
||||||
InitialHalconTools();
|
InitialHalconTools();
|
||||||
@@ -40,6 +42,12 @@ namespace DH.Devices.Vision
|
|||||||
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
|
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
|
||||||
// base.Init();
|
// base.Init();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
SimboStationMLEngineList.ToList().ForEach(sm =>
|
SimboStationMLEngineList.ToList().ForEach(sm =>
|
||||||
@@ -291,11 +299,18 @@ namespace DH.Devices.Vision
|
|||||||
/// 初始化深度学习工具
|
/// 初始化深度学习工具
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private bool InitialSimboMLEnginesAsync()
|
private bool InitialSimboMLEnginesAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
//深度学习 模型加载
|
//深度学习 模型加载
|
||||||
var resultOK = MLLoadModel();
|
var resultOK = MLLoadModel();
|
||||||
return resultOK;
|
return resultOK;
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 深度学习 模型加载
|
/// 深度学习 模型加载
|
||||||
/// </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;
|
||||||
}
|
}
|
||||||
|
@@ -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 |
@@ -10,6 +10,7 @@
|
|||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<Platforms>AnyCPU;x64</Platforms>
|
<Platforms>AnyCPU;x64</Platforms>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
|
<ApplicationIcon>assets\logo.ico</ApplicationIcon>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
@@ -22,6 +23,8 @@
|
|||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<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>
|
||||||
@@ -92,8 +95,11 @@
|
|||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="assets\favicon.ico" />
|
||||||
<None Include="db\db.sqlite">
|
<None Include="db\db.sqlite">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
<!-- 仅在首次生成时复制 -->
|
||||||
|
<Condition>!Exists('$(OutputPath)\db\db.sqlite')</Condition>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
3
DHSoftware/LoginWindow.Designer.cs
generated
3
DHSoftware/LoginWindow.Designer.cs
generated
@@ -53,6 +53,7 @@
|
|||||||
iptName.PlaceholderText = "请输入用户名";
|
iptName.PlaceholderText = "请输入用户名";
|
||||||
iptName.Size = new Size(227, 37);
|
iptName.Size = new Size(227, 37);
|
||||||
iptName.TabIndex = 1;
|
iptName.TabIndex = 1;
|
||||||
|
iptName.Text = "user";
|
||||||
//
|
//
|
||||||
// iptPwd
|
// iptPwd
|
||||||
//
|
//
|
||||||
@@ -62,6 +63,7 @@
|
|||||||
iptPwd.PlaceholderText = "请输入密码";
|
iptPwd.PlaceholderText = "请输入密码";
|
||||||
iptPwd.Size = new Size(227, 37);
|
iptPwd.Size = new Size(227, 37);
|
||||||
iptPwd.TabIndex = 2;
|
iptPwd.TabIndex = 2;
|
||||||
|
iptPwd.Text = "123";
|
||||||
iptPwd.UseSystemPasswordChar = true;
|
iptPwd.UseSystemPasswordChar = true;
|
||||||
//
|
//
|
||||||
// button_cancel
|
// button_cancel
|
||||||
@@ -101,7 +103,6 @@
|
|||||||
Name = "LoginWindow";
|
Name = "LoginWindow";
|
||||||
StartPosition = FormStartPosition.CenterScreen;
|
StartPosition = FormStartPosition.CenterScreen;
|
||||||
Text = "登录界面";
|
Text = "登录界面";
|
||||||
|
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
51
DHSoftware/MainWindow.Designer.cs
generated
51
DHSoftware/MainWindow.Designer.cs
generated
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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,14 +423,9 @@ 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);
|
|
||||||
|
|
||||||
dgvProductNums.DataSource = null;
|
|
||||||
dgvProductNums.DataSource = ProductSummaries;
|
|
||||||
|
|
||||||
|
|
||||||
|
this.BeginInvoke(new MethodInvoker(delegate ()
|
||||||
|
{
|
||||||
|
|
||||||
dgvCamreaNums.Columns.Clear();
|
dgvCamreaNums.Columns.Clear();
|
||||||
|
|
||||||
@@ -606,7 +478,7 @@ namespace DHSoftware
|
|||||||
});
|
});
|
||||||
dgvCamreaNums.AutoGenerateColumns = false;
|
dgvCamreaNums.AutoGenerateColumns = false;
|
||||||
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
|
dgvCamreaNums.DataSource = new BindingList<CameraSummary>(CameraSummaries);
|
||||||
}
|
})); }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -632,49 +504,7 @@ namespace DHSoftware
|
|||||||
segmented1.Items.Remove(itemToHide);
|
segmented1.Items.Remove(itemToHide);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadScheme()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
//方案配置初始化
|
|
||||||
SchemeHelper.Initialize();
|
|
||||||
//读取方案列表
|
|
||||||
List<string> list = SchemeHelper.GetAllSchemes();
|
|
||||||
string CurrentScheme = "默认方案";
|
|
||||||
//如果是空,新增默认数据
|
|
||||||
if (list == null || list.Count <= 0)
|
|
||||||
{
|
|
||||||
list = new() { CurrentScheme };
|
|
||||||
//显示到方案列表
|
|
||||||
sltProjects.Items.Clear();
|
|
||||||
|
|
||||||
sltProjects.Items.Add(CurrentScheme);
|
|
||||||
//保存到方案配置
|
|
||||||
SchemeHelper.AddScheme(CurrentScheme);
|
|
||||||
SchemeHelper.SetCurrentScheme(CurrentScheme);
|
|
||||||
//新构建配置文件
|
|
||||||
ConfigHelper.InitializeScheme(CurrentScheme);
|
|
||||||
|
|
||||||
sltProjects.SelectedIndex = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (string s in list)
|
|
||||||
{
|
|
||||||
sltProjects.Items.Add(s);
|
|
||||||
}
|
|
||||||
CurrentScheme = SchemeHelper.GetCurrentScheme();
|
|
||||||
sltProjects.SelectedValue = CurrentScheme;
|
|
||||||
}
|
|
||||||
SystemModel.CurrentScheme = CurrentScheme;
|
|
||||||
//加载当前方案配置
|
|
||||||
ConfigHelper.LoadConfig();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ConnectCamera()
|
public void ConnectCamera()
|
||||||
{
|
{
|
||||||
@@ -694,7 +524,17 @@ namespace DHSoftware
|
|||||||
cam.CameraName = cameraBase.CameraName;
|
cam.CameraName = cameraBase.CameraName;
|
||||||
cam.CameraIP = cameraBase.CameraIP;
|
cam.CameraIP = cameraBase.CameraIP;
|
||||||
cam.IsEnabled = cameraBase.IsEnabled;
|
cam.IsEnabled = cameraBase.IsEnabled;
|
||||||
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName);
|
cam.IsZoomCamera = cameraBase.IsZoomCamera;
|
||||||
|
cam.DvpImageFormat = cameraBase.DvpImageFormat;
|
||||||
|
cam.Exposure = cameraBase.Exposure;
|
||||||
|
cam.Gain = cameraBase.Gain;
|
||||||
|
cam.RotateImage = cameraBase.RotateImage;
|
||||||
|
cam.IsAllPicEnabled=cameraBase.IsAllPicEnabled;
|
||||||
|
cam.ROIX= cameraBase.ROIX;
|
||||||
|
cam.ROIH= cameraBase.ROIH;
|
||||||
|
cam.ROIW= cameraBase.ROIW;
|
||||||
|
cam.ROIY=cameraBase.ROIY;
|
||||||
|
cam.ImageSaveDirectory = Path.Combine("D://Projects//Images", cameraBase.CameraName);
|
||||||
Cameras.Add(cam);
|
Cameras.Add(cam);
|
||||||
if (cameraBase.IsEnabled)
|
if (cameraBase.IsEnabled)
|
||||||
{
|
{
|
||||||
@@ -739,6 +579,8 @@ namespace DHSoftware
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void ConnectPLC()
|
public void ConnectPLC()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (ConfigModel.PLCBaseList.Count > 0)
|
if (ConfigModel.PLCBaseList.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -755,7 +597,7 @@ namespace DHSoftware
|
|||||||
PLC.Port = plcBase.Port;
|
PLC.Port = plcBase.Port;
|
||||||
PLC.OnLog -= _visionEngine_OnLog;
|
PLC.OnLog -= _visionEngine_OnLog;
|
||||||
PLC.OnLog += _visionEngine_OnLog;
|
PLC.OnLog += _visionEngine_OnLog;
|
||||||
if(PLC.Enable)
|
if (PLC.Enable)
|
||||||
{
|
{
|
||||||
PLC.PLCConnect();
|
PLC.PLCConnect();
|
||||||
Button CamLabel = new Button();
|
Button CamLabel = new Button();
|
||||||
@@ -782,10 +624,18 @@ namespace DHSoftware
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FrmLog frmLog;
|
FrmLog frmLog;
|
||||||
public void InitModel()
|
public void InitModel()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
Dectection.Clear();
|
Dectection.Clear();
|
||||||
_cameraRelatedDetectionDict = new();
|
_cameraRelatedDetectionDict = new();
|
||||||
@@ -804,9 +654,9 @@ namespace DHSoftware
|
|||||||
detectionConfig.IsEnabled = detection.IsEnabled;
|
detectionConfig.IsEnabled = detection.IsEnabled;
|
||||||
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
|
detectionConfig.ImageSaveDirectory = "D://Projects//Images";
|
||||||
|
|
||||||
detectionConfig.ShowLocation.X = (i + 1) % 5 + (i + 1) / 5;
|
// 优化后代码
|
||||||
// detectionConfig.ShowLocation.X = detection.ShowLocation.X;
|
detectionConfig.ShowLocation.X = (i % 5) + 1; // X坐标从1开始,每行1-5
|
||||||
detectionConfig.ShowLocation.Y = (i + 1) / 5 + 1;
|
detectionConfig.ShowLocation.Y = (i / 5) + 1; // Y坐标从1开始,每5个换行
|
||||||
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
|
// detectionConfig.ShowLocation.Y = detection.ShowLocation.Y;
|
||||||
DetectionConfigs.Add(detectionConfig);
|
DetectionConfigs.Add(detectionConfig);
|
||||||
}
|
}
|
||||||
@@ -847,6 +697,11 @@ namespace DHSoftware
|
|||||||
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -950,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)
|
||||||
//{
|
//{
|
||||||
@@ -965,7 +820,36 @@ namespace DHSoftware
|
|||||||
lblUPH.Text = UPM.ToString();
|
lblUPH.Text = UPM.ToString();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
public void LoadScheme()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 初始化方案配置(会自动创建默认方案)
|
||||||
|
SchemeHelper.Initialize();
|
||||||
|
|
||||||
|
// 读取方案列表
|
||||||
|
var schemes = SchemeHelper.GetAllSchemes();
|
||||||
|
sltProjects.Items.Clear();
|
||||||
|
|
||||||
|
// 绑定方案到下拉列表
|
||||||
|
foreach (var scheme in schemes)
|
||||||
|
{
|
||||||
|
sltProjects.Items.Add(scheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置当前选中的方案
|
||||||
|
string currentScheme = SchemeHelper.GetCurrentScheme();
|
||||||
|
sltProjects.SelectedValue = currentScheme;
|
||||||
|
SystemModel.CurrentScheme = currentScheme;
|
||||||
|
|
||||||
|
// 加载当前方案配置
|
||||||
|
ConfigHelper.LoadConfig();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
private void BtnDeleteProject_Click(object? sender, EventArgs e)
|
private void BtnDeleteProject_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -975,29 +859,21 @@ namespace DHSoftware
|
|||||||
var result = AntdUI.Modal.open(this, "删除警告!", "确认要删除该方案吗?", TType.Warn);
|
var result = AntdUI.Modal.open(this, "删除警告!", "确认要删除该方案吗?", TType.Warn);
|
||||||
if (result == DialogResult.OK)
|
if (result == DialogResult.OK)
|
||||||
{
|
{
|
||||||
|
string schemeToDelete = sltProjects.Text;
|
||||||
int selectedIndex = sltProjects.SelectedIndex;
|
int selectedIndex = sltProjects.SelectedIndex;
|
||||||
|
|
||||||
// 删除当前选中项
|
// 删除方案(SchemeHelper会自动处理当前方案的切换)
|
||||||
SchemeHelper.DeleteScheme(sltProjects.Text);
|
SchemeHelper.DeleteScheme(schemeToDelete);
|
||||||
ConfigHelper.DeleteSchemeConfig(sltProjects.Text);
|
ConfigHelper.DeleteSchemeConfig(schemeToDelete);
|
||||||
AntdUI.Message.success(this, $"删除方案{sltProjects.Text}成功!", autoClose: 3);
|
|
||||||
sltProjects.Items.RemoveAt(selectedIndex);
|
|
||||||
// 自动选择下一个(如果存在)
|
|
||||||
if (sltProjects.Items.Count > 0)
|
|
||||||
{
|
|
||||||
// 如果删除的不是最后一项,则选中原位置的新项,否则选中最后一项
|
|
||||||
sltProjects.SelectedIndex = selectedIndex < sltProjects.Items.Count
|
|
||||||
? selectedIndex
|
|
||||||
: sltProjects.Items.Count - 1;
|
|
||||||
|
|
||||||
SystemModel.CurrentScheme = sltProjects.Text;
|
// 刷新UI
|
||||||
SchemeHelper.SetCurrentScheme(SystemModel.CurrentScheme);
|
LoadScheme();
|
||||||
//加载当前方案配置
|
|
||||||
ConfigHelper.LoadConfig();
|
AntdUI.Message.success(this, $"删除方案{schemeToDelete}成功!", autoClose: 3);
|
||||||
}
|
|
||||||
else
|
// 如果没有方案了,提示用户
|
||||||
|
if (sltProjects.Items.Count == 0)
|
||||||
{
|
{
|
||||||
sltProjects.SelectedIndex = -1; // 清空选择
|
|
||||||
AntdUI.Modal.open(this, "空方案警告!", "当前方案全部删除,需重启程序!", TType.Warn);
|
AntdUI.Modal.open(this, "空方案警告!", "当前方案全部删除,需重启程序!", TType.Warn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1013,18 +889,23 @@ namespace DHSoftware
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return;
|
if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return;
|
||||||
if (SystemModel.CurrentScheme == sltProjects.Text)
|
|
||||||
|
string selectedScheme = sltProjects.Text;
|
||||||
|
|
||||||
|
if (SystemModel.CurrentScheme == selectedScheme)
|
||||||
{
|
{
|
||||||
AntdUI.Message.warn(this, "当前已是该方案,无需重复载入!", autoClose: 3);
|
AntdUI.Message.warn(this, "当前已是该方案,无需重复载入!", autoClose: 3);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//修改当前软件当前方案
|
|
||||||
SystemModel.CurrentScheme = sltProjects.Text;
|
// 设置当前方案
|
||||||
//修改配置当前方案
|
SchemeHelper.SetCurrentScheme(selectedScheme);
|
||||||
SchemeHelper.SetCurrentScheme(SystemModel.CurrentScheme);
|
SystemModel.CurrentScheme = selectedScheme;
|
||||||
//将配置文件替换为当前方案
|
|
||||||
|
// 加载配置
|
||||||
ConfigHelper.LoadConfig();
|
ConfigHelper.LoadConfig();
|
||||||
AntdUI.Message.success(this, $"载入方案{SystemModel.CurrentScheme}成功!", autoClose: 3);
|
|
||||||
|
AntdUI.Message.success(this, $"载入方案{selectedScheme}成功!", autoClose: 3);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -1041,31 +922,27 @@ namespace DHSoftware
|
|||||||
{
|
{
|
||||||
BtnHeight = 0,
|
BtnHeight = 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (form.submit)
|
if (form.submit)
|
||||||
{
|
{
|
||||||
string SchemeName = form.SchemeName;
|
string schemeName = form.SchemeName;
|
||||||
//保存到方案配置
|
|
||||||
SchemeHelper.AddScheme(SchemeName);
|
// 保存到方案配置
|
||||||
|
SchemeHelper.AddScheme(schemeName);
|
||||||
|
|
||||||
|
// 根据选择初始化配置
|
||||||
if (form.NullScheme)
|
if (form.NullScheme)
|
||||||
{
|
{
|
||||||
//新构建配置文件
|
ConfigHelper.InitializeScheme(schemeName);
|
||||||
ConfigHelper.InitializeScheme(SchemeName);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//派生当前方案
|
ConfigHelper.DeriveScheme(schemeName);
|
||||||
ConfigHelper.DeriveScheme(SchemeName);
|
|
||||||
}
|
}
|
||||||
//刷新方案列表
|
|
||||||
sltProjects.Items.Clear();
|
// 刷新UI
|
||||||
List<string> list = SchemeHelper.GetAllSchemes();
|
LoadScheme();
|
||||||
foreach (string s in list)
|
AntdUI.Message.success(this, $"新增方案{schemeName}成功!", autoClose: 3);
|
||||||
{
|
|
||||||
sltProjects.Items.Add(s);
|
|
||||||
}
|
|
||||||
string CurrentScheme = SchemeHelper.GetCurrentScheme();
|
|
||||||
sltProjects.SelectedValue = CurrentScheme;
|
|
||||||
AntdUI.Message.success(this, $"新增方案{SchemeName}成功!", autoClose: 3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1079,11 +956,87 @@ namespace DHSoftware
|
|||||||
public Dictionary<string, SimboObjectDetection> Dectection { get; } = new Dictionary<string, SimboObjectDetection>();
|
public Dictionary<string, SimboObjectDetection> Dectection { get; } = new Dictionary<string, SimboObjectDetection>();
|
||||||
public XinJEPLCTcpNet PLC { get; } = XinJEPLCTcpNet.Instance;
|
public XinJEPLCTcpNet PLC { get; } = XinJEPLCTcpNet.Instance;
|
||||||
private SLDMotion sLDMotion = new SLDMotion();
|
private SLDMotion sLDMotion = new SLDMotion();
|
||||||
|
// 线程控制标志
|
||||||
|
private volatile bool _isRunning = false;
|
||||||
|
private Thread _monitorThread;
|
||||||
private void MainWindow_Load(object sender, EventArgs e)
|
private void MainWindow_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//开启按钮监听
|
||||||
|
// 启动所有监控线程
|
||||||
|
StartAllMonitors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void StartAllMonitors()
|
||||||
|
{
|
||||||
|
if (PLC.Connected)
|
||||||
|
{
|
||||||
|
if (_monitorThread == null || !_monitorThread.IsAlive)
|
||||||
|
{
|
||||||
|
//关闭按钮自身功能(比如按按钮转盘自己启动等)
|
||||||
|
PLC.WriteBool("M40", true);
|
||||||
|
_isRunning = true;
|
||||||
|
_monitorThread = new Thread(MonitorPlcButtons);
|
||||||
|
_monitorThread.IsBackground = true; // 后台线程
|
||||||
|
_monitorThread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MonitorPlcButtons(object? obj)
|
||||||
|
{
|
||||||
|
while (_isRunning)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 读取 PLC 输入点状态
|
||||||
|
bool startPressed = PLC.ReadBool("X3");
|
||||||
|
bool resetPressed = PLC.ReadBool("X4");
|
||||||
|
bool stopPressed = PLC.ReadBool("X5");
|
||||||
|
bool eStopPressed = PLC.ReadBool("X6");
|
||||||
|
|
||||||
|
// 处理按钮状态变化
|
||||||
|
if (startPressed)
|
||||||
|
{
|
||||||
|
|
||||||
|
HandleStartButton();
|
||||||
|
}
|
||||||
|
if (resetPressed)
|
||||||
|
{
|
||||||
|
//ResetProcess();
|
||||||
|
}
|
||||||
|
if (stopPressed)
|
||||||
|
{
|
||||||
|
HandleStopButton();
|
||||||
|
}
|
||||||
|
if (eStopPressed)
|
||||||
|
{
|
||||||
|
//EmergencyStop(null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.Sleep(150);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_isRunning = false;
|
||||||
|
// 记录错误并停止线程
|
||||||
|
// throw new ProcessException($"按钮监听线程:{ex.Message}");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止监听线程
|
||||||
|
private void StopMonitoring()
|
||||||
|
{
|
||||||
|
_isRunning = false;
|
||||||
|
if (_monitorThread != null && _monitorThread.IsAlive)
|
||||||
|
{
|
||||||
|
_monitorThread.Join(1000); // 等待线程退出
|
||||||
|
}
|
||||||
|
PLC.WriteBool("M40", false);
|
||||||
|
}
|
||||||
private bool _isClosing = false; // 状态标志
|
private bool _isClosing = false; // 状态标志
|
||||||
|
|
||||||
private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
|
private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
@@ -1110,10 +1063,13 @@ namespace DHSoftware
|
|||||||
{
|
{
|
||||||
camera.CameraDisConnect();
|
camera.CameraDisConnect();
|
||||||
}
|
}
|
||||||
|
StopMonitoring();
|
||||||
if (PLC != null)
|
if (PLC != null)
|
||||||
{
|
{
|
||||||
PLC.CloseProcess();
|
PLC.CloseProcess();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_visionEngine.Stop();//释放模型
|
_visionEngine.Stop();//释放模型
|
||||||
CloseWindow.Instance.Close();// 关闭提示窗口
|
CloseWindow.Instance.Close();// 关闭提示窗口
|
||||||
//Application.Exit();
|
//Application.Exit();
|
||||||
@@ -1202,19 +1158,69 @@ namespace DHSoftware
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void HandleStartButton()
|
private void HandleStartButton()
|
||||||
|
{
|
||||||
|
lock (_stopLock)
|
||||||
|
{
|
||||||
|
if (_isStopProcessing) return;
|
||||||
|
_isStopProcessing = true;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (SystemModel.CurrentStatus == EnumStatus.待机中)
|
||||||
{
|
{
|
||||||
InitialCameraSumsView();
|
InitialCameraSumsView();
|
||||||
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
|
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
|
||||||
ResetAllCameraCounts();
|
ResetAllCameraCounts();
|
||||||
//开始流程
|
//开始流程
|
||||||
|
|
||||||
StartProcess();
|
StartProcess();
|
||||||
|
SystemModel.CurrentStatus = EnumStatus.运行中;
|
||||||
|
this.BeginInvoke(new MethodInvoker(delegate ()
|
||||||
|
{
|
||||||
|
tagMachineStatus.Type = TTypeMini.Success;
|
||||||
|
tagMachineStatus.Text = "运行中";
|
||||||
|
}));
|
||||||
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void StartProcess()
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private async void StartProcess()
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
BatchNO = textBoxBatchNO.Text;
|
BatchNO = textBoxBatchNO.Text;
|
||||||
textBoxBatchNO.ReadOnly = true;
|
textBoxBatchNO.ReadOnly = true;
|
||||||
btnCreateBatchNO.Enabled = false;
|
btnCreateBatchNO.Enabled = false;
|
||||||
@@ -1303,19 +1309,39 @@ namespace DHSoftware
|
|||||||
|
|
||||||
#endregion 虚拟相机
|
#endregion 虚拟相机
|
||||||
|
|
||||||
var settings = _visionEngine.DetectionConfigs.Where(u => u.IsEnabled && u.IsAddStation).ToList();
|
|
||||||
|
///这里会执行完成后,会造成后台线程断断续续,会造成界面UI卡顿
|
||||||
|
//var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList();
|
||||||
|
//if (settings != null)
|
||||||
|
//{
|
||||||
|
// settings = settings.Where(s => s.IsEnabled).ToList();
|
||||||
|
// ProductBaseCount = settings.Count;
|
||||||
|
|
||||||
|
// for (int i = 0; i < ProductBaseCount * ProductListMulti; i++)
|
||||||
|
// {
|
||||||
|
// ConcurrentDictionary<uint, ProductData> products = new ConcurrentDictionary<uint, ProductData>();
|
||||||
|
// _productLists.Add(products);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList();
|
||||||
if (settings != null)
|
if (settings != null)
|
||||||
{
|
{
|
||||||
settings = settings.Where(s => s.IsEnabled).ToList();
|
|
||||||
ProductBaseCount = settings.Count;
|
ProductBaseCount = settings.Count;
|
||||||
|
_productLists.Clear(); // 清空旧数据
|
||||||
|
|
||||||
|
// 预分配列表容量(减少动态扩容开销)
|
||||||
|
_productLists.Capacity = ProductBaseCount * ProductListMulti;
|
||||||
|
|
||||||
for (int i = 0; i < ProductBaseCount * ProductListMulti; i++)
|
for (int i = 0; i < ProductBaseCount * ProductListMulti; i++)
|
||||||
{
|
{
|
||||||
ConcurrentDictionary<uint, ProductData> products = new ConcurrentDictionary<uint, ProductData>();
|
_productLists.Add(new ConcurrentDictionary<uint, ProductData>());
|
||||||
_productLists.Add(products);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
// _MGSCameraList = DeviceCollection
|
// _MGSCameraList = DeviceCollection
|
||||||
//.OfType<MGSCameraDriver>() // 直接筛选出 MGSCameraDriver 类型的元素
|
//.OfType<MGSCameraDriver>() // 直接筛选出 MGSCameraDriver 类型的元素
|
||||||
//.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true
|
//.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true
|
||||||
@@ -1325,10 +1351,15 @@ namespace DHSoftware
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
InitialOEEStatistic();
|
||||||
//流程执行时PLC
|
//流程执行时PLC
|
||||||
PLC.StartProcess();
|
PLC.StartProcess();
|
||||||
InitialOEEStatistic();
|
CurrentMachine = true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1363,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)
|
||||||
@@ -1754,7 +1785,23 @@ namespace DHSoftware
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleStopButton()
|
private readonly object _stopLock = new object(); // 锁对象
|
||||||
|
private bool _isStopProcessing = false; // 状态标志
|
||||||
|
private async void HandleStopButton()
|
||||||
|
{
|
||||||
|
// 通过锁和状态标志实现双重检查
|
||||||
|
lock (_stopLock)
|
||||||
|
{
|
||||||
|
if (_isStopProcessing) return;
|
||||||
|
_isStopProcessing = true;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (SystemModel.CurrentStatus == EnumStatus.待机中)
|
||||||
|
{
|
||||||
|
LogAsync(DateTime.Now, LogLevel.Warning, "设备待机中,无需停止!");
|
||||||
|
}
|
||||||
|
else if (SystemModel.CurrentStatus == EnumStatus.运行中)
|
||||||
{
|
{
|
||||||
textBoxBatchNO.ReadOnly = false;
|
textBoxBatchNO.ReadOnly = false;
|
||||||
btnCreateBatchNO.Enabled = true;
|
btnCreateBatchNO.Enabled = true;
|
||||||
@@ -1762,12 +1809,65 @@ namespace DHSoftware
|
|||||||
// Cameras.Clear();
|
// Cameras.Clear();
|
||||||
// Dectection.Clear();
|
// Dectection.Clear();
|
||||||
// Add the code for the "停止" button click here
|
// Add the code for the "停止" button click here
|
||||||
PLC.TurnStart(false);
|
PLC.StopProcess();
|
||||||
CurrentMachine = true;
|
SystemModel.CurrentStatus = EnumStatus.待机中;
|
||||||
//sLDMotion.Stop();
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//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()
|
||||||
{
|
{
|
||||||
|
@@ -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//vKcf/7ynH/28ph/su6cfy7unH6W8ph55uqUfSrymFhcAAAABAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px77vKcf7bym
|
|
||||||
H9i7px+WuqogMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
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/rumH766px1OuaIjFv//AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+9px/2vacfvbymIGe1nyAYAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/wvKcexbyn
|
|
||||||
Htq7px71vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
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
|
|
||||||
HkW8px/3vKcf/7ynH/+8px//vKcf/7yoH++6px9RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAALymIRe7px/DvKcf/7ynH/+8px//vKcf/7ynH/y7pR+Dv4AABAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
|
|
||||||
u08AAAAAAAAAAAAAAAAAAAAAAAAAAMyZMwW7px+LvKcf/rynH/+8px//vKcf/7ynH/+8px6ru6oiDwAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
|
|
||||||
u/9AxLv/QMS7/0DEvOdAxLvcQMS73EDEu9xAxLvcQMS73EDEu9x0uHrruKkk/rynH/+8px//vKcf/7yn
|
|
||||||
H/+lrTz2TcGp30DEu9xAxLvcQMS73EDEu9xAxLvcQMS73EDEut9AxLv2QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
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
|
|
||||||
H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAL+/AAS7ph6HvKcf/ryn
|
|
||||||
H/+8px//vKcf/7ynH/+9px+tu6oiDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
|
|
||||||
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAMKq
|
|
||||||
JBW8px+/vKcf/7ynH/+8px//vKcf/7umH/28px+Fv78ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAALqmID+8px/2vKcf/7ynH/+8px//vKcf/7ynH/C8px5UAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
|
|
||||||
u08AAAAAAAAAAAAAAAAAAAAAtpIkB7unHrm8px//vKcf/7ynH/+8px//vKcf/7yoH9i/pBscAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
|
|
||||||
u/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAACAgAACu6ggabynH/28px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
H4UAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAC9px86vKcf4LynH/+8px//vKcf/7yn
|
|
||||||
H/+8px//vKcf6LyuGxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
|
|
||||||
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAL2lIR+9pyC6vKcf/7yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px/5vKgeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAv6cgILyn
|
|
||||||
HrC7px/9vKcf/7ynH/+8px//vKcf/7ynH/68ph6yvKEbEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
|
|
||||||
u0+5qB0su6cfx7ynH/68px//vKcf/7ynH/+8px//vKcf/7ynH+a6qR47//8AAQAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
|
|
||||||
u/9AxLv/RMO2/3y0cIi8ph/VvKcf/7ynH/+8px//vKcf/7ynH/+8px//vKce87ymHl8AAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAE+w7t4QMS7/EHEuv9Tv6P/g7Rm/7apKPq8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/svagebf//
|
|
||||||
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE
|
|
||||||
u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAE+w7t4Q8O3/HW3eP+pqzf/uqch/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7um
|
|
||||||
H/S7piBwtrYkBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAv58gCL2lIR+PsViWqas3/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
H/+9qB/+vagf6rymHWqAgAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAqqoAA76qISe7px9avKcflLynHtS8px77vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px//vKcf/7ynH/y9px/EvKYgSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
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 @@
|
|||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6JAAAIBYAAHdlBQBcTAMAeGYGAIVzBwB6aQUA//0XAFlK
|
||||||
|
AQBRPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAADAAAARRYDADkRBAA1DQAAURoIAP+rVQAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEkAABjUgMAGw8AAKOODAD//xMANy0NBVtP
|
||||||
|
Dgb//wAA1L8VAJyKIQCqlx8A794+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAA8DAQA/7uNALhNOQDLUDoAqkMzAI89KwAAAAAAZScTAEweEgAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRSBABBMwMA//8bAJJ/
|
||||||
|
Cii7pAx80LcNrNe+C7HSug+Owq4TP2JZMAOvnigAtaUqAFdVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4CgQA/XFPAJI9KzSsQy9Zoj8wMHg4LArcXEAAnEcwAMNY
|
||||||
|
PwBfKhUAQygNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANysAAAAA
|
||||||
|
AAD/6xEApY8LQ9K2CtTpywX/8NID//HUAv/v0wT/5c0L69O8HG17cz8DqZorADwmAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBCwAA/5JlALdGLoTdUTT+3lA26M9U
|
||||||
|
NrG4UjVUiEIvC71fPAAAAAAAfEQqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAOzIAAKGICQCUfAob1bcLyfHPBP/x0gH/8tMB//PTAf/y1gD/8dYB/+jPDuvMuyg/3MslAP//
|
||||||
|
/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBDgAA/39YAL1H
|
||||||
|
L4PoUzT/7lU0/+xWNP/jVjf2zlc5pKZaOSXXZz8AAAUWAHtCLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAOi4AANrADwCzmwtb58kG+/LSAf/y0gH/8tQB//LVAf/y1gH/8NcA/+7V
|
||||||
|
Bv/dyCCM//8AAJiKKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAA9DAIA/31TAMBIMIPnUzT/7VQ1/+5VNP/uVzP/6Vg0/9VdOca2YD4sz2hDAP+QYQBcGw4AAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMSgAAP//FAC+pQt+7M4E//LRAP/z0gH/8tQB//LV
|
||||||
|
AP/z1wD/89cA//HYA//l0B2leXOHA6eYMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAA6CgEA/3tRAMBIMYLnUzX/7lU0/+5VM//uVjP/7VY1/+lZM//TYDy5sGNHF7tl
|
||||||
|
RwCuZEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCYAAP//FQDCqAuA7c8E//LS
|
||||||
|
AP/z0gH/89QB//LVAP/z1wD/9NcB//LYA//l0Rume3J1A6WULAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2CgAA/3NLAMFJMIDnUzT/7lUz/+5WM//tVjT/7Vc1/+xY
|
||||||
|
Mv/lXDX+zmVDfgArtQCZVz8AVEIOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOyoAAP//
|
||||||
|
EwDGqgx97c4E//LSAf/y0gH/8tQB//LVAP/z1wD/9NgA//PYAv/l0BqnfnNtA6SSKQAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsBgAA/2xFAMNLMXznVDP/7VQz/+5V
|
||||||
|
NP/tVjT/7lgz/+5YM//uWTP/22I82sNzUyLIclIAj1M5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAOjAAAP//EADFqwt87M4E//HSAf/x0wH/8dQA//LUAP/y1wD/89gA//LZAv/l0RqngHRsBKOT
|
||||||
|
KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAA/2hDAMRM
|
||||||
|
MXroVTT/7lU0/+5VNP/uVjT/7lg0/+9ZNP/vWTP/5101/c5sSGLiakMAXjkaAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAASDAAAP//DwDGrAt77c8E//LTAf/y1AH/8tQB//LVAP/z1wD/89gA//PZ
|
||||||
|
Av/m0RungHRwA6WUKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAHAAAA/2RAAMNMMXnnVDP/7lU0/+5VNP/uVzT/7lk0/+5YM//vWTP/6Vwz/9VmQ5cAoMMBi1A0AAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQTYAAP//EADHrAx9788D//PUAf/01AH/89UB//HW
|
||||||
|
AP/z2AH/9NgB//TaA//o1B2niH18A6qaLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA/mM+AMRMMXnmVTP/7VYz/+5WNP/vWDT/7lkz/+5YM//vWDP/61sz/9dk
|
||||||
|
QLSbdl8HrWlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVEABAP/8DgDKrgx77tAD//LU
|
||||||
|
Af/z1QH/89YB//PXAP/02AH/9NkB//TaA//o1B2nin1+A6uaMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAA/2RAAMRLMXnnVDT/7lY0/+1YM//uWDP/7lkz/+1Y
|
||||||
|
M//tWDP/7Vsz/9tlQbyld18JsWxQAGdSAgB9agUAh3MMAIZxDACLdg4AkXsQAI95EACHdQ4AZFgAAP/o
|
||||||
|
DwDIrQx17c8E//LUAP/y1AH/89cB//PXAP/02AH/9NkB//PaA//o0xylg3aCA6yaMAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAA/2RAAMZMMXjoVTT/7lc0/+9Y
|
||||||
|
NP/uWDP/7lkz/+5YMv/uWDP/5Vw0/9BjP6uSZ3gFy6wbAP/8EwAAABoAHhMgA0U2GwRURR4FXVAgBVdL
|
||||||
|
IAUAADQB6dIaAOfMEgDCqgxp680F//PVAP/z1QH/89cB//PXAf/z2AD/9NkB//PaAv/o0xymhXp9A6qZ
|
||||||
|
MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/WU+AMdO
|
||||||
|
MXXoVzT/7lY0/+5XNP/tWDP/7Vkz/+dZNP7YWDfRw1Y0daJQMymjjBQevaMTSsywD3jXug2V2r4MpNu+
|
||||||
|
DKrcvgys3sAMrN7ADazZwA+azboXSwAAmgG4pBBF58sH9fLWAv/01gH/89cB//PYAP/02QD/9NkA//Pb
|
||||||
|
Av/p1RymhoKFA62fMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA/GU/AMhOMnXoVjX/7lY0/+5XNP/qWTP/2Foz6MNUNX6VSyslqZYNQc2zC5bewQnX58oH9uzO
|
||||||
|
BP/u0QP/8NIC//LSAv/x0QL/8tEC//PSAv/x0QT/6c4K8M6+FmafixQg4ccK2/TWAv/y1wD/89gA//PX
|
||||||
|
AP/12gD/9NkA//PaAv/p1hukgX6MA66hLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA92E+AMdNMnToVjX/71gy/+daM//PWDPMp0stRJ+KDC/KsQqe4cMJ7+3P
|
||||||
|
A//y0QL/89IB//PRAf/x0wH/8dMA//LUAP/y0wH/8dIA//HTAP/y0wD/8tUB/+HKEtOdkygf0rwOnfHU
|
||||||
|
BP/01gD/89gB//PXAP/12gD/9NoA//PaAv/p1hqjfHuhArOmMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA92FAAMVMMnTnVjX/61kz/9FZNcKdRy4suaEOU9q+
|
||||||
|
C9rszwP/89IB//PSAP/z0gD/9NMA//PSAf/y0QH/89IB//LTAf/y1AH/89MB//LTAf/y1AH/89QB/+bO
|
||||||
|
EO67sC00vacSPeXMCe311wH/9NkA//TYAf/12QH/9NoA//PbA//p1Ruhe3a/ArioOQAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+mNAAMNLMXXlVzP/01g1z6BO
|
||||||
|
MC+7pg1i48MJ7PHTAv/z0wH/8tMB//PSAP/z0wD/9NMB//PSAP/z0gH/9NMB//PUAf/y1AH/8tQB//LU
|
||||||
|
Af/z1QL/89YB/+jQD/K/tCw8AAAAAc65DpDu1AT/9NgB//TYAf/12gH/9dsA//TcA//p1RyheXHNArim
|
||||||
|
OwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+2NBAMJL
|
||||||
|
MXjWVjbusE00SrehDFbhwwnt8NMC//LTAv/z1AH/8tMB//PSAP/00wD/9NMA//PTAf/00wH/9NMB//PU
|
||||||
|
Af/z1QH/8tQA//LUAP/01QH/9dYB/+rQD/HBtC07xLQkAKWQEBzXwwy58NYE//TZAP/22wD/9twB//Tc
|
||||||
|
A//q1R2ifnemArKiNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA42BFALdLNHK9TTiKoYkPNNy/Ctzx0gH/8tMA//PVAf/y1QH/8tMB//LTAf/z0wD/9NMB//PT
|
||||||
|
Af/y0wH/8tMB//PTAf/z1AH/89UB//PVAP/01gH/9dcB/+XPEea7rC8rwbEvANnDEgCxnBIl28YNs/DW
|
||||||
|
Bf/22wL/9dwC//TdA//p1x+je4KlArClOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAOAAAA13NYAJJENkONSiwrzbIKoPDPBP/y0wD/8tQB//PVAP/y1AD/8dMA//HT
|
||||||
|
AP/y0wD/9NMB//TTAf/z0wH/8tMB//TTAf/01AD/89UA//TUAf/z1gH/8dYG/9bGGKiMhzQKopcoAP//
|
||||||
|
yQDRvRIApZcTF868D4Tjzwrj8dkG//XdBP/n2Bulc3qcA62iNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAVxwRACQAQQWslQ1F4sYG7/PTAf/x0wH/8tQB//PV
|
||||||
|
AP/y1AD/8dMA//HTAP/z0wH/89QB//LVAv/v0wP/7dEE++zRBvnt0Af68NEG+vDRBvrq0Avx3cgYs7+s
|
||||||
|
JCnaxigArZYaALShFAC0nhYAtqUUAAAAAAG2pw8u0MAPeuHKErvayyaGc32FAqKZNgAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAcFgHAAAAAAPKsA6a7tAE//PU
|
||||||
|
Af/y1AH/89UB//PVAP/y1QD/9NMB//PUAf/01QH/79UF/uTOC87bxBJ/0rkQVs22EVHMthNSzLcPUsy3
|
||||||
|
ElHGshw+qpwnENzHJACGcxYDq5UbHLKeFSKynRcitKEWIKydFhgzNSgD//8WAIV7Gwujni0OlZp5AI2I
|
||||||
|
OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqYwAAmIMNAJN+
|
||||||
|
Dh/avQvZ89MC//HTAf/y1AH/9NYB//PVAP/01QD/9NUB//XVAf/u0wf32sUUi7+uHBv//wAA5ssPAOHJ
|
||||||
|
EgDiyRUA4swQAOLKFADTvh4AtaUjAJmHDwCYhxMV1r8Su+XOCeLlzQvg5c8I3+LPCtTcyBGpz7sZS31+
|
||||||
|
LQSupSgA/9cAAJCKOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AABIQgAAwacPALKaDkPnyAb09dMB//HTAf/y0wD/89UA//PWAP/01QH/89UB/+/VBv/ZyBuWhYUqCMS1
|
||||||
|
GgBjTgoAnIkTAGBRAwBcUgQAW1EDAFlOAwBZSgQAQkEIAKKPDgCfjhIa48oL2fXcAf/12wH/9NoB//Pb
|
||||||
|
Af/y3QP/6tYK8NLDHHF6ckwDrKAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAC3ngEA5cYSAMGoDmbrzAb+89QB//LUAP/z1AD/9NUA//XWAf/01QH/9NYB/+bQ
|
||||||
|
D+TBtikux70kAMG7HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKPDgCgjREa48oL1/Tc
|
||||||
|
Af/12wH/89oB//PaAP/13AH/89wC/+rUEenSwi053swrAPDlWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cRAMyyDnftzwT/8tQA//LUAP/01QD/9dUB//XW
|
||||||
|
Af/11gH/89UC/+PMGL+tpkALs6gwAHhgGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOR
|
||||||
|
DgChkBEZ5MwK1/XbAf/02wH/89oA//PaAP/02wH/9dwB//LbB//f0CCD//8AAKaaNgAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAAA//0OAM+2Dn3v0QT/8tQA//PV
|
||||||
|
AP/z1QD/9NUA//TWAf/01QH/8tQD/+DKGreilkwIr6AyAH4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAKOTEAChkRQY48wM1fXcAf/02wH/89oA//PaAP/02wH/9NwC//TcA//o1xygYGzxArir
|
||||||
|
QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaEgAA//8PAM+2
|
||||||
|
Dn7v0gT/8tQA//PVAP/z1gD/9NYA//TXAf/01gH/89UC/+DKG7mel0cJq54xAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqJEACKexkL3coPuvbdAv/22wL/9doB//TbAf/03AH/9N0B//Td
|
||||||
|
A//r1x6hgIDVAr2tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAYDQAA//8PAM+1Dn3v0gT/89UA//PWAP/z1gD/9NcA//XYAf/01wD/89UC/+DLGbuYmEYJpp4wAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdlBgD//w4A0LwRa+/XB/zz3QH/9twA//bc
|
||||||
|
AP/13QH/9d0B//XeA//r1xyjjYKtArmoOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAFAAAA//kPANG3Dnvv0gT/89UA//TXAP/01wD/9NcA//TXAP/11wD/89YC/+HM
|
||||||
|
G7udnEsJq6E0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIVzCgCznxYApZAXD9jE
|
||||||
|
Epru2Af79NsD//XdAP/13QD/9t0B//XeA//r1x6lj4OZA7WkOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+0PAM+3Dnjw0wT/9NYA//TXAP/z2AD/9NcA//XY
|
||||||
|
Af/12AD/8tYD/9/KHLiUk0wIpJoyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKms
|
||||||
|
AwDPtxsAxbIYAKOYFw7RvxRl4MsOwufUCPDw2gT/9t4C//XfA//p2BulgX2MA66hMgAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKtgcA4ccVAMWwEVrs0Af79NcA//TY
|
||||||
|
Af/02AL/9NcA//XYAf/01wH/89YG/9zLI5cAAJ0BjYUlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAABdUgAAzr8bALOkFgD//xgAnpAVEL+uEz/RvRCD38sMxu3VCvPj0iCle31oBKGX
|
||||||
|
KwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAsZ8SAKmW
|
||||||
|
ExzfxQzN9dYD//TZAf/02AH/9NgB//XYAf/z2AH/6dMS79LHNUXk2DAA//+CAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEwAAId2CgBfSQQAppcSAMu7FAD//w8AlYwPEsW0
|
||||||
|
FD3ItzBAi3xSApODLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AABPOgAAKRgAAP//HAC/qhRL48oK3vLWA//12AL/9NgC//PYBP/s0w/y1sQleoyVWASwrD0AcmkbAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWRwAAYUwBAIiA
|
||||||
|
CwBtYgYAn5QMANC/EwDl1DAAj4FdAKKSLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAgGwHAH9vBwD///8Au6gRM9a/D5DiyA3B4csLxdnHEaTOuSFOmYctBr2x
|
||||||
|
MwDAuz0AUygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAABfTgAANCQAAAAAAABNPw4AYlMmAFA/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCACABvYgUAzbgSAAAANQGbiRgNnZAYD1ZP
|
||||||
|
GwTs2SQArZwpALyqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLAAA8KwAAuqYXAIx5
|
||||||
|
DAClkRAApZUSAJKFDQAAAAAAbVgHAEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
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>
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
681
DHSoftware/Views/CameraControl.Designer.cs
generated
681
DHSoftware/Views/CameraControl.Designer.cs
generated
@@ -28,227 +28,65 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
swhEnable = new AntdUI.Switch();
|
panel3 = new AntdUI.Panel();
|
||||||
|
button3 = new AntdUI.Button();
|
||||||
|
button2 = new AntdUI.Button();
|
||||||
|
button1 = new AntdUI.Button();
|
||||||
|
btnSizeAdd = new AntdUI.Button();
|
||||||
|
panel4 = new AntdUI.Panel();
|
||||||
|
pictureBox1 = new PictureBox();
|
||||||
|
panel2 = new AntdUI.Panel();
|
||||||
label18 = new AntdUI.Label();
|
label18 = new AntdUI.Label();
|
||||||
|
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.InputNumber();
|
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();
|
||||||
iptROIW = new AntdUI.InputNumber();
|
iptROIX = new AntdUI.Input();
|
||||||
iptROIY = new AntdUI.InputNumber();
|
iptROIY = new AntdUI.Input();
|
||||||
iptROIX = new AntdUI.InputNumber();
|
iptROIW = new AntdUI.Input();
|
||||||
iptROIH = new AntdUI.InputNumber();
|
iptROIH = new AntdUI.Input();
|
||||||
pictureBox1 = new PictureBox();
|
|
||||||
btnSizeAdd = new AntdUI.Button();
|
|
||||||
button1 = new AntdUI.Button();
|
|
||||||
button2 = new AntdUI.Button();
|
|
||||||
button3 = new AntdUI.Button();
|
|
||||||
sthPic = new AntdUI.Switch();
|
|
||||||
label6 = new AntdUI.Label();
|
label6 = new AntdUI.Label();
|
||||||
|
sthPic = new AntdUI.Switch();
|
||||||
label8 = new AntdUI.Label();
|
label8 = new AntdUI.Label();
|
||||||
label9 = new AntdUI.Label();
|
label9 = new AntdUI.Label();
|
||||||
label10 = new AntdUI.Label();
|
label10 = new AntdUI.Label();
|
||||||
label11 = new AntdUI.Label();
|
label11 = new AntdUI.Label();
|
||||||
sthAllPic = new AntdUI.Switch();
|
|
||||||
label12 = new AntdUI.Label();
|
label12 = new AntdUI.Label();
|
||||||
sltCamType = new AntdUI.Select();
|
sthAllPic = new AntdUI.Switch();
|
||||||
label13 = new AntdUI.Label();
|
label13 = new AntdUI.Label();
|
||||||
|
sltCamType = new AntdUI.Select();
|
||||||
|
label14 = new AntdUI.Label();
|
||||||
|
switch1 = new AntdUI.Switch();
|
||||||
|
panel1 = new AntdUI.Panel();
|
||||||
|
sltPicType = new AntdUI.Select();
|
||||||
|
label15 = new AntdUI.Label();
|
||||||
|
panel3.SuspendLayout();
|
||||||
|
panel4.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
||||||
|
panel2.SuspendLayout();
|
||||||
|
panel1.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// swhEnable
|
// panel3
|
||||||
//
|
//
|
||||||
swhEnable.CheckedText = "启用";
|
panel3.Controls.Add(button3);
|
||||||
swhEnable.Location = new Point(93, 13);
|
panel3.Controls.Add(button2);
|
||||||
swhEnable.Name = "swhEnable";
|
panel3.Controls.Add(button1);
|
||||||
swhEnable.Size = new Size(94, 33);
|
panel3.Controls.Add(btnSizeAdd);
|
||||||
swhEnable.TabIndex = 13;
|
panel3.Dock = DockStyle.Bottom;
|
||||||
swhEnable.UnCheckedText = "关闭";
|
panel3.Location = new Point(0, 585);
|
||||||
//
|
panel3.Name = "panel3";
|
||||||
// label18
|
panel3.Size = new Size(691, 59);
|
||||||
//
|
panel3.TabIndex = 39;
|
||||||
label18.Location = new Point(28, 23);
|
panel3.Text = "panel3";
|
||||||
label18.Name = "label18";
|
|
||||||
label18.Size = new Size(59, 23);
|
|
||||||
label18.TabIndex = 12;
|
|
||||||
label18.Text = "状 态";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
label1.Location = new Point(28, 140);
|
|
||||||
label1.Name = "label1";
|
|
||||||
label1.Size = new Size(59, 36);
|
|
||||||
label1.TabIndex = 14;
|
|
||||||
label1.Text = "曝 光";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
label2.Location = new Point(28, 183);
|
|
||||||
label2.Name = "label2";
|
|
||||||
label2.Size = new Size(59, 36);
|
|
||||||
label2.TabIndex = 15;
|
|
||||||
label2.Text = "增 益";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
label3.Location = new Point(28, 226);
|
|
||||||
label3.Name = "label3";
|
|
||||||
label3.Size = new Size(59, 36);
|
|
||||||
label3.TabIndex = 16;
|
|
||||||
label3.Text = "旋转角度";
|
|
||||||
//
|
|
||||||
// iptExposure
|
|
||||||
//
|
|
||||||
iptExposure.Location = new Point(93, 140);
|
|
||||||
iptExposure.Name = "iptExposure";
|
|
||||||
iptExposure.Size = new Size(94, 36);
|
|
||||||
iptExposure.TabIndex = 17;
|
|
||||||
iptExposure.Tag = "";
|
|
||||||
iptExposure.Text = "0";
|
|
||||||
//
|
|
||||||
// iptGain
|
|
||||||
//
|
|
||||||
iptGain.Location = new Point(93, 183);
|
|
||||||
iptGain.Name = "iptGain";
|
|
||||||
iptGain.Size = new Size(94, 36);
|
|
||||||
iptGain.TabIndex = 18;
|
|
||||||
iptGain.Text = "0";
|
|
||||||
//
|
|
||||||
// iptRevolve
|
|
||||||
//
|
|
||||||
iptRevolve.Location = new Point(93, 226);
|
|
||||||
iptRevolve.Name = "iptRevolve";
|
|
||||||
iptRevolve.Size = new Size(94, 36);
|
|
||||||
iptRevolve.TabIndex = 19;
|
|
||||||
iptRevolve.Text = "0";
|
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
label4.Location = new Point(28, 269);
|
|
||||||
label4.Name = "label4";
|
|
||||||
label4.Size = new Size(59, 36);
|
|
||||||
label4.TabIndex = 20;
|
|
||||||
label4.Text = "采图模式";
|
|
||||||
//
|
|
||||||
// sltAcquisitionMode
|
|
||||||
//
|
|
||||||
sltAcquisitionMode.List = true;
|
|
||||||
sltAcquisitionMode.Location = new Point(93, 269);
|
|
||||||
sltAcquisitionMode.Name = "sltAcquisitionMode";
|
|
||||||
sltAcquisitionMode.Size = new Size(94, 36);
|
|
||||||
sltAcquisitionMode.TabIndex = 21;
|
|
||||||
//
|
|
||||||
// label5
|
|
||||||
//
|
|
||||||
label5.Location = new Point(28, 314);
|
|
||||||
label5.Name = "label5";
|
|
||||||
label5.Size = new Size(59, 36);
|
|
||||||
label5.TabIndex = 22;
|
|
||||||
label5.Text = "触发模式";
|
|
||||||
//
|
|
||||||
// sltTriggerMode
|
|
||||||
//
|
|
||||||
sltTriggerMode.List = true;
|
|
||||||
sltTriggerMode.Location = new Point(93, 314);
|
|
||||||
sltTriggerMode.Name = "sltTriggerMode";
|
|
||||||
sltTriggerMode.Size = new Size(94, 36);
|
|
||||||
sltTriggerMode.TabIndex = 26;
|
|
||||||
//
|
|
||||||
// label7
|
|
||||||
//
|
|
||||||
label7.Location = new Point(19, 476);
|
|
||||||
label7.Name = "label7";
|
|
||||||
label7.Size = new Size(29, 23);
|
|
||||||
label7.TabIndex = 28;
|
|
||||||
label7.Text = "ROI";
|
|
||||||
//
|
|
||||||
// iptROIW
|
|
||||||
//
|
|
||||||
iptROIW.Location = new Point(93, 494);
|
|
||||||
iptROIW.Name = "iptROIW";
|
|
||||||
iptROIW.Size = new Size(94, 37);
|
|
||||||
iptROIW.TabIndex = 31;
|
|
||||||
iptROIW.Text = "0";
|
|
||||||
//
|
|
||||||
// iptROIY
|
|
||||||
//
|
|
||||||
iptROIY.Location = new Point(93, 451);
|
|
||||||
iptROIY.Name = "iptROIY";
|
|
||||||
iptROIY.Size = new Size(94, 37);
|
|
||||||
iptROIY.TabIndex = 30;
|
|
||||||
iptROIY.Text = "0";
|
|
||||||
//
|
|
||||||
// iptROIX
|
|
||||||
//
|
|
||||||
iptROIX.Location = new Point(93, 408);
|
|
||||||
iptROIX.Name = "iptROIX";
|
|
||||||
iptROIX.Size = new Size(94, 37);
|
|
||||||
iptROIX.TabIndex = 29;
|
|
||||||
iptROIX.Tag = "";
|
|
||||||
iptROIX.Text = "0";
|
|
||||||
//
|
|
||||||
// iptROIH
|
|
||||||
//
|
|
||||||
iptROIH.Location = new Point(93, 537);
|
|
||||||
iptROIH.Name = "iptROIH";
|
|
||||||
iptROIH.Size = new Size(94, 37);
|
|
||||||
iptROIH.TabIndex = 32;
|
|
||||||
iptROIH.Text = "0";
|
|
||||||
//
|
|
||||||
// pictureBox1
|
|
||||||
//
|
|
||||||
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
|
|
||||||
pictureBox1.Location = new Point(219, 23);
|
|
||||||
pictureBox1.Name = "pictureBox1";
|
|
||||||
pictureBox1.Size = new Size(659, 489);
|
|
||||||
pictureBox1.TabIndex = 33;
|
|
||||||
pictureBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// 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(282, 532);
|
|
||||||
btnSizeAdd.Name = "btnSizeAdd";
|
|
||||||
btnSizeAdd.Size = new Size(80, 38);
|
|
||||||
btnSizeAdd.TabIndex = 34;
|
|
||||||
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(440, 532);
|
|
||||||
button1.Name = "button1";
|
|
||||||
button1.Size = new Size(80, 38);
|
|
||||||
button1.TabIndex = 35;
|
|
||||||
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(595, 532);
|
|
||||||
button2.Name = "button2";
|
|
||||||
button2.Size = new Size(80, 38);
|
|
||||||
button2.TabIndex = 36;
|
|
||||||
button2.Text = "单次触发";
|
|
||||||
//
|
//
|
||||||
// button3
|
// button3
|
||||||
//
|
//
|
||||||
@@ -257,169 +95,434 @@
|
|||||||
button3.Ghost = true;
|
button3.Ghost = true;
|
||||||
button3.IconRatio = 0F;
|
button3.IconRatio = 0F;
|
||||||
button3.IconSvg = "";
|
button3.IconSvg = "";
|
||||||
button3.Location = new Point(743, 532);
|
button3.Location = new Point(536, 13);
|
||||||
button3.Name = "button3";
|
button3.Name = "button3";
|
||||||
button3.Size = new Size(80, 38);
|
button3.Size = new Size(80, 38);
|
||||||
button3.TabIndex = 37;
|
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.Controls.Add(pictureBox1);
|
||||||
|
panel4.Dock = DockStyle.Fill;
|
||||||
|
panel4.Location = new Point(0, 0);
|
||||||
|
panel4.Name = "panel4";
|
||||||
|
panel4.Size = new Size(691, 585);
|
||||||
|
panel4.TabIndex = 40;
|
||||||
|
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.Controls.Add(panel4);
|
||||||
|
panel2.Controls.Add(panel3);
|
||||||
|
panel2.Dock = DockStyle.Fill;
|
||||||
|
panel2.Location = new Point(218, 0);
|
||||||
|
panel2.Name = "panel2";
|
||||||
|
panel2.Size = new Size(691, 644);
|
||||||
|
panel2.TabIndex = 49;
|
||||||
|
panel2.Text = "panel2";
|
||||||
|
//
|
||||||
|
// label18
|
||||||
|
//
|
||||||
|
label18.Location = new Point(21, 19);
|
||||||
|
label18.Name = "label18";
|
||||||
|
label18.Size = new Size(59, 23);
|
||||||
|
label18.TabIndex = 48;
|
||||||
|
label18.Text = "状 态";
|
||||||
|
//
|
||||||
|
// swhEnable
|
||||||
|
//
|
||||||
|
swhEnable.CheckedText = "启用";
|
||||||
|
swhEnable.Location = new Point(86, 9);
|
||||||
|
swhEnable.Name = "swhEnable";
|
||||||
|
swhEnable.Size = new Size(111, 33);
|
||||||
|
swhEnable.TabIndex = 49;
|
||||||
|
swhEnable.UnCheckedText = "关闭";
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
label1.Location = new Point(21, 136);
|
||||||
|
label1.Name = "label1";
|
||||||
|
label1.Size = new Size(59, 36);
|
||||||
|
label1.TabIndex = 50;
|
||||||
|
label1.Text = "曝 光";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
label2.Location = new Point(21, 179);
|
||||||
|
label2.Name = "label2";
|
||||||
|
label2.Size = new Size(59, 36);
|
||||||
|
label2.TabIndex = 51;
|
||||||
|
label2.Text = "增 益";
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
label3.Location = new Point(21, 222);
|
||||||
|
label3.Name = "label3";
|
||||||
|
label3.Size = new Size(59, 36);
|
||||||
|
label3.TabIndex = 52;
|
||||||
|
label3.Text = "旋转角度";
|
||||||
|
//
|
||||||
|
// iptExposure
|
||||||
|
//
|
||||||
|
iptExposure.Location = new Point(86, 136);
|
||||||
|
iptExposure.Name = "iptExposure";
|
||||||
|
iptExposure.Size = new Size(111, 36);
|
||||||
|
iptExposure.TabIndex = 53;
|
||||||
|
iptExposure.Tag = "";
|
||||||
|
iptExposure.Text = "0";
|
||||||
|
//
|
||||||
|
// iptGain
|
||||||
|
//
|
||||||
|
iptGain.Location = new Point(86, 179);
|
||||||
|
iptGain.Name = "iptGain";
|
||||||
|
iptGain.Size = new Size(111, 36);
|
||||||
|
iptGain.TabIndex = 54;
|
||||||
|
iptGain.Text = "0";
|
||||||
|
//
|
||||||
|
// iptRevolve
|
||||||
|
//
|
||||||
|
iptRevolve.Items.AddRange(new object[] { "0", "90", "180", "270" });
|
||||||
|
iptRevolve.List = true;
|
||||||
|
iptRevolve.Location = new Point(86, 222);
|
||||||
|
iptRevolve.Name = "iptRevolve";
|
||||||
|
iptRevolve.Size = new Size(111, 36);
|
||||||
|
iptRevolve.TabIndex = 55;
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
label4.Location = new Point(21, 265);
|
||||||
|
label4.Name = "label4";
|
||||||
|
label4.Size = new Size(59, 36);
|
||||||
|
label4.TabIndex = 56;
|
||||||
|
label4.Text = "采图模式";
|
||||||
|
//
|
||||||
|
// sltAcquisitionMode
|
||||||
|
//
|
||||||
|
sltAcquisitionMode.List = true;
|
||||||
|
sltAcquisitionMode.Location = new Point(86, 265);
|
||||||
|
sltAcquisitionMode.Name = "sltAcquisitionMode";
|
||||||
|
sltAcquisitionMode.Size = new Size(111, 36);
|
||||||
|
sltAcquisitionMode.TabIndex = 57;
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
label5.Location = new Point(21, 310);
|
||||||
|
label5.Name = "label5";
|
||||||
|
label5.Size = new Size(59, 36);
|
||||||
|
label5.TabIndex = 58;
|
||||||
|
label5.Text = "触发模式";
|
||||||
|
//
|
||||||
|
// sltTriggerMode
|
||||||
|
//
|
||||||
|
sltTriggerMode.List = true;
|
||||||
|
sltTriggerMode.Location = new Point(86, 310);
|
||||||
|
sltTriggerMode.Name = "sltTriggerMode";
|
||||||
|
sltTriggerMode.Size = new Size(111, 36);
|
||||||
|
sltTriggerMode.TabIndex = 59;
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
label7.Location = new Point(3, 538);
|
||||||
|
label7.Name = "label7";
|
||||||
|
label7.Size = new Size(29, 23);
|
||||||
|
label7.TabIndex = 60;
|
||||||
|
label7.Text = "ROI";
|
||||||
|
//
|
||||||
|
// iptROIX
|
||||||
|
//
|
||||||
|
iptROIX.Location = new Point(86, 470);
|
||||||
|
iptROIX.Name = "iptROIX";
|
||||||
|
iptROIX.Size = new Size(111, 37);
|
||||||
|
iptROIX.TabIndex = 61;
|
||||||
|
iptROIX.Tag = "";
|
||||||
|
iptROIX.Text = "0";
|
||||||
|
//
|
||||||
|
// iptROIY
|
||||||
|
//
|
||||||
|
iptROIY.Location = new Point(86, 513);
|
||||||
|
iptROIY.Name = "iptROIY";
|
||||||
|
iptROIY.Size = new Size(111, 37);
|
||||||
|
iptROIY.TabIndex = 62;
|
||||||
|
iptROIY.Text = "0";
|
||||||
|
//
|
||||||
|
// iptROIW
|
||||||
|
//
|
||||||
|
iptROIW.Location = new Point(86, 556);
|
||||||
|
iptROIW.Name = "iptROIW";
|
||||||
|
iptROIW.Size = new Size(111, 37);
|
||||||
|
iptROIW.TabIndex = 63;
|
||||||
|
iptROIW.Text = "0";
|
||||||
|
//
|
||||||
|
// iptROIH
|
||||||
|
//
|
||||||
|
iptROIH.Location = new Point(86, 599);
|
||||||
|
iptROIH.Name = "iptROIH";
|
||||||
|
iptROIH.Size = new Size(111, 37);
|
||||||
|
iptROIH.TabIndex = 64;
|
||||||
|
iptROIH.Text = "0";
|
||||||
|
//
|
||||||
|
// label6
|
||||||
|
//
|
||||||
|
label6.Location = new Point(21, 66);
|
||||||
|
label6.Name = "label6";
|
||||||
|
label6.Size = new Size(59, 23);
|
||||||
|
label6.TabIndex = 65;
|
||||||
|
label6.Text = "相 机 图";
|
||||||
|
//
|
||||||
// sthPic
|
// sthPic
|
||||||
//
|
//
|
||||||
sthPic.CheckedText = "启用";
|
sthPic.CheckedText = "启用";
|
||||||
sthPic.Location = new Point(93, 60);
|
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 = 39;
|
sthPic.TabIndex = 66;
|
||||||
sthPic.UnCheckedText = "关闭";
|
sthPic.UnCheckedText = "关闭";
|
||||||
//
|
//
|
||||||
// label6
|
|
||||||
//
|
|
||||||
label6.Location = new Point(28, 70);
|
|
||||||
label6.Name = "label6";
|
|
||||||
label6.Size = new Size(59, 23);
|
|
||||||
label6.TabIndex = 38;
|
|
||||||
label6.Text = "相 机 图";
|
|
||||||
//
|
|
||||||
// label8
|
// label8
|
||||||
//
|
//
|
||||||
label8.Location = new Point(58, 408);
|
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 = 40;
|
label8.TabIndex = 67;
|
||||||
label8.Text = "X:";
|
label8.Text = "X:";
|
||||||
//
|
//
|
||||||
// label9
|
// label9
|
||||||
//
|
//
|
||||||
label9.Location = new Point(58, 451);
|
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 = 41;
|
label9.TabIndex = 68;
|
||||||
label9.Text = "Y:";
|
label9.Text = "Y:";
|
||||||
//
|
//
|
||||||
// label10
|
// label10
|
||||||
//
|
//
|
||||||
label10.Location = new Point(43, 494);
|
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 = 42;
|
label10.TabIndex = 69;
|
||||||
label10.Text = "宽度:";
|
label10.Text = "宽度:";
|
||||||
//
|
//
|
||||||
// label11
|
// label11
|
||||||
//
|
//
|
||||||
label11.Location = new Point(43, 538);
|
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 = 43;
|
label11.TabIndex = 70;
|
||||||
label11.Text = "高度:";
|
label11.Text = "高度:";
|
||||||
//
|
//
|
||||||
|
// label12
|
||||||
|
//
|
||||||
|
label12.Location = new Point(21, 402);
|
||||||
|
label12.Name = "label12";
|
||||||
|
label12.Size = new Size(59, 23);
|
||||||
|
label12.TabIndex = 71;
|
||||||
|
label12.Text = "全 画 幅";
|
||||||
|
//
|
||||||
// sthAllPic
|
// sthAllPic
|
||||||
//
|
//
|
||||||
sthAllPic.CheckedText = "启用";
|
sthAllPic.CheckedText = "启用";
|
||||||
sthAllPic.Location = new Point(93, 356);
|
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 = 45;
|
sthAllPic.TabIndex = 72;
|
||||||
sthAllPic.UnCheckedText = "关闭";
|
sthAllPic.UnCheckedText = "关闭";
|
||||||
//
|
//
|
||||||
// label12
|
// label13
|
||||||
//
|
//
|
||||||
label12.Location = new Point(28, 366);
|
label13.Location = new Point(21, 95);
|
||||||
label12.Name = "label12";
|
label13.Name = "label13";
|
||||||
label12.Size = new Size(59, 23);
|
label13.Size = new Size(59, 36);
|
||||||
label12.TabIndex = 44;
|
label13.TabIndex = 73;
|
||||||
label12.Text = "全 画 幅";
|
label13.Text = "相机类型";
|
||||||
//
|
//
|
||||||
// sltCamType
|
// sltCamType
|
||||||
//
|
//
|
||||||
sltCamType.List = true;
|
sltCamType.List = true;
|
||||||
sltCamType.Location = new Point(93, 97);
|
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 = 47;
|
sltCamType.TabIndex = 74;
|
||||||
//
|
//
|
||||||
// label13
|
// label14
|
||||||
//
|
//
|
||||||
label13.Location = new Point(28, 99);
|
label14.Location = new Point(21, 441);
|
||||||
label13.Name = "label13";
|
label14.Name = "label14";
|
||||||
label13.Size = new Size(59, 36);
|
label14.Size = new Size(59, 23);
|
||||||
label13.TabIndex = 46;
|
label14.TabIndex = 75;
|
||||||
label13.Text = "相机类型";
|
label14.Text = "变焦相机";
|
||||||
|
//
|
||||||
|
// switch1
|
||||||
|
//
|
||||||
|
switch1.CheckedText = "启用";
|
||||||
|
switch1.Location = new Point(86, 431);
|
||||||
|
switch1.Name = "switch1";
|
||||||
|
switch1.Size = new Size(111, 33);
|
||||||
|
switch1.TabIndex = 76;
|
||||||
|
switch1.UnCheckedText = "关闭";
|
||||||
|
//
|
||||||
|
// panel1
|
||||||
|
//
|
||||||
|
panel1.Controls.Add(sltPicType);
|
||||||
|
panel1.Controls.Add(label15);
|
||||||
|
panel1.Controls.Add(switch1);
|
||||||
|
panel1.Controls.Add(label14);
|
||||||
|
panel1.Controls.Add(sltCamType);
|
||||||
|
panel1.Controls.Add(label13);
|
||||||
|
panel1.Controls.Add(sthAllPic);
|
||||||
|
panel1.Controls.Add(label12);
|
||||||
|
panel1.Controls.Add(label11);
|
||||||
|
panel1.Controls.Add(label10);
|
||||||
|
panel1.Controls.Add(label9);
|
||||||
|
panel1.Controls.Add(label8);
|
||||||
|
panel1.Controls.Add(sthPic);
|
||||||
|
panel1.Controls.Add(label6);
|
||||||
|
panel1.Controls.Add(iptROIH);
|
||||||
|
panel1.Controls.Add(iptROIW);
|
||||||
|
panel1.Controls.Add(iptROIY);
|
||||||
|
panel1.Controls.Add(iptROIX);
|
||||||
|
panel1.Controls.Add(label7);
|
||||||
|
panel1.Controls.Add(sltTriggerMode);
|
||||||
|
panel1.Controls.Add(label5);
|
||||||
|
panel1.Controls.Add(sltAcquisitionMode);
|
||||||
|
panel1.Controls.Add(label4);
|
||||||
|
panel1.Controls.Add(iptRevolve);
|
||||||
|
panel1.Controls.Add(iptGain);
|
||||||
|
panel1.Controls.Add(iptExposure);
|
||||||
|
panel1.Controls.Add(label3);
|
||||||
|
panel1.Controls.Add(label2);
|
||||||
|
panel1.Controls.Add(label1);
|
||||||
|
panel1.Controls.Add(swhEnable);
|
||||||
|
panel1.Controls.Add(label18);
|
||||||
|
panel1.Dock = DockStyle.Left;
|
||||||
|
panel1.Location = new Point(0, 0);
|
||||||
|
panel1.Name = "panel1";
|
||||||
|
panel1.Size = new Size(218, 644);
|
||||||
|
panel1.TabIndex = 48;
|
||||||
|
panel1.Text = "panel1";
|
||||||
|
//
|
||||||
|
// sltPicType
|
||||||
|
//
|
||||||
|
sltPicType.List = true;
|
||||||
|
sltPicType.Location = new Point(86, 352);
|
||||||
|
sltPicType.Name = "sltPicType";
|
||||||
|
sltPicType.Size = new Size(111, 36);
|
||||||
|
sltPicType.TabIndex = 78;
|
||||||
|
//
|
||||||
|
// label15
|
||||||
|
//
|
||||||
|
label15.Location = new Point(21, 352);
|
||||||
|
label15.Name = "label15";
|
||||||
|
label15.Size = new Size(59, 36);
|
||||||
|
label15.TabIndex = 77;
|
||||||
|
label15.Text = "图片格式";
|
||||||
//
|
//
|
||||||
// CameraControl
|
// CameraControl
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(7F, 17F);
|
AutoScaleDimensions = new SizeF(7F, 17F);
|
||||||
AutoScaleMode = AutoScaleMode.Font;
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
Controls.Add(sltCamType);
|
Controls.Add(panel2);
|
||||||
Controls.Add(label13);
|
Controls.Add(panel1);
|
||||||
Controls.Add(sthAllPic);
|
|
||||||
Controls.Add(label12);
|
|
||||||
Controls.Add(label11);
|
|
||||||
Controls.Add(label10);
|
|
||||||
Controls.Add(label9);
|
|
||||||
Controls.Add(label8);
|
|
||||||
Controls.Add(sthPic);
|
|
||||||
Controls.Add(label6);
|
|
||||||
Controls.Add(button3);
|
|
||||||
Controls.Add(button2);
|
|
||||||
Controls.Add(button1);
|
|
||||||
Controls.Add(btnSizeAdd);
|
|
||||||
Controls.Add(pictureBox1);
|
|
||||||
Controls.Add(iptROIH);
|
|
||||||
Controls.Add(iptROIW);
|
|
||||||
Controls.Add(iptROIY);
|
|
||||||
Controls.Add(iptROIX);
|
|
||||||
Controls.Add(label7);
|
|
||||||
Controls.Add(sltTriggerMode);
|
|
||||||
Controls.Add(label5);
|
|
||||||
Controls.Add(sltAcquisitionMode);
|
|
||||||
Controls.Add(label4);
|
|
||||||
Controls.Add(iptRevolve);
|
|
||||||
Controls.Add(iptGain);
|
|
||||||
Controls.Add(iptExposure);
|
|
||||||
Controls.Add(label3);
|
|
||||||
Controls.Add(label2);
|
|
||||||
Controls.Add(label1);
|
|
||||||
Controls.Add(swhEnable);
|
|
||||||
Controls.Add(label18);
|
|
||||||
Name = "CameraControl";
|
Name = "CameraControl";
|
||||||
Size = new Size(909, 601);
|
Size = new Size(909, 644);
|
||||||
|
panel3.ResumeLayout(false);
|
||||||
|
panel4.ResumeLayout(false);
|
||||||
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
|
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
|
||||||
|
panel2.ResumeLayout(false);
|
||||||
|
panel1.ResumeLayout(false);
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private AntdUI.Switch swhEnable;
|
private AntdUI.Panel panel3;
|
||||||
|
private AntdUI.Button button3;
|
||||||
|
private AntdUI.Button button2;
|
||||||
|
private AntdUI.Button button1;
|
||||||
|
private AntdUI.Button btnSizeAdd;
|
||||||
|
private AntdUI.Panel panel4;
|
||||||
|
private PictureBox pictureBox1;
|
||||||
|
private AntdUI.Panel panel2;
|
||||||
private AntdUI.Label label18;
|
private AntdUI.Label label18;
|
||||||
|
private AntdUI.Switch swhEnable;
|
||||||
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.InputNumber 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 iptROIW;
|
private AntdUI.Input iptROIX;
|
||||||
private AntdUI.InputNumber iptROIY;
|
private AntdUI.Input iptROIY;
|
||||||
private AntdUI.InputNumber iptROIX;
|
private AntdUI.Input iptROIW;
|
||||||
private AntdUI.InputNumber iptROIH;
|
private AntdUI.Input iptROIH;
|
||||||
private PictureBox pictureBox1;
|
|
||||||
private AntdUI.Button btnSizeAdd;
|
|
||||||
private AntdUI.Button button1;
|
|
||||||
private AntdUI.Button button2;
|
|
||||||
private AntdUI.Button button3;
|
|
||||||
private AntdUI.Switch sthPic;
|
|
||||||
private AntdUI.Label label6;
|
private AntdUI.Label label6;
|
||||||
|
private AntdUI.Switch sthPic;
|
||||||
private AntdUI.Label label8;
|
private AntdUI.Label label8;
|
||||||
private AntdUI.Label label9;
|
private AntdUI.Label label9;
|
||||||
private AntdUI.Label label10;
|
private AntdUI.Label label10;
|
||||||
private AntdUI.Label label11;
|
private AntdUI.Label label11;
|
||||||
private AntdUI.Switch sthAllPic;
|
|
||||||
private AntdUI.Label label12;
|
private AntdUI.Label label12;
|
||||||
private AntdUI.Select sltCamType;
|
private AntdUI.Switch sthAllPic;
|
||||||
private AntdUI.Label label13;
|
private AntdUI.Label label13;
|
||||||
|
private AntdUI.Select sltCamType;
|
||||||
|
private AntdUI.Label label14;
|
||||||
|
private AntdUI.Switch switch1;
|
||||||
|
private AntdUI.Panel panel1;
|
||||||
|
private AntdUI.Select sltPicType;
|
||||||
|
private AntdUI.Label label15;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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),
|
||||||
@@ -84,24 +113,23 @@ namespace DHSoftware.Views
|
|||||||
// 启用状态绑定
|
// 启用状态绑定
|
||||||
swhEnable.DataBindings.Add(nameof(swhEnable.Checked), CameraBase, nameof(CameraBase.IsEnabled),
|
swhEnable.DataBindings.Add(nameof(swhEnable.Checked), CameraBase, nameof(CameraBase.IsEnabled),
|
||||||
true, DataSourceUpdateMode.OnPropertyChanged);
|
true, DataSourceUpdateMode.OnPropertyChanged);
|
||||||
|
switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera),
|
||||||
|
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.Value), 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) =>
|
||||||
@@ -118,16 +146,23 @@ namespace DHSoftware.Views
|
|||||||
|
|
||||||
private void InitData()
|
private void InitData()
|
||||||
{
|
{
|
||||||
|
iptRevolve.Text = Convert.ToInt32(CameraBase.RotateImage).ToString();
|
||||||
// 获取枚举字段名列表(原描述改为字段名)
|
// 获取枚举字段名列表(原描述改为字段名)
|
||||||
sltCamType.Items.Clear();
|
sltCamType.Items.Clear();
|
||||||
foreach (EnumCamType value in Enum.GetValues(typeof(EnumCamType)))
|
foreach (EnumCamType value in Enum.GetValues(typeof(EnumCamType)))
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
2
DHSoftware/Views/FrmLog.Designer.cs
generated
2
DHSoftware/Views/FrmLog.Designer.cs
generated
@@ -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
|
||||||
//
|
//
|
||||||
|
@@ -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
|
||||||
|
|
||||||
@@ -252,12 +255,18 @@ namespace DHSoftware.Views
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void AutoScrollIfNeeded()
|
private void AutoScrollIfNeeded()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (lvLog.Items.Count > 0 /*&& chkAutoScroll.Checked*/)
|
if (lvLog.Items.Count > 0 /*&& chkAutoScroll.Checked*/)
|
||||||
{
|
{
|
||||||
lvLog.EnsureVisible(lvLog.Items.Count - 1);
|
lvLog.EnsureVisible(lvLog.Items.Count - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void UpdateLayout()
|
private void UpdateLayout()
|
||||||
{
|
{
|
||||||
|
107
DHSoftware/Views/GlobalControl.Designer.cs
generated
107
DHSoftware/Views/GlobalControl.Designer.cs
generated
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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},
|
||||||
|
@@ -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, 200),
|
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}")
|
||||||
|
222
DHSoftware/Views/VisualLocalizationWindow.Designer.cs
generated
222
DHSoftware/Views/VisualLocalizationWindow.Designer.cs
generated
@@ -53,9 +53,28 @@
|
|||||||
label5 = new AntdUI.Label();
|
label5 = new AntdUI.Label();
|
||||||
sltDirection = new AntdUI.Select();
|
sltDirection = new AntdUI.Select();
|
||||||
label4 = new AntdUI.Label();
|
label4 = new AntdUI.Label();
|
||||||
|
panelMotor = new AntdUI.Panel();
|
||||||
|
btnSaveMotorPos = new AntdUI.Button();
|
||||||
|
iptMotorPos = new AntdUI.InputNumber();
|
||||||
|
label9 = new AntdUI.Label();
|
||||||
|
btnMotorZero = new AntdUI.Button();
|
||||||
|
btnMotorReverse = new AntdUI.Button();
|
||||||
|
btnMotorForward = new AntdUI.Button();
|
||||||
|
iptMotorSpeed = new AntdUI.InputNumber();
|
||||||
|
label8 = new AntdUI.Label();
|
||||||
|
panel3 = new AntdUI.Panel();
|
||||||
|
btnSaveBarrierPos = new AntdUI.Button();
|
||||||
|
iptBarrierPos = new AntdUI.InputNumber();
|
||||||
|
label10 = new AntdUI.Label();
|
||||||
|
btnBarrierZero = new AntdUI.Button();
|
||||||
|
btnBarrier = new AntdUI.Button();
|
||||||
|
iptBarrierSpeed = new AntdUI.InputNumber();
|
||||||
|
label11 = new AntdUI.Label();
|
||||||
imageViewerControl1 = new ImageViewerControl();
|
imageViewerControl1 = new ImageViewerControl();
|
||||||
panel1.SuspendLayout();
|
panel1.SuspendLayout();
|
||||||
panel2.SuspendLayout();
|
panel2.SuspendLayout();
|
||||||
|
panelMotor.SuspendLayout();
|
||||||
|
panel3.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// titlebar
|
// titlebar
|
||||||
@@ -321,21 +340,195 @@
|
|||||||
label4.TabIndex = 4;
|
label4.TabIndex = 4;
|
||||||
label4.Text = "转盘方向";
|
label4.Text = "转盘方向";
|
||||||
//
|
//
|
||||||
|
// panelMotor
|
||||||
|
//
|
||||||
|
panelMotor.Controls.Add(btnSaveMotorPos);
|
||||||
|
panelMotor.Controls.Add(iptMotorPos);
|
||||||
|
panelMotor.Controls.Add(label9);
|
||||||
|
panelMotor.Controls.Add(btnMotorZero);
|
||||||
|
panelMotor.Controls.Add(btnMotorReverse);
|
||||||
|
panelMotor.Controls.Add(btnMotorForward);
|
||||||
|
panelMotor.Controls.Add(iptMotorSpeed);
|
||||||
|
panelMotor.Controls.Add(label8);
|
||||||
|
panelMotor.Dock = DockStyle.Top;
|
||||||
|
panelMotor.Location = new Point(0, 149);
|
||||||
|
panelMotor.Name = "panelMotor";
|
||||||
|
panelMotor.Size = new Size(1210, 46);
|
||||||
|
panelMotor.TabIndex = 4;
|
||||||
|
panelMotor.Text = "panel3";
|
||||||
|
//
|
||||||
|
// btnSaveMotorPos
|
||||||
|
//
|
||||||
|
btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnSaveMotorPos.Location = new Point(751, 5);
|
||||||
|
btnSaveMotorPos.Name = "btnSaveMotorPos";
|
||||||
|
btnSaveMotorPos.Size = new Size(109, 38);
|
||||||
|
btnSaveMotorPos.TabIndex = 21;
|
||||||
|
btnSaveMotorPos.Text = "保存相机电机位置";
|
||||||
|
btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// iptMotorPos
|
||||||
|
//
|
||||||
|
iptMotorPos.Location = new Point(284, 0);
|
||||||
|
iptMotorPos.Name = "iptMotorPos";
|
||||||
|
iptMotorPos.ReadOnly = true;
|
||||||
|
iptMotorPos.Size = new Size(175, 43);
|
||||||
|
iptMotorPos.TabIndex = 20;
|
||||||
|
iptMotorPos.Text = "0";
|
||||||
|
//
|
||||||
|
// label9
|
||||||
|
//
|
||||||
|
label9.BackColor = SystemColors.Window;
|
||||||
|
label9.Location = new Point(203, 10);
|
||||||
|
label9.Name = "label9";
|
||||||
|
label9.Size = new Size(81, 23);
|
||||||
|
label9.TabIndex = 19;
|
||||||
|
label9.Text = "变焦电机位置";
|
||||||
|
//
|
||||||
|
// btnMotorZero
|
||||||
|
//
|
||||||
|
btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnMotorZero.Location = new Point(465, 5);
|
||||||
|
btnMotorZero.Name = "btnMotorZero";
|
||||||
|
btnMotorZero.Size = new Size(75, 38);
|
||||||
|
btnMotorZero.TabIndex = 18;
|
||||||
|
btnMotorZero.Text = "电机回原点";
|
||||||
|
btnMotorZero.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// btnMotorReverse
|
||||||
|
//
|
||||||
|
btnMotorReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnMotorReverse.Location = new Point(659, 5);
|
||||||
|
btnMotorReverse.Name = "btnMotorReverse";
|
||||||
|
btnMotorReverse.Size = new Size(75, 38);
|
||||||
|
btnMotorReverse.TabIndex = 17;
|
||||||
|
btnMotorReverse.Text = "电机反转";
|
||||||
|
btnMotorReverse.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// btnMotorForward
|
||||||
|
//
|
||||||
|
btnMotorForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnMotorForward.Location = new Point(563, 5);
|
||||||
|
btnMotorForward.Name = "btnMotorForward";
|
||||||
|
btnMotorForward.Size = new Size(75, 38);
|
||||||
|
btnMotorForward.TabIndex = 16;
|
||||||
|
btnMotorForward.Text = "电机正转";
|
||||||
|
btnMotorForward.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// iptMotorSpeed
|
||||||
|
//
|
||||||
|
iptMotorSpeed.Location = new Point(90, 0);
|
||||||
|
iptMotorSpeed.Name = "iptMotorSpeed";
|
||||||
|
iptMotorSpeed.Size = new Size(107, 43);
|
||||||
|
iptMotorSpeed.TabIndex = 8;
|
||||||
|
iptMotorSpeed.Text = "0";
|
||||||
|
//
|
||||||
|
// label8
|
||||||
|
//
|
||||||
|
label8.BackColor = SystemColors.Window;
|
||||||
|
label8.Location = new Point(9, 10);
|
||||||
|
label8.Name = "label8";
|
||||||
|
label8.Size = new Size(81, 23);
|
||||||
|
label8.TabIndex = 1;
|
||||||
|
label8.Text = "变焦电机速度";
|
||||||
|
//
|
||||||
|
// panel3
|
||||||
|
//
|
||||||
|
panel3.Controls.Add(btnSaveBarrierPos);
|
||||||
|
panel3.Controls.Add(iptBarrierPos);
|
||||||
|
panel3.Controls.Add(label10);
|
||||||
|
panel3.Controls.Add(btnBarrierZero);
|
||||||
|
panel3.Controls.Add(btnBarrier);
|
||||||
|
panel3.Controls.Add(iptBarrierSpeed);
|
||||||
|
panel3.Controls.Add(label11);
|
||||||
|
panel3.Dock = DockStyle.Top;
|
||||||
|
panel3.Location = new Point(0, 195);
|
||||||
|
panel3.Name = "panel3";
|
||||||
|
panel3.Size = new Size(1210, 46);
|
||||||
|
panel3.TabIndex = 6;
|
||||||
|
panel3.Text = "panel3";
|
||||||
|
//
|
||||||
|
// btnSaveBarrierPos
|
||||||
|
//
|
||||||
|
btnSaveBarrierPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnSaveBarrierPos.Location = new Point(681, 5);
|
||||||
|
btnSaveBarrierPos.Name = "btnSaveBarrierPos";
|
||||||
|
btnSaveBarrierPos.Size = new Size(109, 38);
|
||||||
|
btnSaveBarrierPos.TabIndex = 21;
|
||||||
|
btnSaveBarrierPos.Text = "保存挡料电机位置";
|
||||||
|
btnSaveBarrierPos.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// iptBarrierPos
|
||||||
|
//
|
||||||
|
iptBarrierPos.Location = new Point(284, 0);
|
||||||
|
iptBarrierPos.Name = "iptBarrierPos";
|
||||||
|
iptBarrierPos.Size = new Size(175, 43);
|
||||||
|
iptBarrierPos.TabIndex = 20;
|
||||||
|
iptBarrierPos.Text = "0";
|
||||||
|
//
|
||||||
|
// label10
|
||||||
|
//
|
||||||
|
label10.BackColor = SystemColors.Window;
|
||||||
|
label10.Location = new Point(203, 10);
|
||||||
|
label10.Name = "label10";
|
||||||
|
label10.Size = new Size(81, 23);
|
||||||
|
label10.TabIndex = 19;
|
||||||
|
label10.Text = "挡料电机位置";
|
||||||
|
//
|
||||||
|
// btnBarrierZero
|
||||||
|
//
|
||||||
|
btnBarrierZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnBarrierZero.Location = new Point(465, 5);
|
||||||
|
btnBarrierZero.Name = "btnBarrierZero";
|
||||||
|
btnBarrierZero.Size = new Size(75, 38);
|
||||||
|
btnBarrierZero.TabIndex = 18;
|
||||||
|
btnBarrierZero.Text = "电机回原点";
|
||||||
|
btnBarrierZero.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// btnBarrier
|
||||||
|
//
|
||||||
|
btnBarrier.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
|
||||||
|
btnBarrier.Location = new Point(563, 5);
|
||||||
|
btnBarrier.Name = "btnBarrier";
|
||||||
|
btnBarrier.Size = new Size(101, 38);
|
||||||
|
btnBarrier.TabIndex = 16;
|
||||||
|
btnBarrier.Text = "挡料电机转动";
|
||||||
|
btnBarrier.Type = AntdUI.TTypeMini.Primary;
|
||||||
|
//
|
||||||
|
// iptBarrierSpeed
|
||||||
|
//
|
||||||
|
iptBarrierSpeed.Location = new Point(90, 0);
|
||||||
|
iptBarrierSpeed.Name = "iptBarrierSpeed";
|
||||||
|
iptBarrierSpeed.Size = new Size(107, 43);
|
||||||
|
iptBarrierSpeed.TabIndex = 8;
|
||||||
|
iptBarrierSpeed.Text = "0";
|
||||||
|
//
|
||||||
|
// label11
|
||||||
|
//
|
||||||
|
label11.BackColor = SystemColors.Window;
|
||||||
|
label11.Location = new Point(9, 10);
|
||||||
|
label11.Name = "label11";
|
||||||
|
label11.Size = new Size(81, 23);
|
||||||
|
label11.TabIndex = 1;
|
||||||
|
label11.Text = "挡料电机速度";
|
||||||
|
//
|
||||||
// imageViewerControl1
|
// imageViewerControl1
|
||||||
//
|
//
|
||||||
imageViewerControl1.Dock = DockStyle.Fill;
|
imageViewerControl1.Dock = DockStyle.Fill;
|
||||||
imageViewerControl1.Image = null;
|
imageViewerControl1.Image = null;
|
||||||
imageViewerControl1.Location = new Point(0, 149);
|
imageViewerControl1.Location = new Point(0, 241);
|
||||||
imageViewerControl1.Name = "imageViewerControl1";
|
imageViewerControl1.Name = "imageViewerControl1";
|
||||||
imageViewerControl1.Size = new Size(1210, 558);
|
imageViewerControl1.Size = new Size(1210, 464);
|
||||||
imageViewerControl1.TabIndex = 4;
|
imageViewerControl1.TabIndex = 7;
|
||||||
//
|
//
|
||||||
// VisualLocalizationWindow
|
// VisualLocalizationWindow
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(7F, 17F);
|
AutoScaleDimensions = new SizeF(7F, 17F);
|
||||||
AutoScaleMode = AutoScaleMode.Font;
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
ClientSize = new Size(1210, 707);
|
ClientSize = new Size(1210, 705);
|
||||||
Controls.Add(imageViewerControl1);
|
Controls.Add(imageViewerControl1);
|
||||||
|
Controls.Add(panel3);
|
||||||
|
Controls.Add(panelMotor);
|
||||||
Controls.Add(panel2);
|
Controls.Add(panel2);
|
||||||
Controls.Add(panel1);
|
Controls.Add(panel1);
|
||||||
Controls.Add(titlebar);
|
Controls.Add(titlebar);
|
||||||
@@ -344,6 +537,8 @@
|
|||||||
WindowState = FormWindowState.Maximized;
|
WindowState = FormWindowState.Maximized;
|
||||||
panel1.ResumeLayout(false);
|
panel1.ResumeLayout(false);
|
||||||
panel2.ResumeLayout(false);
|
panel2.ResumeLayout(false);
|
||||||
|
panelMotor.ResumeLayout(false);
|
||||||
|
panel3.ResumeLayout(false);
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,10 +565,27 @@
|
|||||||
private AntdUI.Button btnForward;
|
private AntdUI.Button btnForward;
|
||||||
private AntdUI.Button btnSaveImg;
|
private AntdUI.Button btnSaveImg;
|
||||||
private AntdUI.Button btnSavePos;
|
private AntdUI.Button btnSavePos;
|
||||||
private ImageViewerControl imageViewerControl1;
|
|
||||||
private AntdUI.InputNumber iptThreshold;
|
private AntdUI.InputNumber iptThreshold;
|
||||||
private AntdUI.Label label6;
|
private AntdUI.Label label6;
|
||||||
private AntdUI.InputNumber iptSpeed;
|
private AntdUI.InputNumber iptSpeed;
|
||||||
private AntdUI.Label label7;
|
private AntdUI.Label label7;
|
||||||
|
private AntdUI.Panel panelMotor;
|
||||||
|
private AntdUI.InputNumber iptMotorSpeed;
|
||||||
|
private AntdUI.Label label8;
|
||||||
|
private AntdUI.Button btnMotorReverse;
|
||||||
|
private AntdUI.Button btnMotorForward;
|
||||||
|
private AntdUI.InputNumber iptMotorPos;
|
||||||
|
private AntdUI.Label label9;
|
||||||
|
private AntdUI.Button btnMotorZero;
|
||||||
|
private AntdUI.Button btnSaveMotorPos;
|
||||||
|
private AntdUI.Panel panel3;
|
||||||
|
private AntdUI.Button btnSaveBarrierPos;
|
||||||
|
private AntdUI.InputNumber iptBarrierPos;
|
||||||
|
private AntdUI.Label label10;
|
||||||
|
private AntdUI.Button btnBarrierZero;
|
||||||
|
private AntdUI.Button btnBarrier;
|
||||||
|
private AntdUI.InputNumber iptBarrierSpeed;
|
||||||
|
private AntdUI.Label label11;
|
||||||
|
private ImageViewerControl imageViewerControl1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,21 +1,15 @@
|
|||||||
using System;
|
using System.Data;
|
||||||
using System.Collections.Generic;
|
using System.Diagnostics;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
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 DH.Commons.Helper;
|
||||||
|
using DH.Commons.Models;
|
||||||
using DH.Devices.Camera;
|
using DH.Devices.Camera;
|
||||||
using HalconDotNet;
|
using HalconDotNet;
|
||||||
using OpenCvSharp.Extensions;
|
using OpenCvSharp.Extensions;
|
||||||
using Sunny.UI;
|
|
||||||
using static System.Net.Mime.MediaTypeNames;
|
|
||||||
|
|
||||||
namespace DHSoftware.Views
|
namespace DHSoftware.Views
|
||||||
{
|
{
|
||||||
@@ -36,6 +30,54 @@ namespace DHSoftware.Views
|
|||||||
//定时器
|
//定时器
|
||||||
private System.Threading.Timer Timer;
|
private System.Threading.Timer Timer;
|
||||||
|
|
||||||
|
List<VisualLocalization> localizations = new List<VisualLocalization>();
|
||||||
|
#region 控件大小随窗体大小等比例缩放
|
||||||
|
|
||||||
|
private readonly float x; //定义当前窗体的宽度
|
||||||
|
private readonly float y; //定义当前窗体的高度
|
||||||
|
|
||||||
|
private void setTag(Control cons)
|
||||||
|
{
|
||||||
|
foreach (Control con in cons.Controls)
|
||||||
|
{
|
||||||
|
con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size;
|
||||||
|
if (con.Controls.Count > 0) setTag(con);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setControls(float newx, float newy, Control cons)
|
||||||
|
{
|
||||||
|
//遍历窗体中的控件,重新设置控件的值
|
||||||
|
foreach (Control con in cons.Controls)
|
||||||
|
//获取控件的Tag属性值,并分割后存储字符串数组
|
||||||
|
if (con.Tag != null)
|
||||||
|
{
|
||||||
|
var mytag = con.Tag.ToString().Split(';');
|
||||||
|
//根据窗体缩放的比例确定控件的值
|
||||||
|
con.Width = Convert.ToInt32(Convert.ToSingle(mytag[0]) * newx); //宽度
|
||||||
|
con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度
|
||||||
|
con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距
|
||||||
|
con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距
|
||||||
|
var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小
|
||||||
|
if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
|
||||||
|
con.Focus();
|
||||||
|
if (con.Controls.Count > 0) setControls(newx, newy, con);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置窗体布局
|
||||||
|
/// </summary>
|
||||||
|
private void ReWinformLayout()
|
||||||
|
{
|
||||||
|
var newx = Width / x;
|
||||||
|
var newy = Height / y;
|
||||||
|
setControls(newx, newy, this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public VisualLocalizationWindow()
|
public VisualLocalizationWindow()
|
||||||
{
|
{
|
||||||
@@ -51,29 +93,433 @@ namespace DHSoftware.Views
|
|||||||
btnReverse.MouseUp += BtnReverse_MouseUp;
|
btnReverse.MouseUp += BtnReverse_MouseUp;
|
||||||
btnSaveImg.Click += BtnSaveImg_Click;
|
btnSaveImg.Click += BtnSaveImg_Click;
|
||||||
btnSavePos.Click += BtnSavePos_Click;
|
btnSavePos.Click += BtnSavePos_Click;
|
||||||
|
sltCameraName.SelectedIndexChanged += SltCameraName_SelectedIndexChanged;
|
||||||
|
btnMotorForward.MouseDown += BtnMotorForward_MouseDown;
|
||||||
|
btnMotorForward.MouseUp += MotorButton_MouseUp;
|
||||||
|
btnMotorReverse.MouseDown += BtnMotorReverse_MouseDown;
|
||||||
|
btnMotorReverse.MouseUp += MotorButton_MouseUp;
|
||||||
|
btnMotorZero.Click += BtnMotorZero_Click;
|
||||||
|
btnSaveMotorPos.Click += BtnSaveMotorPos_Click;
|
||||||
|
panelMotor.Visible = false;
|
||||||
|
Resize += VisualLocalizationWindow_Resize;
|
||||||
|
btnBarrierZero.Click += BtnBarrierZero_Click;
|
||||||
|
btnBarrier.Click += BtnBarrier_Click;
|
||||||
|
btnSaveBarrierPos.Click += BtnSaveBarrierPos_Click;
|
||||||
|
iptMotorSpeed.Value =1200;
|
||||||
|
iptBarrierSpeed.Value = 500;
|
||||||
|
AutoDpi(this);
|
||||||
|
|
||||||
|
x = Width;
|
||||||
|
y = Height;
|
||||||
|
setTag(this);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BtnSaveBarrierPos_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//根据工位查找点位
|
||||||
|
PLCItem? pLCItem = ConfigModel.PLCBaseList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.PLCItemList?
|
||||||
|
.Where(it => it.Name == "挡料电机位置").FirstOrDefault();
|
||||||
|
if (pLCItem == null)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, $"未找到挡料电机位置地址,请检查该地址是否存在于点位表!", autoClose: 3);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PLCItem? pLCItem1 = ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?
|
||||||
|
.Where(it => it.Name == "挡料电机位置").FirstOrDefault();
|
||||||
|
|
||||||
|
if (pLCItem1 == null)
|
||||||
|
{
|
||||||
|
pLCItem1 = new PLCItem();
|
||||||
|
pLCItem1.Name = pLCItem.Name;
|
||||||
|
pLCItem1.Address = pLCItem.Address;
|
||||||
|
pLCItem1.Value = iptBarrierPos.Text;
|
||||||
|
pLCItem1.Type = pLCItem.Type;
|
||||||
|
pLCItem1.StartExecute = true;
|
||||||
|
ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?.Add(pLCItem1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pLCItem1.Value = iptBarrierPos.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigHelper.SaveConfig();
|
||||||
|
AntdUI.Message.success(this, "保存成功!", autoClose: 3);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this,ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void BtnBarrier_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_isOperating) return;
|
||||||
|
_isOperating = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取并处理速度值
|
||||||
|
if (!int.TryParse(iptBarrierSpeed.Text, out int speed) || speed == 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, "挡料电机速度值无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!int.TryParse(iptBarrierPos.Text, out int barrierPos) || barrierPos == 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, "挡料电机位置值无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
btnBarrierZero.Enabled= false;
|
||||||
|
int actualSpeed = Math.Abs(speed); // 正转取绝对值
|
||||||
|
|
||||||
|
|
||||||
|
MainWindow.Instance.PLC.BarrierSpeed(actualSpeed);
|
||||||
|
MainWindow.Instance.PLC.BarrierPos(barrierPos);
|
||||||
|
MainWindow.Instance.PLC.BarrierClockwise(true);
|
||||||
|
|
||||||
|
// 实时更新循环
|
||||||
|
while (barrierPos!=MainWindow.Instance.PLC.ReadBarrierRealPos())
|
||||||
|
{
|
||||||
|
await Task.Delay(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_isOperating = false;
|
||||||
|
btnBarrierZero.Enabled = true;
|
||||||
|
AntdUI.Message.error(this, $"挡料电机转动异常: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
MainWindow.Instance.PLC.BarrierClockwise(false);
|
||||||
|
_isOperating = false;
|
||||||
|
btnBarrierZero.Enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CancellationTokenSource? _bCts;
|
||||||
|
private bool _isOperating;
|
||||||
|
|
||||||
|
private async void BtnBarrierZero_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_isOperating) return;
|
||||||
|
_isOperating = true;
|
||||||
|
btnBarrier.Enabled = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
// 执行回零
|
||||||
|
await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(true));
|
||||||
|
|
||||||
|
// 等待回零完成
|
||||||
|
while (!MainWindow.Instance.PLC.ReadBarrierToZero())
|
||||||
|
{
|
||||||
|
await Task.Delay(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(false));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
btnBarrier.Enabled = true;
|
||||||
|
_isOperating = false;
|
||||||
|
AntdUI.Message.error(this, $"回零失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
btnBarrier.Enabled = true;
|
||||||
|
_isOperating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VisualLocalizationWindow_Resize(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ReWinformLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BtnSaveMotorPos_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//根据工位查找点位
|
||||||
|
PLCItem? pLCItem = ConfigModel.PLCBaseList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.PLCItemList?
|
||||||
|
.Where(it => it.Name == "相机步进位置").FirstOrDefault();
|
||||||
|
if (pLCItem == null)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, $"未找到相机步进位置地址,请检查该地址是否存在于点位表!", autoClose: 3);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PLCItem? pLCItem1 = ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?
|
||||||
|
.Where(it => it.Name == "相机步进位置").FirstOrDefault();
|
||||||
|
|
||||||
|
if (pLCItem1 == null)
|
||||||
|
{
|
||||||
|
pLCItem1 = new PLCItem();
|
||||||
|
pLCItem1.Name = pLCItem.Name;
|
||||||
|
pLCItem1.Address = pLCItem.Address;
|
||||||
|
pLCItem1.Value = iptMotorPos.Text;
|
||||||
|
pLCItem1.Type = pLCItem.Type;
|
||||||
|
pLCItem1.StartExecute = true;
|
||||||
|
ConfigModel.GlobalList?
|
||||||
|
.FirstOrDefault()?
|
||||||
|
.StartProcessList?.Add(pLCItem1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pLCItem1.Value = iptMotorPos.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigHelper.SaveConfig();
|
||||||
|
AntdUI.Message.success(this, "保存成功!", autoClose: 3);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private CancellationTokenSource _cts;
|
||||||
|
private bool _isBusy;
|
||||||
|
|
||||||
|
// 电机正转控制
|
||||||
|
private async void BtnMotorForward_MouseDown(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
if (_isBusy) return;
|
||||||
|
_isBusy = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取并处理速度值
|
||||||
|
if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed == 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, "速度值无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int actualSpeed = Math.Abs(speed); // 正转取绝对值
|
||||||
|
|
||||||
|
// 启动PLC控制
|
||||||
|
_cts?.Dispose();
|
||||||
|
_cts = new CancellationTokenSource();
|
||||||
|
MainWindow.Instance.PLC.MotorSpeed(actualSpeed);
|
||||||
|
MainWindow.Instance.PLC.MotorTest(true);
|
||||||
|
|
||||||
|
// 实时更新循环
|
||||||
|
while (!_cts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
var pos = await Task.Run(() => MainWindow.Instance.PLC.ReadMotorRealPos());
|
||||||
|
iptMotorPos.Text = pos.ToString();
|
||||||
|
await Task.Delay(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_isBusy = false;
|
||||||
|
AntdUI.Message.error(this, $"正转异常: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
MainWindow.Instance.PLC.MotorTest(false);
|
||||||
|
_isBusy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 电机反转控制
|
||||||
|
// 电机反转控制(带原点保护)
|
||||||
|
private async void BtnMotorReverse_MouseDown(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
if (_isBusy) return;
|
||||||
|
_isBusy = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取并处理速度值
|
||||||
|
if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed == 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, "速度值无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int actualSpeed = -Math.Abs(speed);
|
||||||
|
|
||||||
|
// 实时位置检查(启动前)
|
||||||
|
int currentPos = MainWindow.Instance.PLC.ReadMotorRealPos();
|
||||||
|
if (currentPos <= 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.info(this, "已在原点位置");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启动PLC控制
|
||||||
|
_cts?.Dispose();
|
||||||
|
_cts = new CancellationTokenSource();
|
||||||
|
MainWindow.Instance.PLC.MotorSpeed(actualSpeed);
|
||||||
|
MainWindow.Instance.PLC.MotorTest(true);
|
||||||
|
|
||||||
|
// 带保护的实时更新循环
|
||||||
|
while (!_cts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
currentPos = await Task.Run(() => MainWindow.Instance.PLC.ReadMotorRealPos());
|
||||||
|
|
||||||
|
// 位置边界保护
|
||||||
|
if (currentPos <= 0)
|
||||||
|
{
|
||||||
|
_cts.Cancel();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新UI
|
||||||
|
this.Invoke((MethodInvoker)delegate {
|
||||||
|
iptMotorPos.Text = currentPos.ToString();
|
||||||
|
});
|
||||||
|
|
||||||
|
await Task.Delay(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_isBusy = false;
|
||||||
|
AntdUI.Message.error(this, $"反转异常: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
MainWindow.Instance.PLC.MotorTest(false);
|
||||||
|
_isBusy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止控制(正反转共用)
|
||||||
|
private void MotorButton_MouseUp(object sender, MouseEventArgs e) {
|
||||||
|
_cts?.Cancel();
|
||||||
|
iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回零操作
|
||||||
|
private async void BtnMotorZero_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_isBusy) return;
|
||||||
|
_isBusy = true;
|
||||||
|
btnMotorForward.Enabled = btnMotorReverse.Enabled = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取速度值
|
||||||
|
if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed <= 0)
|
||||||
|
{
|
||||||
|
AntdUI.Message.warn(this, "速度值无效");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行回零
|
||||||
|
MainWindow.Instance.PLC.MotorSpeed(speed);
|
||||||
|
await Task.Run(() => MainWindow.Instance.PLC.MotorToZero(true));
|
||||||
|
|
||||||
|
// 等待回零完成
|
||||||
|
while (MainWindow.Instance.PLC.ReadMotorRealPos() != 0)
|
||||||
|
{
|
||||||
|
iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString();
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Run(() => MainWindow.Instance.PLC.MotorToZero(false));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
btnMotorForward.Enabled = btnMotorReverse.Enabled = true;
|
||||||
|
_isBusy = false;
|
||||||
|
AntdUI.Message.error(this, $"回零失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
btnMotorForward.Enabled = btnMotorReverse.Enabled = true;
|
||||||
|
_isBusy = false;
|
||||||
|
iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SltCameraName_SelectedIndexChanged(object sender, IntEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
localizations = VisualLocalization.LoadAll();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
string cameraName = sltCameraName.Text;
|
||||||
|
Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == cameraName).FirstOrDefault() ?? new Do3ThinkCamera();
|
||||||
|
VisualLocalization? visual = localizations.Where(it => it.CameraName == cameraName).FirstOrDefault();
|
||||||
|
if (visual != null)
|
||||||
|
{
|
||||||
|
iptModel.Text = visual.ModelPath;
|
||||||
|
iptBackImg.Text = visual.ImgPath;
|
||||||
|
iptThreshold.Text = visual.Threshold;
|
||||||
|
sltDirection.SelectedIndex = visual.Direction == "正方向" ? 0 : 1;
|
||||||
|
iptSpeed.Text = visual.Speed;
|
||||||
|
}
|
||||||
|
if (Do3ThinkCamera.IsZoomCamera)
|
||||||
|
{
|
||||||
|
panelMotor.Visible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
panelMotor.Visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void BtnSavePos_Click(object? sender, EventArgs e)
|
private void BtnSavePos_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var form = new SavePositionControl(this,Convert.ToInt32(iptPosition.Text)) { Size = new Size(300, 300) };
|
try
|
||||||
|
{
|
||||||
|
var form = new SavePositionControl(this, Convert.ToInt32(iptPosition.Text)) { Size = new Size(300, 300) };
|
||||||
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
|
AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None)
|
||||||
{
|
{
|
||||||
BtnHeight = 0,
|
BtnHeight = 0,
|
||||||
});
|
});
|
||||||
if (form.submit)
|
if (form.submit)
|
||||||
{
|
{
|
||||||
//保存用户操作到文件
|
|
||||||
VisualLocalization visualLocalization = new VisualLocalization();
|
VisualLocalization visualLocalization = new VisualLocalization();
|
||||||
|
//保存用户操作到文件
|
||||||
visualLocalization.CameraName = sltCameraName.Text;
|
visualLocalization.CameraName = sltCameraName.Text;
|
||||||
visualLocalization.ModelPath=iptModel.Text;
|
visualLocalization.ModelPath = iptModel.Text;
|
||||||
visualLocalization.ImgPath=iptBackImg.Text;
|
visualLocalization.ImgPath = iptBackImg.Text;
|
||||||
visualLocalization.Threshold=iptThreshold.Text;
|
visualLocalization.Threshold = iptThreshold.Text;
|
||||||
visualLocalization.Direction=sltDirection.Text;
|
visualLocalization.Direction = sltDirection.Text;
|
||||||
visualLocalization.Speed=iptSpeed.Text;
|
visualLocalization.Speed = iptSpeed.Text;
|
||||||
visualLocalization.SaveToFile("VisualLocalization.json");
|
visualLocalization.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,13 +529,15 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnSaveImg_Click(object? sender, EventArgs e)
|
private void BtnSaveImg_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (!isCapturing)
|
if (!isCapturing)
|
||||||
{
|
{
|
||||||
AntdUI.Message.warn(this, $"未开始采集,无法保存图像!", autoClose: 3);
|
AntdUI.Message.warn(this, $"未开始采集,无法保存图像!", autoClose: 3);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Bitmap bitmap =imageViewerControl1.GetCurrentSnapshot();
|
Bitmap bitmap = imageViewerControl1.GetCurrentSnapshot();
|
||||||
using (SaveFileDialog saveDialog = new SaveFileDialog())
|
using (SaveFileDialog saveDialog = new SaveFileDialog())
|
||||||
{
|
{
|
||||||
saveDialog.Title = "保存图像文件";
|
saveDialog.Title = "保存图像文件";
|
||||||
@@ -108,6 +556,12 @@ namespace DHSoftware.Views
|
|||||||
AntdUI.Message.warn(this, $"取消图像保存操作!", autoClose: 3);
|
AntdUI.Message.warn(this, $"取消图像保存操作!", autoClose: 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -116,6 +570,8 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnLocalization_Click(object? sender, EventArgs e)
|
private void BtnLocalization_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (!isCapturing)
|
if (!isCapturing)
|
||||||
{
|
{
|
||||||
@@ -124,7 +580,7 @@ namespace DHSoftware.Views
|
|||||||
}
|
}
|
||||||
if (!isLocationing)
|
if (!isLocationing)
|
||||||
{
|
{
|
||||||
bool direction =sltDirection.SelectedIndex==0?true:false;
|
bool direction = sltDirection.SelectedIndex == 0 ? true : false;
|
||||||
if (string.IsNullOrEmpty(iptSpeed.Text))
|
if (string.IsNullOrEmpty(iptSpeed.Text))
|
||||||
{
|
{
|
||||||
AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3);
|
AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3);
|
||||||
@@ -152,11 +608,16 @@ namespace DHSoftware.Views
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
MainWindow.Instance.PLC.TurnStart(false);
|
MainWindow.Instance.PLC.TurnStart(false);
|
||||||
iptPosition.Text= MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
||||||
isLocationing = false;
|
isLocationing = false;
|
||||||
btnLocalization.Text = "开始定位";
|
btnLocalization.Text = "开始定位";
|
||||||
btnLocalization.Type = TTypeMini.Primary;
|
btnLocalization.Type = TTypeMini.Primary;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +627,8 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnAcquisition_Click(object? sender, EventArgs e)
|
private void BtnAcquisition_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (!isCapturing)
|
if (!isCapturing)
|
||||||
{
|
{
|
||||||
@@ -219,7 +682,7 @@ namespace DHSoftware.Views
|
|||||||
AntdUI.Message.warn(this, $"未连接PLC,无法视觉定位!", autoClose: 3);
|
AntdUI.Message.warn(this, $"未连接PLC,无法视觉定位!", autoClose: 3);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Do3ThinkCamera=MainWindow.Instance.Cameras.Where(it=>it.CameraName==sltCameraName.Text).FirstOrDefault()??new Do3ThinkCamera();
|
Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == sltCameraName.Text).FirstOrDefault() ?? new Do3ThinkCamera();
|
||||||
Do3ThinkCamera.OnHImageOutput += OnCameraHImageOutput;
|
Do3ThinkCamera.OnHImageOutput += OnCameraHImageOutput;
|
||||||
Timer = new System.Threading.Timer(CaptureLoop, null, 0, 50);
|
Timer = new System.Threading.Timer(CaptureLoop, null, 0, 50);
|
||||||
isCapturing = true;
|
isCapturing = true;
|
||||||
@@ -242,6 +705,13 @@ namespace DHSoftware.Views
|
|||||||
btnAcquisition.Type = TTypeMini.Primary;
|
btnAcquisition.Type = TTypeMini.Primary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -251,9 +721,95 @@ namespace DHSoftware.Views
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="state"></param>
|
/// <param name="state"></param>
|
||||||
private void CaptureLoop(object? state)
|
private void CaptureLoop(object? state)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
Do3ThinkCamera.Snapshot();
|
Do3ThinkCamera.Snapshot();
|
||||||
}
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CancellationTokenSource? _rotateCts;
|
||||||
|
private bool _isRotating;
|
||||||
|
/// <summary>
|
||||||
|
/// 统一旋转控制方法
|
||||||
|
/// </summary>
|
||||||
|
private async Task RotateControlAsync(bool direction)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 防止重复启动
|
||||||
|
if (_isRotating) return;
|
||||||
|
_isRotating = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!MainWindow.Instance.PLC.Connected)
|
||||||
|
{
|
||||||
|
this.Invoke(() => AntdUI.Message.warn(this, "未连接PLC!", autoClose: 3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输入验证
|
||||||
|
if (string.IsNullOrEmpty(iptSpeed.Text))
|
||||||
|
{
|
||||||
|
this.Invoke(() => AntdUI.Message.warn(this, "请输入速度!", autoClose: 3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!int.TryParse(iptSpeed.Text, out int speed) || speed <= 0)
|
||||||
|
{
|
||||||
|
this.Invoke(() => AntdUI.Message.warn(this, "速度必须为正整数!", autoClose: 3));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化取消令牌
|
||||||
|
_rotateCts?.Dispose();
|
||||||
|
_rotateCts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
// 设置PLC参数
|
||||||
|
MainWindow.Instance.PLC.TurnSpeed(speed);
|
||||||
|
MainWindow.Instance.PLC.TurnDirection(direction);
|
||||||
|
MainWindow.Instance.PLC.TurnStart(true);
|
||||||
|
|
||||||
|
// 异步更新循环
|
||||||
|
while (!_rotateCts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
var position = MainWindow.Instance.PLC.ReadVisionPos();
|
||||||
|
Debug.WriteLine(position.ToString());
|
||||||
|
this.BeginInvoke(() => iptPosition.Text = position.ToString());
|
||||||
|
await Task.Delay(100, _rotateCts.Token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// 正常取消不处理
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
this.Invoke(() => AntdUI.Message.error(this, $"操作异常:{ex.Message}"));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// 确保停止转动
|
||||||
|
MainWindow.Instance.PLC.TurnStart(false);
|
||||||
|
var finalPos = MainWindow.Instance.PLC.ReadVisionPos();
|
||||||
|
this.Invoke(() => iptPosition.Text = finalPos.ToString());
|
||||||
|
|
||||||
|
_isRotating = false;
|
||||||
|
_rotateCts?.Dispose();
|
||||||
|
_rotateCts = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 反转抬起
|
/// 反转抬起
|
||||||
@@ -262,15 +818,7 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnReverse_MouseUp(object? sender, MouseEventArgs e)
|
private void BtnReverse_MouseUp(object? sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (MainWindow.Instance.PLC.Connected)
|
_rotateCts?.Cancel();
|
||||||
{
|
|
||||||
MainWindow.Instance.PLC.TurnStart(false);
|
|
||||||
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"未连接PLC!", autoClose: 3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -278,38 +826,9 @@ namespace DHSoftware.Views
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnReverse_MouseDown(object? sender, MouseEventArgs e)
|
private async void BtnReverse_MouseDown(object? sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (MainWindow.Instance.PLC.Connected)
|
await RotateControlAsync(false);
|
||||||
{
|
|
||||||
//开启转盘
|
|
||||||
if (string.IsNullOrEmpty(iptSpeed.Text))
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int speed = 0;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bool isValid = int.TryParse(iptSpeed.Text, out speed);
|
|
||||||
if (!isValid)
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"输入的速度不是有效值!", autoClose: 3);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex) { }
|
|
||||||
|
|
||||||
MainWindow.Instance.PLC.TurnSpeed(speed);
|
|
||||||
MainWindow.Instance.PLC.TurnDirection(false);
|
|
||||||
MainWindow.Instance.PLC.TurnStart(true);
|
|
||||||
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"未连接PLC!", autoClose: 3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -319,15 +838,7 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnForward_MouseUp(object? sender, MouseEventArgs e)
|
private void BtnForward_MouseUp(object? sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (MainWindow.Instance.PLC.Connected)
|
_rotateCts?.Cancel();
|
||||||
{
|
|
||||||
MainWindow.Instance.PLC.TurnStart(false);
|
|
||||||
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"未连接PLC!", autoClose: 3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -335,38 +846,9 @@ namespace DHSoftware.Views
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnForward_MouseDown(object? sender, MouseEventArgs e)
|
private async void BtnForward_MouseDown(object? sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (MainWindow.Instance.PLC.Connected)
|
await RotateControlAsync(true);
|
||||||
{
|
|
||||||
//开启转盘
|
|
||||||
if (string.IsNullOrEmpty(iptSpeed.Text))
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int speed = 0;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bool isValid = int.TryParse(iptSpeed.Text, out speed);
|
|
||||||
if (!isValid)
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"输入的速度不是有效值!", autoClose: 3);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex) { }
|
|
||||||
|
|
||||||
MainWindow.Instance.PLC.TurnSpeed(speed);
|
|
||||||
MainWindow.Instance.PLC.TurnDirection(true);
|
|
||||||
MainWindow.Instance.PLC.TurnStart(true);
|
|
||||||
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AntdUI.Message.warn(this, $"未连接PLC!", autoClose: 3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -375,6 +857,8 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnSelectBackImg_Click(object? sender, EventArgs e)
|
private void BtnSelectBackImg_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
@@ -395,6 +879,12 @@ namespace DHSoftware.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 选择算法
|
/// 选择算法
|
||||||
@@ -402,6 +892,8 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void BtnSelectModel_Click(object? sender, EventArgs e)
|
private void BtnSelectModel_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
using (OpenFileDialog openFileDialog = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
@@ -422,6 +914,11 @@ namespace DHSoftware.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载事件
|
/// 加载事件
|
||||||
@@ -429,12 +926,14 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void VisualLocalizationWindow_Load(object? sender, EventArgs e)
|
private void VisualLocalizationWindow_Load(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
sltDirection.SelectedIndex = 0;
|
sltDirection.SelectedIndex = 0;
|
||||||
sltCameraName.Items.Clear();
|
sltCameraName.Items.Clear();
|
||||||
if (MainWindow.Instance.Cameras?.Count > 0)
|
if (MainWindow.Instance.Cameras?.Count > 0)
|
||||||
{
|
{
|
||||||
foreach(var cam in MainWindow.Instance.Cameras)
|
foreach (var cam in MainWindow.Instance.Cameras)
|
||||||
{
|
{
|
||||||
sltCameraName.Items.Add(cam.CameraName);
|
sltCameraName.Items.Add(cam.CameraName);
|
||||||
}
|
}
|
||||||
@@ -444,6 +943,13 @@ namespace DHSoftware.Views
|
|||||||
AntdUI.Message.warn(this, $"未找到启用相机!", autoClose: 3);
|
AntdUI.Message.warn(this, $"未找到启用相机!", autoClose: 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,9 +975,17 @@ namespace DHSoftware.Views
|
|||||||
/// <param name="camera"></param>
|
/// <param name="camera"></param>
|
||||||
/// <param name="imageSet"></param>
|
/// <param name="imageSet"></param>
|
||||||
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet)
|
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet)
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
this.BeginInvoke(new MethodInvoker(delegate ()
|
||||||
{
|
{
|
||||||
|
|
||||||
imageViewerControl1.Image = imageSet._mat.ToBitmap();
|
imageViewerControl1.Image = imageSet._mat.ToBitmap();
|
||||||
|
if (isLocationing)
|
||||||
|
{
|
||||||
HObject obj = OpenCVHelper.MatToHImage(imageSet._mat);
|
HObject obj = OpenCVHelper.MatToHImage(imageSet._mat);
|
||||||
HImage hImage = HalconHelper.ConvertHObjectToHImage(obj);
|
HImage hImage = HalconHelper.ConvertHObjectToHImage(obj);
|
||||||
// 调用 ProcCall 的方法
|
// 调用 ProcCall 的方法
|
||||||
@@ -487,7 +1001,20 @@ namespace DHSoftware.Views
|
|||||||
{
|
{
|
||||||
MainWindow.Instance.PLC.TurnStart(false);
|
MainWindow.Instance.PLC.TurnStart(false);
|
||||||
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString();
|
||||||
|
isLocationing = false;
|
||||||
|
btnLocalization.Text = "开始定位";
|
||||||
|
btnLocalization.Type = TTypeMini.Primary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AntdUI.Message.error(this, ex.Message, autoClose: 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@@ -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//vKcf/7ynH/28ph/su6cfy7unH6W8ph55uqUfSrymFhcAAAABAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px77vKcf7bym
|
|
||||||
H9i7px+WuqogMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
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/rumH766px1OuaIjFv//AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+9px/2vacfvbymIGe1nyAYAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/wvKcexbyn
|
|
||||||
Htq7px71vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn
|
|
||||||
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
|
|
||||||
HkW8px/3vKcf/7ynH/+8px//vKcf/7yoH++6px9RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/
|
|
||||||
vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAALymIRe7px/DvKcf/7ynH/+8px//vKcf/7ynH/y7pR+Dv4AABAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF
|
|
||||||
u08AAAAAAAAAAAAAAAAAAAAAAAAAAMyZMwW7px+LvKcf/rynH/+8px//vKcf/7ynH/+8px6ru6oiDwAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn
|
|
||||||
H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE
|
|
||||||
u/9AxLv/QMS7/0DEvOdAxLvcQMS73EDEu9xAxLvcQMS73EDEu9x0uHrruKkk/rynH/+8px//vKcf/7yn
|
|
||||||
H/+lrTz2TcGp30DEu9xAxLvcQMS73EDEu9xAxLvcQMS73EDEut9AxLv2QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
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
|
|
||||||
H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn
|
|
||||||
H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
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
|
|
||||||
H/+8px//vKcf/7ynH/y9px/EvKYgSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
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 @@
|
|||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6JAAAIBYAAHdlBQBcTAMAeGYGAIVzBwB6aQUA//0XAFlK
|
||||||
|
AQBRPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAADAAAARRYDADkRBAA1DQAAURoIAP+rVQAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEkAABjUgMAGw8AAKOODAD//xMANy0NBVtP
|
||||||
|
Dgb//wAA1L8VAJyKIQCqlx8A794+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAA8DAQA/7uNALhNOQDLUDoAqkMzAI89KwAAAAAAZScTAEweEgAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRSBABBMwMA//8bAJJ/
|
||||||
|
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
|
||||||
|
AAAAAAAAAAAAAAAAAABfTgAANCQAAAAAAABNPw4AYlMmAFA/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCACABvYgUAzbgSAAAANQGbiRgNnZAYD1ZP
|
||||||
|
GwTs2SQArZwpALyqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLAAA8KwAAuqYXAIx5
|
||||||
|
DAClkRAApZUSAJKFDQAAAAAAbVgHAEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
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
BIN
DHSoftware/assets/logo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
BIN
DHSoftware/assets/screenshots/favicon.ico
Normal file
BIN
DHSoftware/assets/screenshots/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
Reference in New Issue
Block a user