diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs index c50e9373..32689bf4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs @@ -3,9 +3,13 @@ public class ElevatorControlConfiguration { /// - /// 设备名称 + /// 3#梯设备名称 /// - public string DevName { get; set; } + public string DevName3 { get; set; } + /// + /// 4#梯设备名称 + /// + public string DevName4 { get; set; } public string token { get; set; } /// /// 获取设备标签列表url diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevatorStatusQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevatorStatusQuery.cs new file mode 100644 index 00000000..fbbf7d8c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevatorStatusQuery.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Queries +{ + /// + /// 电梯状态查询输入参数 + /// + public class ElevatorStatusQuery + { + /// + /// 设备名称 + /// + public string DevName { get; set; } + /// + /// 标签集合 + /// + public IEnumerable tags { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs index f7e9baff..8e6cff4a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs @@ -24,6 +24,15 @@ /// 取消标志 /// Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token); + /// + /// 获取电梯状态 + /// + /// 设备名称 + /// 标签集合 + /// 取消标志 + /// 获取到的状态值 + Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable tags, CancellationToken token); + /// /// 检查Agv状态 /// @@ -49,5 +58,6 @@ /// 取消令牌 /// Task CallLift(string devName, int floor, CancellationToken cancellationToken); + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index b099637b..2154f966 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -35,9 +35,17 @@ namespace Tnb.WarehouseMgr public class BaseWareHouseService : IOverideVisualDevService, IDynamicApiController, ITransient { private static readonly Lazy> _stroageMapLazy; + private static readonly Dictionary s_logLevelMap = new() + { + [LogLevel.Debug] = "DBG", + [LogLevel.Information] = "INF", + [LogLevel.Warning] = "WRN", + [LogLevel.Error] = "ERR", + }; public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); public static SemaphoreSlim s_taskExecuteSemaphore = new(1); + protected IEventPublisher? EventPublisher { set; get; } protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/custom{DateTime.Now:yyyyMMdd}.log", cfgOpts => @@ -46,9 +54,9 @@ namespace Tnb.WarehouseMgr //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; cfgOpts.MessageFormat = (logMsg) => { - Span span = logMsg.LogLevel.ToString().ToCharArray(); - StringBuilder sb = new(); - _ = sb.Append($"{span[..4]} "); + var logLevel = s_logLevelMap[logMsg.LogLevel]; + var sb = new StringBuilder(); + _ = sb.Append($"[{logLevel}] "); _ = sb.Append($"{logMsg.LogName} "); _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); _ = sb.Append($"#{logMsg.EventId.Id} "); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 9ba0ce75..40430005 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; +using Senparc.CO2NET.Cache; using SqlSugar; using Tnb.Common.Extension; using Tnb.EquipMgr.Entities; @@ -85,9 +86,8 @@ namespace Tnb.WarehouseMgr WmsElevatorH elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.startlocation_id) - .LeftJoin((a, b, c, d) => c.startlocation_id == d.location_id) - .Where((a, b, c, d) => d.point_code == input.sourceName && input.taskCode.Contains(c.bill_code)) - .Select((a, b, c, d) => new WmsElevatorH + .Where((a, b, c) => c.endpoint_code == input.sourceName && input.taskCode == input.taskCode) + .Select((a, b, c) => new WmsElevatorH { distask_id = c.id, device_id = a.elevator_id, @@ -102,10 +102,13 @@ namespace Tnb.WarehouseMgr try { Logger.Information($"当前任务Id:{elevator.distask_id}"); + Logger.Information($"elevator.device_id={elevator.device_id}"); if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { - string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName; - (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None); + + string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName3; + var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo}"); { if (doorStatus.ToEnum() != EnumDoorStatus.开门到位保持) @@ -139,18 +142,18 @@ namespace Tnb.WarehouseMgr [HttpPost, NonUnify, AllowAnonymous] public async Task UnloadConfirm(ConfirmInput input)// { + Logger.Information($"输入参数:{JsonConvert.SerializeObject(input)}"); Logger.Information("放货确认.................."); try { //根据Agv传递的参数获取,对应的电梯 WmsElevatorH elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.endlocation_id) - .LeftJoin((a, b, c, d) => c.endlocation_id == d.location_id) - .Where((a, b, c, d) => d.point_code == input.targetName && c.bill_code == input.taskCode) - .Select((a, b, c, d) => new WmsElevatorH + .Where((a, b, c) => c.endpoint_code == input.targetName && (c.bill_code == input.taskCode || c.bill_code == input.taskChainCode)) + .Select((a, b, c) => new WmsElevatorH { end_floor = SqlFunc.ToInt32(c.end_floor), - distask_id = c.id, + device_id = a.elevator_id, }, true) .FirstAsync(); if (elevator.IsNull()) @@ -158,10 +161,11 @@ namespace Tnb.WarehouseMgr throw new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"); } - if (s_elevatorMap.TryGetValue(elevator.elevator_id, out object? elevatorCode)) + if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { - string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName; - (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);//elevator.elevator_code + string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName3; + var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);//elevator.elevator_code Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}"); //判断Agv电梯是否进入状态 if (agvStatus != (int)EnumAgvStatus.AGV运行状态) @@ -253,14 +257,22 @@ namespace Tnb.WarehouseMgr List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - TaskExecuteUpInput taskExecuteUpInput = new() + if (disTasks == null || disTasks.Count < 1) { - disTaskIds = disTasks.Select(x => x.id).ToList(), - EqpIds = eps.Select(x => x.id).ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); + Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); + } + if (disTasks?.Count > 0) + { + TaskExecuteUpInput taskExecuteUpInput = new() + { + disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + }; + await _wareHouseService.TaskExecute(taskExecuteUpInput); + } - ConnectionConfigOptions opts = App.GetOptions(); + + /*ConnectionConfigOptions opts = App.GetOptions(); UserAgent userAgent = new(App.HttpContext); //写系统日志 await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateOpLog", opts, new SysLogEntity @@ -275,11 +287,12 @@ namespace Tnb.WarehouseMgr Json = $"任务链状态上报,任务链编号:{input.taskChainCode},上报状态:{input.status},设备编号:{input.deviceID}", PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue), CreatorTime = DateTime.Now - })); + }));*/ } catch (Exception ex) { Logger.Error("任务链状态上报", ex); + Logger.Error($"任务链状态上报错误堆栈{Environment.NewLine}{ex.StackTrace}"); return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } @@ -326,6 +339,7 @@ namespace Tnb.WarehouseMgr { disTaskIds = disTasks.Select(x => x.id).ToList() }; + Logger.Information($"taskCompleUpInput json parameter:{JsonConvert.SerializeObject(taskCompleUpInput)}"); await _wareHouseService.TaskComplate(taskCompleUpInput); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index afeebd57..f19b7cfc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -1,4 +1,5 @@ -using System.Dynamic; +using System.Diagnostics.CodeAnalysis; +using System.Dynamic; using JNPF; using JNPF.Common.Extension; using Microsoft.AspNetCore.Mvc; @@ -120,7 +121,7 @@ namespace Tnb.WarehouseMgr { TaskCompletionSource tcs = new(); dynamic reqParam = new ExpandoObject(); - reqParam.DevName = _elevatorCtlCfg.DevName; + //reqParam.DevName = _elevatorCtlCfg.DevName; reqParam.TagName = tagName; reqParam.value = value; reqParam.token = _elevatorCtlCfg.token; @@ -133,7 +134,7 @@ namespace Tnb.WarehouseMgr { Dictionary parameters = new() { - ["DevName"] = _elevatorCtlCfg.DevName, + //["DevName"] = _elevatorCtlCfg.DevName, ["token"] = _elevatorCtlCfg.token, }; if (obj is IDictionary dynamicDic) @@ -181,7 +182,7 @@ namespace Tnb.WarehouseMgr { Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) { - ["DevName"] = _elevatorCtlCfg.DevName, + //["DevName"] = _elevatorCtlCfg.DevName, ["TagName"] = "AGVControl", ["Value"] = value.ToString(), ["token"] = _elevatorCtlCfg.token @@ -228,39 +229,107 @@ namespace Tnb.WarehouseMgr return jo.Value("V"); } + + /// /// 获取电梯状态 /// /// /// /// - + [HttpGet] public async Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token) { (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) multi = (-1, -1, -1, -1, -1); - Dictionary pars = new() + try { - ["DevName"] = devName, - ["Pos"] = "1", - ["Count"] = "11", - ["token"] = _elevatorCtlCfg.token - }; - string url = _elevatorCtlCfg.GetTagListUrl; - string systemInfo = await HttpClientHelper.GetAsync(url, pars: pars); - JObject jo = JObject.Parse(systemInfo); - List objs = jo["Items"].Values().ToList(); - //if (objs?.Count == 4) - { - if (objs[0].Value("Name").Equals("SysStatus") - && objs[1].Value("Name").Equals("RunStatus") - && objs[3].Value("Name").Equals("FloorNo")) + Dictionary pars = new() { - multi = (objs[0].Value("V"), objs[1].Value("V"), objs[3].Value("V"), objs[2].Value("V"), objs[9].Value("V")); + ["DevName"] = devName, + ["Pos"] = "1", + ["Count"] = "11", + ["token"] = _elevatorCtlCfg.token + }; + string url = _elevatorCtlCfg.GetTagListUrl; + string systemInfo = await HttpClientHelper.GetAsync(url, pars: pars); + JObject jo = JObject.Parse(systemInfo); + List objs = jo["Items"].Values().ToList(); + //if (objs?.Count == 4) + { + if (objs[0].Value("Name").Equals("SysStatus") + && objs[1].Value("Name").Equals("RunStatus") + && objs[3].Value("Name").Equals("FloorNo")) + { + multi = (objs[0].Value("V"), objs[1].Value("V"), objs[3].Value("V"), objs[2].Value("V"), objs[10].Value("V")); + } } } + catch (Exception ex) + { + Logger.Error("获取电梯状态错误", ex); + throw; + } return multi; } + /// + /// 获取电梯状态 + /// + /// + /// + /// + /// + [HttpPost("GetElevatorStatus")] + public async Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus([NotNull] string devName, [FromBody] IEnumerable tags, CancellationToken token) + { + Task GetTag(string tag) + { + var dicCommand = new Dictionary + { + ["DevName"] = devName, + ["token"] = _elevatorCtlCfg.token, + ["TagName"] = tag + }; + + return HttpClientHelper.GetAsync(_elevatorCtlCfg.GetTagUrl, pars: dicCommand); + } + + var tasks = tags.Select(tag => GetTag(tag)); + var results = await Task.WhenAll(tasks.Select(task => task)); + var jos = results.Select(r => JObject.Parse(r)).ToArray(); + var (sysStatus, runStatus, floorNo, doorStatus, agvStatus) = (0, 0, 0, 0, 0); + var propertyMap = new Dictionary>() + { + { ElevatorConsts.SysStatus, v => sysStatus = v }, + { ElevatorConsts.RunStatus, v => runStatus = v }, + { ElevatorConsts.FloorNo, v => floorNo = v }, + { ElevatorConsts.DoorStatus, v => doorStatus = v }, + { ElevatorConsts.AGVStatus, v => agvStatus = v }, + }; + + if (jos?.Length > 0) + { + foreach (var jo in jos) + { + if (jo == null) + { + continue; + } + string? tagName = jo!.Value("Name"); + int value = jo!.Value("V"); + + if (propertyMap.TryGetValue(tagName!, out var setProperty)) + { + setProperty(value); + } + } + } + return (sysStatus: sysStatus, runStatus: runStatus, floorNo: floorNo, doorStatus: doorStatus, agvStatus: agvStatus); + + } + + + /// /// 检查Agv状态 @@ -293,10 +362,12 @@ namespace Tnb.WarehouseMgr public async Task CallLift(string devName, int floor, CancellationToken cancellationToken) { bool isSuccefuly = false; - (int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, CancellationToken.None); + var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; + (int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, tags, CancellationToken.None); + Logger.Information($"开始呼梯,当前{devName.Match(@"\d+")}#梯,sysStatus:{sysStatus.ToEnum().ToString()},runStatus:{runStatus.ToEnum().ToString()},doorStatus:{doorStatus.ToEnum().ToString()},agvStatus:{agvStatus.ToEnum().ToString()}"); //判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层 if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 && - agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态) + agvStatus.ToEnum() == EnumAgvStatus.AGV运行状态) { if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs index 8be1be94..f4c9cb7c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs @@ -17,7 +17,7 @@ namespace Tnb.WarehouseMgr initializationTask = new Lazy(InitializeAsync); } - + private static async Task InitializeAsync() { @@ -75,5 +75,10 @@ namespace Tnb.WarehouseMgr { logger.LogError(ex, message, parameters); } + + public static void Error(this ILogger logger, string message, params object[] parameters) + { + logger.LogError(message, parameters); + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index fa748d84..8c8a275b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -1,10 +1,12 @@ using System.Collections.Concurrent; using JNPF; +using JNPF.Common.Extension; using JNPF.Common.Security; using JNPF.EventBus; using JNPF.EventHandler; using JNPF.Systems.Entitys.System; using Microsoft.Extensions.Hosting; +using NPOI.OpenXmlFormats.Dml.Diagram; using Tnb.Common.Extension; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities.Configs; @@ -42,13 +44,25 @@ namespace Tnb.WarehouseMgr { Dictionary parameter = new() { - ["DevName"] = _elevatorControlConfiguration.DevName, + ["DevName"] = _elevatorControlConfiguration.DevName3, ["TagName"] = "AGVKeepalive", ["Value"] = "123", ["token"] = _elevatorControlConfiguration.token }; string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); - await Console.Out.WriteLineAsync($"心跳检测结果:{result}"); + await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName3.Match(@"\d+")}#梯, 心跳检测结果:{result}"); + }, stoppingToken, 30, TimeSpanUnit.Seconds); + _ = TimedTask(async token => + { + Dictionary parameter = new() + { + ["DevName"] = _elevatorControlConfiguration.DevName4, + ["TagName"] = "AGVKeepalive", + ["Value"] = "123", + ["token"] = _elevatorControlConfiguration.token + }; + string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); + await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName4.Match(@"\d+")}#梯,心跳检测结果:{result}"); }, stoppingToken, 30, TimeSpanUnit.Seconds); ////齐套出库 /*var kittingOutService = App.GetRequiredService(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 5e99d633..1c8b1275 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -408,20 +408,25 @@ namespace Tnb.WarehouseMgr { //呼梯操作 //获取目标库位为电梯库位的任务 - var eleTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && - !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) - .ToList(); - foreach (var et in eleTasks) + + var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && + !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + foreach (var at in agvDTTasks) { - var ele = elevatorList.Find(x => x.location_code == et.endlocation_code); - if(ele!=null) + var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); + Logger.Information($"ele.elevator_id={ele?.elevator_id}"); + if (ele != null) { - et.device_id = ele.elevator_id; + at.device_id = ele.elevator_id; } } - List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = eleTasks - .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); + List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = agvDTTasks + .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); + if (endLocCodes?.Count > 0) + { + await CallingLanding(endLocCodes); + } //执行电梯任务 List? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); @@ -483,17 +488,20 @@ namespace Tnb.WarehouseMgr } string? devName = elevatorCode.ToString(); - + Logger.Information($"电梯编号:{devName}"); Logger.Information($"当前:{devName.Match(@"\d+")}#梯"); await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); (int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1); if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) { + Logger.Information("获取电梯状态"); + Logger.Information($"_elevatorControlService ==null{_elevatorControlService == null}"); + var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; do { - eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None); - await Task.Delay(500); + eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); + await Task.Delay(1000); } while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态); Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum()}"); _elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus; @@ -539,6 +547,7 @@ namespace Tnb.WarehouseMgr catch (Exception ex) { Logger.Error("呼梯操作错误", ex); + Logger.Error($"呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}"); throw; } } @@ -558,18 +567,19 @@ namespace Tnb.WarehouseMgr { return; } - string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName; + string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3; Logger.Information($"当前:{devName.Match(@"\d+")}#梯"); - await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); + _ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); (int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1); + var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) { do { - eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None); - await Task.Delay(500); + eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); + await Task.Delay(1000); } while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态); Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum()}"); _elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus; @@ -581,7 +591,7 @@ namespace Tnb.WarehouseMgr do { doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus); - await Task.Delay(2000); + await Task.Delay(1000); } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); @@ -596,8 +606,8 @@ namespace Tnb.WarehouseMgr do { - tuple = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None); - await Task.Delay(2000); + tuple = await _elevatorControlService.GetElevatorStatus(devName,tags, CancellationToken.None); + await Task.Delay(1000); } while (tuple.sysStatus != 3 && tuple.runStatus != 0); Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}"); @@ -811,8 +821,6 @@ namespace Tnb.WarehouseMgr _ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync(); //更新库位信息,使用状态为 使用,锁定状态为未锁定 _ = await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync(); - Logger.Information("更新载具及库位结束....."); - Logger.Information($"_userManager==null:{_userManager == null}"); /* var loginType= _userManager?.LoginType ?? "web"; Log.Information($"_userManager.LoginType={loginType}"); */ //更新业务主表的单据状态 diff --git a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json index caecf272..fb0a3e53 100644 --- a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json +++ b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json @@ -1,5 +1,6 @@ { - "DevName": "Elevator2", + "DevName3": "Elevator3", + "DevName4": "Elevator4", "token": "780BE4144636CF47DDF3920B0F1D069B", "GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList", "GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",