private void Modbus_Request_Event(object sender, Modbus.Device.ModbusSlaveRequestEventArgs e) { //request from master//disassemble packet from master byte fc = e.Message.FunctionCode; byte[] data = e.Message.MessageFrame; byte[] byteStartAddress = new byte[] { data[3], data[2] }; byte[] byteNum = new byte[] { data[5], data[4] }; Int16 StartAddress = BitConverter.ToInt16(byteStartAddress, 0); Int16 NumOfPoint = BitConverter.ToInt16(byteNum, 0); //Console.WriteLine(fc.ToString() + "," + StartAddress.ToString() + "," + NumOfPoint.ToString()); }
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); }
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; }