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); } }
/// <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); }
/// <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); }
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); }