private void RequestToDB(IModbusMessage message) { WriteMultipleRegistersRequest typedResponse = (WriteMultipleRegistersRequest)message; ModbusMessageLog logitem = new ModbusMessageLog() { LogTime = DateTime.Now, LogMessage = message.ToString(), FunctionCode = message.FunctionCode.ToString(), MessageFrame = message.MessageFrame, ProtocolDataUnit = message.ProtocolDataUnit, SlaveAddress = message.SlaveAddress.ToString(), TransactionId = message.TransactionId.ToString() }; int iStartIndex = typedResponse.MinimumFrameSize; int iLen = message.MessageFrame.Length - iStartIndex; byte[] bdata = new byte[iLen]; Array.Copy(message.MessageFrame, iStartIndex, bdata, 0, iLen); string strFrame = System.Text.Encoding.UTF8.GetString(bdata).TrimEnd('\0'); string strUnit = Modbus.ConvertTools.BytesToHexString(message.ProtocolDataUnit); DataLogHelper.AddModbusMessageLog(logitem); //将数据传入后台处理 string strToText = logitem.ToJsonString(); SendToSocketServer(strToText); }
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); }
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); }
// TODO unit test internal IModbusMessage ApplyRequest(IModbusMessage request) { IModbusMessage response; _log.Info(request.ToString()); switch (request.FunctionCode) { case Modbus.ReadCoils: response = ReadDiscretes((ReadCoilsInputsRequest) request, DataStore.CoilDiscretes); break; case Modbus.ReadInputs: response = ReadDiscretes((ReadCoilsInputsRequest) request, DataStore.InputDiscretes); break; case Modbus.ReadHoldingRegisters: response = ReadRegisters((ReadHoldingInputRegistersRequest) request, DataStore.HoldingRegisters); break; case Modbus.ReadInputRegisters: response = ReadRegisters((ReadHoldingInputRegistersRequest) request, DataStore.InputRegisters); break; case Modbus.WriteSingleCoil: response = WriteSingleCoil((WriteSingleCoilRequestResponse) request, DataStore.CoilDiscretes); break; case Modbus.WriteSingleRegister: response = WriteSingleRegister((WriteSingleRegisterRequestResponse) request, DataStore.HoldingRegisters); break; case Modbus.Diagnostics: response = request; break; case Modbus.WriteMultipleCoils: response = WriteMultipleCoils((WriteMultipleCoilsRequest) request, DataStore.CoilDiscretes); break; case Modbus.WriteMultipleRegisters: response = WriteMultipleRegisters((WriteMultipleRegistersRequest) request, DataStore.HoldingRegisters); break; case Modbus.ReadWriteMultipleRegisters: ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest) request; WriteMultipleRegisters(readWriteRequest.WriteRequest, DataStore.HoldingRegisters); response = ReadRegisters(readWriteRequest.ReadRequest, DataStore.HoldingRegisters); break; default: string errorMessage = String.Format("Unsupported function code {0}", request.FunctionCode); _log.Error(errorMessage); throw new ArgumentException(errorMessage, "request"); } return response; }
internal IModbusMessage ApplyRequest(IModbusMessage request) { _logger.Info(request.ToString()); EventHandler<ModbusSlaveRequestEventArgs> handler = ModbusSlaveRequestReceived; if (handler != null) handler(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); _logger.Error(errorMessage); throw new ArgumentException(errorMessage, "request"); } return response; }
internal IModbusMessage ApplyRequest(IModbusMessage request) { _logger.Info(request.ToString()); ModbusSlaveRequestReceived.Raise(this, new ModbusSlaveRequestEventArgs(request)); IModbusMessage response; /* * ANGELOXX: if datastore is null, this Slave returns an error to the Master * I use the datastore = null asignment to emulate a missing device. Returned * error is 0x02 -> Illegal Data Address */ if (DataStore == null) { byte[] messageFrame = new byte[] { request.SlaveAddress, (byte)(Modbus.ExceptionOffset + request.FunctionCode), 2 }; return ModbusMessageFactory.CreateModbusMessage<SlaveExceptionResponse>(messageFrame); } 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); _logger.Error(errorMessage); throw new ArgumentException(errorMessage, "request"); } 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; }