First fix for SetData (not complete)
This commit is contained in:
@@ -52,25 +52,39 @@ namespace Modbus.Net
|
||||
}
|
||||
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()
|
||||
{
|
||||
Area = area,
|
||||
Address = (int)Math.Floor(initNum),
|
||||
GetCount = (int)Math.Ceiling(byteCount),
|
||||
Address = (int) Math.Floor(initNum),
|
||||
GetCount = (int) Math.Ceiling(byteCount),
|
||||
DataType = typeof (byte),
|
||||
OriginalAddresses = originalAddresses.ToList(),
|
||||
});
|
||||
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];
|
||||
originalAddresses.Clear();
|
||||
originalAddresses.Add(address);
|
||||
}
|
||||
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];
|
||||
originalAddresses.Add(address);
|
||||
}
|
||||
|
||||
@@ -340,19 +340,24 @@ namespace Modbus.Net
|
||||
var addressStart = AddressFormater.FormatAddress(communicateAddress.Area,
|
||||
communicateAddress.Address);
|
||||
|
||||
while (setCount > 0.001)
|
||||
while (setCount > 0)
|
||||
{
|
||||
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,
|
||||
communicateAddress.Address + (int) localPos);
|
||||
communicateAddress.Address + (int) localPos, subPos);
|
||||
var address2 = subPos != 0
|
||||
? null
|
||||
: AddressFormater.FormatAddress(communicateAddress.Area,
|
||||
communicateAddress.Address + (int) localPos);
|
||||
//找到对应的描述地址
|
||||
var addressUnit =
|
||||
GetAddresses.SingleOrDefault(
|
||||
p =>
|
||||
p.Area == communicateAddress.Area &&
|
||||
p.Address == communicateAddress.Address + (int) localPos &&
|
||||
p.SubAddress == (int) ((localPos - (int) localPos)/0.125));
|
||||
p.SubAddress == subPos);
|
||||
//如果没有相应地址,跳过
|
||||
if (addressUnit == null) continue;
|
||||
//获取写入类型
|
||||
@@ -362,7 +367,7 @@ namespace Modbus.Net
|
||||
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));
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user