From 7f304e826f4482e1d1970e606d2c5f8009c9a8c3 Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Mon, 20 Oct 2025 15:08:07 +0800 Subject: [PATCH] Add AddressCombinerStatic --- .../Modbus.Net/Machine/AddressCombiner.cs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/Modbus.Net/Modbus.Net/Machine/AddressCombiner.cs b/Modbus.Net/Modbus.Net/Machine/AddressCombiner.cs index bf315b4..fe0a96d 100644 --- a/Modbus.Net/Modbus.Net/Machine/AddressCombiner.cs +++ b/Modbus.Net/Modbus.Net/Machine/AddressCombiner.cs @@ -398,4 +398,59 @@ namespace Modbus.Net addressUnits); } } + + public class ReadAddressesDesc + { + public string Area { get; set; } + + public int Address { get; set; } + + public int GetCount { get; set; } + } + + /// + /// 固定读取地址的范围,无视所有其它规则 + /// + public class AddressCombinerStatic : AddressCombiner where TKey : IEquatable + { + protected IEnumerable ReadAddresses { get; set; } + + protected AddressTranslator AddressTranslator { get; set; } + + public AddressCombinerStatic(IEnumerable readAddresses, AddressTranslator addressTranslator) + { + AddressTranslator = addressTranslator; + ReadAddresses = readAddresses; + } + + /// + /// 组合地址 + /// + /// 需要组合的地址 + /// 组合后的地址 + public override IEnumerable> Combine(IEnumerable> addresses) + { + List> communicationUnits = new List>(); + foreach (var readAddress in ReadAddresses) + { + var originalAddresses = new List>(); + foreach (var address in addresses) + { + if (address.Area == readAddress.Area && address.Address >= readAddress.Address && address.Address < readAddress.Address + readAddress.GetCount) + originalAddresses.Add(address); + } + communicationUnits.Add(new CommunicationUnit + { + Area = readAddress.Area, + Address = readAddress.Address, + GetCount = readAddress.GetCount * (int) + Math.Ceiling(AddressTranslator.GetAreaByteLength(readAddress.Area)), + DataType = typeof(byte), + GetOriginalCount = originalAddresses.Count, + OriginalAddresses = originalAddresses.ToList() + }); + } + return communicationUnits; + } + } } \ No newline at end of file