ModbusFunctionServiceBase.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System;
  2. namespace NModbus.Device
  3. {
  4. /// <summary>
  5. /// Base class for
  6. /// </summary>
  7. /// <typeparam name="TRequest">The type of request to handle.</typeparam>
  8. public abstract class ModbusFunctionServiceBase<TRequest> : IModbusFunctionService
  9. where TRequest : class
  10. {
  11. private readonly byte _functionCode;
  12. protected ModbusFunctionServiceBase(byte functionCode)
  13. {
  14. _functionCode = functionCode;
  15. }
  16. public byte FunctionCode => _functionCode;
  17. public abstract IModbusMessage CreateRequest(byte[] frame);
  18. public IModbusMessage HandleSlaveRequest(IModbusMessage request, ISlaveDataStore dataStore)
  19. {
  20. //Attempt to cast the message
  21. TRequest typedRequest = request as TRequest;
  22. if (typedRequest == null)
  23. throw new InvalidOperationException($"Unable to cast request of type '{request.GetType().Name}' to type '{typeof(TRequest).Name}");
  24. //Do the implementation specific logic
  25. return Handle(typedRequest, dataStore);
  26. }
  27. public abstract int GetRtuRequestBytesToRead(byte[] frameStart);
  28. public abstract int GetRtuResponseBytesToRead(byte[] frameStart);
  29. protected abstract IModbusMessage Handle(TRequest request, ISlaveDataStore dataStore);
  30. protected static T CreateModbusMessage<T>(byte[] frame)
  31. where T : IModbusMessage, new()
  32. {
  33. IModbusMessage message = new T();
  34. message.Initialize(frame);
  35. return (T)message;
  36. }
  37. }
  38. }