Visual C#でUSB対応I/Oボードを制御

2010年10月26日

今回、タートル工業社のUSB対応I/O ボードTUSB-KINS4/4をVisualStudio2008のC#で、動作させるプログラムを作成しました。プロジェクトContorolIOに、TUSB-KINS4/4用関数をまとめたIODeviceクラスを作成し、追加します。

最初に、TUSB-KINS4/4のDLL呼び出しを宣言します。
以下のように、インポートDLLファイルを記述し、関数の定義をします。

[DllImport("TUSBKINS.DLL")]
public static extern short TUSBKINS_Read(short Id, ref int InData, ref int OutStatus);

注意点は各関数毎に、[DllImport("TUSBKINS.DLL")]の宣言が必要です。また、ドットネット開発環境はポインタの扱いを推奨していませんが、refキーワードで、ポインタ参照が可能です。refによるポインタ参照で、関数からの戻りデータをInData, OutStatusで取得できます。

作成する関数は以下です。

public static bool OpenIODevice()
IOデバイスDLLを初期化し、IODeviceIdで指定したIOデバイスが使用できるかどうかチェックします。エラーであればfalseが返ります。
注意点として、TUSBKINS_Load()の後に、1秒程度の待機時間が必要です。
待機時間がないと、次のTUSBKINS_Chk()でエラーになる場合があります。
最新DLLでは、確認していませんが、過去DLLでは、1秒程度の待機時間を入れないと確実にエラーとなっていました。

public static void CloseIODevice()
IOデバイスDLLの終了処理をします。

public static string GetErrorIODevice(short rcode)
DLLの関数から返ってくる戻り値を文字列のエラーメッセージに変換します。

public static bool GetTypeIODevice()
現在の使用IOデバイスのIDからIOデバイスのタイプを返します。
結果はIODeviceTypeに返されます。

public static bool ReadIODevice()
現在のI/Oデータを読み込みます。
入力ポート、出力ポートを読み込み、データをビットに変換しIOReadData[]、IOWriteData[]に読み込みます。

public static bool WriteIODevice()
出力ポートに書き込みます。
ビットデータIOWriteData[]をバイトデータに変換して、出力ポートに書き込みます。

以下がソースリストです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ContorolIO
{
    class IODevice
    {   

        [DllImport("TUSBKINS.DLL")]
        public static extern void TUSBKINS_Load();

        [DllImport("TUSBKINS.DLL")]
        public static extern  void TUSBKINS_Unload();

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_Chk(short Id);

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_Write(short Id, int Data);

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_Read(short Id, ref int InData, ref int OutStatus);

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_EdgeSet(short Id, int Data);

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_EdgeRead(short Id, ref int Data);

        [DllImport("TUSBKINS.DLL")]
        public static extern short TUSBKINS_Type(short Id, ref byte devType);

        public static short IODeviceId;
        public static int   IODevicePWidth;
        public static int   IODeviceReadWait;
        public static string IODeviceErrorMessage;
        public static string IODeviceType;

        public static int[] IOReadData = new int[8];
        public static int[] IOWriteData = new int[8];

        public static bool OpenIODevice()
        {
            short ret;

            TUSBKINS_Load();

            //MainConfig.WaitMsec(1000);
            //1sec程度のウエイトを入れる

            ret = TUSBKINS_Chk(IODeviceId);
            if(ret == 0){
                return true;
            }
            else
            {
                IODeviceErrorMessage = GetErrorIODevice(ret);
                return false;
            }
        }

        public static void CloseIODevice()
        {
            TUSBKINS_Unload();

        }

        public static string GetErrorIODevice(short rcode)
        {
            string str;

            str = "";

            switch( rcode )
                {
                    case 0:
                            str = "正常に終了しました";
                        break;
                    case 2:
                            str = "ドライバが初期化されていません";
                        break;
                    case 6:
                            str = "デバイスが見つかりませんでした";
                        break;
                    case 8:
                            str = "パラメータエラー";
                        break;
                    case 9:
                            str = "USB通信エラー";
                        break;
                    default:
                            str = "不明なエラーです";
                        break;
                }

            return str;
        }

        public static bool GetTypeIODevice()
        {
            bool    bret;
            short   sret;
            byte    devType;

            bret = false;
            IODeviceErrorMessage = "";
            IODeviceType = "";
            devType = 0;
            sret = TUSBKINS_Type(IODeviceId, ref devType);
            if(sret == 0)
            {
                bret = true;

                switch(devType)
                {
                        case 0://TUSB-KINS4/4
                                IODeviceType = "TUSB-INS4/4";
                                break;
                        case 1://TUSB-KINS08O
                                IODeviceType = "TUSB-KINS08O";
                                break;
                        case 2://TUSB-KINS08I
                                IODeviceType = "TUSB-KINS08I";
                                break;
                        case 3://TUSB-KINS8/8
                                IODeviceType = "TUSB-KINS8/8";
                                break;
                        case 4://TUSB-KINS16O
                                IODeviceType = "TUSB-KINS16O";
                                break;
                        case 5://TUSB-KINS16I
                                IODeviceType = "TUSB-KINS16I";
                                break;
                        default:
                                IODeviceType = "ERROR";
                                break;
                    }
            }
            else
            {
                IODeviceErrorMessage = GetErrorIODevice(sret);
            }

            return bret;
        }

        public static bool ReadIODevice()
        {
            bool    bret;
            short   sret;
            int indata, outdata;
            int i, ia;

            bret = false;

            indata = 0;
            outdata = 0;

            sret = TUSBKINS_Read(IODeviceId, ref indata, ref outdata);
            if(sret == 0)
            {
                for (i = 0; i < 8; i++)
                {
                     ia = indata & 0x00000001;
                     if (ia == 0)
                     {
                         IOReadData[i] = 0;
                     }
                     else
                     {
                         IOReadData[i] = 1;
                     }
                     indata = indata >> 1;
                }

                for (i = 0; i < 8; i++)
                 {
                     ia = outdata & 0x00000001;
                     if (ia == 0)
                     {
                         IOWriteData[i] = 0;
                     }
                     else
                     {
                         IOWriteData[i] = 1;
                     }
                     outdata = outdata >> 1;
                }

                bret = true;
            }
            else
            {
                IODeviceErrorMessage = GetErrorIODevice(sret);
            }

            return bret;
        }

        public static bool WriteIODevice()
        {
            bool    bret;
            short   sret;
            int     i, outdata, mask;

            bret = false;
            mask = 0x00000001;

            outdata = 0;

            for (i = 0; i < 8; i++)
            {
                if(IOWriteData[i] != 0)
                {
                    outdata = outdata | mask;
                }
                mask = mask << 1;
            }

            sret = TUSBKINS_Write(IODeviceId, outdata);
                if(sret == 0)
            {
                bret = true;
            }
            else
            {
                IODeviceErrorMessage = GetErrorIODevice(sret);
            }

            return bret;
        }
    }
}

他のフォームからの呼び出しは、以下となります。

{
  OpenIODevice()
  
  ReadIODevice()
  または
    WriteIODevice()     

  CloseIODevice()
}


USB対応入力4bit出力4bit絶縁型デジタルI/O ボードTUSB-KINS4/4の詳細

この記事に関しての、お問い合わせは、以下までお寄せください。

お問い合わせ