namespace Modbus.Message
{
using System;
///
/// Modbus message factory.
///
public static class ModbusMessageFactory
{
///
/// Minimum request frame length.
///
private const int MinRequestFrameLength = 3;
///
/// Create a Modbus message.
///
/// Modbus message type.
/// Bytes of Modbus frame.
/// New Modbus message based on type and frame bytes.
public static T CreateModbusMessage(byte[] frame)
where T : IModbusMessage, new()
{
IModbusMessage message = new T();
message.Initialize(frame);
return (T)message;
}
///
/// Create a Modbus request.
///
/// Bytes of Modbus frame.
/// Modbus request.
public static IModbusMessage CreateModbusRequest(byte[] frame)
{
if (frame.Length < MinRequestFrameLength)
{
string msg = $"Argument 'frame' must have a length of at least {MinRequestFrameLength} bytes.";
throw new FormatException(msg);
}
IModbusMessage request;
byte functionCode = frame[1];
switch (functionCode)
{
case Modbus.ReadCoils:
case Modbus.ReadInputs:
request = CreateModbusMessage(frame);
break;
case Modbus.ReadHoldingRegisters:
case Modbus.ReadInputRegisters:
request = CreateModbusMessage(frame);
break;
case Modbus.WriteSingleCoil:
request = CreateModbusMessage(frame);
break;
case Modbus.WriteSingleRegister:
request = CreateModbusMessage(frame);
break;
case Modbus.Diagnostics:
request = CreateModbusMessage(frame);
break;
case Modbus.WriteMultipleCoils:
request = CreateModbusMessage(frame);
break;
case Modbus.WriteMultipleRegisters:
request = CreateModbusMessage(frame);
break;
case Modbus.ReadWriteMultipleRegisters:
request = CreateModbusMessage(frame);
break;
default:
string msg = $"Unsupported function code {functionCode}";
throw new ArgumentException(msg, nameof(frame));
}
return request;
}
}
}