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