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)
        {
            Debug.WriteLine(request.ToString());
            ModbusSlaveRequestReceived.Raise(this, new ModbusSlaveRequestEventArgs(request));

            IModbusMessage response;

            try
            {
                Debug.WriteLine(request.ToString());
                ModbusSlaveRequestReceived.Raise(this, new ModbusSlaveRequestEventArgs(request));

                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);
                    Debug.WriteLine(errorMessage);
                    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);
        }