2016-01-29 update 2

This commit is contained in:
parallelbgls@outlook.com
2016-01-29 16:55:23 +08:00
parent 1bfaa71e2e
commit 92800844cf
3 changed files with 89 additions and 2 deletions

View File

@@ -25,6 +25,7 @@ namespace ModBus.Net
public override IEnumerable<CommunicationUnit> Combine(IEnumerable<AddressUnit> addresses)
{
var groupedAddresses = from address in addresses
orderby address.Address
group address by address.Area
into grouped
select grouped;
@@ -93,4 +94,90 @@ namespace ModBus.Net
}).ToList();
}
}
class CommunicationUnitGap
{
public CommunicationUnit EndUnit { get; set; }
public int GapNumber { get; set; }
}
public class AddressCombinerNumericJump : AddressCombiner
{
private int JumpNumber { get; }
public AddressCombinerNumericJump(int jumpNumber)
{
JumpNumber = jumpNumber;
}
public override IEnumerable<CommunicationUnit> Combine(IEnumerable<AddressUnit> addresses)
{
var continusAddresses = new AddressCombinerContinus().Combine(addresses).ToList();
List<CommunicationUnitGap> addressesGaps = new List<CommunicationUnitGap>();
CommunicationUnit preCommunicationUnit = null;
foreach (var continusAddress in continusAddresses)
{
if (preCommunicationUnit == null)
{
preCommunicationUnit = continusAddress;
continue;
}
if (continusAddress.Area == preCommunicationUnit.Area)
{
var gap = new CommunicationUnitGap()
{
EndUnit = continusAddress,
GapNumber = continusAddress.Address - preCommunicationUnit.Address - (int)(preCommunicationUnit.GetCount * BigEndianValueHelper.Instance.ByteLength[preCommunicationUnit.DataType.FullName])
};
addressesGaps.Add(gap);
}
preCommunicationUnit = continusAddress;
}
var orderedGaps = addressesGaps.OrderBy(p => p.GapNumber);
int jumpNumberInner = JumpNumber;
foreach (var orderedGap in orderedGaps)
{
jumpNumberInner -= orderedGap.GapNumber;
if (jumpNumberInner < 0) break;
var nowAddress = orderedGap.EndUnit;
var index = continusAddresses.IndexOf(nowAddress);
index--;
var preAddress = continusAddresses[index];
continusAddresses.RemoveAt(index);
continusAddresses.RemoveAt(index);
var newAddress = new CommunicationUnit()
{
Area = nowAddress.Area,
Address = preAddress.Address,
GetCount =
(int)
(preAddress.GetCount*BigEndianValueHelper.Instance.ByteLength[preAddress.DataType.FullName]) +
orderedGap.GapNumber +
(int)
(nowAddress.GetCount*BigEndianValueHelper.Instance.ByteLength[nowAddress.DataType.FullName]),
DataType = typeof (byte)
};
continusAddresses.Insert(index, newAddress);
}
return continusAddresses;
}
}
public class AddressCombinerPercentageJump : AddressCombiner
{
private double Percentage { get; }
public AddressCombinerPercentageJump(double percentage)
{
if (percentage < 0 || percentage > 100) throw new ArgumentException();
Percentage = percentage;
}
public override IEnumerable<CommunicationUnit> Combine(IEnumerable<AddressUnit> addresses)
{
var addressUnits = addresses as IList<AddressUnit> ?? addresses.ToList();
double count = addressUnits.Sum(address => BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]);
return new AddressCombinerNumericJump((int)(count * Percentage / 100.0)).Combine(addressUnits);
}
}
}

View File

@@ -39,7 +39,7 @@ namespace ModBus.Net
}
//自动寻找存在的协议并将其加载
var protocalUnit =
Assembly.Load("ModBus.Net").CreateInstance(protocalName) as ProtocalUnit;
Assembly.Load(type.Assembly.FullName).CreateInstance(protocalName) as ProtocalUnit;
if (protocalUnit == null) throw new InvalidCastException("没有相应的协议内容");
Register(protocalUnit);
return Protocals[protocalName];

View File

@@ -112,7 +112,7 @@ namespace ModBus.Net
{
//自动查找相应的协议放缩类,命令规则为——当前的实际类名(注意是继承后的)+"BytesExtend"。
ProtocalLinkerBytesExtend bytesExtend =
Assembly.Load(this.GetType().Assembly.GetName().Name).CreateInstance(this.GetType().FullName + "BytesExtend") as
Assembly.Load(this.GetType().Assembly.FullName).CreateInstance(this.GetType().FullName + "BytesExtend") as
ProtocalLinkerBytesExtend;
return bytesExtend?.BytesExtend(content);
}