コード例 #1
0
 internal SlaveException(SlaveExceptionResponse slaveExceptionResponse)
 {
     _slaveExceptionResponse = slaveExceptionResponse;
 }
コード例 #2
0
 internal SlaveException(string message, SlaveExceptionResponse slaveExceptionResponse)
     : base(message)
 {
     _slaveExceptionResponse = slaveExceptionResponse;
 }
コード例 #3
0
        public void SlaveExceptionResponsePDU()
        {
            SlaveExceptionResponse response = new SlaveExceptionResponse(11, Modbus.ReadCoils + Modbus.ExceptionOffset, 2);

            Assert.AreEqual(new byte[] { response.FunctionCode, response.SlaveExceptionCode }, response.ProtocolDataUnit);
        }
コード例 #4
0
 public void CreateModbusMessageSlaveExceptionResponseWithInvalidFunctionCode()
 {
     SlaveExceptionResponse response = ModbusMessageFactory.CreateModbusMessage <SlaveExceptionResponse>(new byte[] { 11, 128, 2 });
 }
コード例 #5
0
        internal IModbusMessage ApplyRequest(IModbusMessage request)
        {
            IModbusMessage response;

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

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

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

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

                case Modbus.ReportSlaveId:
                    ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest)request;
                    WriteMultipleRegisters(readWriteRequest.WriteRequest, DataStore, DataStore.HoldingRegisters);
                    WriteComplete.Raise(this, eventArgs);
                    response = ReadRegisters(readWriteRequest.ReadRequest, 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);
        }
コード例 #6
0
        internal IModbusMessage ApplyRequest(IModbusMessage request)
        {
            IModbusMessage response;
            try
            {
                Debug.WriteLine(request.ToString());
                var eventArgs = new ModbusSlaveRequestEventArgs(request);
                ModbusSlaveRequestReceived.Raise(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.Raise(this, eventArgs);
                        break;
                    case Modbus.WriteSingleRegister:
                        response = WriteSingleRegister((WriteSingleRegisterRequestResponse)request, DataStore,
                            DataStore.HoldingRegisters);
                        WriteComplete.Raise(this, eventArgs);
                        break;
                    case Modbus.WriteMultipleCoils:
                        response = WriteMultipleCoils((WriteMultipleCoilsRequest)request, DataStore,
                            DataStore.CoilDiscretes);
                        WriteComplete.Raise(this, eventArgs);
                        break;
                    case Modbus.WriteMultipleRegisters:
                        response = WriteMultipleRegisters((WriteMultipleRegistersRequest)request, DataStore,
                            DataStore.HoldingRegisters);
                        WriteComplete.Raise(this, eventArgs);
                        break;
                    case Modbus.ReadWriteMultipleRegisters:
                        ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest)request;
                        WriteMultipleRegisters(readWriteRequest.WriteRequest, DataStore, DataStore.HoldingRegisters);
                        WriteComplete.Raise(this, eventArgs);
                        response = ReadRegisters(readWriteRequest.ReadRequest, 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;
        }
コード例 #7
0
        // TODO catch socket exception
        // TODO implement asynch calls
        internal virtual T UnicastMessage <T>(IModbusMessage message) where T : IModbusMessage, new()
        {
            IModbusMessage response = null;
            int            attempt  = 1;
            bool           readAgain;
            bool           success = false;

            do
            {
                try
                {
                    Write(message);

                    do
                    {
                        readAgain = false;
                        response  = ReadResponse <T>();

                        SlaveExceptionResponse exceptionResponse = response as SlaveExceptionResponse;
                        if (exceptionResponse != null)
                        {
                            if (exceptionResponse.SlaveExceptionCode == Modbus.Acknowlege)
                            {
                                readAgain = true;
                            }
                            else
                            {
                                throw new SlaveException(exceptionResponse);
                            }
                        }
                    } while (readAgain);

                    ValidateResponse(message, response);
                    success = true;
                }
                catch (NotImplementedException nie)
                {
                    _log.ErrorFormat("Not Implemented Exception, {0} retries remaining - {1}", _retries + 1 - attempt, nie.Message);

                    if (attempt++ > _retries)
                    {
                        throw;
                    }
                }
                catch (TimeoutException te)
                {
                    _log.ErrorFormat("Timeout, {0} retries remaining - {1}", _retries + 1 - attempt, te.Message);

                    if (attempt++ > _retries)
                    {
                        throw;
                    }
                }
                catch (IOException ioe)
                {
                    _log.ErrorFormat("IO Exception, {0} retries remaining - {1}", _retries + 1 - attempt, ioe.Message);

                    if (attempt++ > _retries)
                    {
                        throw;
                    }
                }
                catch (SlaveException se)
                {
                    _log.ErrorFormat("Slave Exception, {0} retries remaining - {1}", _retries + 1 - attempt, se.Message);

                    if (attempt++ > _retries)
                    {
                        throw;
                    }
                }
            } while (!success);

            return((T)response);
        }