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; } } }