chengsc
2025-04-29 3e9a6a06132b06b8c2568f900df936ccc654bd58
修改问题,添加四向车车充电流程
3个文件已修改
2个文件已添加
290 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Entity/WCSCarTime.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Entity/WcsTask.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 148 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Entity/WCSCarTime.cs
New file
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.CreateMarketingMemberCardActivityRequest.Types.AwardSendPeriod.Types.AwardSendDayTime.Types;
namespace WCS.Application.Entity;
/// <summary>
/// 四向车空闲时间表
/// </summary>
[SugarTable("WCSCarTime", "四向车空闲时间表")]
public class WcsCarTime : EntityBaseData
{
    /// <summary>
    /// 小车IP
    /// </summary>
    [SugarColumn(ColumnName = "CarIp", ColumnDescription = "小车IP")]
    public string? CarIp { get; set; }
    /// <summary>
    /// 小车空闲时间
    /// </summary>
    [SugarColumn(ColumnName = "CarTime", ColumnDescription = "小车空闲时间")]
    public DateTime? CarTime { get; set; }
}
Admin.NET/WCS.Application/Entity/WcsTask.cs
@@ -165,7 +165,7 @@
    public string? WcsPosValue { get; set; }
    
    /// <summary>
    /// 优先级
    /// 优先级 四向车 小车充电888 其他任务999
    /// </summary>
    [SugarColumn(ColumnName = "Levels", ColumnDescription = "优先级")]
    public int? Levels { get; set; }
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs
New file
@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WCS.Application;
/// <summary>
/// 四向车出入库口位置枚举
/// </summary>
[Description("四向车出入库口位置枚举")]
public enum FourWayCarEnum
{
    /// <summary>
    /// 密集库1层南左
    /// </summary>
    [Description("密集库1层南左")]
    A1 = 13,
    /// <summary>
    /// 密集库1层南右
    /// </summary>
    [Description("密集库1层南右")]
    A2 = 13,
    /// <summary>
    /// 密集库2层南左
    /// </summary>
    [Description("密集库2层南左")]
    A3 = 14,
    /// <summary>
    /// 密集库2层南右
    /// </summary>
    [Description("密集库2层南右")]
    A4 = 15,
    /// <summary>
    /// 密集库1层北左
    /// </summary>
    [Description("密集库1层北左")]
    B1,
    /// <summary>
    /// 密集库1层北中
    /// </summary>
    [Description("密集库1层北中")]
    B2,
    /// <summary>
    /// 密集库1层北右
    /// </summary>
    [Description("密集库1层北右")]
    B3,
    /// <summary>
    /// 密集库2层北左
    /// </summary>
    [Description("密集库2层北左")]
    B4,
    /// <summary>
    /// 密集库2层北中
    /// </summary>
    [Description("密集库2层北中")]
    B5,
    /// <summary>
    /// 密集库2层北右
    /// </summary>
    [Description("密集库2层北右")]
    B6,
}
/// <summary>
/// 四向车电量值枚举
/// </summary>
[Description("四向车电量值枚举")]
public enum FourWayCarDLEnum
{
    /// <summary>
    /// 极限电量 低于此电量不执行任务
    /// </summary>
    [Description("极限电量")]
    Dl = 30,
    /// <summary>
    /// 健康电量 低于此电量 且无任务时去充电
    /// </summary>
    [Description("健康电量")]
    Dl2 = 80,
}
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -6,6 +6,7 @@
using Furion.Logging;
using IoTClient;
using NewLife.Reflection;
using SixLabors.ImageSharp.ColorSpaces;
using WCS.Application.Entity;
using WCS.Application.Util;
@@ -171,8 +172,8 @@
                        var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP);
                        if (carTask == null)
                        {
                            var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                            plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//没有找到任务  复位
                            //var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                            //plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//没有找到任务  复位
                            return;
                        }
                         
@@ -207,6 +208,14 @@
                            modFinshTask.FinishDate = DateTime.Now;
                            _db.Updateable(modFinshTask).ExecuteCommand();
                            
                            //判断任务是否充电任务,下发开始充电命令
                            if (modFinshTask.Levels == 888)
                            {
                                //写入开始充电
                                var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                                plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2");
                            }
                            //反馈WMS系统 任务完成
                            //HttpService httpService = new HttpService();
                            //var requestMode = new TaskRequestWMS()
@@ -225,14 +234,6 @@
                        
                    }
                    
                    var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(X)");
                    var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos);
                    var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Y)");
                    var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos);
                    var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)");
                    var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
                    WcsTask modTask;
                    //要下发路径2任务
                    if (carTaskNext != null)
