2017-04-28 update 1 Add combiner max limit.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user