protected override void EncodeWrite(byte[] request, WriteOperation writeOperation)
        {
            //uid
            request[0] = Convert.ToByte(writeOperation.UnitId);

            //Body
            //function code
            request[m_dataBodyOffset] = writeOperation.FunctionCode;

            //address
            byte[] address_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address)));
            request[this.m_dataBodyOffset + 1] = address_byte[0];
            request[this.m_dataBodyOffset + 2] = address_byte[1];
            //value
            UInt16 value_int = writeOperation.IntValueToWrite;

            if (writeOperation.Address == '0' && value_int == 1)
            {
                request[this.m_dataBodyOffset + 3] = 0xFF;
                request[this.m_dataBodyOffset + 4] = 0x00;
            }
            else
            {
                byte[] val_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)value_int));
                request[this.m_dataBodyOffset + 3] = val_byte[0];
                request[this.m_dataBodyOffset + 4] = val_byte[1];
            }
            if (this.GetCRC(request, 6, out UInt16 crc))
            {
                byte[] crc_byte = BitConverter.GetBytes(crc);
                request[this.m_dataBodyOffset + 5] = crc_byte[0];
                request[this.m_dataBodyOffset + 6] = crc_byte[1];
            }
        }
        private async Task WriteCBAsync(WriteOperation operation)
        {
            byte[] writeRequest = new byte[this.RequestSize];

            this.EncodeWrite(writeRequest, operation);

            await this.SendRequestAsync(writeRequest).ConfigureAwait(false);
        }
        public async Task WriteCB(WriteOperation operation)
        {
            byte[] writeRequest  = new byte[m_bufSize];
            byte[] writeResponse = null;
            int    reqLen        = this.m_reqSize;

            this.EncodeWrite(writeRequest, operation);

            writeResponse = await this.SendRequest(writeRequest, reqLen);
        }
        protected override void EncodeWrite(byte[] request, WriteOperation writeOperation)
        {
            //MBAP
            //transaction id 2 bytes
            request[0] = 0;
            request[1] = 0;
            //protocol id 2 bytes
            request[2] = 0;
            request[3] = 0;
            //length
            const int requestLength = 6;

            byte[] requestLengthBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)requestLength));
            request[4] = requestLengthBytes[0];
            request[5] = requestLengthBytes[1];
            //uid
            request[6] = Convert.ToByte(writeOperation.UnitId);

            //Body
            //function code
            request[this.FunctionCodeOffset] = (byte)writeOperation.FunctionCode;

            //address
            byte[] addressBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address)));
            request[this.FunctionCodeOffset + 1] = addressBytes[0];
            request[this.FunctionCodeOffset + 2] = addressBytes[1];

            //value
            UInt16 valueToWrite = writeOperation.IntValueToWrite;

            if (writeOperation.Entity == '0' && valueToWrite == 1)
            {
                request[this.FunctionCodeOffset + 3] = 0xFF;
                request[this.FunctionCodeOffset + 4] = 0x00;
            }
            else
            {
                byte[] valueBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)valueToWrite));
                request[this.FunctionCodeOffset + 3] = valueBytes[0];
                request[this.FunctionCodeOffset + 4] = valueBytes[1];
            }
        }
Exemplo n.º 5
0
        protected override void EncodeWrite(byte[] request, WriteOperation writeOperation)
        {
            //MBAP
            //transaction id 2 bytes
            request[0] = 0;
            request[1] = 0;
            //protocol id 2 bytes
            request[2] = 0;
            request[3] = 0;
            //length
            byte[] len_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)6));
            request[4] = len_byte[0];
            request[5] = len_byte[1];
            //uid
            request[6] = Convert.ToByte(writeOperation.UnitId);

            //Body
            //function code
            request[m_dataBodyOffset] = writeOperation.FunctionCode;

            //address
            byte[] address_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)(writeOperation.Address)));
            request[this.m_dataBodyOffset + 1] = address_byte[0];
            request[this.m_dataBodyOffset + 2] = address_byte[1];
            //value
            UInt16 value_int = writeOperation.IntValueToWrite;

            if (writeOperation.Entity == '0' && value_int == 1)
            {
                request[this.m_dataBodyOffset + 3] = 0xFF;
                request[this.m_dataBodyOffset + 4] = 0x00;
            }
            else
            {
                byte[] val_byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)value_int));
                request[this.m_dataBodyOffset + 3] = val_byte[0];
                request[this.m_dataBodyOffset + 4] = val_byte[1];
            }
        }
        public async Task WriteMessage(WriteOperation operation)
        {
            if (operation.ValueType != ModbusValueType.Basic)
            {
                //Handling complex value
                //Obtain value split into several int values
                var valuesToBeWritten = ModbusComplexValuesHandler.SplitComplexValue(operation.Value, operation.ValueType);

                //We need to write each part of complex value to separate registry
                foreach (var v in valuesToBeWritten)
                {
                    operation.IntValueToWrite = Convert.ToUInt16(operation.Value);
                    await WriteCB(operation);

                    operation.StartAddress = (Convert.ToInt32(operation.StartAddress) + 1).ToString();
                }
            }
            else
            {
                operation.IntValueToWrite = Convert.ToUInt16(operation.Value);
                await WriteCB(operation);
            }
        }
 protected abstract void EncodeWrite(byte[] writeRequest, WriteOperation readOperation);