2017-04-28 update 1 Add combiner max limit.

This commit is contained in:
parallelbgls
2017-04-28 17:17:59 +08:00
parent 8380c95570
commit 069b0a56e1
4 changed files with 143 additions and 25 deletions

View File

@@ -16,8 +16,8 @@ namespace Modbus.Net.Modbus
{ {
BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian); BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian);
AddressFormater = new AddressFormaterModbus(); AddressFormater = new AddressFormaterModbus();
AddressCombiner = new AddressCombinerContinus<TUnitKey>(AddressTranslator); AddressCombiner = new AddressCombinerContinus<TUnitKey>(AddressTranslator, 100);
AddressCombinerSet = new AddressCombinerContinus<TUnitKey>(AddressTranslator); AddressCombinerSet = new AddressCombinerContinus<TUnitKey>(AddressTranslator, 100);
} }
public ModbusMachine(ModbusType connectionType, string connectionString, public ModbusMachine(ModbusType connectionType, string connectionString,
@@ -40,8 +40,8 @@ namespace Modbus.Net.Modbus
{ {
BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian); BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian);
AddressFormater = new AddressFormaterModbus(); AddressFormater = new AddressFormaterModbus();
AddressCombiner = new AddressCombinerContinus(AddressTranslator); AddressCombiner = new AddressCombinerContinus(AddressTranslator, 100);
AddressCombinerSet = new AddressCombinerContinus(AddressTranslator); AddressCombinerSet = new AddressCombinerContinus(AddressTranslator, 100);
} }
public ModbusMachine(ModbusType connectionType, string connectionString, public ModbusMachine(ModbusType connectionType, string connectionString,

View File

@@ -15,8 +15,8 @@ namespace Modbus.Net.Siemens
{ {
BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress);
AddressFormater = new AddressFormaterSiemens(); AddressFormater = new AddressFormaterSiemens();
AddressCombiner = new AddressCombinerContinus<TUnitKey>(AddressTranslator); AddressCombiner = new AddressCombinerContinus<TUnitKey>(AddressTranslator, 100);
AddressCombinerSet = new AddressCombinerContinus<TUnitKey>(AddressTranslator); AddressCombinerSet = new AddressCombinerContinus<TUnitKey>(AddressTranslator, 100);
} }
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,
@@ -37,8 +37,8 @@ namespace Modbus.Net.Siemens
{ {
BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress);
AddressFormater = new AddressFormaterSiemens(); AddressFormater = new AddressFormaterSiemens();
AddressCombiner = new AddressCombinerContinus(AddressTranslator); AddressCombiner = new AddressCombinerContinus(AddressTranslator, 100);
AddressCombinerSet = new AddressCombinerContinus(AddressTranslator); AddressCombinerSet = new AddressCombinerContinus(AddressTranslator, 100);
} }
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,

View File

