First fix for SetData (not complete)

This commit is contained in:
罗圣
2016-08-30 10:46:31 +08:00
parent e1cb42a499
commit 0ad78c06b9
2 changed files with 28 additions and 9 deletions

View File

@@ -52,25 +52,39 @@ namespace Modbus.Net
} }
else else
{ {
if (address.Address + address.SubAddress * (0.125 / AddressTranslator.GetAreaByteLength(address.Area)) > preNum + BigEndianValueHelper.Instance.ByteLength[preType.FullName] / AddressTranslator.GetAreaByteLength(address.Area)) if (address.Address +
address.SubAddress*(0.125/AddressTranslator.GetAreaByteLength(address.Area)) <
preNum +
BigEndianValueHelper.Instance.ByteLength[preType.FullName]/
AddressTranslator.GetAreaByteLength(address.Area))
{
continue;
}
else if (address.Address +
address.SubAddress*(0.125/AddressTranslator.GetAreaByteLength(address.Area)) >
preNum +
BigEndianValueHelper.Instance.ByteLength[preType.FullName]/
AddressTranslator.GetAreaByteLength(address.Area))
{ {
ans.Add(new CommunicationUnit() ans.Add(new CommunicationUnit()
{ {
Area = area, Area = area,
Address = (int)Math.Floor(initNum), Address = (int) Math.Floor(initNum),
GetCount = (int)Math.Ceiling(byteCount), GetCount = (int) Math.Ceiling(byteCount),
DataType = typeof (byte), DataType = typeof (byte),
OriginalAddresses = originalAddresses.ToList(), OriginalAddresses = originalAddresses.ToList(),
}); });
initNum = address.Address; initNum = address.Address;
getCount = BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName] / AddressTranslator.GetAreaByteLength(address.Area); getCount = BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]/
AddressTranslator.GetAreaByteLength(address.Area);
byteCount = BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]; byteCount = BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName];
originalAddresses.Clear(); originalAddresses.Clear();
originalAddresses.Add(address); originalAddresses.Add(address);
} }
else else
{ {
getCount += BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName] / AddressTranslator.GetAreaByteLength(address.Area); getCount += BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]/
AddressTranslator.GetAreaByteLength(address.Area);
byteCount += BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName]; byteCount += BigEndianValueHelper.Instance.ByteLength[address.DataType.FullName];
originalAddresses.Add(address); originalAddresses.Add(address);
} }

View File

@@ -340,19 +340,24 @@ namespace Modbus.Net
var addressStart = AddressFormater.FormatAddress(communicateAddress.Area, var addressStart = AddressFormater.FormatAddress(communicateAddress.Area,
communicateAddress.Address); communicateAddress.Address);
while (setCount > 0.001) while (setCount > 0)
{ {
var localPos = (allBytes - setCount) / AddressTranslator.GetAreaByteLength(communicateAddress.Area); var localPos = (allBytes - setCount) / AddressTranslator.GetAreaByteLength(communicateAddress.Area);
//编码当前地址 //编码当前地址
var subPos = (int)((localPos - (int)localPos) / (0.125 / AddressTranslator.GetAreaByteLength(communicateAddress.Area)));
var address = AddressFormater.FormatAddress(communicateAddress.Area, var address = AddressFormater.FormatAddress(communicateAddress.Area,
communicateAddress.Address + (int) localPos); communicateAddress.Address + (int) localPos, subPos);
var address2 = subPos != 0
? null
: AddressFormater.FormatAddress(communicateAddress.Area,
communicateAddress.Address + (int) localPos);
//找到对应的描述地址 //找到对应的描述地址
var addressUnit = var addressUnit =
GetAddresses.SingleOrDefault( GetAddresses.SingleOrDefault(
p => p =>
p.Area == communicateAddress.Area && p.Area == communicateAddress.Area &&
p.Address == communicateAddress.Address + (int) localPos && p.Address == communicateAddress.Address + (int) localPos &&
p.SubAddress == (int) ((localPos - (int) localPos)/0.125)); p.SubAddress == subPos);
//如果没有相应地址,跳过 //如果没有相应地址,跳过
if (addressUnit == null) continue; if (addressUnit == null) continue;
//获取写入类型 //获取写入类型
@@ -362,7 +367,7 @@ namespace Modbus.Net
case MachineSetDataType.Address: case MachineSetDataType.Address:
{ {
//获取要写入的值 //获取要写入的值
var value = values.SingleOrDefault(p => p.Key == address); var value = values.SingleOrDefault(p => p.Key == address || (address2 != null && p.Key == address2));
//将要写入的值加入队列 //将要写入的值加入队列
datasList.Add(Convert.ChangeType(value.Value / addressUnit.Zoom, dataType)); datasList.Add(Convert.ChangeType(value.Value / addressUnit.Zoom, dataType));
break; break;