IVI VISA (например: NI VISA) неправильно устанавливает TCP Keep Alive для всех соединений.C#

Место общения программистов C#
Ответить
Anonymous
 IVI VISA (например: NI VISA) неправильно устанавливает TCP Keep Alive для всех соединений.

Сообщение Anonymous »

Следующий код C# открывает сеанс VISA для измерительного прибора:

Код: Выделить всё

// Connect
var vi = GlobalResourceManager.Open("TCPIP::10.0.0.2::hislip0::INSTR") as IMessageBasedSession;
// Set TCP Keep Alive
if (vi.ResourceName.StartsWith("TCPIP"))
{
((INativeVisaSession)vi).SetAttributeBoolean(NativeVisaAttribute.TcpKeepAlive, true);
}
// IDN query
vi.RawIO.Write("*IDN?");
Console.WriteLine(vi.RawIO.ReadString());
// IDN query using SRQ
vi.EnableEvent(EventType.ServiceRequest);
vi.DiscardEvents(EventType.ServiceRequest);
vi.RawIO.Write("*CLS;*ESE 1;*SRE 32");
vi.RawIO.Write("*IDN?;*OPC");
vi.WaitOnEvent(EventType.ServiceRequest, 1000);
vi.ReadStatusByte();
vi.DisableEvent(EventType.ServiceRequest);
Console.WriteLine(vi.RawIO.ReadString());
// Sleep to monitor keep alive traffic using Wireshark
Thread.Sleep(5 * 60 * 60 * 1000);
// IDN query
vi.RawIO.Write("*IDN?");
Console.WriteLine(vi.RawIO.ReadString());
// IDN query using SRQ
vi.EnableEvent(EventType.ServiceRequest);
vi.DiscardEvents(EventType.ServiceRequest);
vi.RawIO.Write("*CLS;*ESE 1;*SRE 32");
vi.RawIO.Write("*IDN?;*OPC");
vi.WaitOnEvent(EventType.ServiceRequest, 1000);
vi.ReadStatusByte();
vi.DisableEvent(EventType.ServiceRequest);
Console.WriteLine(vi.RawIO.ReadString());
// Disconnect
vi.Dispose();
Используя Wireshark, я вижу это:
  • Код: Выделить всё

    GlobalResourceManager.Open
    открывает два TCP-соединения (1: порт 61741 с портом 4880, 2: порт 61742 с 4880)
  • Код: Выделить всё

    ((INativeVisaSession)vi).SetAttributeBoolean(NativeVisaAttribute.TcpKeepAlive, true)
    устанавливает поддерживающий трафик только для первого TCP-соединения, а не для второго. Второй, похоже, используется для обработки событий.
Это проблема, когда у меня есть брандмауэр, между которым через некоторое время (например, 3 часа) сбрасываются неактивные соединения.
После этого запрос IDN с использованием SRQ завершается с ошибкой. Запрос IDN все еще работает.
У меня есть следующие вопросы:
  • Есть ли способ установить сохранение активности для обоих сеансов TCP?
  • Или есть способ получить базовые соединения Socket?
  • Интервал поддержания активности по умолчанию составляет 2 часа. Можно ли это изменить? Это было бы возможно, если бы я мог получить доступ к соединению Socket, см. Непостоянная частота поддержания активности TCP.
Я использую NI VISA 19.0, .NET Framework 4.6.2 и Windows 10.
В этом примере я использую протокол HiSLIP, но у меня аналогичное поведение при использовании протокола VXI-11.
Я также тестировал это с Rohde & Schwarz VISA 5.12.8 (поведение аналогичное).

Подробнее здесь: https://stackoverflow.com/questions/797 ... or-all-con
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»