From 4606665e0e359aa54483283c042934c644a45434 Mon Sep 17 00:00:00 2001
From: chengsc <11752@DESKTOP-DS49RCP>
Date: 星期一, 28 四月 2025 17:26:15 +0800
Subject: [PATCH] 修改冲突问题
---
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 204 insertions(+), 11 deletions(-)
diff --git a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
index 7bd5530..f22caec 100644
--- a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -2,13 +2,18 @@
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Drawing.Charts;
+using Elastic.Clients.Elasticsearch.Snapshot;
using Furion.Logging;
using Microsoft.AspNetCore.SignalR;
using NewLife.Serialization;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
+using OnceMi.AspNetCore.OSS;
using System;
using System.Drawing.Drawing2D;
using System.Net.NetworkInformation;
+using WCS.Application.Entity;
+using WCS.Application.Util;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types;
//using WCS.Application.Util;
@@ -35,6 +40,7 @@
private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>();
private static readonly SysConfigService _sysConfigService = App.GetService<SysConfigService>();
+ private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>();
private static List<WcsPlc> listPlc = new List<WcsPlc>();
private static List<WcsDevice> listPlcDevice = new List<WcsDevice>();
@@ -84,7 +90,7 @@
/// <summary>
/// 鍒濆鍖朠LC杩炴帴
/// </summary>
- public static void Init()
+ public static void Init()
{
cts.Cancel();
listPlc = _db.Queryable<WcsPlc>()
@@ -137,6 +143,7 @@
StartRead();
ConnectionStatus();
StartWatchAlarm();
+ AssignTasks();
//StartWatchPosition();
}
}
@@ -202,15 +209,15 @@
var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
if (result.IsSucceed)
{
- //濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺�
- if (modPlc.Type == PLCTypeEnum.ShuttleCar)
- {
- var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault();
- if (modHeart != null)
- {
- modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1");
- }
- }
+ ////濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺�
+ //if (modPlc.Type == PLCTypeEnum.ShuttleCar)
+ //{
+ // var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault();
+ // if (modHeart != null)
+ // {
+ // modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1");
+ // }
+ //}
//鏃犳祦绋嬭烦鍑�
if (Convert.ToInt32(value) == 0)
continue;
@@ -258,11 +265,22 @@
var (result, value) = modbusUtil.GetDBValue(modDevice.PosType, modDevice.PlcPos);
if (result.IsSucceed)
{
+ //濡傛灉鏄┛姊溅锛岃繖閲屽彂閫佸績璺�
+ if (modPlc.Type == PLCTypeEnum.ShuttleCar)
+ {
+ var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "蹇冭烦").FirstOrDefault();
+ if (modHeart != null)
+ {
+ modbusUtil.SetDBValue(modHeart.PosType, modHeart.PlcPos, "1");
+ }
+ }
+
//鏃犳祦绋嬭烦鍑�
if (value == 0)
continue;
var dto = modDevice.Adapt<WcsDeviceDto>();
dto.Value = value;
+ dto.PlcIdIP = modPlc.IP;
dto.Type = _modplc.Type;
dto.modbusUtil = modbusUtil;
dto.listStation = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList();
@@ -320,7 +338,7 @@
- Thread.Sleep(1000);
+ Thread.Sleep(3000);
}
catch (OperationCanceledException)
{
@@ -334,6 +352,177 @@
}, cts.Token);
}
}
+
+ /// <summary>
+ /// 鍥涘悜杞︿换鍔″垎閰�
+ /// </summary>
+ private static void AssignTasks()
+ {
+
+ Task.Run(() =>
+ {
+ while (true)
+ {
+ Console.WriteLine("寮�鍚洓鍚戣溅浠诲姟鑷垎閰�");
+ //鍙栨秷绾跨▼ 鍏抽棴PLC杩炴帴
+ if (cts.Token.IsCancellationRequested)
+ {
+ foreach (var modModBusUtil in listModbusUtil)
+ {
+ if (modModBusUtil != null && modModBusUtil.Connected)
+ modModBusUtil.Close();
+ }
+ break;
+ }
+ try
+ {
+ // 鑾峰彇瀵嗛泦搴撴湭鎵ц浠诲姟 鏍规嵁鍒涘缓鏃堕棿鎺掑簭
+ var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => s.CreateTime).First();
+ if (waitTask == null)
+ {
+ continue;
+ }
+ //01010101: 01鎺� 01鍒� 01灞� 01娣卞害-姝ら」鐩笉鍋氬垽鏂�
+ var taskpai = int.Parse(waitTask.StartLocate.Substring(0, 2));
+ var tasklie = int.Parse(waitTask.StartLocate.Substring(2, 2));
+ var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2));
+
+ #region 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞�
+
+ // 鑾峰彇鏈変换鍔$殑灏忚溅缂栧彿
+ var taskCarList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.Status == TaskStatusEnum.Wait).Select(m => m.CarNo).Distinct().ToList();
+
+ // 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞︼紙鏍规嵁灏忚溅浠诲姟琛ㄦ槸鍚︽湁浠诲姟鍜屽皬杞︾姸鎬佸叡鍚屽垽鏂皬杞︽槸鍚︾┖闂�)
+ var kXCarList = new List<CarInfo>();
+ var carErr = false;//灏忚溅鏄惁鏈夊け鑱旂殑
+ foreach (var modbusUtil in listModbusUtil)
+ {
+ //濡傛灉灏忚溅鏈夋湭鎵ц鐨勪换鍔★紝璺冲嚭
+ if (taskCarList.Contains(modbusUtil.PlcIP))
+ {
+ continue;
+ }
+ //鑾峰彇灏忚溅鐨刉csDevice淇℃伅
+ var listDevice = listPlcDevice.Where(s => s.PlcId == modbusUtil.PlcId && s.DeviceType == DeviceTypeEnum.Business).ToList();
+ //寰幆璇昏澶�
+ foreach (var modDevice in listDevice)
+ {
+ var (result, value) = modbusUtil.GetDBValue(modDevice.PosType, modDevice.PlcPos);
+ if (result.IsSucceed)
+ {
+ //鑾峰彇宸ヤ綅WCSPLCPosition淇℃伅
+ var plcPosition = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList();
+ //灏忚溅绌洪棽鍔犲叆闆嗗悎
+ if (value == 1)
+ {
+ var modStationX = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(X)");
+ var (resultx, valuex) = modbusUtil.GetDBValue(modStationX.PosType, modStationX.PlcPos);
+ var modStationY = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Y)");
+ var (resulty, valuey) = modbusUtil.GetDBValue(modStationY.PosType, modStationY.PlcPos);
+ var modStationZ = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Z)");
+ var (resultz, valuez) = modbusUtil.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
+ //灏忚溅褰撳墠灞�
+ var carZ = (int)valuez;
+ //浠诲姟灞備笌灏忚溅灞傜浉鍚�
+ if (taskceng == carZ)
+ {
+ if (!kXCarList.Any(m => m.CarPlcIp == modbusUtil.PlcIP))
+ {
+ var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0');
+ //灏忚溅鍒板彇璐у偍浣嶈矾寰�
+ var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate);
+ kXCarList.Add(new CarInfo()
+ {
+ CarPlcIp = modbusUtil.PlcIP,
+ X = (int)valuex,
+ Y = (int)valuey,
+ Z = (int)valuez,
+ Level = d.Count,
+ });
+ }
+ }
+ }
+ }
+ else
+ {
+ Console.WriteLine($"璇诲彇鍥涘悜杞modbusUtil.PlcIP}鐘舵�佸け璐�");
+ carErr = true;
+ break;//鏈変竴涓皬杞﹁鍙栧け璐ヨ烦鍑烘柟娉曪紝鏆傜紦鍒嗛厤锛岄槻姝㈠悓灞傚皬杞﹀叧鏈烘垨澶辫仈瀵艰嚧闃绘尅璺緞
+ }
+ }
+ //鏈夊皬杞﹀け鑱旓紝涓嶅垎閰嶄换鍔�
+ if (carErr)
+ {
+ kXCarList.Clear();//娓呮绌鸿溅璁板綍
+ break;
+ }
+ }
+
+ #endregion
+
+
+ // 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級
+ var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault();
+ if (assignCar == null)
+ {
+ continue;//娌℃湁绌洪棽灏忚溅
+ }
+
+ if (assignCar.Level != 0)
+ {
+ //鍒ゆ柇灏忚溅浣嶇疆鏄惁涓庝换鍔$殑璧峰鍌ㄤ綅鐩稿悓,涓嶇浉鍚岋細鑾峰彇灏忚溅鍒板彇璐у偍浣嶈矾寰�
+ var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0');
+ //鑾峰彇灏忚溅鍘诲彇璐у偍浣嶄换鍔¤矾寰�
+ var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate);
+ var datas1 = FourWayCarUtil.GetCarPathUp(data1, 0);
+ if (datas1 == null)
+ {
+ continue;
+ }
+ else
+ {
+ var bl = FourWayCarUtil.AddCarTask(datas1, kXCarList, assignCar, waitTask,0);
+ //鍒嗛厤閿欒锛屽垹闄ゅ垎閰嶄俊鎭�
+ if (!bl)
+ {
+ var carTask = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == waitTask.TaskNo).ToList();
+ _db.Deleteable(carTask).ExecuteCommand();
+ }
+ }
+ }
+ //鑾峰彇灏忚溅鍘绘斁璐у偍浣嶄换鍔¤矾寰�
+ var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, "1");
+ var datas2 = FourWayCarUtil.GetCarPathUp(data2, 1);
+
+ if (datas2 == null)
+ {
+ continue;
+ }
+ else
+ {
+ var bl = FourWayCarUtil.AddCarTask(datas2,kXCarList,assignCar,waitTask,1);
+ //鍒嗛厤閿欒锛屽垹闄ゅ垎閰嶄俊鎭�
+ if (!bl)
+ {
+ waitTask.Status = TaskStatusEnum.Wait;
+ _db.Updateable(waitTask).ExecuteCommand();
+ var carTask = _db.Queryable<WcsCarTasks>().Where(m=>m.IsDelete == false && m.TaskNo == waitTask.TaskNo).ToList();
+ _db.Deleteable(carTask).ExecuteCommand();
+ }
+ }
+
+
+
+ Thread.Sleep(3000);
+ }
+ catch (Exception ex)
+ {
+ Log.Error("浠诲姟鍒嗛厤鍙戠敓寮傚父", ex);
+ }
+ }
+ },cts.Token);
+ }
+
/// <summary>
/// 杩炴帴鐘舵�佺嚎绋�
@@ -692,6 +881,10 @@
}
});
}
+ /// <summary>
+ /// 淇敼浣嶇疆淇℃伅
+ /// </summary>
+ /// <param name="modInfo"></param>
private static void UpdatePosition(PlcPositionInfo modInfo)
{
var modTemp = listPositionInfo.FirstOrDefault(s => s.StationNum == modInfo.StationNum && modInfo.Type == s.Type);
--
Gitblit v1.8.0