パソコンから 操作する |
Visual C++® 2010 Express Edition を起動します。
「ファイル」メニューから [新規作成 → プロジェクト] を選択します。
テンプレートは「Windows フォーム アプリケーション」を選択します。
「プロジェクト名」は "Sample" とし、「OK」ボタンを押してください。
「.lib」や「.h」ファイルを参照できるように設定を行います。
「プロジェクト」メニューから「プロパティ」を開きます。
左の「構成プロパティ」選択し、「構成:アクティブ(Debug)」から「構成:すべての構成」に変更します。
「構成プロパティ」から [VC++ディレクトリ → インクルード ディレクトリ] を選択します。
「プロジェクト」メニューから「プロパティ」を開きます。
左の「構成プロパティ」選択し、「構成:アクティブ(Debug)」から「構成:すべての構成」に変更します。
「構成プロパティ」から [VC++ディレクトリ → インクルード ディレクトリ] を選択します。
三角の印から「編集」をクリックすると、「インクルード ディレクトリ」ウィンドウが表示されます。
「新しい行」ボタンを押し、開発用ファイルのインストールされたフォルダパスを入力し、「OK」をクリックします。
開発用ファイルは「USBMTools」、または、「LANMTools」のインストール時にパソコン内にコピーされます。デフォルトのパスは「C:\Program Files(x86)\Technowave\Lib」です。
「ライブラリ ディレクトリ」にも同様に開発用ファイルのパスを追加します。
続けて、[リンカ → 入力] を選択します。
「追加の依存ファイル」の欄に「TWB.lib」を加えます。
「適用」ボタンを押して設定を保存します。
最後に、「windows.h」をインクルードします。
[ソリューション エクスプローラ → ヘッダー ファイル] から、「StdAfx.h」をダブルクリックして開きます。
// TODO: ... の次の行に
#include <windows.h>
の1行を追加します。
上の例の場合、「TWB.h / TWB.lib」はライブラリのインストールフォルダ中のファイルが参照されています。最新の「USBMTools」や「LANMTools」をインストールすることで、ライブラリファイルも更新されますので、プロジェクトからは常に最新のファイルが参照されます。
まず、ヘッダファイルのインクルードと、「ハンドル」用のメンバ変数の定義を行います。
「ソリューション エクスプローラ」(画面左)の「Form1.h」を右クリックし、「コードの表示」をクリックします。
「Form1.h」の2行目(画面参照)の位置に以下の1行を追加します。
#include "TWB.h"
次にファイルの最後の方(上図参照)に以下の一行を追加します。
private: TW_HANDLE m_hDev;
追加したハンドルを初期化するコードをコンストラクタに追加します。
「Form1」クラスのコンストラクタ「Form1()」(画面参照)に 以下の一文を追加します。
m_hDev = NULL;
ボードを制御するためには、まず接続の操作が必要になります。そこで、作成するプログラムに「接続」ボタンを用意します。
「Form1.h」をデザイナで開きます。「ツールボックス」から「Button」を選択します。
「Form1.h」の上でドラッグして、ボタンを1つ配置します。
次に、「プロパティ」ウィンドウ(画面右下)の「(Name)」に "Connect"、「Text」に "接続" と入力してください。
フォーム上の「接続」ボタンをダブルクリックするとコード入力の画面になりますので、下のようにプログラムを入力してください。
private: System::Void Connect_Click(System::Object^ sender, System::EventArgs^ e) { pin_ptr<TW_HANDLE> p = &m_hDev; //ポインタを固定 TWB_Open(p, NULL, 0, TWB_IF_ANY | TWB_LIST_UPDATE); //ボードへ接続 if(m_hDev != NULL){ TWB_Initialize(m_hDev, TWB_INIT_ALL); //ボードの初期化 Connect->Enabled = false; //接続ボタンを無効にする Disconnect->Enabled = true; //切断ボタンを有効にする MessageBox::Show(L"ボードに接続しました。"); //メッセージを表示 }else{ MessageBox::Show(L"ボードに接続できませんでした。"); } }
リスト中の TWB_ で始まる関数が、マルチファンクションI/Oボードを制御するためのライブラリ関数です。これらの関数は「TWB.dll」という DLL ファイルに収められており、「TWBライブラリ」と呼んでいます。
「TWB_Open(m_hDev, ...);」 がボードに接続する部分です。成功すると m_hDev に "NULL" 以外のハンドル値が格納されます。格納された整数は一般に「ハンドル」と呼ばれるもので、接続したボードを操作するために必要となりますので、プログラムを通じて参照できるようにグローバルな変数に格納しています。
「TWB_Initailize(m_hDev, ...);」 は、接続したボードを初期化している部分です。以前の操作状態がボードに残っている可能性がありますので、ここで初期状態に戻しています。
次にボードの制御を終了するための「切断」ボタンを用意します。
「Form1.h」をデザイナで開き、ボタンを1つ配置します。
「接続」ボタン同様に、「プロパティ」ウィンドウの「(Name)」に "Disconnect"、「Text」に "切断" と入力してください。
実際に接続しているときだけ、ボタンを有効にしますので、「Enabled」の初期値を "False" に変更してください。
フォーム上の「切断」ボタンをダブルクリックして、以下のプログラムを入力します。
private: System::Void Disconnect_Click(System::Object^ sender, System::EventArgs^ e) { if(m_hDev){ TWB_Close(m_hDev); //切断 m_hDev = NULL; //ハンドルを初期化 Connect->Enabled = true; //接続ボタンを有効にする Disconnect->Enabled = false; //切断ボタンを無効にする } }
「TWB_Close(m_hDev);」 が切断処理です。ハンドルの値は無効になりますので、ボードと接続されていないことがわかるように m_hDev を0に戻しています。
次にデジタル入力(P40)の端子状態を定期的に読み出して表示を行います。
「Form1.h」をデザイナで開き、ツールボックスから「Timer」を選択して配置します。
プロパティの「Enabled」を "True" に変更してください。これで、100msec毎にタイマイベントが発生します。
続いて入力状態を表示するためのチェックボックスを1つ配置します。
「(Name)」を "P40"、「Text」を "P40" に変更してください。
フォーム上の "Timer1" のアイコンをダブルクリックして、以下のプログラムを入力します。
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { BYTE Data; TW_STATUS Status; if(m_hDev == NULL) return; //接続していないときは何もしない Status = TWB_PortRead(m_hDev, TWB_P4, &Data); //ポート4の読み出し if(Status != TW_OK){ Disconnect_Click(nullptr, nullptr); //切断処理の呼び出し //メッセージとエラー番号の表示 MessageBox::Show(String::Format(L"エラーが発生しました。: {0:X8}", Status)); } //読み出したデータの0ビット(P40端子に対応)を調べる if(Data & 0x01){ P40->Checked = true; //1の場合チェックボックスにチェックを入れる }else{ P40->Checked = false; //0の場合チェックボックスのチェックを消す } }
「Status = TWB_PortRead(...)」 の部分がポート4(P40-P47)の端子状態を読み出している部分です。P40が "Hi" の場合、Data 変数のビット0(最下位ビット)が "1" となり、"Lo" の場合は、Data のビット0 が "0" となります。P41 の状態は同様にビット1 に格納され、以下同様に P47 までの 8ビットが、それぞれビット7(MSB)までの 8ビットに格納されます。
TWB_PortRead() 関数が成功した場合、Status には "TW_OK" という定数(列挙型)が入ります。関数の戻り値を表す定数は「TWB.h」の中で定義されています。実際の "TW_OK" の値は 0 です。関数が失敗した場合には、Status が "TW_OK" 以外(0以外)の値となります。
次にデジタル出力(POUT0#)を変更する処理を追加します。
「Form1.h」をデザイナで開き、POUT0# 端子と対応するチェックボックスを1つ配置します。
「(Name)」を "POUT0"、「Text」を "POUT0" に変更してください
フォーム上の「POUT0」チェックボックスをダブルクリックして、以下のプログラムを入力します。
private: System::Void POUT0_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { //接続していない場合チェックを外して処理を終わる if(m_hDev == NULL){ POUT0->Checked = false; return; } //チェックされた場合はPOUT0を"1"に、チェックが無い場合POUT0を"0"にする if(POUT0->Checked == true){ TWB_PortWrite(m_hDev, TWB::WPORT::POUT, 0x01); }else{ TWB_PortWrite(m_hDev, TWB::WPORT::POUT, 0x00); } }
「TWB_PortWrite(..., 0x01)」 の部分が POUT0# の出力を "ON" にしている部分です。"0x01" の部分には8ビット(BYTE)の数値を指定できます。ポート入力の場合と同様にビット0 - ビット7 が、それぞれ、POUT0# - POUT7# 端子に対応しています。POUT# はオープンコレクタ出力となっていますので、"ON" になると端子から GND へ電流を流します。
それでは、作成したプログラムを実行し、動作確認を行います。
M3069評価ボードが利用可能な場合は、評価ボード上にマルチファンクションI/Oボードを取付けてください。評価ボードが無い場合は、「動作確認用の回路」に従って、簡単な回路を構成すれば、動作確認が可能になります。
ボードをパソコン、または、ネットワークに接続し、電源を入れ、通信可能な状態にします。
「デバッグ」メニューから「デバッグ開始」を選択してください。作成したプログラムが起動しますので「接続」ボタンを押してください。成功すると図のようにメッセージが表示されますので「OK」を押してください。
ビルドエラーが発生する場合には、プログラムに誤りがないか確認してください。
「P40」のチェックボックスは、P40 端子の入力レベルを表示しています。M3069評価ボードに接続している場合は、SW1 のディップスイッチの1番を "ON" にするとチェックが消えます。逆に "OFF" にするとチェックが表示されます。(図1)
動作確認用の回路がある場合も同様に、スイッチを "ON" にすると、チェックが消えます。
「POUT0」にチェックを入れると、POUT0# の出力が "ON" になります。M3069評価ボードに接続している場合は、対応する LED が点灯します。(図2)
動作確認用の回路がある場合も同様に、接続した LED が点灯するはずです。
ハードウェアや、各機能の使用方法に関しての詳細は、以下のマニュアルでご案内しています。