internal SlaveException(SlaveExceptionResponse slaveExceptionResponse) { _slaveExceptionResponse = slaveExceptionResponse; }
internal SlaveException(string message, SlaveExceptionResponse slaveExceptionResponse) : base(message) { _slaveExceptionResponse = slaveExceptionResponse; }
public void SlaveExceptionResponsePDU() { SlaveExceptionResponse response = new SlaveExceptionResponse(11, Modbus.ReadCoils + Modbus.ExceptionOffset, 2); Assert.AreEqual(new byte[] { response.FunctionCode, response.SlaveExceptionCode }, response.ProtocolDataUnit); }
public void CreateModbusMessageSlaveExceptionResponseWithInvalidFunctionCode() { SlaveExceptionResponse response = ModbusMessageFactory.CreateModbusMessage <SlaveExceptionResponse>(new byte[] { 11, 128, 2 }); }
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); }
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; }
// 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); }