#region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2026 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:Mr.Wen's MacBook Pro * 命名空间:Sln.Wcs.HoistDispatchHub * 唯一标识:764B880E-8084-48A5-B773-95E8EA044319 * * 创建者:WenJY * 电子邮箱: * 创建时间:2026-06-01 13:24:25 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using Newtonsoft.Json; using Sln.Wcs.HoistAdapter.Domain.Dto.GetHoistStatus; using Sln.Wcs.HoistAdapter.Domain.Dto.HoistControl; using Sln.Wcs.HoistAdapter.Domain.Dto.HoistTaskExecutor; using Sln.Wcs.HoistAdapter.Domain.Enum; using Sln.Wcs.HoistAdapter.Service; using Sln.Wcs.Model.Domain; using Sln.Wcs.Serilog; namespace Sln.Wcs.HoistDispatcher; public class HoistDispatchHub { private readonly SerilogHelper _logger; private readonly IHoistService _hoistAdapter; public HoistDispatchHub(IHoistService hoistAdapter, SerilogHelper logger) { _hoistAdapter = hoistAdapter; _logger = logger; } /// /// 提升机启动:放置完成下发 /// /// public void TaskRun(BaseDeviceInfo deviceInfo) { try { HoistControlResultDto res = _hoistAdapter.HoistControl(new HoistControlDto() { hoistCode = deviceInfo.hostCode, deviceSerialNo = deviceInfo.deviceSerialNo, action = ControlAction.Start }); if (res.code == HoistStatusEnum.成功) { _logger.Info($"提升机启动指令(放置完成)下发成功"); } else { _logger.Info($"提升机启动指令(放置完成)下发失败:{res.msg},SDK返回信息:{res.data.message}"); } } catch (Exception e) { _logger.Info($"提升机启动指令(放置完成)下发异常:{e.Message}"); } } /// /// 提升机任务下发执行:可根据现场节拍进行提前下发(AGV 确定接驳位后即可下发) /// /// /// public void TaskDispatch(BaseDeviceInfo deviceInfo,LiveTaskDetail liveTaskDetail) { try { //解析起始点,组合 PLC 所需的起始点 TryParsePointCode(liveTaskDetail.startPoint, out string startBuilding, out string startFloor, out string startLocation); TryParsePointCode(liveTaskDetail.endPoint, out string endBuilding, out string endFloor, out string endLocation); int endPoint = Convert.ToInt32(deviceInfo.deviceSerialNo + startFloor + endFloor); //调用适配层下发 提升机调度任务 HoistTaskExeResultDto res = _hoistAdapter.HoistTaskExecutor(new HoistTaskExeDto() { hoistCode = deviceInfo.hostCode, taskCode = liveTaskDetail.taskCode, deviceSerialNo = deviceInfo.deviceSerialNo, endPoint = endPoint, }); if (res.code == HoistStatusEnum.成功) { _logger.Info($"提升机任务{liveTaskDetail.taskCode}下发成功:目标位置-{endPoint}"); } else { _logger.Info($"提升机任务{liveTaskDetail.taskCode}下发失败:{res.msg},SDK返回信息:{res.data.message}"); } } catch (Exception e) { _logger.Info($"提升机任务下发异常:{e.Message}"); } } /// /// 获取空闲提升机 /// /// /// public async Task GetFreeHoistAsync(string hostCode) { while (true) { RefreshDeviceParams(hostCode, out List deviceInfos); var freeHoist = deviceInfos?.FirstOrDefault(info => info.deviceParams.Any(item => item.paramName.Contains("提升机反馈任务状态") && item.paramValue == 0 ) ); if (freeHoist != null) return freeHoist; await Task.Delay(1000); } } /// /// 刷新设备参数:根据设备参数地址通过 PLC 获取参数值 /// hostCode为空时获取配置的所有参数值 /// /// /// private void RefreshDeviceParams(string hostCode,out List deviceParams) { deviceParams = null; GetHoistStatusResultDto getRes = _hoistAdapter.GetHoistStatus(new GetHoistStatusDto(){hoistCode = hostCode}); if (getRes.code == HoistStatusEnum.成功) { deviceParams = JsonConvert.DeserializeObject>(getRes.data.deviceParamStr); } else { _logger.Info($"设备参数获取失败:{getRes.msg}"); } } /// /// 解析起始点内容 /// 14#_L2_02 => 14栋、2层、02货位 /// /// /// /// /// /// private bool TryParsePointCode(string taskCode, out string building, out string floor, out string location) { building = null; floor = null; location = null; if (string.IsNullOrWhiteSpace(taskCode)) return false; // 使用正则表达式匹配格式:数字+#+_+L+数字+_+数字(至少一位) // 示例:14#_L2_03 var match = System.Text.RegularExpressions.Regex.Match(taskCode, @"^(\d+)#_L(\d+)_(\d+)$"); if (!match.Success) return false; building = match.Groups[1].Value; floor = match.Groups[2].Value; location = match.Groups[3].Value; return true; } }