@@ -245,17 +246,122 @@
                    {
                        // 获取任务信息
                        modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First();
                        if (modTask == null)
                        if (modTask != null)
                        {
                            return;
                            carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
                        }
                        carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
                    }
                    //return;
                    //读取小车位置
                    var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(X)");
                    var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos);
                    var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Y)");
                    var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos);
                    var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "四向车位置(Z)");
                    var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
                    var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0');
                    if (modTask == null || carTaskNext == null)
                    {
                        //判断小车是否有空闲时间记录 没有:添加  有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务
                        //读取小车电量
                        var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "电池电量");
                        var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos);
                        if (resultDl.IsSucceed && valueDl < FourWayCarDLEnum.Dl)
                        {
                            var endLocateCar = "";
                            if (valuez == 1)
                            {
                                endLocateCar = "210401";
                            }
                            else if (valuez == 2)
                            {
                                endLocateCar = "210402"; //011202
                            }
                            else
                            {
                                return; // 层数错误
                            }
                            //添加小车充电位置
                            WcsTask modCarTask = new WcsTask()
                            {
                                TaskNo = _taskService.GetTaskCode(),
                                TaskType = TaskTypeEnum.Move,
                                Type = PLCTypeEnum.ShuttleCar,
                                StartLocate = carXYZ,
                                EndLocate = endLocateCar,
                                PalletNo = "",
                                Status = TaskStatusEnum.Wait,
                                Levels = 888, //充电等级优先任务等级
                                Origin = "WCS",
                                CarIp = modDevice.PlcIdIP
                            };
                            _db.Insertable(modCarTask).ExecuteCommand();
                            HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                        }
                        else if(resultDl.IsSucceed && valueDl < FourWayCarDLEnum.Dl2)
                        {
                            //判断小车是否有空闲时间记录 没有:添加  有:判断当前时间与记录时间是否满足5分钟 满足:添加让小车去充电任务
                            var carTime = _db.Queryable<WcsCarTime>().First(m => m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
                            if (carTime == null)
                            {
                                var carTimeAdd = new WcsCarTime()
                                {
                                    CarIp = modDevice.PlcIdIP,
                                    CarTime = DateTime.Now
                                };
                                _db.Insertable(carTimeAdd).ExecuteCommand();
                            }
                            else
                            {
                                if (carTime.CarTime == null)
                                {
                                    carTime.CarTime = DateTime.Now;
                                    carTime.UpdateTime = DateTime.Now;
                                    _db.Updateable(carTime).ExecuteCommand();
                                }
                                else
                                {
                                    var date1 = DateTime.Now;
                                    var data2 = (DateTime)carTime.CarTime;
                                    TimeSpan interval = date1 - data2;
                                    if (interval.TotalMinutes >= 5)
                                    {
                                        var endLocateCar = "";
                                        if (valuez == 1)
                                        {
                                            endLocateCar = "011201";
                                        }
                                        else if (valuez == 2)
                                        {
                                            endLocateCar = "011202";
                                        }
                                        else
                                        {
                                            return; // 层数错误
                                        }
                                        //添加小车充电位置
                                        WcsTask modCarTask = new WcsTask()
                                        {
                                            TaskNo = _taskService.GetTaskCode(),
                                            TaskType = TaskTypeEnum.Move,
                                            Type = PLCTypeEnum.ShuttleCar,
                                            StartLocate = carXYZ,
                                            EndLocate = endLocateCar,
                                            PalletNo = "",
                                            Status = TaskStatusEnum.Wait,
                                            Levels = 888, //充电等级优先任务等级
                                            Origin = "WCS",
                                            CarIp = modDevice.PlcIdIP
                                        };
                                        _db.Insertable(modCarTask).ExecuteCommand();
                                        HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                    }
                                }
                            }
                        }
                        return;
                    }
                    
@@ -264,6 +370,7 @@
                        Thread.Sleep(3000);
                        return;
                    }
                    //判断当前任务是否还有前置任务未完成
                    var preStrs = carTaskNext.PreId.Split(';');
                    foreach (var preStr in preStrs)
@@ -279,6 +386,7 @@
                            return;//前置任务未完成
                        }
                    }
                    //先复位
                    var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "复位");
                    plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1");
@@ -286,7 +394,15 @@
                    List<Result> listResult = new List<Result>();
                    //获取小车任务号
                    var carTaskNo = FourWayCarUtil.GetTaskNo();
                    //判断任务是否充电任务
                    if (modTask.Levels == 888)
                    {
                        //写入充电命令
                        var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "充电命令");
                        listResult.Add(plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "1"));
                    }
                    var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "写入任务号");
                    listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString()));
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -9,6 +9,7 @@
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using OnceMi.AspNetCore.OSS;
using Qiniu.Storage;
using System;
using System.Drawing.Drawing2D;
using System.Net.NetworkInformation;
@@ -377,7 +378,7 @@
                try
                {
                    // 获取密集库未执行任务 根据创建时间排序
                    var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => s.CreateTime).First();
                    var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => new {s.Levels, s.CreateTime}).First();
                    if (waitTask == null)
                    {
                        continue;
@@ -386,7 +387,7 @@
                    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 获取当前任务所在层所有空闲小车
                    // 获取有任务的小车编号
@@ -412,6 +413,19 @@
                            {
                                //获取工位WCSPLCPosition信息
                                var plcPosition = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList();
                                if (value == 3)
                                {
                                    var modCarDl = plcPosition.FirstOrDefault(s => s.Text == "电池电量");
                                    var (resultDl, valueDl) = modbusUtil.GetDBValue(modCarDl.PosType, modCarDl.PlcPos);
                                    if (resultDl.IsSucceed && valueDl> FourWayCarDLEnum.Dl)
                                    {
                                        //写入结束充电命令
                                        var modCdEnd = plcPosition.FirstOrDefault(s => s.Text == "充电命令");
                                        modbusUtil.SetDBValue(modCdEnd.PosType, modCdEnd.PlcPos.ToString(), "2") ;
                                        carErr = true;
                                        break; //暂缓分配,防止同层小车关机或失联导致阻挡路径
                                    }
                                }
                                //小车空闲加入集合
                                if (value == 1)
                                {
@@ -490,8 +504,13 @@
                            }
                        }
                    }
                    var typeStr = "1";
                    if (waitTask.Levels  == 888 )
                    {
                        typeStr = "0";//小车任务是充电任务
                    }
                    //获取小车去放货储位任务路径
                    var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, "1");
                    var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, typeStr);
                    var datas2 = FourWayCarUtil.GetCarPathUp(data2, 1);
                    
                    if (datas2 == null)