今回、タートル工業社の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の詳細
この記事に関しての、お問い合わせは、以下までお寄せください。
お問い合わせ