步进电机 挡料地

This commit is contained in:
Admin 2025-04-22 18:03:12 +08:00
parent 74051a4287
commit 33e94b92f9
13 changed files with 1378 additions and 585 deletions

View File

@ -49,6 +49,7 @@ namespace DH.Commons.Base
private bool _isallPicEnabled = true;//默认全画幅 private bool _isallPicEnabled = 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 ImageFormat _imageFormat = ImageFormat.Jpeg; private ImageFormat _imageFormat = ImageFormat.Jpeg;
@ -59,7 +60,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;
@ -83,6 +84,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 +256,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

View File

@ -16,6 +16,8 @@ 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; }
// 配置文件路径 // 配置文件路径
private const string ConfigFile = "VisualConfigs.json"; private const string ConfigFile = "VisualConfigs.json";
private static readonly object _fileLock = new object(); private static readonly object _fileLock = new object();
@ -38,6 +40,7 @@ namespace DH.Commons.Base
existing.Threshold = Threshold; existing.Threshold = Threshold;
existing.Direction = Direction; existing.Direction = Direction;
existing.Speed = Speed; existing.Speed = Speed;
existing.MSpeed = MSpeed;
} }
else else
{ {

View File

@ -115,7 +115,16 @@ namespace DH.Commons.Enums
NG脉冲, NG脉冲,
, ,
, ,
,
,
,
,
,
,
,
,
,

View File

@ -350,14 +350,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 +380,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);

View File

@ -737,7 +737,55 @@ 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()?
.StartProcessList?
.Where(it => it.Name == "挡料电机回原点速度").FirstOrDefault();
if (pLCItem == null)
{
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)
//皮带
// _PLC.Belt(true);
// LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置");
//计数清零 //计数清零
CountToZero(); CountToZero();
LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零"); LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零");
@ -827,6 +875,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 +888,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 +900,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;
} }
@ -914,6 +963,59 @@ namespace DH.Devices.PLC
return; return;
WriteBool(pLCItem.Address, b); WriteBool(pLCItem.Address, b);
Thread.Sleep(30); Thread.Sleep(30);
}
public void Motor(bool direction, int speed, int pos)
{
int timeout = 5000;
int elapsedTime = 0;
int checkInterval = 100;
MotorToZero(false);
// 检查是否不在原点,如果不在,则回原点
MotorSpeed(speed); // 速度
Thread.Sleep(300);
// 发送回原点指令
MotorToZero(true);
Thread.Sleep(1000); // 给设备一些时间响应
// 等待回到原点
while (!ReadMotorToZero())
{
if (elapsedTime >= timeout)
{
break;
}
Thread.Sleep(checkInterval);
elapsedTime += checkInterval;
}
// }
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
MotorSpeed(speed);
if (direction)
{
MotorClockwise(true); // 顺时针转动
}
else
{
MotorCounterclockwise(true); // 逆时针转动
}
Thread.Sleep(30);
MotorPos(pos); // 目标位置
Thread.Sleep(2000);
} }
/// <summary> /// <summary>
@ -922,60 +1024,26 @@ namespace DH.Devices.PLC
/// 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 = 5000;
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);
// 检查是否不在原点,如果不在,则回原点 // 检查是否不在原点,如果不在,则回原点
if (!ReadBool(CunToZero))
{
WriteUInt16(CunToZeroSpeed, zerospeed); // 速度 BarrierToZeroSpeed(speed); // 速度
Thread.Sleep(30); Thread.Sleep(300);
// 发送回原点指令 // 发送回原点指令
WriteBool(CunToZero, true); BarrierToZero(true);
Thread.Sleep(1000); // 给设备一些时间响应 Thread.Sleep(1000); // 给设备一些时间响应
// 等待回到原点 // 等待回到原点
while (!ReadBool(CunToZero)) while (!ReadBarrierToZero())
{ {
if (elapsedTime >= timeout) if (elapsedTime >= timeout)
{ {
@ -985,33 +1053,32 @@ namespace DH.Devices.PLC
Thread.Sleep(checkInterval); Thread.Sleep(checkInterval);
elapsedTime += checkInterval; elapsedTime += checkInterval;
} }
}
// 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置 // 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置
BarrierSpeed(speed);
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); Thread.Sleep(30);
WriteUInt16(CunPos, u); // 目标位置 BarrierPos(pos); // 目标位置
Thread.Sleep(2000); Thread.Sleep(2000);
} }
/// <summary> /// <summary>
/// 转盘清料 /// 转盘清料
/// </summary> /// </summary>
@ -1052,16 +1119,226 @@ 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>
/// <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;
WriteUInt32(pLCItem.Address, (uint)speed);
}
/// <summary>
/// 挡杆位置
/// </summary>
public void BarrierPos(int value)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机位置");
if (pLCItem == null)
return;
WriteUInt16(pLCItem.Address, (ushort)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);
}
/// <summary>
/// 相机步进电机位置
/// </summary>
/// <param></param>
public void MotorPos(int value)
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进位置");
if (pLCItem == null)
return;
WriteUInt16(pLCItem.Address, (ushort)value);
}
public int ReadMotorRealPos()
{
PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进实时位置");
if (pLCItem == null)
{
throw new Exception("未找到相机步进实时位置");
}
return ReadInt16(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";

View File

@ -694,6 +694,14 @@ 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.IsZoomCamera = cameraBase.IsZoomCamera;
cam.Exposure = cameraBase.Exposure;
cam.Gain = cameraBase.Gain;
cam.RotateImage = cameraBase.RotateImage;
cam.ROIX= cameraBase.ROIX;
cam.ROIH= cameraBase.ROIH;
cam.ROIW= cameraBase.ROIW;
cam.ROIY=cameraBase.ROIY;
cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName); cam.ImageSaveDirectory = Path.Combine("D://Projects", cameraBase.CameraName);
Cameras.Add(cam); Cameras.Add(cam);
if (cameraBase.IsEnabled) if (cameraBase.IsEnabled)
@ -1215,120 +1223,127 @@ namespace DHSoftware
private void StartProcess() private void StartProcess()
{ {
BatchNO = textBoxBatchNO.Text; try
textBoxBatchNO.ReadOnly = true;
btnCreateBatchNO.Enabled = false;
PrepareBatchNO();//生成批次号
ProcessstartTime = DateTime.Now;
lblStartTime.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
//计数清零
PieceCount = 0;
//CameraSummaries.Clear();
if (PLC?.Enable == true)
{ {
PLC.OnNewPieces -= MainMotion_NewPieces;
PLC.OnNewPieces += MainMotion_NewPieces;
}
Cameras.ForEach(d =>
{ BatchNO = textBoxBatchNO.Text;
if (d is CameraBase cam) textBoxBatchNO.ReadOnly = true;
btnCreateBatchNO.Enabled = false;
PrepareBatchNO();//生成批次号
ProcessstartTime = DateTime.Now;
lblStartTime.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss");
//计数清零
PieceCount = 0;
//CameraSummaries.Clear();
if (PLC?.Enable == true)
{ {
cam.SnapshotCount = 0; PLC.OnNewPieces -= MainMotion_NewPieces;
PLC.OnNewPieces += MainMotion_NewPieces;
} }
});
//PrepareBatchNO(); Cameras.ForEach(d =>
// isInPositionChecking = false;
//isFullTrayChecking = false;
//队列清空
// var temp = new List<ITriggerSet>();
// temp.AddRange(XKRSPLCConfig.TriggerConfigCollection);
// temp.AddRange(XKRSPLCConfig.SnapshotTriggerConfigCollection);
//temp.ForEach(t =>
//{
// var diskInfo = XKRSPLCConfig.DiskInfoList.FirstOrDefault(u => u.DiskName == t.DiskName);
// if (diskInfo != null)
// {
// t.AxisNum = diskInfo.DiskAxisNum;
// }
// else
// {
// t.AxisNum = -1;
// }
//});
//if (temp.Any(u => u.AxisNum < 0))
//{
// LogAsync(DateTime.Now, LogLevel.Error, "触发信号归属转盘未确认");
// return new ProcessResponse(false);
//}
// _diskInfoListInOrder = XKRSPLCConfig.DiskInfoList.OrderBy(u => u.DiskSequence).ToList();
// var axisNumList = _diskInfoListInOrder.Select(u => u.DiskAxisNum).ToList();
/// PrepareMLEngine();
// if (_PLCConfig?.Enable == true)
//挡料电机操作
// _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection);
//流程开启操作配置
// ProcessInitialAction();
// if (_PLC?Enabled == true)
//皮带
// _PLC.Belt(true);
//DeviceCollection.ForEach(d =>
//{
// if (d is CameraBase c)
// {
// c.OnHImageOutput -= OnCameraHImageOutput;
// c.OnHImageOutput += OnCameraHImageOutput;
// c.SnapshotCount = 0;
// }
//});
_productLists.Clear();
#region
//mOfflineImageTimer = new System.Timers.Timer();
//mOfflineImageTimer.Elapsed += OnEmitSerialPortAsync;
//mOfflineImageTimer.Interval = 1000;
//mOfflineImageTimer.Start();
#endregion
var settings = _visionEngine.DetectionConfigs.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>(); if (d is CameraBase cam)
_productLists.Add(products); {
cam.SnapshotCount = 0;
}
});
//PrepareBatchNO();
// isInPositionChecking = false;
//isFullTrayChecking = false;
//队列清空
// var temp = new List<ITriggerSet>();
// temp.AddRange(XKRSPLCConfig.TriggerConfigCollection);
// temp.AddRange(XKRSPLCConfig.SnapshotTriggerConfigCollection);
//temp.ForEach(t =>
//{
// var diskInfo = XKRSPLCConfig.DiskInfoList.FirstOrDefault(u => u.DiskName == t.DiskName);
// if (diskInfo != null)
// {
// t.AxisNum = diskInfo.DiskAxisNum;
// }
// else
// {
// t.AxisNum = -1;
// }
//});
//if (temp.Any(u => u.AxisNum < 0))
//{
// LogAsync(DateTime.Now, LogLevel.Error, "触发信号归属转盘未确认");
// return new ProcessResponse(false);
//}
// _diskInfoListInOrder = XKRSPLCConfig.DiskInfoList.OrderBy(u => u.DiskSequence).ToList();
// var axisNumList = _diskInfoListInOrder.Select(u => u.DiskAxisNum).ToList();
/// PrepareMLEngine();
// if (_PLCConfig?.Enable == true)
//挡料电机操作
// _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection);
//流程开启操作配置
// ProcessInitialAction();
// if (_PLC?Enabled == true)
//皮带
// _PLC.Belt(true);
//DeviceCollection.ForEach(d =>
//{
// if (d is CameraBase c)
// {
// c.OnHImageOutput -= OnCameraHImageOutput;
// c.OnHImageOutput += OnCameraHImageOutput;
// c.SnapshotCount = 0;
// }
//});
_productLists.Clear();
#region
//mOfflineImageTimer = new System.Timers.Timer();
//mOfflineImageTimer.Elapsed += OnEmitSerialPortAsync;
//mOfflineImageTimer.Interval = 1000;
//mOfflineImageTimer.Start();
#endregion
var settings = _visionEngine.DetectionConfigs.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);
}
} }
// _MGSCameraList = DeviceCollection
//.OfType<MGSCameraDriver>() // 直接筛选出 MGSCameraDriver 类型的元素
//.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true
//.ToList();
// ProductBaseCount = _MGSCameraList.Count;
//流程执行时PLC
PLC.StartProcess();
InitialOEEStatistic();
}
catch (Exception ex)
{
} }
// _MGSCameraList = DeviceCollection
//.OfType<MGSCameraDriver>() // 直接筛选出 MGSCameraDriver 类型的元素
//.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true
//.ToList();
// ProductBaseCount = _MGSCameraList.Count;
//流程执行时PLC
PLC.StartProcess();
InitialOEEStatistic();
} }

