Windows10 .net Core時代のGPIB制御　初級編

#はじめに
WindowsでのGPB制御は、National InstrumentsやキーサイトのUSB-GPIBコントローラを各社提供の.net framework用のDLL経由でプログラミングしてきましたが、近年.net Coreのほうが主流になってきています。web、帳票でのソフト開発では、.net Coreを使っても差し支えないし、またこの分野ではgoogle先生の検索で世の中には多数のサンプルコードが公開されています。その点、ハードウェアを制御するようなものでは、ハードウェア各社のサンプルプログラムをみても.net Coreに対応したものは見当たらない。しかもこの分野では、未だにVB6がサンプルプログラムというハードウェアメーカーも多々ある状況です。とはいっても、ハードウェア制御でプログラムを書く時だけ.net frameworkを使うというの釈然としない。
そこで、.net CoreでGPIBを制御できるのか、試しに実行してみたので、その結果を報告したいと思います。

#とりあえず試してみる。
OS:Windows10　Pro　20H2
開発:Visual studio2019
言語：C#

まずは、.net Core初心者は、過去の遺産から大きく変わると、変更点の多さに戸惑うので、まずは、慣れたFormアプリを作成しGPIBテストプログラムを作成してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/0e9d4eeb-32cb-3892-80dd-344943b59e63.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/32708164-c992-b981-fe05-4f7fa33a4ae4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/5274bc56-9385-562d-f9ee-c85052e327b9.png)

本当に、対象フレームワークが。NET Core 3.1になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/d2729fd7-f60c-1d60-692c-6e108491aa57.png)
ソリューションエクスプローラはちょっと様子が異なるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/8dd13abd-486e-6fb2-baae-3cb74a806107.png)

「参照」ではなく「依存関係」この文字で、やっぱり参照設定ないのかなーと思っていましたが、恐る恐る右クリックしてみるとCOM参照の追加という文字がありましたので実際に参照設定してみたいと思います。
GPIB制御は、過去は各社DLLのライブラリを使っていましたが、近年（とは言っても結構昔）は、VISAドライバ経由にすることで、プログラムは、コントローラのメーカーに依存せずにプログラムが書ける仕組みになっています。今回は、このVISAドライバのDLLを読みこみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/c819012d-e276-6dad-5a51-da15bf3671f3.png)

いまのGPIB制御は、各社のドライバではなく、IVI FoundationのCOMライブラリを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/ec9bb376-b3cb-09e9-02d8-3ee574e5e79a.png)

無事、依存関係にCOMが加わり、VisaComLibが登録されています。

コードは、Formにラベルとボタンを追加し、名前はデフォルトのままでにして、次のコードをForm1.csに書き込みます。


```csharp

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VisaComLib;

namespace netCoreGpibTestS
{
    public partial class Form1 : Form
    {
        VisaComLib.ResourceManager rm;
        VisaComLib.FormattedIO488 dmm;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            rm = new ResourceManager();
            dmm = new FormattedIO488();
            dmm.IO = (IMessage)rm.Open("GPIB0::7::INSTR");
            dmm.WriteString("*IDN?");
            string v = dmm.ReadString();
            label1.Text = v;
        }
    }
}

```

コードの記載が終わったら、さっそく実行してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/a6f279a6-2c0a-9c28-fb7c-308e2a031334.png)

無事「*IDN?」コマンドで測定機器名を取得できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/93e57f1c-c6c7-6823-09da-421bb5c87512.png)

簡単なプログラムですが、.net Core時代でも、GPIB制御できることがわかりました。今後は、.net Coreらしいコーディングで
GPIB機器を制御していきたいと思います。
プログラムを書いた後付けですが、マイクロソフトのホームページに.net Core とCOMの関係が記載されています。

#参考文献
.net Core とCOMの関係
https://docs.microsoft.com/ja-jp/dotnet/standard/native-interop/cominterop