IVI VISA (z. B. NI VISA) stellt TCP Keep Alive nicht für alle Verbindungen korrekt einC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 IVI VISA (z. B. NI VISA) stellt TCP Keep Alive nicht für alle Verbindungen korrekt ein

Post by Anonymous »

Der folgende C#-Code öffnet eine VISA-Sitzung mit einem Messgerät:

Code: Select all

// 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();
Mit Wireshark kann ich Folgendes sehen:
  • Code: Select all

    GlobalResourceManager.Open
    öffnet zwei TCP-Verbindungen (1: Port 61741 bis Port 4880, 2: Port 61742 bis 4880)
  • Code: Select all

    ((INativeVisaSession)vi).SetAttributeBoolean(NativeVisaAttribute.TcpKeepAlive, true)
    legt den Keep-Alive-Verkehr nur für die erste TCP-Verbindung fest und nicht für die zweite. Der zweite scheint für die Ereignisbehandlung verwendet zu werden.
Das ist ein Problem, wenn ich eine Firewall dazwischen habe, die inaktive Verbindungen nach einer Weile (z. B.: 3 Stunden) trennt.
Danach schlägt die IDN-Abfrage mit SRQ fehl. Die IDN-Abfrage funktioniert immer noch.
Ich habe die folgenden Fragen:
  • Gibt es eine Möglichkeit, das Keep-Alive für beide TCP-Sitzungen festzulegen?
  • Oder gibt es eine Möglichkeit, die zugrunde liegenden Socket-Verbindungen abzurufen?
  • Das standardmäßige Keep-Alive-Intervall scheint 2 Stunden zu betragen. Kann man das ändern? Dies wäre möglich, wenn ich auf die Socket-Verbindung zugreifen könnte, siehe Inkonsistente TCP-Keep-Alive-Frequenz.
Ich verwende NI VISA 19.0, .NET Framework 4.6.2 und Windows 10.
In diesem Beispiel verwende ich das HiSLIP-Protokoll, aber ich habe ein ähnliches Verhalten mit dem VXI-11-Protokoll.
Ich habe es auch getestet mit Rohde & Schwarz VISA 5.12.8 (ähnliches Verhalten).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post