View File

@ -28,188 +28,63 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
swhEnable = new AntdUI.Switch(); panel3 = new AntdUI.Panel();
btnSizeAdd = new AntdUI.Button();
button1 = new AntdUI.Button();
button2 = new AntdUI.Button();
button3 = new AntdUI.Button();
panel4 = new AntdUI.Panel();
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.InputNumber();
iptGain = new AntdUI.InputNumber(); iptGain = new AntdUI.InputNumber();
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();
iptROIY = new AntdUI.InputNumber();
iptROIX = new AntdUI.InputNumber(); iptROIX = new AntdUI.InputNumber();
iptROIY = new AntdUI.InputNumber();
iptROIW = new AntdUI.InputNumber();
iptROIH = new AntdUI.InputNumber(); iptROIH = new AntdUI.InputNumber();
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();
pictureBox1 = new PictureBox();
panel3.SuspendLayout();
panel4.SuspendLayout();
panel2.SuspendLayout();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
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, 552);
// 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
// //
@ -218,10 +93,10 @@
btnSizeAdd.Ghost = true; btnSizeAdd.Ghost = true;
btnSizeAdd.IconRatio = 0F; btnSizeAdd.IconRatio = 0F;
btnSizeAdd.IconSvg = ""; btnSizeAdd.IconSvg = "";
btnSizeAdd.Location = new Point(282, 532); btnSizeAdd.Location = new Point(75, 13);
btnSizeAdd.Name = "btnSizeAdd"; btnSizeAdd.Name = "btnSizeAdd";
btnSizeAdd.Size = new Size(80, 38); btnSizeAdd.Size = new Size(80, 38);
btnSizeAdd.TabIndex = 34; btnSizeAdd.TabIndex = 43;
btnSizeAdd.Text = "连接相机"; btnSizeAdd.Text = "连接相机";
// //
// button1 // button1
@ -231,10 +106,10 @@
button1.Ghost = true; button1.Ghost = true;
button1.IconRatio = 0F; button1.IconRatio = 0F;
button1.IconSvg = ""; button1.IconSvg = "";
button1.Location = new Point(440, 532); button1.Location = new Point(233, 13);
button1.Name = "button1"; button1.Name = "button1";
button1.Size = new Size(80, 38); button1.Size = new Size(80, 38);
button1.TabIndex = 35; button1.TabIndex = 44;
button1.Text = "断开相机"; button1.Text = "断开相机";
// //
// button2 // button2
@ -244,10 +119,10 @@
button2.Ghost = true; button2.Ghost = true;
button2.IconRatio = 0F; button2.IconRatio = 0F;
button2.IconSvg = ""; button2.IconSvg = "";
button2.Location = new Point(595, 532); button2.Location = new Point(388, 13);
button2.Name = "button2"; button2.Name = "button2";
button2.Size = new Size(80, 38); button2.Size = new Size(80, 38);
button2.TabIndex = 36; button2.TabIndex = 45;
button2.Text = "单次触发"; button2.Text = "单次触发";
// //
// button3 // button3
@ -257,169 +132,375 @@
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 = "连续触发";
// //
// panel4
//
panel4.Controls.Add(pictureBox1);
panel4.Dock = DockStyle.Fill;
panel4.Location = new Point(0, 0);
panel4.Name = "panel4";
panel4.Size = new Size(691, 552);
panel4.TabIndex = 40;
panel4.Text = "panel4";
//
// 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, 611);
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(94, 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(94, 36);
iptExposure.TabIndex = 53;
iptExposure.Tag = "";
iptExposure.Text = "0";
//
// iptGain
//
iptGain.Location = new Point(86, 179);
iptGain.Name = "iptGain";
iptGain.Size = new Size(94, 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(94, 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(94, 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(94, 36);
sltTriggerMode.TabIndex = 59;
//
// label7
//
label7.Location = new Point(3, 498);
label7.Name = "label7";
label7.Size = new Size(29, 23);
label7.TabIndex = 60;
label7.Text = "ROI";
//
// iptROIX
//
iptROIX.Location = new Point(86, 430);
iptROIX.Name = "iptROIX";
iptROIX.Size = new Size(94, 37);
iptROIX.TabIndex = 61;
iptROIX.Tag = "";
iptROIX.Text = "0";
//
// iptROIY
//
iptROIY.Location = new Point(86, 473);
iptROIY.Name = "iptROIY";
iptROIY.Size = new Size(94, 37);
iptROIY.TabIndex = 62;
iptROIY.Text = "0";
//
// iptROIW
//
iptROIW.Location = new Point(86, 516);
iptROIW.Name = "iptROIW";
iptROIW.Size = new Size(94, 37);
iptROIW.TabIndex = 63;
iptROIW.Text = "0";
//
// iptROIH
//
iptROIH.Location = new Point(86, 559);
iptROIH.Name = "iptROIH";
iptROIH.Size = new Size(94, 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(94, 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, 430);
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, 473);
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, 516);
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, 560);
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, 362);
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, 352);
sthAllPic.Name = "sthAllPic"; sthAllPic.Name = "sthAllPic";
sthAllPic.Size = new Size(94, 33); sthAllPic.Size = new Size(94, 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(94, 36);
sltCamType.TabIndex = 47; sltCamType.TabIndex = 74;
// //
// label13 // label14
// //
label13.Location = new Point(28, 99); label14.Location = new Point(21, 401);
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, 391);
switch1.Name = "switch1";
switch1.Size = new Size(94, 33);
switch1.TabIndex = 76;
switch1.UnCheckedText = "关闭";
//
// panel1
//
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, 611);
panel1.TabIndex = 48;
panel1.Text = "panel1";
//
// pictureBox1
//
pictureBox1.BorderStyle = BorderStyle.FixedSingle;
pictureBox1.Dock = DockStyle.Fill;
pictureBox1.Location = new Point(0, 0);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(691, 552);
pictureBox1.TabIndex = 39;
pictureBox1.TabStop = false;
// //
// 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, 611);
panel3.ResumeLayout(false);
panel4.ResumeLayout(false);
panel2.ResumeLayout(false);
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
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.InputNumber iptExposure;
private AntdUI.InputNumber iptGain; private AntdUI.InputNumber 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.InputNumber iptROIY;
private AntdUI.InputNumber iptROIX; private AntdUI.InputNumber iptROIX;
private AntdUI.InputNumber iptROIY;
private AntdUI.InputNumber iptROIW;
private AntdUI.InputNumber iptROIH; private AntdUI.InputNumber 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;
} }
} }

