예제 #1
0
        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);
        }
예제 #2
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);
        }
예제 #3
0
        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;
        }
예제 #6
0
        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;
        }
예제 #7
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;
        }