Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Modbus/Device/ModbusSerialSlave.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ public override async Task ListenAsync()
}

// only service requests addressed to this particular slave
if (request.SlaveAddress != UnitId)
{
Debug.WriteLine($"NModbus Slave {UnitId} ignoring request intended for NModbus Slave {request.SlaveAddress}");
continue;
}
//if (request.SlaveAddress != UnitId)
//{
// Debug.WriteLine($"NModbus Slave {UnitId} ignoring request intended for NModbus Slave {request.SlaveAddress}");
// continue;
//}

// perform action
IModbusMessage response = ApplyRequest(request);
Expand Down
66 changes: 42 additions & 24 deletions Modbus/Device/ModbusSlave.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Diagnostics;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using Modbus.Data;
using Modbus.IO;
Expand All @@ -16,8 +17,13 @@ internal ModbusSlave(byte unitId, ModbusTransport transport)
{
DataStore = DataStoreFactory.CreateDefaultDataStore();
UnitId = unitId;

DataStores.TryAdd(unitId, DataStore);
}

private static readonly ConcurrentDictionary<byte, DataStore> DataStores =
new ConcurrentDictionary<byte, DataStore>();

/// <summary>
/// Raised when a Modbus slave receives a request, before processing request function.
/// </summary>
Expand All @@ -33,7 +39,19 @@ internal ModbusSlave(byte unitId, ModbusTransport transport)
/// <summary>
/// Gets or sets the data store.
/// </summary>
public DataStore DataStore { get; set; }
public DataStore DataStore
{
get => DataStores.GetOrAdd(UnitId, sa => DataStoreFactory.CreateDefaultDataStore());
set => DataStores[UnitId] = value;
}

/// <summary>
/// Get the data store by slaveAddress
/// </summary>
/// <param name="slaveAddress"></param>
/// <returns></returns>

private DataStore GetDataStoreBySlaveAddress(byte slaveAddress) => DataStores.GetOrAdd(slaveAddress, sa => DataStoreFactory.CreateDefaultDataStore());

/// <summary>
/// Gets or sets the unit ID.
Expand Down Expand Up @@ -160,41 +178,41 @@ internal static WriteMultipleRegistersResponse WriteMultipleRegisters(
internal IModbusMessage ApplyRequest(IModbusMessage request)
{
IModbusMessage response;

try
{
Debug.WriteLine(request.ToString());
ModbusSlaveRequestEventArgs eventArgs = new(request);
ModbusSlaveRequestReceived?.Invoke(this, eventArgs);

DataStore dataStore = GetDataStoreBySlaveAddress(request.SlaveAddress);
switch (request.FunctionCode)
{
case Modbus.ReadCoils:
response = ReadDiscretes(
(ReadCoilsInputsRequest)request,
DataStore,
DataStore.CoilDiscretes);
dataStore,
dataStore.CoilDiscretes);
break;

case Modbus.ReadInputs:
response = ReadDiscretes(
(ReadCoilsInputsRequest)request,
DataStore,
DataStore.InputDiscretes);
dataStore,
dataStore.InputDiscretes);
break;

case Modbus.ReadHoldingRegisters:
response = ReadRegisters(
(ReadHoldingInputRegistersRequest)request,
DataStore,
DataStore.HoldingRegisters);
dataStore,
dataStore.HoldingRegisters);
break;

case Modbus.ReadInputRegisters:
response = ReadRegisters(
(ReadHoldingInputRegistersRequest)request,
DataStore,
DataStore.InputRegisters);
dataStore,
dataStore.InputRegisters);
break;

case Modbus.Diagnostics:
Expand All @@ -204,46 +222,46 @@ internal IModbusMessage ApplyRequest(IModbusMessage request)
case Modbus.WriteSingleCoil:
response = WriteSingleCoil(
(WriteSingleCoilRequestResponse)request,
DataStore,
DataStore.CoilDiscretes);
dataStore,
dataStore.CoilDiscretes);
WriteComplete?.Invoke(this, eventArgs);
break;

case Modbus.WriteSingleRegister:
response = WriteSingleRegister(
(WriteSingleRegisterRequestResponse)request,
DataStore,
DataStore.HoldingRegisters);
dataStore,
dataStore.HoldingRegisters);
WriteComplete?.Invoke(this, eventArgs);
break;

case Modbus.WriteMultipleCoils:
response = WriteMultipleCoils(
(WriteMultipleCoilsRequest)request,
DataStore,
DataStore.CoilDiscretes);
dataStore,
dataStore.CoilDiscretes);
WriteComplete?.Invoke(this, eventArgs);
break;

case Modbus.WriteMultipleRegisters:
response = WriteMultipleRegisters(
(WriteMultipleRegistersRequest)request,
DataStore,
DataStore.HoldingRegisters);
dataStore,
dataStore.HoldingRegisters);
WriteComplete?.Invoke(this, eventArgs);
break;

case Modbus.ReadWriteMultipleRegisters:
ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest)request;
WriteMultipleRegisters(
readWriteRequest.WriteRequest,
DataStore,
DataStore.HoldingRegisters);
dataStore,
dataStore.HoldingRegisters);
WriteComplete?.Invoke(this, eventArgs);
response = ReadRegisters(
readWriteRequest.ReadRequest,
DataStore,
DataStore.HoldingRegisters);
dataStore,
dataStore.HoldingRegisters);
break;

default:
Expand Down