View File

@ -84,7 +84,8 @@ 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), iptExposure.DataBindings.Add(nameof(iptExposure.Value), CameraBase, nameof(CameraBase.Exposure),
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2"); true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
@ -94,7 +95,7 @@ namespace DHSoftware.Views
true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2"); true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
// 旋转角度绑定 // 旋转角度绑定
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"); true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2");
// ROI坐标绑定 // ROI坐标绑定
@ -118,6 +119,7 @@ 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)))

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
@ -48,7 +48,7 @@
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter

View File

@ -253,10 +253,16 @@ namespace DHSoftware.Views
private void AutoScrollIfNeeded() private void AutoScrollIfNeeded()
{ {
if (lvLog.Items.Count > 0 /*&& chkAutoScroll.Checked*/) try
{ {
lvLog.EnsureVisible(lvLog.Items.Count - 1); if (lvLog.Items.Count > 0 /*&& chkAutoScroll.Checked*/)
{
lvLog.EnsureVisible(lvLog.Items.Count - 1);
}
} }
catch (Exception ex) {
}
} }
private void UpdateLayout() private void UpdateLayout()

View File

@ -598,7 +598,7 @@ namespace DHSoftware.Views
var form = new AddCubicleControl(this, "重命名工位操作") var form = new AddCubicleControl(this, "重命名工位操作")
{ {
Size = new Size(300, 200), Size = new Size(300, 500),
// 传递当前名称到表单 // 传递当前名称到表单
CubicleName = originalName CubicleName = originalName
}; };