@@ -29,7 +29,7 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerContinus : AddressCombinerContinus<string> public class AddressCombinerContinus : AddressCombinerContinus<string>
{ {
public AddressCombinerContinus(AddressTranslator addressTranslator) : base(addressTranslator) public AddressCombinerContinus(AddressTranslator addressTranslator, int maxLength) : base(addressTranslator, maxLength)
{ {
} }
} }
@@ -39,9 +39,12 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerContinus<TKey> : AddressCombiner<TKey> where TKey : IEquatable<TKey> public class AddressCombinerContinus<TKey> : AddressCombiner<TKey> where TKey : IEquatable<TKey>
{ {
public AddressCombinerContinus(AddressTranslator addressTranslator) protected int MaxLength { get; set; }
public AddressCombinerContinus(AddressTranslator addressTranslator, int maxLength)
{ {
AddressTranslator = addressTranslator; AddressTranslator = addressTranslator;
MaxLength = maxLength;
} }
protected AddressTranslator AddressTranslator { get; set; } protected AddressTranslator AddressTranslator { get; set; }
@@ -158,7 +161,48 @@ namespace Modbus.Net
OriginalAddresses = originalAddresses.ToList() OriginalAddresses = originalAddresses.ToList()
}); });
} }
return ans; List<CommunicationUnit<TKey>> newAns = new List<CommunicationUnit<TKey>>();
foreach (var communicationUnit in ans)
{
double oldByteCount = communicationUnit.GetCount * BigEndianValueHelper.Instance.ByteLength[communicationUnit.DataType.FullName];
while (oldByteCount * BigEndianValueHelper.Instance.ByteLength[communicationUnit.DataType.FullName] >
MaxLength)
{
var newOriginalAddresses = new List<AddressUnit<TKey>>();
var oldOriginalAddresses = communicationUnit.OriginalAddresses.ToList();
var newByteCount = 0.0;
do
{
var currentAddressUnit = oldOriginalAddresses.First();
newByteCount += BigEndianValueHelper.Instance.ByteLength[currentAddressUnit.DataType.FullName];
if (newByteCount > MaxLength) break;
oldByteCount -= BigEndianValueHelper.Instance.ByteLength[currentAddressUnit.DataType.FullName];
newOriginalAddresses.Add(currentAddressUnit);
oldOriginalAddresses.RemoveAt(0);
} while (newByteCount < MaxLength);
var newCommunicationUnit = new CommunicationUnit<TKey>
{
Area = communicationUnit.Area,
Address = communicationUnit.Address,
SubAddress = communicationUnit.SubAddress,
DataType = communicationUnit.DataType,
GetCount =
(int)
Math.Ceiling(newByteCount /
BigEndianValueHelper.Instance.ByteLength[communicationUnit.DataType.FullName]),
OriginalAddresses = newOriginalAddresses,
};
newAns.Add(newCommunicationUnit);
}
communicationUnit.GetCount =
(int)
Math.Ceiling(oldByteCount /
BigEndianValueHelper.Instance.ByteLength[communicationUnit.DataType.FullName]);
newAns.Add(communicationUnit);
}
return newAns;
} }
} }
@@ -205,8 +249,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerNumericJump : AddressCombinerNumericJump<string> public class AddressCombinerNumericJump : AddressCombinerNumericJump<string>
{ {
public AddressCombinerNumericJump(int jumpByteCount, AddressTranslator addressTranslator) public AddressCombinerNumericJump(int jumpByteCount, int maxLength, AddressTranslator addressTranslator)
: base(jumpByteCount, addressTranslator) : base(jumpByteCount, maxLength, addressTranslator)
{ {
} }
} }
@@ -216,8 +260,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerNumericJump<TKey> : AddressCombinerContinus<TKey> where TKey : IEquatable<TKey> public class AddressCombinerNumericJump<TKey> : AddressCombinerContinus<TKey> where TKey : IEquatable<TKey>
{ {
public AddressCombinerNumericJump(int jumpByteCount, AddressTranslator addressTranslator) public AddressCombinerNumericJump(int jumpByteCount, int maxLength, AddressTranslator addressTranslator)
: base(addressTranslator) : base(addressTranslator, maxLength)
{ {
JumpNumber = jumpByteCount; JumpNumber = jumpByteCount;
} }
@@ -260,12 +304,14 @@ namespace Modbus.Net
var jumpNumberInner = JumpNumber; var jumpNumberInner = JumpNumber;
foreach (var orderedGap in orderedGaps) foreach (var orderedGap in orderedGaps)
{ {
jumpNumberInner -= orderedGap.GapNumber; if (orderedGap.GapNumber <= 0) continue;
if (jumpNumberInner < 0) break;
var nowAddress = orderedGap.EndUnit; var nowAddress = orderedGap.EndUnit;
var index = continusAddresses.IndexOf(nowAddress); var index = continusAddresses.IndexOf(nowAddress);
index--; index--;
var preAddress = continusAddresses[index]; var preAddress = continusAddresses[index];
if (nowAddress.GetCount*BigEndianValueHelper.Instance.ByteLength[nowAddress.DataType.FullName] + preAddress.GetCount*BigEndianValueHelper.Instance.ByteLength[preAddress.DataType.FullName] + orderedGap.GapNumber > MaxLength) continue;
jumpNumberInner -= orderedGap.GapNumber;
if (jumpNumberInner < 0) break;
continusAddresses.RemoveAt(index); continusAddresses.RemoveAt(index);
continusAddresses.RemoveAt(index); continusAddresses.RemoveAt(index);
//合并两个已有的地址段,变为一个新的地址段 //合并两个已有的地址段,变为一个新的地址段
@@ -293,8 +339,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerPercentageJump : AddressCombinerPercentageJump<string> public class AddressCombinerPercentageJump : AddressCombinerPercentageJump<string>
{ {
public AddressCombinerPercentageJump(double percentage, AddressTranslator addressTranslator) public AddressCombinerPercentageJump(double percentage, int maxLength, AddressTranslator addressTranslator)
: base(percentage, addressTranslator) : base(percentage, maxLength, addressTranslator)
{ {
} }
} }
@@ -304,8 +350,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public class AddressCombinerPercentageJump<TKey> : AddressCombinerContinus<TKey> where TKey : IEquatable<TKey> public class AddressCombinerPercentageJump<TKey> : AddressCombinerContinus<TKey> where TKey : IEquatable<TKey>
{ {
public AddressCombinerPercentageJump(double percentage, AddressTranslator addressTranslator) public AddressCombinerPercentageJump(double percentage, int maxLength, AddressTranslator addressTranslator)
: base(addressTranslator) : base(addressTranslator, maxLength)
{ {
if (percentage < 0) percentage = 0; if (percentage < 0) percentage = 0;
Percentage = percentage; Percentage = percentage;
@@ -318,7 +364,7 @@ namespace Modbus.Net
var addressUnits = addresses as IList<AddressUnit<TKey>> ?? addresses.ToList(); var addressUnits = addresses as IList<AddressUnit<TKey>> ?? addresses.ToList();
var count = addressUnits.Sum(address => BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]); var count = addressUnits.Sum(address => BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]);
return return
new AddressCombinerNumericJump<TKey>((int) (count*Percentage/100.0), AddressTranslator).Combine( new AddressCombinerNumericJump<TKey>((int) (count*Percentage/100.0), MaxLength, AddressTranslator).Combine(
addressUnits); addressUnits);
} }
} }

View File

@@ -151,7 +151,7 @@ namespace Modbus.Net.Tests
[TestMethod] [TestMethod]
public void AddressCombinerContinusTest() public void AddressCombinerContinusTest()
{ {
var addressCombiner = new AddressCombinerContinus<int>(new AddressTranslatorModbus()); var addressCombiner = new AddressCombinerContinus<int>(new AddressTranslatorModbus(), 100000);
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].Address, 1);
@@ -176,6 +176,37 @@ namespace Modbus.Net.Tests
Assert.AreEqual(combinedAddresses[6].GetCount, 2); Assert.AreEqual(combinedAddresses[6].GetCount, 2);
} }
[TestMethod]
public void AddressCombinerContinusLimitTest()
{
var addressCombiner = new AddressCombinerContinus<int>(new AddressTranslatorModbus(), 4);
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 1);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 2);
Assert.AreEqual(combinedAddresses[1].GetCount, 4);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 2);
Assert.AreEqual(combinedAddresses[2].GetCount, 2);
Assert.AreEqual(combinedAddresses[3].Area, "3X");
Assert.AreEqual(combinedAddresses[3].Address, 6);
Assert.AreEqual(combinedAddresses[3].GetCount, 2);
Assert.AreEqual(combinedAddresses[4].Area, "3X");
Assert.AreEqual(combinedAddresses[4].Address, 9);
Assert.AreEqual(combinedAddresses[4].GetCount, 4);
Assert.AreEqual(combinedAddresses[5].Area, "3X");
Assert.AreEqual(combinedAddresses[5].Address, 100);
Assert.AreEqual(combinedAddresses[5].GetCount, 2);
Assert.AreEqual(combinedAddresses[6].Area, "4X");
Assert.AreEqual(combinedAddresses[6].Address, 1);
Assert.AreEqual(combinedAddresses[6].GetCount, 4);
Assert.AreEqual(combinedAddresses[7].Area, "4X");
Assert.AreEqual(combinedAddresses[7].Address, 4);
Assert.AreEqual(combinedAddresses[7].GetCount, 2);
}
[TestMethod] [TestMethod]
public void AddressCombinerSingleTest() public void AddressCombinerSingleTest()
{ {
@@ -203,7 +234,7 @@ namespace Modbus.Net.Tests
[TestMethod] [TestMethod]
public void AddressCombinerNumericJumpTest() public void AddressCombinerNumericJumpTest()
{ {
var addressCombiner = new AddressCombinerNumericJump<int>(10, new AddressTranslatorModbus()); var addressCombiner = new AddressCombinerNumericJump<int>(10, 100000, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].Address, 1);
@@ -216,10 +247,29 @@ namespace Modbus.Net.Tests
Assert.AreEqual(combinedAddresses[2].GetCount, 8); Assert.AreEqual(combinedAddresses[2].GetCount, 8);
} }
[TestMethod]
public void AddressCombinerNumericJumpLimitTest()
{
var addressCombiner = new AddressCombinerNumericJump<int>(10, 10, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 8);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 6);
Assert.AreEqual(combinedAddresses[1].GetCount, 10);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 100);
Assert.AreEqual(combinedAddresses[2].GetCount, 2);
Assert.AreEqual(combinedAddresses[3].Area, "4X");
Assert.AreEqual(combinedAddresses[3].Address, 1);
Assert.AreEqual(combinedAddresses[3].GetCount, 8);
}
[TestMethod] [TestMethod]
public void AddressCombinerPercentageJumpTest() public void AddressCombinerPercentageJumpTest()
{ {
var addressCombiner = new AddressCombinerPercentageJump<int>(30.0, new AddressTranslatorModbus()); var addressCombiner = new AddressCombinerPercentageJump<int>(30.0, 100000, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray(); var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X"); Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1); Assert.AreEqual(combinedAddresses[0].Address, 1);
@@ -235,6 +285,28 @@ namespace Modbus.Net.Tests
Assert.AreEqual(combinedAddresses[3].GetCount, 8); Assert.AreEqual(combinedAddresses[3].GetCount, 8);
} }
[TestMethod]
public void AddressCombinerPercentageJumpLimitTest()
{
var addressCombiner = new AddressCombinerPercentageJump<int>(30.0, 10, new AddressTranslatorModbus());
var combinedAddresses = addressCombiner.Combine(_addressUnits).ToArray();
Assert.AreEqual(combinedAddresses[0].Area, "3X");
Assert.AreEqual(combinedAddresses[0].Address, 1);
Assert.AreEqual(combinedAddresses[0].GetCount, 8);
Assert.AreEqual(combinedAddresses[1].Area, "3X");
Assert.AreEqual(combinedAddresses[1].Address, 6);
Assert.AreEqual(combinedAddresses[1].GetCount, 2);
Assert.AreEqual(combinedAddresses[2].Area, "3X");
Assert.AreEqual(combinedAddresses[2].Address, 9);
Assert.AreEqual(combinedAddresses[2].GetCount, 4);
Assert.AreEqual(combinedAddresses[3].Area, "3X");
Assert.AreEqual(combinedAddresses[3].Address, 100);
Assert.AreEqual(combinedAddresses[3].GetCount, 2);
Assert.AreEqual(combinedAddresses[4].Area, "4X");
Assert.AreEqual(combinedAddresses[4].Address, 1);
Assert.AreEqual(combinedAddresses[4].GetCount, 8);
}
[TestMethod] [TestMethod]
public void TaskManagerGetMachineTest() public void TaskManagerGetMachineTest()
{ {