using Microsoft.Extensions.Options; using WIDESEAWCS_S7Simulator.Core.Interfaces; using WIDESEAWCS_S7Simulator.Core.Protocol; namespace WIDESEAWCS_S7Simulator.Application.Protocol; /// /// 化成堆垛机设备协议处理器。 /// public class PlcLinkStackerProtocolHandler : IDeviceProtocolHandler { private readonly MirrorAckProtocolHandler _mirrorAckHandler; private readonly ProtocolMonitoringOptions _options; public PlcLinkStackerProtocolHandler( MirrorAckProtocolHandler mirrorAckHandler, IOptions options) { _mirrorAckHandler = mirrorAckHandler; _options = options.Value; } public string ProtocolName => "PlcLinkStackerProtocol"; public bool Process(IMemoryStore memoryStore, ProtocolTemplate template, ProtocolRuntimeState runtimeState) { var ruleIds = _options.PlcLinkStackerRuleIds .Where(x => !string.IsNullOrWhiteSpace(x)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); if (ruleIds.Length == 0) { return false; } bool changed = false; foreach (var ruleId in ruleIds) { var rule = _options.MirrorAckRules .FirstOrDefault(x => string.Equals(x.RuleId, ruleId, StringComparison.OrdinalIgnoreCase)); if (rule == null) { continue; } changed |= _mirrorAckHandler.Process(memoryStore, template, runtimeState, rule, $"{ProtocolName}:{ruleId}"); } return changed; } }