View File

@ -53,9 +53,19 @@
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();
imageViewerControl1 = new ImageViewerControl(); imageViewerControl1 = new ImageViewerControl();
panel1.SuspendLayout(); panel1.SuspendLayout();
panel2.SuspendLayout(); panel2.SuspendLayout();
panelMotor.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
// titlebar // titlebar
@ -67,11 +77,12 @@
titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134);
titlebar.ForeColor = Color.White; titlebar.ForeColor = Color.White;
titlebar.Location = new Point(0, 0); titlebar.Location = new Point(0, 0);
titlebar.Margin = new Padding(4, 4, 4, 4);
titlebar.Mode = AntdUI.TAMode.Dark; titlebar.Mode = AntdUI.TAMode.Dark;
titlebar.Name = "titlebar"; titlebar.Name = "titlebar";
titlebar.ShowButton = true; titlebar.ShowButton = true;
titlebar.ShowIcon = true; titlebar.ShowIcon = true;
titlebar.Size = new Size(1210, 37); titlebar.Size = new Size(1551, 44);
titlebar.SubText = "视觉定位系统"; titlebar.SubText = "视觉定位系统";
titlebar.TabIndex = 1; titlebar.TabIndex = 1;
titlebar.Text = "山东迭慧智能科技有限公司"; titlebar.Text = "山东迭慧智能科技有限公司";
@ -89,35 +100,39 @@
panel1.Controls.Add(sltCameraName); panel1.Controls.Add(sltCameraName);
panel1.Controls.Add(label1); panel1.Controls.Add(label1);
panel1.Dock = DockStyle.Top; panel1.Dock = DockStyle.Top;
panel1.Location = new Point(0, 37); panel1.Location = new Point(0, 44);
panel1.Margin = new Padding(4, 4, 4, 4);
panel1.Name = "panel1"; panel1.Name = "panel1";
panel1.Size = new Size(1210, 56); panel1.Size = new Size(1551, 66);
panel1.TabIndex = 2; panel1.TabIndex = 2;
panel1.Text = "panel1"; panel1.Text = "panel1";
// //
// iptThreshold // iptThreshold
// //
iptThreshold.Location = new Point(1094, 6); iptThreshold.Location = new Point(1407, 7);
iptThreshold.Margin = new Padding(4, 4, 4, 4);
iptThreshold.Name = "iptThreshold"; iptThreshold.Name = "iptThreshold";
iptThreshold.Size = new Size(107, 43); iptThreshold.Size = new Size(138, 51);
iptThreshold.TabIndex = 15; iptThreshold.TabIndex = 15;
iptThreshold.Text = "0"; iptThreshold.Text = "0";
// //
// label6 // label6
// //
label6.BackColor = SystemColors.Window; label6.BackColor = SystemColors.Window;
label6.Location = new Point(1044, 18); label6.Location = new Point(1342, 21);
label6.Margin = new Padding(4, 4, 4, 4);
label6.Name = "label6"; label6.Name = "label6";
label6.Size = new Size(57, 23); label6.Size = new Size(73, 27);
label6.TabIndex = 14; label6.TabIndex = 14;
label6.Text = "定位阈值"; label6.Text = "定位阈值";
// //
// btnSelectBackImg // btnSelectBackImg
// //
btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectBackImg.Location = new Point(963, 11); btnSelectBackImg.Location = new Point(1238, 13);
btnSelectBackImg.Margin = new Padding(4, 4, 4, 4);
btnSelectBackImg.Name = "btnSelectBackImg"; btnSelectBackImg.Name = "btnSelectBackImg";
btnSelectBackImg.Size = new Size(75, 38); btnSelectBackImg.Size = new Size(96, 45);
btnSelectBackImg.TabIndex = 13; btnSelectBackImg.TabIndex = 13;
btnSelectBackImg.Text = "打开"; btnSelectBackImg.Text = "打开";
btnSelectBackImg.Type = AntdUI.TTypeMini.Primary; btnSelectBackImg.Type = AntdUI.TTypeMini.Primary;
@ -125,63 +140,70 @@
// btnSelectModel // btnSelectModel
// //
btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSelectModel.Location = new Point(525, 9); btnSelectModel.Location = new Point(675, 11);
btnSelectModel.Margin = new Padding(4, 4, 4, 4);
btnSelectModel.Name = "btnSelectModel"; btnSelectModel.Name = "btnSelectModel";
btnSelectModel.Size = new Size(75, 38); btnSelectModel.Size = new Size(96, 45);
btnSelectModel.TabIndex = 12; btnSelectModel.TabIndex = 12;
btnSelectModel.Text = "打开"; btnSelectModel.Text = "打开";
btnSelectModel.Type = AntdUI.TTypeMini.Primary; btnSelectModel.Type = AntdUI.TTypeMini.Primary;
// //
// iptBackImg // iptBackImg
// //
iptBackImg.Location = new Point(694, 6); iptBackImg.Location = new Point(892, 7);
iptBackImg.Margin = new Padding(4, 4, 4, 4);
iptBackImg.Name = "iptBackImg"; iptBackImg.Name = "iptBackImg";
iptBackImg.PlaceholderText = "请选择背景图片"; iptBackImg.PlaceholderText = "请选择背景图片";
iptBackImg.Size = new Size(263, 43); iptBackImg.Size = new Size(338, 51);
iptBackImg.TabIndex = 10; iptBackImg.TabIndex = 10;
// //
// label3 // label3
// //
label3.BackColor = SystemColors.Window; label3.BackColor = SystemColors.Window;
label3.Location = new Point(606, 18); label3.Location = new Point(779, 21);
label3.Margin = new Padding(4, 4, 4, 4);
label3.Name = "label3"; label3.Name = "label3";
label3.Size = new Size(82, 23); label3.Size = new Size(105, 27);
label3.TabIndex = 9; label3.TabIndex = 9;
label3.Text = "背景图片路径"; label3.Text = "背景图片路径";
// //
// iptModel // iptModel
// //
iptModel.Location = new Point(256, 6); iptModel.Location = new Point(329, 7);
iptModel.Margin = new Padding(4, 4, 4, 4);
iptModel.Name = "iptModel"; iptModel.Name = "iptModel";
iptModel.PlaceholderText = "请选择算法"; iptModel.PlaceholderText = "请选择算法";
iptModel.Size = new Size(263, 43); iptModel.Size = new Size(338, 51);
iptModel.TabIndex = 3; iptModel.TabIndex = 3;
// //
// label2 // label2
// //
label2.BackColor = SystemColors.Window; label2.BackColor = SystemColors.Window;
label2.Location = new Point(193, 18); label2.Location = new Point(248, 21);
label2.Margin = new Padding(4, 4, 4, 4);
label2.Name = "label2"; label2.Name = "label2";
label2.Size = new Size(57, 23); label2.Size = new Size(73, 27);
label2.TabIndex = 2; label2.TabIndex = 2;
label2.Text = "算法路径"; label2.Text = "算法路径";
// //
// sltCameraName // sltCameraName
// //
sltCameraName.List = true; sltCameraName.List = true;
sltCameraName.Location = new Point(72, 7); sltCameraName.Location = new Point(93, 8);
sltCameraName.Margin = new Padding(4, 4, 4, 4);
sltCameraName.MaxCount = 10; sltCameraName.MaxCount = 10;
sltCameraName.Name = "sltCameraName"; sltCameraName.Name = "sltCameraName";
sltCameraName.PlaceholderText = "请选择相机"; sltCameraName.PlaceholderText = "请选择相机";
sltCameraName.Size = new Size(115, 43); sltCameraName.Size = new Size(148, 51);
sltCameraName.TabIndex = 1; sltCameraName.TabIndex = 1;
// //
// label1 // label1
// //
label1.BackColor = SystemColors.Window; label1.BackColor = SystemColors.Window;
label1.Location = new Point(9, 18); label1.Location = new Point(12, 21);
label1.Margin = new Padding(4, 4, 4, 4);
label1.Name = "label1"; label1.Name = "label1";
label1.Size = new Size(57, 23); label1.Size = new Size(73, 27);
label1.TabIndex = 0; label1.TabIndex = 0;
label1.Text = "相机名称"; label1.Text = "相机名称";
// //
@ -200,35 +222,39 @@
panel2.Controls.Add(sltDirection); panel2.Controls.Add(sltDirection);
panel2.Controls.Add(label4); panel2.Controls.Add(label4);
panel2.Dock = DockStyle.Top; panel2.Dock = DockStyle.Top;
panel2.Location = new Point(0, 93); panel2.Location = new Point(0, 110);
panel2.Margin = new Padding(4, 4, 4, 4);
panel2.Name = "panel2"; panel2.Name = "panel2";
panel2.Size = new Size(1210, 56); panel2.Size = new Size(1551, 66);
panel2.TabIndex = 3; panel2.TabIndex = 3;
panel2.Text = "panel2"; panel2.Text = "panel2";
// //
// iptSpeed // iptSpeed
// //
iptSpeed.Location = new Point(256, 6); iptSpeed.Location = new Point(329, 7);
iptSpeed.Margin = new Padding(4, 4, 4, 4);
iptSpeed.Name = "iptSpeed"; iptSpeed.Name = "iptSpeed";
iptSpeed.Size = new Size(107, 43); iptSpeed.Size = new Size(138, 51);
iptSpeed.TabIndex = 20; iptSpeed.TabIndex = 20;
iptSpeed.Text = "0"; iptSpeed.Text = "0";
// //
// label7 // label7
// //
label7.BackColor = SystemColors.Window; label7.BackColor = SystemColors.Window;
label7.Location = new Point(193, 18); label7.Location = new Point(248, 21);
label7.Margin = new Padding(4, 4, 4, 4);
label7.Name = "label7"; label7.Name = "label7";
label7.Size = new Size(57, 23); label7.Size = new Size(73, 27);
label7.TabIndex = 19; label7.TabIndex = 19;
label7.Text = "转盘速度"; label7.Text = "转盘速度";
// //
// btnSaveImg // btnSaveImg
// //
btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveImg.Location = new Point(1126, 11); btnSaveImg.Location = new Point(1448, 13);
btnSaveImg.Margin = new Padding(4, 4, 4, 4);
btnSaveImg.Name = "btnSaveImg"; btnSaveImg.Name = "btnSaveImg";
btnSaveImg.Size = new Size(75, 38); btnSaveImg.Size = new Size(96, 45);
btnSaveImg.TabIndex = 18; btnSaveImg.TabIndex = 18;
btnSaveImg.Text = "保存图像"; btnSaveImg.Text = "保存图像";
btnSaveImg.Type = AntdUI.TTypeMini.Primary; btnSaveImg.Type = AntdUI.TTypeMini.Primary;
@ -236,9 +262,10 @@
// btnSavePos // btnSavePos
// //
btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSavePos.Location = new Point(1013, 11); btnSavePos.Location = new Point(1302, 13);
btnSavePos.Margin = new Padding(4, 4, 4, 4);
btnSavePos.Name = "btnSavePos"; btnSavePos.Name = "btnSavePos";
btnSavePos.Size = new Size(75, 38); btnSavePos.Size = new Size(96, 45);
btnSavePos.TabIndex = 17; btnSavePos.TabIndex = 17;
btnSavePos.Text = "保存定位"; btnSavePos.Text = "保存定位";
btnSavePos.Type = AntdUI.TTypeMini.Primary; btnSavePos.Type = AntdUI.TTypeMini.Primary;
@ -246,9 +273,10 @@
// btnReverse // btnReverse
// //
btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnReverse.Location = new Point(904, 11); btnReverse.Location = new Point(1162, 13);
btnReverse.Margin = new Padding(4, 4, 4, 4);
btnReverse.Name = "btnReverse"; btnReverse.Name = "btnReverse";
btnReverse.Size = new Size(75, 38); btnReverse.Size = new Size(96, 45);
btnReverse.TabIndex = 16; btnReverse.TabIndex = 16;
btnReverse.Text = "转盘反转"; btnReverse.Text = "转盘反转";
btnReverse.Type = AntdUI.TTypeMini.Primary; btnReverse.Type = AntdUI.TTypeMini.Primary;
@ -256,9 +284,10 @@
// btnForward // btnForward
// //
btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnForward.Location = new Point(804, 11); btnForward.Location = new Point(1034, 13);
btnForward.Margin = new Padding(4, 4, 4, 4);
btnForward.Name = "btnForward"; btnForward.Name = "btnForward";
btnForward.Size = new Size(75, 38); btnForward.Size = new Size(96, 45);
btnForward.TabIndex = 15; btnForward.TabIndex = 15;
btnForward.Text = "转盘正转"; btnForward.Text = "转盘正转";
btnForward.Type = AntdUI.TTypeMini.Primary; btnForward.Type = AntdUI.TTypeMini.Primary;
@ -266,9 +295,10 @@
// btnLocalization // btnLocalization
// //
btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnLocalization.Location = new Point(704, 11); btnLocalization.Location = new Point(905, 13);
btnLocalization.Margin = new Padding(4, 4, 4, 4);
btnLocalization.Name = "btnLocalization"; btnLocalization.Name = "btnLocalization";
btnLocalization.Size = new Size(75, 38); btnLocalization.Size = new Size(96, 45);
btnLocalization.TabIndex = 14; btnLocalization.TabIndex = 14;
btnLocalization.Text = "开始定位"; btnLocalization.Text = "开始定位";
btnLocalization.Type = AntdUI.TTypeMini.Primary; btnLocalization.Type = AntdUI.TTypeMini.Primary;
@ -276,28 +306,31 @@
// btnAcquisition // btnAcquisition
// //
btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnAcquisition.Location = new Point(606, 11); btnAcquisition.Location = new Point(779, 13);
btnAcquisition.Margin = new Padding(4, 4, 4, 4);
btnAcquisition.Name = "btnAcquisition"; btnAcquisition.Name = "btnAcquisition";
btnAcquisition.Size = new Size(75, 38); btnAcquisition.Size = new Size(96, 45);
btnAcquisition.TabIndex = 13; btnAcquisition.TabIndex = 13;
btnAcquisition.Text = "开始采集"; btnAcquisition.Text = "开始采集";
btnAcquisition.Type = AntdUI.TTypeMini.Primary; btnAcquisition.Type = AntdUI.TTypeMini.Primary;
// //
// iptPosition // iptPosition
// //
iptPosition.Location = new Point(425, 6); iptPosition.Location = new Point(546, 7);
iptPosition.Margin = new Padding(4, 4, 4, 4);
iptPosition.Name = "iptPosition"; iptPosition.Name = "iptPosition";
iptPosition.ReadOnly = true; iptPosition.ReadOnly = true;
iptPosition.Size = new Size(175, 43); iptPosition.Size = new Size(225, 51);
iptPosition.TabIndex = 7; iptPosition.TabIndex = 7;
iptPosition.Text = "0"; iptPosition.Text = "0";
// //
// label5 // label5
// //
label5.BackColor = SystemColors.Window; label5.BackColor = SystemColors.Window;
label5.Location = new Point(369, 18); label5.Location = new Point(474, 21);
label5.Margin = new Padding(4, 4, 4, 4);
label5.Name = "label5"; label5.Name = "label5";
label5.Size = new Size(59, 23); label5.Size = new Size(76, 27);
label5.TabIndex = 6; label5.TabIndex = 6;
label5.Text = "当前位置"; label5.Text = "当前位置";
// //
@ -305,45 +338,152 @@
// //
sltDirection.Items.AddRange(new object[] { "正方向", "反方向" }); sltDirection.Items.AddRange(new object[] { "正方向", "反方向" });
sltDirection.List = true; sltDirection.List = true;
sltDirection.Location = new Point(72, 6); sltDirection.Location = new Point(93, 7);
sltDirection.Margin = new Padding(4, 4, 4, 4);
sltDirection.MaxCount = 10; sltDirection.MaxCount = 10;
sltDirection.Name = "sltDirection"; sltDirection.Name = "sltDirection";
sltDirection.PlaceholderText = "请选择方向"; sltDirection.PlaceholderText = "请选择方向";
sltDirection.Size = new Size(115, 43); sltDirection.Size = new Size(148, 51);
sltDirection.TabIndex = 5; sltDirection.TabIndex = 5;
// //
// label4 // label4
// //
label4.BackColor = SystemColors.Window; label4.BackColor = SystemColors.Window;
label4.Location = new Point(9, 18); label4.Location = new Point(12, 21);
label4.Margin = new Padding(4, 4, 4, 4);
label4.Name = "label4"; label4.Name = "label4";
label4.Size = new Size(57, 23); label4.Size = new Size(73, 27);
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, 176);
panelMotor.Margin = new Padding(4, 4, 4, 4);
panelMotor.Name = "panelMotor";
panelMotor.Size = new Size(1551, 54);
panelMotor.TabIndex = 4;
panelMotor.Text = "panel3";
//
// btnSaveMotorPos
//
btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnSaveMotorPos.Location = new Point(966, 6);
btnSaveMotorPos.Margin = new Padding(4, 4, 4, 4);
btnSaveMotorPos.Name = "btnSaveMotorPos";
btnSaveMotorPos.Size = new Size(111, 45);
btnSaveMotorPos.TabIndex = 21;
btnSaveMotorPos.Text = "保存电机位置";
btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary;
//
// iptMotorPos
//
iptMotorPos.Location = new Point(365, 0);
iptMotorPos.Margin = new Padding(4, 4, 4, 4);
iptMotorPos.Name = "iptMotorPos";
iptMotorPos.ReadOnly = true;
iptMotorPos.Size = new Size(225, 51);
iptMotorPos.TabIndex = 20;
iptMotorPos.Text = "0";
//
// label9
//
label9.BackColor = SystemColors.Window;
label9.Location = new Point(261, 12);
label9.Margin = new Padding(4, 4, 4, 4);
label9.Name = "label9";
label9.Size = new Size(104, 27);
label9.TabIndex = 19;
label9.Text = "变焦电机位置";
//
// btnMotorZero
//
btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
btnMotorZero.Location = new Point(598, 6);
btnMotorZero.Margin = new Padding(4, 4, 4, 4);
btnMotorZero.Name = "btnMotorZero";
btnMotorZero.Size = new Size(96, 45);
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(847, 6);
btnMotorReverse.Margin = new Padding(4, 4, 4, 4);
btnMotorReverse.Name = "btnMotorReverse";
btnMotorReverse.Size = new Size(96, 45);
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(724, 6);
btnMotorForward.Margin = new Padding(4, 4, 4, 4);
btnMotorForward.Name = "btnMotorForward";
btnMotorForward.Size = new Size(96, 45);
btnMotorForward.TabIndex = 16;
btnMotorForward.Text = "电机正转";
btnMotorForward.Type = AntdUI.TTypeMini.Primary;
//
// iptMotorSpeed
//
iptMotorSpeed.Location = new Point(116, 0);
iptMotorSpeed.Margin = new Padding(4, 4, 4, 4);
iptMotorSpeed.Name = "iptMotorSpeed";
iptMotorSpeed.Size = new Size(138, 51);
iptMotorSpeed.TabIndex = 8;
iptMotorSpeed.Text = "0";
//
// label8
//
label8.BackColor = SystemColors.Window;
label8.Location = new Point(12, 12);
label8.Margin = new Padding(4, 4, 4, 4);
label8.Name = "label8";
label8.Size = new Size(104, 27);
label8.TabIndex = 1;
label8.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, 230);
imageViewerControl1.Margin = new Padding(4, 4, 4, 4);
imageViewerControl1.Name = "imageViewerControl1"; imageViewerControl1.Name = "imageViewerControl1";
imageViewerControl1.Size = new Size(1210, 558); imageViewerControl1.Size = new Size(1551, 593);
imageViewerControl1.TabIndex = 4; imageViewerControl1.TabIndex = 5;
// //
// VisualLocalizationWindow // VisualLocalizationWindow
// //
AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleDimensions = new SizeF(9F, 20F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1210, 707); ClientSize = new Size(1551, 823);
Controls.Add(imageViewerControl1); Controls.Add(imageViewerControl1);
Controls.Add(panelMotor);
Controls.Add(panel2); Controls.Add(panel2);
Controls.Add(panel1); Controls.Add(panel1);
Controls.Add(titlebar); Controls.Add(titlebar);
Margin = new Padding(4, 4, 4, 4);
Name = "VisualLocalizationWindow"; Name = "VisualLocalizationWindow";
Text = "CCD光学筛选定位系统"; Text = "CCD光学筛选定位系统";
WindowState = FormWindowState.Maximized; WindowState = FormWindowState.Maximized;
panel1.ResumeLayout(false); panel1.ResumeLayout(false);
panel2.ResumeLayout(false); panel2.ResumeLayout(false);
panelMotor.ResumeLayout(false);
ResumeLayout(false); ResumeLayout(false);
} }
@ -370,10 +510,19 @@
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 ImageViewerControl imageViewerControl1;
private AntdUI.Button btnMotorReverse;
private AntdUI.Button btnMotorForward;
private AntdUI.InputNumber iptMotorPos;
private AntdUI.Label label9;
private AntdUI.Button btnMotorZero;
private AntdUI.Button btnSaveMotorPos;
} }
} }

