0

私は現在、C#を介してSCPI互換デバイスと通信するためのさまざまな可能性を探しています。私は最初のコードをLabWindows/CVI(言語:C)でCOMインターフェイスを介して記述し、次のように「手動で」実行しました。

ComOpen(ComId, "Com1",....);
ComWrite("SYST:...\r");
ComRead(&value)`

このようなもの。問題は、純粋なCが好きではなく、通信したい実際のオブジェクトがあるため、OOPの欠如が愚かだったことです。National Instruments様、オブジェクトを制御するためにOOPを使用してみませんか?

デバイスのマニュアルよりも多くの情報があるので、誰かが私にヒントをくれました。グローバルなSCPIドキュメントを調べる必要があります。そして、.NET互換のコマンドセットを見つけました。例えば、

IIviDCPwr Ivi.DCPwr.Create(String resourceName,
                           Boolean idQuery,
                           Boolean reset,
                           LockType lockType,
                           String accessKey,
                           String options);

SCPIデバイスとのオブジェクト指向通信を構築します。私はC#が本当に好きなので、次の週にこれを試してみたいと思います。

しかし、resourceNameは後で対象のデバイスを解放するための名前であるように見え、接続がすでに設定されているときに他の設定が使用されたため、実際には接続設定を確認できません。IIviDCPwrのインスタンスは、どの接続(TCP / IP、COM、またはGPIB)を使用する必要があるかをどのように知ることができますか?

ソケットを使用したTCP/IPのソリューションしか見たことがありません。しかし、これはCOMとGPIBには当てはまらないと思いますか?

もう1つの解決策は、NationalInstrumentsVISAパッケージを使用することです。しかし、NIが提供する独自のパッケージを使用するというアイデアは好きではありません(CVIを使用した後、NIに対して新たに開発された反発を感じると思います)。

この問題を処理するためのコードスニペットまたはドキュメントを提供できますか?VISAを使って何か経験をしたことがありますか?COM / GPIB通信にソケットを使用できますか?

ところで:コードスニペットで新しい行を作成するにはどうすればよいですか?入力もShift+ Enter、\ r、\ n、\も私には機能しません...

4

1 に答える 1

0

.NET SerialPortおよびSocket (VISA を使用せずに) を使用して、読み取り/書き込みメソッドを使用してデバイスと通信できます。GPIB については、同様の方法で、ハードウェアに .NET ドライバーが必要です。

SerialPort を使用してデバイスと通信する方法の例 (疑似 SCPI を使用)

        SerialPort port = new SerialPort("COM1", 9600);
        port.Open();
        port.WriteLine(":DEVICE:OUT 1"); //turn on
        port.WriteLine(":DEVICE:MEAS:VOLT?"); //measure voltage
        float v = float.Parse(port.ReadLine()); //reading from device
        Console.WriteLine("The measured voltage is " + v );

これで、すべてのインスタンスが独自のプロトコル (SerialPort、Socket、GPIB) とメソッドを持つ、デバイスのクラスを作成できます。

public class SomeDevice
{
    private SerialPort _port;
    public SomeDevice(string  serialPortName)
    {
        // do the connection work...
    }
    public void SetVoltage(float voltage)
    {
        port.WriteLine(":VOLT " + voltage.ToSring("N2"));
    }
    public float GetVoltage()
    {
        port.WriteLine(":DEVICE:MEAS:VOLT?");
        return float.Parse(port.ReadLine()); //reading from device
    }

}

クラスを改善して、一般的な接続 (一般的な読み取り/書き込みメソッドを使用) のインターフェイス (たとえば GenConnection) を作成することにより、あらゆる種類の接続 (SerialPort、Socket、GPIB...) を使用できるようにすることもできます。次に、このインターフェイスを実装する接続タイプの子を作成します。各デバイスは、実際の接続の種類を「認識」せずに GenConnection インスタンスのみを持ちます (接続の種類ごとにコンストラクターをオーバーロードするだけです)。

注意すべきいくつかの点:

  • プログラミングマニュアルは、一般的なエラーを回避するのに役立ちます
  • 接続構成 (ボー、パリティ...)
  • 行末文字。デバイスの行末で読み値を送信して分離することに注意してください。通常は、<CR>または<CR><LF>(C# では "\r" または "\r\n")。

    SerialPort のReadLine&WriteLineは、指定された SerialPort のNewLineプロパティを使用してそれを行っています

  • TeraTermを使用してポートとソケットをいじって、すべてを期待どおりに表示することができます
于 2016-06-24T12:28:25.580 に答える