-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathServerFunctionFactory.cs
More file actions
100 lines (86 loc) · 4.82 KB
/
ServerFunctionFactory.cs
File metadata and controls
100 lines (86 loc) · 4.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using NModbus.BasicServer.Functions;
using NModbus.BasicServer.Interfaces;
using NModbus.Functions;
using NModbus.Interfaces;
using NModbus.Messages;
namespace NModbus.BasicServer
{
public static class ServerFunctionFactory
{
public static IServerFunction[] CreateBasicServerFunctions(
IDeviceStorage? storage = null,
ILoggerFactory? loggerFactory = null,
IEnumerable<IServerFunction>? customServerFunctions = null)
{
loggerFactory ??= new NullLoggerFactory();
storage ??= new Storage();
//These are the built in function implementations.
var serverFunctions = new IServerFunction[]
{
//Write Single Register
new ModbusServerFunction<WriteSingleRegisterRequest, WriteSingleRegisterResponse>(
ModbusFunctionCodes.WriteSingleRegister,
new WriteSingleRegisterMessageSerializer(),
new WriteSingleRegisterImplementation(loggerFactory, storage.HoldingRegisters)),
//Read Holding Registers
new ModbusServerFunction<ReadHoldingRegistersRequest, ReadHoldingRegistersResponse>(
ModbusFunctionCodes.ReadHoldingRegisters,
new ReadHoldingRegistersMessageSerializer(),
new ReadHoldingRegistersImplementation(loggerFactory, storage.HoldingRegisters)),
//Write Multiple Registers
new ModbusServerFunction<WriteMultipleRegistersRequest, WriteMultipleRegistersResponse>(
ModbusFunctionCodes.WriteMultipleRegisters,
new WriteMultipleRegistersMessageSerializer(),
new WriteMultipleRegistersImplementation(loggerFactory, storage.HoldingRegisters)),
//Read Write Multiple Registers
new ModbusServerFunction<ReadWriteMultipleRegistersRequest, ReadWriteMultipleRegistersResponse>(
ModbusFunctionCodes.ReadWriteMultipleRegisters,
new ReadWriteMultipleRegistersMessageSerializer(),
new ReadWriteMultipleRegistersImplementation(loggerFactory, storage.HoldingRegisters)),
//Read Input Registers
new ModbusServerFunction<ReadInputRegistersRequest, ReadInputRegistersResponse>(
ModbusFunctionCodes.ReadInputRegisters,
new ReadInputRegistersMessageSerializer(),
new ReadInputRegistersImplementation(loggerFactory, storage.InputRegisters)),
//Write Single Coil
new ModbusServerFunction<WriteSingleCoilRequest, WriteSingleCoilResponse>(
ModbusFunctionCodes.WriteSingleCoil,
new WriteSingleCoilMessageSerializer(),
new WriteSingleCoilImplementation(loggerFactory, storage.Coils)),
//Write Multiple Coils
new ModbusServerFunction<WriteMultipleCoilsRequest, WriteMultipleCoilsResponse>(
ModbusFunctionCodes.WriteMultipleCoils,
new WriteMultipleCoilsMessageSerializer(),
new WriteMultipleCoilsImplementation(loggerFactory,storage.Coils)),
//Read Coils
new ModbusServerFunction<ReadCoilsRequest, ReadCoilsResponse>(
ModbusFunctionCodes.ReadCoils,
new ReadCoilsMessageSerializer(),
new ReadCoilsImplementation(loggerFactory, storage.Coils)),
//Read Discrete Inputs
new ModbusServerFunction<ReadDiscreteInputsRequest, ReadDiscreteInputsResponse>(
ModbusFunctionCodes.ReadDiscreteInputs,
new ReadDiscreteInputsMessageSerilizer(),
new ReadDiscreteInputsImplementation(loggerFactory, storage.DiscreteInputs)),
//Mask Write Register
new ModbusServerFunction<MaskWriteRegisterRequest, MaskWriteRegisterResponse>(
ModbusFunctionCodes.MaskWriteRegister,
new MaskWriteRegisterMessageSerializer(),
new MaskWriteRegisterImplementation(loggerFactory, storage.HoldingRegisters)),
};
var dictionary = serverFunctions
.ToDictionary(f => f.FunctionCode);
if (customServerFunctions != null)
{
foreach(var customServerFunction in customServerFunctions)
{
dictionary[customServerFunction.FunctionCode] = customServerFunction;
}
}
return dictionary.Values
.ToArray();
}
}
}