View File

@ -1,8 +1,11 @@
using System.Data; using System.Data;
using System.Diagnostics;
using System.Drawing.Imaging; using System.Drawing.Imaging;
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;
@ -45,23 +48,228 @@ namespace DHSoftware.Views
btnSaveImg.Click += BtnSaveImg_Click; btnSaveImg.Click += BtnSaveImg_Click;
btnSavePos.Click += BtnSavePos_Click; btnSavePos.Click += BtnSavePos_Click;
sltCameraName.SelectedIndexChanged += SltCameraName_SelectedIndexChanged; 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;
}
private void BtnSaveMotorPos_Click(object? sender, EventArgs e)
{
//根据工位查找点位
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);
}
private CancellationTokenSource? _motorCts;
private bool _isMotorOperating;
private bool _isHoming;
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)
{
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)
{
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)
{
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(); localizations = VisualLocalization.LoadAll();
} }
catch catch
{ {
} }
}
private void SltCameraName_SelectedIndexChanged(object sender, IntEventArgs e)
{
string cameraName= sltCameraName.Text; 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(); VisualLocalization? visual= localizations.Where(it=>it.CameraName==cameraName).FirstOrDefault();
if (visual != null) if (visual != null)
{ {
@ -71,6 +279,14 @@ namespace DHSoftware.Views
sltDirection.SelectedIndex = visual.Direction == "正方向" ? 0 : 1; sltDirection.SelectedIndex = visual.Direction == "正方向" ? 0 : 1;
iptSpeed.Text = visual.Speed; iptSpeed.Text = visual.Speed;
} }
if (Do3ThinkCamera.IsZoomCamera)
{
panelMotor.Visible=true;
}
else
{
panelMotor.Visible = false;
}
} }
private void BtnSavePos_Click(object? sender, EventArgs e) private void BtnSavePos_Click(object? sender, EventArgs e)
@ -272,6 +488,78 @@ namespace DHSoftware.Views
Do3ThinkCamera.Snapshot(); Do3ThinkCamera.Snapshot();
} }
private CancellationTokenSource? _rotateCts;
private bool _isRotating;
/// <summary>
/// 统一旋转控制方法
/// </summary>
private async Task RotateControlAsync(bool direction)
{
// 防止重复启动
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;
}
}
/// <summary> /// <summary>
/// 反转抬起 /// 反转抬起
/// </summary> /// </summary>
@ -279,15 +567,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>
@ -295,38 +575,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>
@ -336,15 +587,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>
@ -352,38 +595,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>
@ -488,23 +702,37 @@ namespace DHSoftware.Views
private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet) private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet)
{ {
imageViewerControl1.Image = imageSet._mat.ToBitmap();
HObject obj = OpenCVHelper.MatToHImage(imageSet._mat);
HImage hImage = HalconHelper.ConvertHObjectToHImage(obj); this.BeginInvoke(new MethodInvoker(delegate ()
// 调用 ProcCall 的方法 {
ProcCall.SetInputIconicParamObject("INPUT_Image", hImage); // 将图像输入Proc
imageViewerControl1.Image = imageSet._mat.ToBitmap();
if (isLocationing)
{
HObject obj = OpenCVHelper.MatToHImage(imageSet._mat);
HImage hImage = HalconHelper.ConvertHObjectToHImage(obj);
// 调用 ProcCall 的方法
ProcCall.SetInputIconicParamObject("INPUT_Image", hImage); // 将图像输入Proc
ProcCall.SetInputIconicParamObject("BackGroundPic", backImage); ProcCall.SetInputIconicParamObject("BackGroundPic", backImage);
ProcCall.SetInputCtrlParamTuple("DistThreshold", Convert.ToInt32(iptThreshold.Text)); ProcCall.SetInputCtrlParamTuple("DistThreshold", Convert.ToInt32(iptThreshold.Text));
ProcCall.Execute(); ProcCall.Execute();
double nNUm = ProcCall.GetOutputCtrlParamTuple("OUTPUT_Flag"); double nNUm = ProcCall.GetOutputCtrlParamTuple("OUTPUT_Flag");
if (nNUm == 0) if (nNUm == 0)
{ {
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;
}
}
}));
}
} }
} }
}
}