Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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;
        }