From 619a674cc06351f413e4ca9d58f3d283aeb36fa9 Mon Sep 17 00:00:00 2001 From: wenjy Date: Tue, 17 Jun 2025 15:33:43 +0800 Subject: [PATCH] =?UTF-8?q?change=20-=20=E6=8F=90=E5=8D=87=E6=9C=BA?= =?UTF-8?q?=E6=97=81=E5=87=BA=E7=A9=BA=E6=96=99=E7=AE=B1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=94=B6=E5=88=B0=E8=BF=90=E9=80=81?= =?UTF-8?q?=E7=A9=BA=E6=96=99=E7=AE=B1=E4=BB=BB=E5=8A=A1=E5=B0=B1=E9=80=9A?= =?UTF-8?q?=E7=9F=A5PLC=E5=87=BA=E7=A9=BA=E6=96=99=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.idea.SlnMesnac/.idea/.name | 1 + SlnMesnac.WCS/MainCentralControl.cs | 43 +++++++++++++++++++++-- SlnMesnac.WCS/WCS/BearAgv.cs | 17 +++++++-- SlnMesnac.WPF/ViewModel/IndexViewModel.cs | 2 +- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 .idea/.idea.SlnMesnac/.idea/.name diff --git a/.idea/.idea.SlnMesnac/.idea/.name b/.idea/.idea.SlnMesnac/.idea/.name new file mode 100644 index 0000000..bdf328a --- /dev/null +++ b/.idea/.idea.SlnMesnac/.idea/.name @@ -0,0 +1 @@ +SlnMesnac \ No newline at end of file diff --git a/SlnMesnac.WCS/MainCentralControl.cs b/SlnMesnac.WCS/MainCentralControl.cs index 19b3699..cb5205a 100644 --- a/SlnMesnac.WCS/MainCentralControl.cs +++ b/SlnMesnac.WCS/MainCentralControl.cs @@ -35,6 +35,8 @@ namespace SlnMesnac.WCS private readonly SerilogHelper _logger; private IServiceProvider serviceProvider; private ISqlSugarClient SqlSugarClient; + + private BearAgv bearAgv; #region 变量定义 public List plcList; @@ -42,7 +44,7 @@ namespace SlnMesnac.WCS public List rfidList; #endregion 变量定义 - + /// /// 构造函数 /// @@ -97,7 +99,7 @@ namespace SlnMesnac.WCS _logger.Agv("WCS调度程序启动成功!"); //背负式agv执行任务 - BearAgv bearAgv = new BearAgv(host.Services); + bearAgv = new BearAgv(host.Services); bearAgv.StartPoint(); } @@ -270,6 +272,8 @@ namespace SlnMesnac.WCS agv.Timestamp = DateTime.Now; } } + + //TaskHandleByAgv(agvList); SqlSugarClient.Updateable(agvList).ExecuteCommand(); } } @@ -279,6 +283,41 @@ namespace SlnMesnac.WCS } } + public void TaskHandleByAgv(List agvInfos) + { + if (agvInfos == null || agvInfos.Count == 0) + { + return; + } + + var targetPoint = new { X = 142430, Y = 108540 }; + + var agvInfo = agvInfos.OrderBy(agv => CalculateDistance(double.Parse(agv.PosX), double.Parse(agv.PosY), targetPoint.X, targetPoint.Y)).First(); + + _logger.Agv($"=====>>>>离接驳位最近的设备为:{agvInfo.RobotCode}"); + + //判断当前小车有没有送空箱任务,下发PLC触发取料信号 + if (agvInfo.StatusDetail.Contains("待机模式") || agvInfo.StatusDetail.Contains("空闲")) + { + _logger.Agv($"当前空闲车辆{agvInfo.RobotCode};离取料点最近,优先进行取料,锁定线体,下发PLC触发取料信号"); + } + else + { + _logger.Agv($"当前没有空闲小车离取料点最近,等线体空闲后进行取料"); + var flag = bearAgv.workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态")); + if (flag == 0) + { + //线体空闲了,可以锁定进行取料 + _logger.Agv($"线体空闲了,可以锁定使用远处小车进行取料"); + } + } + } + + private static double CalculateDistance(double x1, double y1, double x2, double y2) + { + return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)); + } + #region 删除任务 -- 已经下发的任务,需要通知agv取消 /// diff --git a/SlnMesnac.WCS/WCS/BearAgv.cs b/SlnMesnac.WCS/WCS/BearAgv.cs index be3d640..2707ff6 100644 --- a/SlnMesnac.WCS/WCS/BearAgv.cs +++ b/SlnMesnac.WCS/WCS/BearAgv.cs @@ -24,13 +24,15 @@ namespace SlnMesnac.WCS.WCS private List agvEquipNos = new List() { "AGV01", "AGV02", "AGV03" }; //3#车间上料点plc - private readonly PlcAbsractFactory workShop3Plc; + public readonly PlcAbsractFactory workShop3Plc; //2#计量室相关点位 private readonly PlcAbsractFactory workShop2Plc; public readonly WcsBaseEquip baseEquip; + public List agvStatusList = new List(); + public BearAgv(IServiceProvider serviceProvider) : base(serviceProvider) { sqlSugarClient = serviceProvider.GetRequiredService(); @@ -590,6 +592,7 @@ namespace SlnMesnac.WCS.WCS if (task.TaskStatus == 0) { TaskStatus0Handle(task); + workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出一个空托盘信号"), true); } else if (task.TaskStatus == 2) //agv到达接驳位里面,等待料箱上agv { @@ -598,6 +601,11 @@ namespace SlnMesnac.WCS.WCS _logger.Plc(DateTime.Now + "2#PLC未连接,请检查网络!"); return; } + + if (!workShop2Plc.readBoolByAddress("DB100.DBX38.0")) + { + workShop2Plc.writeBoolByAddress("DB100.DBX38.0", true); + } bool goOutFlag = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#缓存空进AGV任务反馈")); bool outFlag = workShop2Plc.readBoolByAddress(StaticData.GetPlcAddress("2#接驳位到位信号")); @@ -616,6 +624,8 @@ namespace SlnMesnac.WCS.WCS workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出接驳位信号"), false); workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#出一个空托盘信号"), false); + workShop2Plc.writeBoolByAddress("DB100.DBX38.0", false); + //判断二次生成补空箱任务 Thread.Sleep(500); CreateSecondSuppleSmallPallet(); @@ -663,7 +673,7 @@ namespace SlnMesnac.WCS.WCS } if (busyFlag == 0) { - Thread.Sleep(1000); + Thread.Sleep(3000); busyFlag = workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态")); if (busyFlag == 0) { @@ -1275,6 +1285,9 @@ namespace SlnMesnac.WCS.WCS { try { + + return; + if (workShop3Plc == null || !workShop3Plc.IsConnected || workShop2Plc == null || !workShop2Plc.IsConnected) { return; diff --git a/SlnMesnac.WPF/ViewModel/IndexViewModel.cs b/SlnMesnac.WPF/ViewModel/IndexViewModel.cs index 8c7e261..5f31b02 100644 --- a/SlnMesnac.WPF/ViewModel/IndexViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/IndexViewModel.cs @@ -79,7 +79,7 @@ namespace SlnMesnac.WPF.ViewModel GetTaskList(); await RefreChartAsync(); await LoadAgvDataAsync(); - PrintMessageToListBox("测试消息" + Guid.NewGuid()); + //PrintMessageToListBox("测试消息" + Guid.NewGuid()); await Task.Delay(5000); } });