using Serilog; using WIDESEAWCS_QuartzJob; namespace WIDESEAWCS_Tasks { /// /// 输送线目标地址选择器 /// /// /// public class ConveyorLineTargetAddressSelector { /// /// 日志记录器 /// /// /// 通过 Microsoft.Extensions.Logging 接口注入,用于结构化日志输出。 /// private readonly ILogger _logger; /// /// 构造函数 /// /// 日志记录器,由依赖注入容器自动注入 public ConveyorLineTargetAddressSelector(ILogger logger) { _logger = logger; // 保存日志记录器实例,供后续方法使用 } /// /// 处理入库场景的下一地址请求 /// /// /// 入库任务到达某个位置时调用此方法,判断目标设备是否需要物料。 /// 入库对应上层工位(Layer.Upper),因为物料从上层进入仓库。 /// /// 输送线设备对象,用于写入目标地址和 ACK 信号 /// 下一地址/目标设备编码,用于识别目标设备类型 /// 当前子设备编码,用于精确定位写入哪个子设备 public bool HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) { // 记录入库场景的调试日志,包含子设备和目标地址信息 WriteDebug(conveyorLine, "入库下一地址", childDeviceCode, nextAddress); var cvState = conveyorLine.GetValue(ConveyorLineDBNameNew.CV_State, nextAddress); bool isAvailable = cvState == 2; if (isAvailable) { return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); } return false; } /// /// 处理出库场景的下一地址请求 /// /// /// 出库任务到达某个位置时调用此方法,判断目标设备是否需要出料。 /// 出库对应下层工位(Layer.Lower),因为物料从下层离开仓库。 /// /// 输送线设备对象,用于写入目标地址和 ACK 信号 /// 下一地址/目标设备编码,用于识别目标设备类型 /// 当前子设备编码,用于精确定位写入哪个子设备 public bool HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) { // 记录出库场景的调试日志,包含子设备和目标地址信息 WriteDebug(conveyorLine, "出库下一地址", childDeviceCode, nextAddress); var cvState = conveyorLine.GetValue(ConveyorLineDBNameNew.CV_State, nextAddress); bool isAvailable = cvState == 2; if (isAvailable) { return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); } return false; } /// /// 写入调试日志(同时输出到两个日志系统) /// /// /// 统一入口点日志格式,同时向 Microsoft.Extensions.Logging 和 QuartzLogger 写入, /// 保证日志既能在控制台查看也能在文件中追溯。 /// /// 输送线设备对象,用于获取设备编码写入 QuartzLogger /// 场景描述,如"入库下一地址"或"出库下一地址" /// 子设备编码 /// 目标设备编码 private void WriteDebug(CommonConveyorLine conveyorLine, string scenario, string childDeviceCode, string nextAddress) { // 写入结构化日志(可被 Serilog 等日志框架捕获) QuartzLogHelper.LogDebug(_logger, "Handle{Scenario}:子设备: {ChildDeviceCode},目标地址: {NextAddress}", $"Handle{scenario}:子设备: {childDeviceCode},目标地址: {nextAddress}", conveyorLine.DeviceCode, scenario, childDeviceCode, nextAddress); } } }