Exemplo n.º 1
0
        internal IModbusMessage ApplyRequest(IModbusMessage request)
        {
            Log.Info(request.ToString());
            ModbusSlaveRequestReceived.Raise(this, new ModbusSlaveRequestEventArgs(request));

            IModbusMessage response;

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

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

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

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

            case Modbus.Diagnostics:
                response = request;
                break;

            case Modbus.WriteSingleCoil:
                response = WriteSingleCoil((WriteSingleCoilRequestResponse)request, DataStore, DataStore.CoilDiscretes);
                break;

            case Modbus.WriteSingleRegister:
                response = WriteSingleRegister((WriteSingleRegisterRequestResponse)request, DataStore, DataStore.HoldingRegisters);
                break;

            case Modbus.WriteMultipleCoils:
                response = WriteMultipleCoils((WriteMultipleCoilsRequest)request, DataStore, DataStore.CoilDiscretes);
                break;

            case Modbus.WriteMultipleRegisters:
                response = WriteMultipleRegisters((WriteMultipleRegistersRequest)request, DataStore, DataStore.HoldingRegisters);
                break;

            case Modbus.ReadWriteMultipleRegisters:
                ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest)request;
                response = ReadRegisters(readWriteRequest.ReadRequest, DataStore, DataStore.HoldingRegisters);
                WriteMultipleRegisters(readWriteRequest.WriteRequest, DataStore, DataStore.HoldingRegisters);
                break;

            default:
                string errorMessage = String.Format(CultureInfo.InvariantCulture, "Unsupported function code {0}", request.FunctionCode);
                Log.Error(errorMessage);
                throw new ArgumentException(errorMessage, "request");
            }

            return(response);
        }
Exemplo n.º 2
0
        internal IModbusMessage ApplyRequest(IModbusMessage request)
        {
            IModbusMessage response;

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

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

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

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

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

                case Modbus.Diagnostics:
                    response = request;
                    break;

                case Modbus.WriteSingleCoil:
                    response = WriteSingleCoil(
                        (WriteSingleCoilRequestResponse)request,
                        DataStore,
                        DataStore.CoilDiscretes);
                    WriteComplete?.Invoke(this, eventArgs);
                    break;

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

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

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

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

                default:
                    string msg = $"Unsupported function code {request.FunctionCode}.";
                    Debug.WriteLine(msg);
                    throw new InvalidModbusRequestException(Modbus.IllegalFunction);
                }
            }
            catch (InvalidModbusRequestException ex)
            {
                // Catches the exception for an illegal function or a custom exception from the ModbusSlaveRequestReceived event.
                response = new SlaveExceptionResponse(
                    request.SlaveAddress,
                    (byte)(Modbus.ExceptionOffset + request.FunctionCode),
                    ex.ExceptionCode);
            }

            return(response);
        }