diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml b/src/Khd.Core.Wpf/Form/FormBoardT.xaml
index 91a129a..da63d13 100644
--- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml
+++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml
@@ -3348,7 +3348,7 @@ IsReadOnly="True">
HorizontalAlignment="Left"
Background="#213269"
Orientation="Horizontal">
-
+
diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs
index 1c9efae..6aedb9a 100644
--- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs
+++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs
@@ -5873,11 +5873,29 @@ namespace Khd.Core.Wpf.Form
GetInvertoryData();
}
+
+ ///
+ /// 提升机报警信息查询
+ ///
+ ///
+ ///
private void HoistWarnInfoButton_Click(object sender, RoutedEventArgs e)
{
HoistWarnInfoWindow window = new HoistWarnInfoWindow(_host);
window.ShowDialog();
}
+
+ ///
+ /// 提升机报警异常处理
+ ///
+ ///
+ ///
+ private void HoistWarnHandlerButton_Click(object sender, RoutedEventArgs e)
+ {
+ HoistWarnHandlerWindow window = new HoistWarnHandlerWindow(_host);
+ window.ShowDialog();
+
+ }
}
}
diff --git a/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj b/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
index 08d5cc4..4f8d0f7 100644
--- a/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
+++ b/src/Khd.Core.Wpf/Khd.Core.Wpf.csproj
@@ -476,6 +476,9 @@
+
+ Code
+
Code
diff --git a/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml b/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml
new file mode 100644
index 0000000..c0979bf
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml.cs b/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml.cs
new file mode 100644
index 0000000..5b12361
--- /dev/null
+++ b/src/Khd.Core.Wpf/WindowPage/HoistWarnHandlerWindow.xaml.cs
@@ -0,0 +1,324 @@
+using Khd.Core.Domain.Models;
+using Khd.Core.EntityFramework;
+using Khd.Core.Library.Mapper;
+using Khd.Core.Plc.S7;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using Khd.Core.Plc;
+using System.Windows.Threading;
+
+namespace Khd.Core.Wpf.WindowPage
+{
+
+
+ ///
+ /// HoistWarnInfoWindow.xaml 的交互逻辑
+ ///
+ /// 提升机异常处理步骤:
+ /// 前置条件:提升机无报警==》PLC触摸屏有报警先复位消除报警、有急停先拔起来急停按钮(5F上电、复位、蓝色确认按钮)
+ /// 1.点击删除任务按钮,删除提升机已经下发的正在执行的任务
+ /// 2.选择问题楼层,不需要选择,读PLC自动判断
+ /// 3.点击对应楼层步序清0,提升机状态清0
+ /// 4.点击对应楼层出,将托盘出到接驳位
+ /// 5.重新下发任务
+ ///
+ ///
+ public partial class HoistWarnHandlerWindow : Window
+ {
+ private readonly long T01 = 6;
+ //提升机当前楼层
+ private long currentFloor = 1;
+
+ private bool taskHandlerFlag = false;
+
+ ///
+ /// 提升机当前楼层 写
+ ///
+ private BasePlcpoint currentfloor06;
+
+ private DispatcherTimer _timer;
+ private int _timeRemaining = 30; // 初始时间为30秒
+
+
+ private IHost _host;
+ public HoistWarnHandlerWindow(IHost host)
+ {
+ _host = host;
+ InitializeComponent();
+ getCurrentFloor();
+ }
+
+
+ private void getCurrentFloor()
+ {
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ dbContext.ChangeTracker.Clear();
+
+ //一楼提升机当前楼层 写
+ this.currentfloor06 = SystemData.BasePlcpoints.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("currentfloor06"));
+ var currentfloor06Value = SystemData.PlcDic[0].Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读
+ currentFloor = Convert.ToInt32(currentfloor06Value);
+ FloorTxt.Text = currentFloor.ToString();
+
+ }
+
+
+ private void Window_StateChanged(object sender, System.EventArgs e)
+ {
+ if (WindowState == WindowState.Minimized)
+ {
+ Close();
+ }
+ }
+
+
+
+
+
+ ///
+ /// 1.手动提升机操作到起始地楼层或目的楼层
+ ///如果有任务,校验是否在起始地或者目的地楼层,不在的话校验不通过
+ ///
+ ///
+ ///
+ private void ManualHoistButton_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ getCurrentFloor();
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ dbContext.ChangeTracker.Clear();
+ var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01 && t.taskStatus > 0 && t.taskStatus <= 5).FirstOrDefault();
+ if (wcsTask != null)
+ {
+ if (wcsTask.currPointId != currentFloor && wcsTask.endPointId != currentFloor)
+ {
+ this.Msg.Text = DateTime.Now + " 提升机当前在" + currentFloor + "楼,需要到达起始地楼层:" + wcsTask.currPointId + " 或者到达终点楼层:" + wcsTask.endPointId;
+ this.ManualHoistButton.Background = new SolidColorBrush(Colors.Red);
+ return;
+ }
+ }
+
+ this.Msg.Text = DateTime.Now + " 手动提升机到达" + currentFloor + "楼,通过校验";
+ this.ManualHoistButton.Background = new SolidColorBrush(Colors.LimeGreen);
+ this.ManualHoistButton.IsEnabled = false;
+ HoistClearButton.IsEnabled = true;
+ }
+ catch (Exception ex)
+ {
+ this.Msg.Text = DateTime.Now + " 校验手动提升机操作到起始地楼层或目的楼层:" + ex.Message;
+ this.ManualHoistButton.Background = new SolidColorBrush(Colors.Red);
+
+ }
+ }
+
+
+ ///
+ /// 2.提升机步序清0,轿厢线步序清0
+ ///
+ ///
+ ///
+ private void HoistClear_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ ///轿厢线步序清0; 等待昆明TODO
+ ///
+
+ this.HoistClearButton.Background = new SolidColorBrush(Colors.LimeGreen);
+ this.Msg.Text = DateTime.Now + " 轿厢线步序清0成功,请等待30s以后,提升机还未动作,请点击任务处理按钮...";
+ this.HoistClearButton.IsEnabled = false;
+ #region 开始定时器30s倒计时
+ // 初始化定时器
+ _timeRemaining = 30; // 重置时间为30秒
+ _timer = new DispatcherTimer();
+ _timer.Interval = TimeSpan.FromSeconds(1); // 每秒触发一次
+ _timer.Tick += Timer_Tick; // 设置定时器事件处理器
+ _timer.Start(); // 启动定时器
+
+ #endregion
+
+
+ }
+ catch (Exception ex)
+ {
+ this.Msg.Text = DateTime.Now + " 轿厢线步序清0出现异常:" + ex.Message;
+ this.HoistClearButton.Background = new SolidColorBrush(Colors.Red);
+ }
+ }
+
+
+ private void Timer_Tick(object sender, EventArgs e)
+ {
+ if (_timeRemaining > 0)
+ {
+ _timeRemaining--;
+ UpdateTimeDisplay();
+ }
+ else
+ {
+ _timer.Stop(); // 倒计时结束,停止定时器
+ this.Msg.Text = DateTime.Now + " 倒计时结束,允许下一步操作";
+ if (taskHandlerFlag)
+ {
+ PalletOutButton.IsEnabled = true;
+ }
+ else
+ {
+ TaskHandlerButton.IsEnabled = true;
+ }
+ }
+ }
+
+ private void UpdateTimeDisplay()
+ {
+ if (taskHandlerFlag)
+ {
+ this.timeTxt2.Text = _timeRemaining.ToString();
+ }
+ else
+ {
+ this.timeTxt1.Text = _timeRemaining.ToString();
+ }
+
+ }
+
+
+
+ ///
+ /// 3.任务处理
+ ///
+ ///
+ ///
+ private void TaskHandlerButton_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ using var scope = _host.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ dbContext.ChangeTracker.Clear();
+ var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == T01 && t.taskStatus > 0 && t.taskStatus <= 5).FirstOrDefault();
+ if (wcsTask != null)
+ {
+ if (wcsTask.currPointId == currentFloor) //在起始地楼层
+ {
+ #region 读接驳位RFID ,防止托盘还没走,但是任务状态不为0,需要重新把状态重置0下发
+ //提升机当前楼层
+ this.currentfloor06 = SystemData.BasePlcpoints.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("currentfloor06"));
+ var currentfloor06Value = SystemData.PlcDic[0].Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读
+ currentFloor = Convert.ToInt32(currentfloor06Value);
+
+ FloorTxt.Text = currentFloor.ToString();
+ //接驳位RFID
+ BasePlcpoint LineRFID = SystemData.BasePlcpoints.First(t => t.plcpointNo == $"RFID00{currentFloor}");
+ var rfid = SystemData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress);
+ #endregion
+
+ if (!string.IsNullOrEmpty(wcsTask.containerNo) && rfid.Contains(wcsTask.containerNo)) // 在出发地接驳位并且任务RFID不为空,与接驳位RFID相同
+ {
+ wcsTask.taskStatus = 0;
+ //if(wcsTask.endPointId == currentFloor) //到达终点
+ //{
+ // wcsTask.taskStatus = 5;
+ //}else if(wcsTask.currPointId == currentFloor) //托盘还在起始地
+ //{
+ // wcsTask.taskStatus = 0;
+ //}
+ }
+ else//在提升机里面
+ {
+ wcsTask.taskStatus = 2;
+ }
+ }
+ else if (wcsTask.endPointId == currentFloor) //在目的地楼层
+ {
+ #region 读接驳位RFID ,防止托盘已经到达目的楼层,但是任务状态不为5,需要自动更新
+ //提升机当前楼层
+ this.currentfloor06 = SystemData.BasePlcpoints.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("currentfloor06"));
+ var currentfloor06Value = SystemData.PlcDic[0].Read(this.currentfloor06.plcpointAddress); //提升机当前楼层 读
+ currentFloor = Convert.ToInt32(currentfloor06Value);
+
+ FloorTxt.Text = currentFloor.ToString();
+
+ //接驳位RFID
+ BasePlcpoint LineRFID = SystemData.BasePlcpoints.First(t => t.plcpointNo == $"RFID00{currentFloor}");
+ var rfid = SystemData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress);
+ #endregion
+
+ if (!string.IsNullOrEmpty(wcsTask.containerNo) && rfid.Contains(wcsTask.containerNo)) // 在目的地接驳位并且任务RFID不为空,与接驳位RFID相同
+ {
+ wcsTask.taskStatus = 4;
+
+ }
+ else//在提升机里面
+ {
+ wcsTask.taskStatus = 3;
+ }
+
+ }
+ dbContext.WcsTask.Update(wcsTask);
+ dbContext.SaveChanges();
+ }
+
+ this.TaskHandlerButton.Background = new SolidColorBrush(Colors.LimeGreen);
+ this.Msg.Text = DateTime.Now + " 任务处理成功,请等待30s以后提升机或者AGV还未动作,点击出提升机按钮...";
+ taskHandlerFlag = true;
+ this.TaskHandlerButton.IsEnabled = false;
+ #region 开始定时器30s倒计时
+ // 初始化定时器
+ _timeRemaining = 30; // 重置时间为30秒
+ _timer = new DispatcherTimer();
+ _timer.Interval = TimeSpan.FromSeconds(1); // 每秒触发一次
+ _timer.Tick += Timer_Tick; // 设置定时器事件处理器
+ _timer.Start(); // 启动定时器
+
+ #endregion
+ }catch(Exception ex)
+ {
+ this.Msg.Text = DateTime.Now + " 任务处理异常:" + ex.Message;
+ this.TaskHandlerButton.Background = new SolidColorBrush(Colors.Red);
+ }
+
+ }
+
+ ///
+ /// 4.下发提升机出轿厢任务
+ ///
+ ///
+ ///
+ private void PalletOutButton_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+
+ BasePlcpoint basePlcpoint = SystemData.BasePlcpoints.First(t => t.floorNo == currentFloor && t.plcpointNo.Contains("wcsrun"));
+ SystemData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2,表示提升机已到达目的地,让货出去
+ this.Msg.Text = DateTime.Now + " 提升机下发" + currentFloor + "楼出库指令";
+ this.PalletOutButton.Background = new SolidColorBrush(Colors.LimeGreen);
+ this.PalletOutButton.IsEnabled = false;
+ }
+ catch (Exception ex)
+ {
+ this.Msg.Text = DateTime.Now + " 下发提升机出轿厢任务异常:" + ex.Message;
+ this.PalletOutButton.Background = new SolidColorBrush(Colors.Red);
+ }
+ }
+ }
+}