Exemplo n.º 1
0
        private void LastMessageDublicate_ThrowTimeout()
        {
            var        nmsProtocol = _stack.GetCodec <NmsCodec>().Protocol;
            var        options     = new NibusOptions();
            NmsMessage lastMessage;

            nmsProtocol.IncomingMessages.TryReceive(null, out lastMessage);
            var query = new NmsRead(Destanation, 2);

            nmsProtocol.OutgoingMessages.Post(query);
            var        wob = new WriteOnceBlock <NmsMessage>(m => m);
            NmsMessage response, response2;

            using (nmsProtocol.IncomingMessages.LinkTo(
                       wob, m => !ReferenceEquals(m, lastMessage) && m.IsResponse && m.ServiceType == query.ServiceType && m.Id == query.Id))
            {
                response = wob.Receive(options.Timeout);
            }
            nmsProtocol.IncomingMessages.TryReceive(null, out lastMessage);
            Assert.That(lastMessage, Is.EqualTo(response));
            var wob2 = new WriteOnceBlock <NmsMessage>(m => m);

            using (nmsProtocol.IncomingMessages.LinkTo(
                       wob2, m => !ReferenceEquals(m, lastMessage) && m.IsResponse && m.ServiceType == query.ServiceType && m.Id == query.Id))
            {
                response2 = wob2.Receive(options.Timeout);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Асинхронная проверка доступности устройства.
        /// </summary>
        /// <param name="target">Адрес устройства.</param>
        /// <param name="options">Параметры NiBUS-операции.</param>
        /// <returns>
        /// Возвращает время в миллисекундах, затрачиваемое на отправку запроса
        /// и получение соответствующего сообщения ответа.
        /// </returns>
        /// <value>
        ///   <c>-1</c> - устройство не ответило в течение заданного интервала времени <see cref="NibusOptions.Timeout"/>
        /// либо выполнение было прервано пользователем или статус ответа содержал ошибку.
        ///   </value>
        public async Task <long> PingAsync(Address target, NibusOptions options = null)
        {
            //Contract.Requires(!IsDisposed);
            //Contract.Requires(target != null);
            //Contract.Requires(target.Type == AddressType.Hardware || target.Type == AddressType.Net);
            var queryVersion = new NmsRead(target, (int)StdNms.SoftwareVersion);
            var sw           = new Stopwatch();

            try
            {
                sw.Start();
                await WaitForNmsResponseAsync(queryVersion, options).ConfigureAwait(false);

                sw.Stop();
            }
            catch (TimeoutException)
            {
                return(-1);
            }
            catch (TaskCanceledException)
            {
                return(-1);
            }
            catch (NibusResponseException)
            {
                return(-1);
            }

            return(sw.ElapsedMilliseconds);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Асинхронное чтение переменной.
        /// </summary>
        /// <param name="target">Адрес устройства, с которого необходимо получить значение переменной.</param>
        /// <param name="id">Идентификатор переменной.</param>
        /// <param name="options">Параметры NiBUS-операции.</param>
        /// <returns><see cref="Task{TResult}"/> представляющий асинхронную операцию чтения.</returns>
        /// <seealso cref="WaitForNmsResponseAsync{TMessage}"/>
        public async Task <object> ReadValueAsync(Address target, int id, NibusOptions options = null)
        {
            //Contract.Requires(!IsDisposed);
            //Contract.Requires(target != null);
            //Contract.Requires(target.Type == AddressType.Hardware || target.Type == AddressType.Net);
            var query    = new NmsRead(target, id);
            var response = await WaitForNmsResponseAsync(query, options);

            return(response.Value);
        }
Exemplo n.º 4
0
        public void RawRead()
        {
            var readVersion = new NmsRead(Destanation, 2);
            var nmsCodec    = _stack.GetCodec <NmsCodec>();

            nmsCodec.Encoder.Post(readVersion);
            var response = nmsCodec.Decoder.Receive(TimeSpan.FromSeconds(1));

            Assert.That(response.Id == 2);
            Assert.That(response.IsResponse);
            Assert.That(response.ServiceType == NmsServiceType.Read);
        }