using System;
namespace NModbus.Message
{
///
/// Abstract Modbus message.
///
public abstract class AbstractModbusMessage
{
private readonly ModbusMessageImpl _messageImpl;
///
/// Abstract Modbus message.
///
internal AbstractModbusMessage()
{
_messageImpl = new ModbusMessageImpl();
}
///
/// Abstract Modbus message.
///
internal AbstractModbusMessage(byte slaveAddress, byte functionCode)
{
_messageImpl = new ModbusMessageImpl(slaveAddress, functionCode);
}
public ushort TransactionId
{
get => _messageImpl.TransactionId;
set => _messageImpl.TransactionId = value;
}
public byte FunctionCode
{
get => _messageImpl.FunctionCode;
set => _messageImpl.FunctionCode = value;
}
public byte SlaveAddress
{
get => _messageImpl.SlaveAddress;
set => _messageImpl.SlaveAddress = value;
}
public byte[] MessageFrame => _messageImpl.MessageFrame;
public virtual byte[] ProtocolDataUnit => _messageImpl.ProtocolDataUnit;
public abstract int MinimumFrameSize { get; }
internal ModbusMessageImpl MessageImpl => _messageImpl;
public void Initialize(byte[] frame)
{
if (frame.Length < MinimumFrameSize)
{
string msg = $"Message frame must contain at least {MinimumFrameSize} bytes of data.";
throw new FormatException(msg);
}
_messageImpl.Initialize(frame);
InitializeUnique(frame);
}
protected abstract void InitializeUnique(byte[] frame);
}
}