C#でデジタルマルチメータの自動校正ソフトを開発【ソースコードあげる】

2020年3月28日

2020年最初の投稿です。本年もよろしくお願いします。

本ブログでは品質保証、計測管理、自動計測、プログラミング、それ関係のIT情報などを扱っていますが、品保とプログラミングのアクセスが多いかなと感じています。

プログラミングのアクセスが伸びるのは良いのですが、もうちょっと自動計測や計測管理などこのブログの特色が出したいと思っていまして、今回は自動計測のプログラムについて書きたいと思います。

計測器を使っている人たちのほとんどは測定や校正を手動で行っていると思います。プログラミングで自動化すると楽な上に正確でばらつきのデータもとれるようになります。この機能はほとんどの計測器に搭載されています。

私はもっと自動計測が広まってもいいと思っています。残念ながら自動計測が広がらない理由はプログラミングの難しさやめんどくささが原因です。製造現場の人は忙しいですからね。

せっかく計測器に自動化の機能がついているのに使わないのはもったいないです。それなら、みんながほしそうなプログラムを私が作ってこのブログで配ったら、使ってもらえるかも?と思いました。

というわけで、今回は自動校正プログラムを作りましたので使えそうな人はトライしてみてください。

自動校正プログラムのダウンロード

C#のslnファイルと関係するファイルをZIPにしました。下のリンクからZIPファイルをダウンロードしてください。解凍後slnファイルを実行するとVisual Studioで自動校正プログラムのコードが開きます。

自動校正実行の環境

プログラミング言語

このプログラムはC#で書かれています。C#を実行するにはMicroSoftのVisual StudioをWindows PCにインストールする必要があります。Visual Studioのインストールは登録が必要ですが、無料です。インストール手順は以前に投稿しましたのでそちらを参考にしてください。

上のインストール手順はちょっと古くなってしまいました。2020年最新のVisual Studioは2019です。個人の方とPC250台保有以下の組織はVisual Studio Communityが無料で利用できます。機能制限ありますが、配布のプログラムはCommunityで動きます。インストール時は.NETデスクトップ開発を選択してください。

配布のプログラムはPCと計測器との通信方式はGPIBを使っています。GPIBは計測器では一番メジャーなインターフェースです。GPIB通信を使うにはGPIBアダプタが必要ですが、配布プログラムはNI社のGPIB-USB-HSの使用を想定して書いています。GPIB-USBーHSは5万円前後とちょっとお高いですが、もしかすると校内、社内に転がっているかもしれませんから、探してみてください。

プログラムの実行前にGPIB-USB-HSのドライバをインストールする必要があります。インストールのしかたは以前に投稿しましたので参考にしてください。

計測器

自動校正に使用する機器は計測器の方がAgilentの34401A、キャリブレータ(標準器)がFLUKEの5700Aを想定しています。多分34401AではなくAgilentやKeysightのその他のマルチメータを使っても動きます。同様に標準器は5700Aでなくても5720Aや5730Aでも動くと思います。

計測器とキャリブレータはワンペアのバナナ端子ケーブルで接続します。下の写真のようなケーブルが黒赤1組必要です。計測器のINPUT、キャリブレータのOUTPUTをつなぎます。

計測器とキャリブレータの制御用にGPBIケーブルが必要です。GPBIケーブルはスタッキングできるので初めにキャリブレータの背面と計測器の背面のコネクタにGPIBケーブルをつなげて、そのケーブルにGPIB-USB-HSをつなげます。

計測器のGPIBアドレスはソースファイルの中でキャリブレータのアドレスを10、計測器のアドレスを20に直書きしてあります 。機器の設定を合わせるか、ソースファイルの中のアドレスを変えてください。

自動校正の実行

接続ができたら、PCのVisual Studioを起動してソースファイルを読み込みます。多分そのまま開始ボタン(▶開始)を押すと実行形式に変換してプログラムが立ち上がるはずです。

配布したプログラムに余計なものはつけていません。Startボタンを押すと自動校正を開始します。校正終了後に停止します。途中停止するボタンはつけてませんので必要な人は改変してください。

実行の結果は計測器の出力をそのままテキストボックスに吐き出すようにしてありますので、コピーしてExcelなどにペーストして使ってください。

毎年校正試験をやっていくと機器の微妙な変化が分かります。ただこのプログラムではキャリブレターが変化しているのか計測器が変化しているのかは分かりませんけどね。どちらかを定期校正をしていれば、Excelで足し引きして変化が分かると思います。

まとめ

この記事では私が作った自動校正プログラムを紹介しました。

計測器の校正をしている方のほとんどは手動で操作をしていると思います。校正試験はたくさんの測定を行う必要があり、時間のかかる作業です。この作業が自動でできるとするなら作業員数人くらいの削減はすぐにできるはずです。

とりあえずFLUKEの5700AとAgilentの34401Aの組み合わせで校正をするプログラムを作りましたが、標準器ー計測器の組み合わせであれば何でも可能です。配布しているサンプルは自由に改変していただいていいので、ほかの組み合わせも作ってみてください。

またこんな組み合わせのプログラムを作ってほしいという要望がありましたら書き込みをいただければ作ってみます。多分マニュアルがあれば何とかなると思います。

ソースコード

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 Ivi.Visa;
using NationalInstruments.Visa;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] calPoint = new string[] {
                "1 V",
                "2 V",
                "3 V",
                "4 V",
                "5 V",
                "6 V",
                "7 V",
                "8 V",
                "9 V",
                "10 V"
            };

            MessageBasedSession mbsessionA, mbsessionB;
            mbsessionA = (MessageBasedSession)(new ResourceManager()).Open("GPIB::10::INSTR");
            mbsessionB = (MessageBasedSession)(new ResourceManager()).Open("GPIB::20::INSTR");

            mbsessionA.RawIO.Write("OPER");

            for (int i = 0; i < calPoint.Length; i++)
            {
                mbsessionA.RawIO.Write("OUT " + calPoint[i]);

                System.Threading.Thread.Sleep(10000);

                mbsessionB.RawIO.Write(":MEAS?");
                richTextBox1.Text += mbsessionB.RawIO.ReadString();
                richTextBox1.Update();

                System.Threading.Thread.Sleep(1000);

            }
            mbsessionA.RawIO.Write("STBY");

            mbsessionA.Dispose();
            mbsessionB.Dispose();

        }
    }
}