Innovenergy_trunk/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersRespons...

49 lines
1.8 KiB
C#

using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors;
using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode;
namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Replies;
using UInt16s = IReadOnlyList<UInt16>;
internal class ReadHoldingRegistersResponseFrame : ModbusFrame
{
internal new const Int32 MinSize = 3;
public MbByte ByteCount => Data.ByteAt(2);
public MbWords RegistersRead => Data.WordsAt(3);
public ReadHoldingRegistersResponseFrame(Byte slave, UInt16s registersRead) : base(ExpectedSize(registersRead.Count))
{
SlaveAddress .Set(slave);
FunctionCode .Set(ReadHoldingRegisters);
ByteCount .Set(registersRead.Count * 2);
RegistersRead.Set(registersRead);
}
internal static Int32 ExpectedSize(Int32 nRegisters) => MinSize + nRegisters * 2;
private ReadHoldingRegistersResponseFrame(Byte[] data) : this(new ArraySegment<Byte>(data))
{ }
private ReadHoldingRegistersResponseFrame(ArraySegment<Byte> data) : base(data)
{
if (data.Count < MinSize)
throw new ArgumentOutOfRangeException($"Expecting an array of size {MinSize} or more", nameof(data));
AssertFunctionCode(ReadHoldingRegisters);
var expectedSize = ByteCount + MinSize;
if (data.Count != expectedSize)
throw new ArgumentOutOfRangeException($"Expecting an array of size {expectedSize}", nameof(data));
if (ByteCount != RegistersRead.Count * 2)
throw new ArgumentException(nameof(RegistersRead));
}
public static ReadHoldingRegistersResponseFrame Parse(Byte[] data) => new ReadHoldingRegistersResponseFrame(data);
public static ReadHoldingRegistersResponseFrame Parse(ArraySegment<Byte> data) => new ReadHoldingRegistersResponseFrame(data);
}