パソコンから 操作する |
Visual Studio® 2012 C++ を起動します。
「ファイル」メニューから [新規作成 → プロジェクト] をクリックします。
「新しいプロジェクト」ウィンドウが表示されますので、[テンプレート → Visual C++] から「MFC アプリケーション」を選択します。
「プロジェクト名」は"Sample"とし、「OK」ボタンを押してください。
「MFC アプリケーション ウィザード」が表示されますので、「次へ」を押してください。
作成するアプリケーションの種類として「ダイアログベース」、MFCの使用法で「スタティック ライブラリで使用する」をチェックし、「完了」のボタンを押します。
次に、「.lib」や「.h」ファイルを参照できるように設定を行います。
「プロジェクト」メニューから「Sample のプロパティ」を開きます。
左の「構成プロパティ」選択し、「構成:アクティブ(Debug)」から「構成:すべての構成」に変更します。
「構成プロパティ」から [VC++ディレクトリ → インクルード ディレクトリ] を選択します。
三角の印から「編集」をクリックすると、「インクルード ディレクトリ」ウィンドウが表示されます。
「新しい行」ボタンを押し、開発用ファイルのインストールされたフォルダパスを入力し、「OK」をクリックします。
開発用ファイルは「USBMTools」、または、「LANMTools」のインストール時にパソコン内にコピーされます。デフォルトのパスは「C:\Program Files(x86)\Technowave\Lib」です。
「ライブラリ ディレクトリ」にも同様に開発用ファイルのパスを追加します。
続けて、[構成プロパティ → リンカ → 入力] を選択します。
「追加のライブラリディレクトリ」の欄に "TWB.lib" を加えます。
「適用」ボタンを押して設定を保存します。
上の例の場合、「TWB.h / TWB.lib」はライブラリのインストールフォルダ中のファイルが参照されています。最新の「USBMTools」や「LANMTools」をインストールすることで、ライブラリファイルも更新されますので、プロジェクトからは常に最新のファイルが参照されます。
まず、ヘッダファイルのインクルードと、「ハンドル」用のメンバ変数の定義を行います。
「ソリューション エクスプローラ」(画面左)の「ヘッダー ファイル」から「SampleDlg.h」をダブルクリックして開きます。
「#include "TWB.h"」 と、「TW_HANDLE m_hDev;」 の2行を下図の位置に追加してください。
次に、追加したハンドルを初期化するコードと、定期的にボードにアクセスするためのタイマイベントの設定を行います。
「クラスビュー」(画面左)を開き、「CSampleDlg」クラスの「OnInitDialog()」をダブルクリックして関数を表示します。
以下の2行を上の図の位置に追加してください。
m_hDev = NULL; SetTimer(1, 100, NULL);
ボードを制御するためには、まず接続の操作が必要になります。そこで、作成するプログラムに「接続」ボタンを用意します。
「リソースビュー」(画面左)を開き、「IDD_SAMPLE_DIALOG」をダブルクリックして開きます。
「TODO : ...」と書かれたスタティックコントロールと「キャンセル」ボタンは削除します。
「OK」ボタンは右クリックで、「プロパティ」を表示し、「Caption」を "終了" に変更してください。
ダイアログ上に、新たなボタンを1つ配置します。
「ツールボックス」からボタンを配置します。
配置したボタンを右クリックして、「プロパティ」を開きます。
「ID」を "IDC_CONNECT"、「Caption」を "接続" に変更してください。
ダイアログ上の「接続」ボタンをダブルクリックして、ハンドラを追加します。コード入力の画面になりますので、下のようにプログラムを入力してください。
void CSampleDlg::OnBnClickedConnect() { TWB_Open(&m_hDev, NULL, 0, TWB_IF_ANY | TWB_LIST_UPDATE); //ボードへ接続 if(m_hDev){ TWB_Initialize(m_hDev, TWB_INIT_ALL); //ボードの初期化 GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE); //接続ボタンを無効にする GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE); //切断ボタンを有効にする AfxMessageBox(_T("ボードに接続しました"), MB_ICONINFORMATION); //メッセージを表示 }else{ AfxMessageBox(_T("ボードにできませんでした")); } }
リスト中の "TWB_" で始まる関数が、マルチファンクションI/Oボードを制御するためのライブラリ関数です。これらの関数は「TWB.dll」というDLLファイルに収められており、「TWBライブラリ」と呼んでいます。
「TWB_Open(&m_hDev, ...)」 がボードに接続する部分です。成功すると m_hDev に "NULL" 以外のハンドル値が格納されます。この値は、接続したボードを操作するために必要となります。
「TWB_Initailize(m_hDev, ...);」 は、接続したボードを初期化している部分です。以前の操作状態がボードに残っている可能性がありますので、ここで初期状態に戻しています。
次にボードの制御を終了するための「切断」ボタンを用意します。
「IDD_SAMPLE_DIALOG」を開き、ボタンを1つ配置します。
「接続」ボタン同様に、「プロパティ」を開き、「ID」に "IDC_DISCONNECT"、「Caption」に "切断" と入力してください。
実際に接続しているときだけ、ボタンを有効にしますので、「Disabled」を True にします。
ダイアログ上の「切断」ボタンをダブルクリックして、ハンドラを追加します。コード入力の画面になりますので、下のようにプログラムを入力してください。
void CSampleDlg::OnBnClickedDisconnect() { if(m_hDev){ TWB_Close(m_hDev); //切断 m_hDev = NULL; //ハンドルをNULLに初期化 GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE); //接続ボタンを有効にする GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE); //切断ボタンを無効にする } }
「TWB_Close(m_hDev);」 が切断処理です。ハンドルの値は無効になりますので、ボードと接続されていないことがわかるように m_hDev を "NULL" に戻しています。
次にデジタル入力(P40)の端子状態を定期的に読み出して表示を行います。
まず、ダイアログ上に、入力状態を表示するためのチェックボックスを1つ配置します
「ID」を "IDC_P40"、「Caption」を "P40" に変更してください
「ワークスペース」ウィンドウの「クラスビュー」(画面左)を開きます。
「CSampleDlg」クラスを選択し、プロパティ(画面右)のツールバーから「メッセージ」を選択します。
表示されるリストに「WM_TIMER」がありますので、三角の矢印をクリックし、「<Add> OnTimer」をクリックします。
コード入力の画面になりますので、下のようにプログラムを入力してください。
void CSampleDlg::OnTimer(UINT_PTR nIDEvent) { BYTE Data; TW_STATUS Status; CString str; if(m_hDev){ Status = TWB_PortRead(m_hDev, TWB_P4, &Data); //ポート4の読み出し if(Status){ OnBnClickedDisconnect(); //切断処理の呼び出し str.Format(_T("エラーが発生しました。: %x"), Status); AfxMessageBox(str); return; } //読み出したデータの0ビット(P40端子に対応)を調べる if(Data & 0x01){ ((CButton*)GetDlgItem(IDC_P40))->SetCheck(1); //1のときチェックを入れる }else{ ((CButton*)GetDlgItem(IDC_P40))->SetCheck(0); //0のときチェックを外す } } CDialogEx::OnTimer(nIDEvent); }
「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" という定数が入ります。"TW_OK" は「TWB.h」の中で定義されている定数で、値は 0 になります。関数が失敗した場合には、Status が "TW_OK" 以外(0以外)の値となります。
次にデジタル出力(POUT0#)を変更する処理を追加します。
「IDD_SAMPLE_DIALOG」を開き、POUT0# 端子と対応するチェックボックスを1つ配置します。
「ID」を "IDC_POUT0"、「Caption」を "POUT0" に変更してください
ダイアログ上の「POUT0」チェックボックスをダブルクリックして、ハンドラを追加します。コード入力の画面になりますので、下のようにプログラムを入力してください。
void CSampleDlg::OnBnClickedPout0() { //接続していない場合チェックを外して処理を終わる if(m_hDev == NULL){ ((CButton*)GetDlgItem(IDC_POUT0))->SetCheck(0); return; } //チェックされた場合はPOUT0を"1"に、チェックが無い場合POUT0を"0"にする if(((CButton*)GetDlgItem(IDC_POUT0))->GetCheck() == 1){ TWB_PortWrite(m_hDev, TWB_POUT, 0x01); }else{ TWB_PortWrite(m_hDev, TWB_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 が点灯するはずです。
ハードウェアや、各機能の使用方法に関しての詳細は、以下のマニュアルでご案内しています。