First fix for SetData (not complete)
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user