USB-1208FSを制御する(C#)

ご家庭に眠っているIOボードUSB-1208FS(-Plus)を活用しましょう。
User's Guide
公式にMeasurement Computing(MCC)からドライバーやサンプルプログラムが配布されています。
CSharp Programs for USB-1208FS, 1408FS, 1608FS

ここでは、アナログ入力を記録するため、Visual C#のフォームアプリケーションでの利用を考えてみたいと思います。

利用前の準備

MccのIOボードの制御にはドライバーが必要です。InstaCalをインストールすると、同時にドライバーである「MccDaq.dll」もインストールされます。
C#でフォームアプリケーションを参考に、プロジェクトを作ります。
渥美剛史

ソリューションエクスプローラーから「参照」を選択し、右クリック→「参照の追加」をクリックします。
渥美剛史

InstaCalをインストールすると、「参照マネージャー」の「拡張」から「MccDaq」を選択することができます。
渥美剛史

OKすると、ソリューションエクスプローラーに「MccDaq」が追加されます。これでお使いのIOデバイスを利用する準備が整いました。
渥美剛史

コードの書き方

Windowsでのプログラミングには、MCC純正のUniversal Library(UL)が利用できます。
ULは、MCCのすべてのデータ収集ハードウエアに対応するI/Oライブラリおよびドライバのセットです。(NFテクノコマースの説明)
個々の関数の機能は、リファレンス(英語)を御覧ください。
Universal Library Help ("Universal Library Function Reference" → "UL for .NET")

さてVisual C#では、まずコードを表示して、先頭箇所で名前空間を記載することで、MccDaqが参照されULが使えます。
渥美剛史
基本的には、以下のようにパラメータを定義しておきます。
ここでは、MccDaq名前空間に含まれるMccBoardクラスのフィールドをdaqと宣言しています。

public const int NUMOFBLKS      = 50;
public const int CHANCOUNT      = 4;
public const int FIRSTCHANNEL   = 0;
public const int LASTCHANNEL    = 3;
public const int FREQ           = 1000;

public const string DEVICE = "USB-1208FS";
public static int PACKETSIZE;	// パケットサイズはUSB-1208FSは31で、-Plusは32

public static MccBoard daq;

IOボードの指定には、接続されているUSBなどのデバイス番号(0~)から、お使いのボード名が割り振られているものを指定します。PCに接続されているデバイスはキーボードだったりマウスだったりするかもしれません。
daq = new MccDaq.MccBoard(0);
とすると、0番のデバイスの情報がdaqに格納されます。
daqで取得したデバイスとボード名が一致しているかは、プロパティを確認します。
daq.BoardName.Contains("ボード名")を使うと、daqのデバイス名とボード名が一致しているかをTrueかFalseで返してくれます。
アナログ入力には、AIn()やAInScan()関数を使うことになるでしょう。
AInScan()では複数のチャンネルからの入力をまとめて記録できます。
記録には、チャンネルごとのサンプリングデータ数分のメモリーバッファを確保しておき、いっぱいになったところでバッファのデータを流す、という操作をします。
パケットサイズはUSB通信時の最小単位になりますので、最小限確保しなければならないメモリサイズは、
バッファサイズ = パケットサイズ × チャンネル数(× 任意のブロック数) となります。
実際にバッファを確保するときは以下のようにして、メモリのハンドルを取得して用います。
IntPtr buffer = MccService.WinBufAllocEx( BUFFERSIZE );
記録を開始するには、
IsError( daq.AInScan(   FIRSTCHANNEL, 
                                    LASTCHANNEL, 
                                    BUFFERSIZE, 
                                    ref Rate, 
                                    Range.Bip10Volts, 
                                    buffer,
                                    ScanOptions.Background | ScanOptions.Continuous | ScanOptions.BlockIo
                                ) );
なおこのページの例では、MccDaqがエラーを返した際の処理をIsError()という自作の関数で行っています。
データをバッファから読み込むには、ULのWinBufToArray()関数を用います。
ushort[] ushortArray = new ushort[BUFFERSIZE];
IsError(MccService.WinBufToArray(buffer, ushortArray, 0, BUFFERSIZE));

として、データを配列に格納します。メモリを解放するには、
MccService.WinBufFreeEx(buffer);
プロットや計算用にデータを変換するには、
float temp = 0;	// 一つひとつのデータの保持用
IsError(daq.ToEngUnits(Range.Bip10Volts, ushortArray[i], out temp));
とします。配列内の個々のデータは、バッファサイズ × ch数分多重ループさせることで出力していけばよいでしょう。
なかなか面倒ですね。




↑ PAGE TOP