コード例 #1
0
        protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List <object> output)
        {
            //Transaction Identifier + Protocol Identifier + Length + Unit Identifier + Function Code
            if (input.Capacity < 2 + 2 + 2 + 1 + 1)
            {
                return;
            }

            ModbusHeader   header       = new ModbusHeader(input);
            short          functionCode = input.ReadByte();
            ModbusFunction function     = null;

            if (Enum.IsDefined(typeof(ModbusCommand), functionCode))
            {
                var command = Enum.GetName(typeof(ModbusCommand), functionCode);

                function = (ModbusFunction)Activator.CreateInstance(Type.GetType(string.Format(typeName, isServerMode ? "Request" : "Response", command)));
            }


            if (functionCode >= maxFunctionCode)
            {
                function = new ExceptionFunction(functionCode);
            }
            else if (function == null)
            {
                function = new ExceptionFunction(functionCode, 0x01);
            }

            function.Decode(input);
            ModbusFrame frame = new ModbusFrame(header, function);

            output.Add(frame);
        }
コード例 #2
0
ファイル: SerialDriver.cs プロジェクト: flowchip/bluetoothBLE
        /// <summary>
        /// This Task handles all the types of Modbus Functions
        /// </summary>
        /// <returns>The operation.</returns>
        /// <param name="functionType">Function type.</param>
        /// <param name="slaveAddress">Slave address.</param>
        /// <param name="nrRegisters">Nr registers.</param>
        /// <param name="selectedRegisterAddress">Selected register address.</param>
        /// <param name="dataToWrite">Data to write.</param>
        public async Task <ReceivedData> ModbusOperation(ModbusFunctionType functionType, byte slaveAddress, byte[] nrRegisters, byte[] selectedRegisterAddress, byte[] dataToWrite)
        {
            frameToSend = new ModbusFrame();

            if (functionType == ModbusFunctionType.WriteCoil || functionType == ModbusFunctionType.WriteHoldingRegister)
            {
                frameToSend = new ModbusFrame(slaveAddress, functionType, selectedRegisterAddress, null, dataToWrite);
            }
            else
            {
                frameToSend = new ModbusFrame(slaveAddress, functionType, selectedRegisterAddress, nrRegisters, null);
            }


            //We send the message to the Slave Device
            TransmissionState b = await SendMessage(frameToSend.BytePacketToSend);

            sizeOfMessage = CalculateExpectedSize();



            ReceivedData responseData = new ReceivedData();

            //If the message was transmitted right, then proceed with the listening
            //of the response
            if (b == TransmissionState.OK)
            {
                System.Diagnostics.Debug.WriteLine("MessageSended: " + b.ToString());

                //TO-DO Implement the retry mechanism
                //int retries = 3;
                //responseData = await ListenMessages();

                responseData = await ListenMessages();
            }
            else
            {
                responseData.state = TransmissionState.ErrorSendMessage;
            }

            if (responseData.state == TransmissionState.OK)
            {
                frameReceived = new ModbusFrame(responseData.data);
            }
            else
            {
                frameReceived = new ModbusFrame();
            }

            return(responseData);
        }
コード例 #3
0
        public ushort CallModbusFunction(ModbusFunction function)
        {
            if (ConnectionState.Connected != connectionState || Channel == null)
            {
                throw new Exception("Not connected!");
            }

            SetTransactionIdentifier();

            ModbusHeader header = new ModbusHeader(transactionIdentifier, UnitIdentifier);
            ModbusFrame  frame  = new ModbusFrame(header, function);

            Channel.WriteAndFlushAsync(frame);

            return(transactionIdentifier);
        }