From 0ad78c06b93cc78a178dd3ebae84ae25b5a1c071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E5=9C=A3?= Date: Tue, 30 Aug 2016 10:46:31 +0800 Subject: [PATCH] First fix for SetData (not complete) --- Modbus.Net/Modbus.Net/AddressCombiner.cs | 24 +++++++++++++++++++----- Modbus.Net/Modbus.Net/BaseMachine.cs | 13 +++++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Modbus.Net/Modbus.Net/AddressCombiner.cs b/Modbus.Net/Modbus.Net/AddressCombiner.cs index fd0b3f8..89e8cfd 100644 --- a/Modbus.Net/Modbus.Net/AddressCombiner.cs +++ b/Modbus.Net/Modbus.Net/AddressCombiner.cs @@ -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); } diff --git a/Modbus.Net/Modbus.Net/BaseMachine.cs b/Modbus.Net/Modbus.Net/BaseMachine.cs index de6d175..cd970bf 100644 --- a/Modbus.Net/Modbus.Net/BaseMachine.cs +++ b/Modbus.Net/Modbus.Net/BaseMachine.cs @@ -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;