ページへ戻る

− Links

 印刷 

Dynamixel Library のバックアップソース(No.13) :: Besttechnology

knowledge:Dynamixel Library のバックアップソース(No.13)

« Prev[4]  Next »[5]
TITLE:Dynamixel Library
**概要 [#va21cbfb]
Dynamixel LibraryはDynamixelの通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。~
従来はユーザ自らシリアル通信に関するAPIを使用してタイミングやエラー処理を加えて利用するものでしたが、本APIを介する事でシリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができるはずです。

なお、PCと[[BTE061D]]・[[BTE068]]・[[BTE082]]・[[BTE083]]のいずれかがUSBケーブルで接続され、PC上にWindowsのデバイスとして仮想COMポートが増設された状態で使用するものとします。

**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f]
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。
-''2011/03/28 Ver.2.5.1''~
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.5.1.zip)
内容
--放置していたLinuxへの対応をマトモに見直し。
-2011/03/16 Ver.2.5~
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.5.zip)
内容
--内部のイベント処理をさらに整理しパフォーマンスを改善。
--イリガルクローズ時のリソースリーク対策。
--DELPHI向けのサンプル追加。
-2011/03/08 Ver.2.4~
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.4.zip)
内容
--内部のイベント処理が一部破綻していたのを修正。
--シリアルエラー時の停止措置を解除。
--ゴミデータ受信時の停滞を解消。
-2011/03/03 Ver.2.3
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.3.zip)
内容
--内部のイベント処理がことごとく破綻していたのを修正。
--DX_ChangeBaudrateの返り値が反転していたいのを修正。
--BROADCASTING IDを使用したPING(DX_Ping2)を追加。
-2011/02/02 Ver.2.2
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.2.zip)
内容
--ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。
-2011/02/01 Ver.2.1~
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.1.zip)
内容
--呼出規約をstdcallに変更
--LabVIEWのラッパーviの設定を共通化
--新規ターゲット向けにサンプルを追加~
-2010/12/24 Ver.2.0~
#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.0.zip)
内容
--初期リリース~

アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。
|DXLIB2|dxlib2.dll|<|ライブラリ本体 |
|~|dxlib2_x64.dll|<|~|
|~|libdxlib2.a|<|GCC用ライブラリ(定義のみ) |
|~|libdxlib2_x64.a|<|~|
|~|dxlib2.llb|<|MSVC用ライブラリ(定義のみ) |
|~|dxlib2_x64.lib|<|~|
|~|dxlib2.c|<|ライブラリソース |
|~|dxlib2.h|<|ライブラリヘッダ |
|~|dxmemmap.h|<|DX/AX/EXシリーズ用コントロールテーブル定義ヘッダ |
|~|makelib.bat|<|ライブラリ再構築用バッチ |
|~|83.bat|<|~|
|SampleCode|GCCDeveloperLite|smpl1(template).c |サンプル |
|~|~|smpl2(ping).c |~|
|~|~|smpl3(byte_rw).c |~|
|~|~|smpl4(word_rw).c |~|
|~|~|smpl5(multithread).c |~|
|~|~|smpl6(sync).c |~|
|~|~|smpl7(rawpacket).c |~|
|~|~|smpl9(DynamicLoad).c |~|
|~|~|smpl10(USS3).c |~|
|~|~|libdxlib2.a |DXLIB2フォルダに収録されるものと同一 |
|~|~|libdxlib2_x64.a |~|
|~|~|dxlib2.h |~|
|~|~|dxmemmap.h |~|
|~|~|dxlib2.dll |~|
|~|~|dxlib2_x64.dll |~|
|~|DELPHI|Project1.dpr |サンプル |
|~|~|Unit1.dfm |~|
|~|~|DXLIB2.pas |~|
|~|~|Unit1.dfm |~|
|~|~|Unit1.pas |~|
|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |
|~|LabVIEW2009|sample.vi |サンプル |
|~|~|dbyte2word.vi |~|
|~|~|DXLIB2.llb |DXLIB2ラッパーライブラリ |
|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |
|~|EXCEL|text.xls |サンプルシート |
|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |
|~|Linux|smpl2(ping).c |サンプル |
|~|~|smpl4(word_rw).c |サンプル |
|~|Ruby|SMPL1.c |サンプル |
|~|~|SMPL3.c |サンプル |
|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |
|~|Python|SMPL1.py |サンプル |
|~|~|SMPL3.py |サンプル |
|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |

**開発環境毎の設定 [#u3ff03d9]
ここでは3つのツールで使用する場合の設定方法を説明します。ここで紹介しないツールでも必要とされる操作は概ね同様ですが、全てに対応できるとまでは明言しません。

***GCC Developer Lite [#e1d4017c]
GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~
'SampleCode\GCCDeveloperLite'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。

****DLLの静的リンク [#la562acf]
静的にDLLを使用する場合は以下の手順でライブラリをリンクする指定を行った上でコンパイルします。なお、コンパイル後のファイルを実行する際にdxlib2.dllが同一のフォルダに存在しないと、プログラムは起動直後に異常終了してしまいます。
+ファイルの準備~
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 |
|<ヘッダ |<dxlib2.h |<必要な宣言を集約 |
|<DLL |<dxlib2.dll |<DLL本体(実行時に必要) |
|<ライブラリ |<libdxlib2.a |<リンク時に必要 |
+コンパイルオプションの選択
~ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択~
#ref(GCC_CompileOption_dxlib2.png)~
+ライブラリの追加
~リンクタブ内の追加ボタンを押し、新規に行を追加~
#ref(GCC_CompileOption_Link_add_btn.png)~
~新規に追加された空の行をクリックし'dxlib2'と入力~
#ref(GCC_ComplileOption_Link_add_dxlib2.png)~

~OKを押して設定を反映

****DLLの動的リンク [#y15bf22f]
動的にDLLを使用する場合はライブラリの追加登録やオプションの指定は必要ありませんが、ソース中でdxlib2.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。
 #define _DYNAMICLOAD
 #include "dxlib2.h"
これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うDX_LoadDLLとDX_UnloadDLLが利用できるようになります。

***Microsoft Visual C++ [#j5a74d33]
[[Visual C++ 2010 Express:http://www.microsoft.com/japan/msdn/vstudio/express/]]でDLLの静的なリンク方法のみ紹介します。
+ファイルの準備~
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 |
|<ヘッダ |<dxlib2.h |<必要な宣言を集約 |
|<DLL |<dxlib2.dll |<DLL本体(実行時に必要) |
|<ライブラリ |<dxlib2.lib |<リンク時に必要 |
+プロジェクトのプロパティを変更~
~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~
#ref(VCC_property_include.png)~
~構成プロパティ→リンカー→全般→追加のライブラリディレクトリの項目にLIBファイルの格納フォルダを指定~
#ref(VCC_property_lib_path.png)~
~構成プロパティ→リンカー→入力→追加の依存ファイルの項目にLIBファイル名を指定~
#ref(VCC_property_lib_file.png)~
~構成プロパティ→C/C++→プリコンパイル済ヘッダーの項目にプリコンパイル済ヘッダーを使用しないを指定~
#ref(VCC_property_precompile.png)

***National Instruments LabVIEW [#mdd5d507]
'SampleCode\LabVIEW2009'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
[[LabVIEW2009:http://www.ni.com/labview/ja/]]には外部のDLLへアクセスする手段が提供されています。しかしながらDXLIB2そのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB2.llbにまとめて提供しています。
#ref(vi_frontpanel.png)
#ref(vi_diagram.png)
***DELPHI [#bdd8ef87]
'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
[[DELPHI:http://www.embarcadero.com/jp/products/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB2.pas内にDXLIB2.DLLを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlib2を追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。

***Ruby [#r63b1e3e]
'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
[[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~
  require 'dl/import'
  molude dxlib2
    extend DL::Importer
    dlload "./dxlib2.dll"
    extern "int DX_OpenPort( char *, long )"
  end
  devid = dxlib2.DX_OpenPort( "ポート名", ボーレート )

***Python [#mc6a5a49]
'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
[[Python:http://www.python.jp/Zope]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます

***Java [#ceff395d]

***MathWorks MATLAB [#mad2ebed]

***Linux [#w5c096b8]
Linux上でのdxlib2のコンパイル方法を紹介します。~
+コンパイル準備~
ダウンロードファイルを解凍~
+オブジェクトファイルの作成~
  gcc dxlib2.c -o dxlib2.o
+共有ライブラリの作成~
RubyやPython等で使用する場合のみ。~
  gcc -fPIC -shared dxlib2.c -o dxlib2.so -lpthread -lrt
+コンパイル~
dxlib2のオブジェクトファイルとC言語ソースを合わせてコンパイルする。~
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~
ライブラリは必要に合わせて追加する。~
  gcc sample.c dxlib2.o -o sample -lpthread -lrt
+Windowsとの相違点~
起動時にattach()、終了時にdetach()を呼び出す。

**API [#ybae1454]
dxlib2.dllは、シリアル通信を意識する必要が無いレベルで、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~
C言語のソースにdxlib2.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。

***DX_OpenPort [#zbd2f6ef]
ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、ユニークな[[DXDEVICEID>#DXDEVICEID]]を返す。以後はこの[[DXDEVICEID>#DXDEVICEID]]を使用して各APIを使用する。~
複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行い[[DXDEVICEID>#DXDEVICEID]]を取得しなくてはならない。
 DXDEVICEID DX_OpenPort (char *pcom, long br);
-パラメータ
--char '''*pcom'''
~インターフェースが提供するCOMポート名。~
記述方法は[[こちら:http://support.microsoft.com/default.aspx?scid=kb;ja;JP115831]]の情報に従う。
--long '''br'''
~インターフェースとデバイス間の通信速度[bps]。
-戻り値
--[[DXDEVICEID>#DXDEVICEID]]~
~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~
-使用例
 DXDEVICEID dev;
 // COM10を9600bpsでオープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);

***DX_ClosePort [#w1ab7cbb]
DX_OpenPortで開いたCOMポートを閉じる。~
DX_ClosePortが実行された以後は指定された[[DXDEVICEID>#DXDEVICEID]]での通信が行えなくなる。
 BOOL DX_ClosePort (DXDEVICEID dvid);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
-戻り値
--BOOL
~クローズに成功した場合はTRUE、失敗した場合はFALSEを返す。
-使用例
 DXDEVICEID dev;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);
 if (dev) {
   ... (中略)
   // クローズ
   DX_ClosePort (dev);
 }

***DX_ChangeBaudrate [#ba9f52b8]
既にオープンされている[[DXDEVICEID>#DXDEVICEID]]の通信速度の変更を行う。~
実行すると強制的に受信バッファがクリアされる。
 BOOL DX_ChangeBaudrate (DXDEVICEID dvid, long br);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--long '''br'''~
~新しい通信速度[bps]。
-戻り値
--BOOL
~通信速度の変更が成功するとTRUE、失敗するとFALSE。~
-使用例
 DXDEVICEID dev;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);
 if (dev) {
   // 通信速度を1M[bps]に変更
   DX_ChangeBaudrate (dev, 1000000);
   ... (中略)
   // クローズ
   DX_ClosePort (dev);
 }

***DX_Active [#ie20e4a7]
指定された[[DXDEVICEID>#DXDEVICEID]]のポートが使用可能であるかを確認する。~
USB接続等によりインターフェースが取り外し可能な場合に、実際に使用可能であるかを判断するために使用するが、状況によっては正確に判断できない場合もある。
 BOOL DX_Active (DXDEVICEID dvid);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
-戻り値
--BOOL
~指定されたdvidが使用可能な場合はTRUE、使用不可の場合はFALSE。
-使用例
 DXDEVICEID dev;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);
 if (dev) {
   while (DX_Active (dev)) {
     ... (中略)
   }
   // クローズ
   DX_ClosePort (dev);
 }

***DX_Ping [#v393b505]
PINGインストラクションを使用して対象IDからの応答を確認する。
 BOOL DX_Ping (DXDEVICEID dvid, UCHAR id, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253, 254)。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 57143);
 if (dev) {
   // ID=1にPINGを発行
   if (DX_Ping (dev, 1, 100, &err))
     printf ("Found [%08X]\n", err);
   else
     printf ("Not found [%08X]\n", err);
   // クローズ
   DX_ClosePort (dev);
 }

***DX_Ping2 [#g16504b3]
PINGインストラクションを使用して不特定の対象の応答を確認する。
 BOOL DX_Ping (DXDEVICEID dvid, UCHAR *id, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''*id'''
~検索で見つかったIDの保存先。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        id;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 57143);
 if (dev) {
   // 不明な対象に対してPINGを発行
   if (DX_Ping (dev, &id, 100, &err))
     printf ("Found ID=%d [%08X]\n", id, err);
   else
     printf ("Not found [%08X]\n", err);
   // クローズ
   DX_ClosePort (dev);
 }

***DX_ReadByteData [#u7d86432]
対象IDのコントロールテーブルから1バイトのデータを読み出す。
 BOOL DX_ReadByteData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR *result, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--UCHAR '''*result'''
~読み出した値の保存先。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR dat;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+からLEDの状態を取得
   if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) {
     printf ("LED STAT=%d\n", dat);
   }
   DX_ClosePort (dev);
 }

***DX_WriteByteData [#ma2205f0]
対象IDのコントロールテーブルへ1バイトのデータを書き込む。
 BOOL DX_WriteByteData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR dat, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253, 254)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--UCHAR '''dat'''~
~書き込む値。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR dat;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+からLEDの状態を取得
   if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) {
     dat ~= 1; // ビット反転
     // ID=1のAX-12+へLEDの状態を設定
     DX_WriteByteData (dev, 1, 25, 1, 100, &err);
   }
   DX_ClosePort (dev);
 }

***DX_ReadWordData [#x202d573]
対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。
 BOOL DX_ReadWordData (DXDEVICEID dvid, UCHAR id, UCHAR adr, USHORT *result, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--USHORT '''*result'''
~読み出した値の保存先。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 USHORT dat;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+から現在位置を取得
   if (DX_ReadWordData (dev, 1, 36, &dat, 100, &err)) {
     printf ("PRESENT POS=%d\n", dat);
   }
   DX_ClosePort (dev);
 }

***DX_WriteWordData [#pcc1b3ce]
対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。
 BOOL DX_WriteWordData (DXDEVICEID dvid, UCHAR id, UCHAR adr, USHORT dat, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253, 254)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--USHORT '''dat'''
~書き込む値。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+へ位置(511)を指令
   DX_WriteWordData (dev, 1, 30, 511, 100, &err);
   DX_ClosePort (dev);
 }

***DX_ReadBlockData [#b8a1ae1e]
対象IDのコントロールテーブルから指定サイズのデータを読み出す。
 BOOL DX_ReadBlockData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR size, UCHAR *result, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--UCHAR '''size'''
~読み出すデータのサイズ。
--UCHAR '''*result'''
~読み出したデータの保存先。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        comp[4];
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+からコンプライアンスのデータを取得
   if (DX_ReadBlockData (dev, 1, 26, 4, comp, 100, &err) {
     printf (
      "CWM=%d CCWM=%d CWS=%d CCWS=%d\n",
      comp[0], comp[1], comp[2], comp[3]
     );
   }
   DX_ClosePort (dev);
 }

***DX_WriteBlockData [#fcf55aa0]
対象IDのコントロールテーブルへ指定サイズのデータを書き込む。
 BOOL DX_WriteBlockData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR size, UCHAR *dat, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''id'''
~対象とするID (0~253, 254)。
--UCHAR '''adr'''
~コントロールテーブルのアドレス。
--UCHAR '''size'''
~書き込むデータのサイズ。
--UCHAR '''*dat'''
~書き込むデータの保存先。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~正常な応答が得られた場合はTRUE、それ以外はFALSE。~
BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        comp[4] = { 0, 1, 200, 200 };
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+のコンプライアンスを変更
   DX_WriteBlockData (dev, 1, 26, 4, comp, 100, &err);
   DX_ClosePort (dev);
 }

***DX_SyncWriteData [#v566e16b]
SYNCインストラクションを使用して複数IDへブロック書き込みを行う。~
書き込まれるデータの構成はユーザに委ねられる。
 BOOL DX_SyncWriteData (DXDEVICEID dvid, UCHAR size, UCHAR *dat, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''size'''
~パラメータのサイズ。
--UCHAR '''*dat'''
~書き込むパラメータの保存先。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
--BOOL
~インターフェースより送信が行われた場合はTRUE、それ以外はFALSE。~
-使用例
 #define _POS1 (400)
 #define _POS2 (511)

 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        param[8] = {
   30,    // アドレス (Goal Position)
   2,     // データ長 (2 byte)
   // ID=1用データ
   1,
   _POS1 & 0xff,
   _POS1 >> 8,
   // ID=2用データ
   2,
   _POS2 & 0xff,
   _POS2 >> 8
 };

 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // 2つのAX-12+へ同時に位置を指令
   DX_SyncWriteData (dev, 8, param, &err);
   DX_ClosePort (dev);
 };

***DX_TxPacket [#r051327a]
任意のインストラクションパケットを送信する。
 int DX_TxPacket (DXDEVICEID dvid, UCHAR cID, TInstruction cInst, UCHAR *pParam, int iLength, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''cID'''
~対象とするID (0~254)。
--[[TInstruction>#TInstruction]] '''cInst'''
~使用するインストラクションの種類。
--UCHAR '''*pParam'''
~送信するパラメータの保存先。
--int '''iLength'''~
~送信するパラメータのサイズ。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
~インターフェースより送信が行われた場合は送信バイト数、それ以外は0。
-使用例
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        param[2] = {
   25,    // アドレス (LED)
   0,     // データ
 };
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+のLEDを消灯
   DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err);
   DX_ClosePort (dev);
 };

***DX_RxPacket [#r280cda8]
ステータスパケットを受信する。~
基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。
 int DX_RxPacket (DXDEVICEID dvid, UCHAR *pRcv, int sz, int readsize, int *pLength, int timeout, TDxErrorCode *errcode);
-パラメータ
--[[DXDEVICEID>#DXDEVICEID]] '''dvid'''
~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。
--UCHAR '''*pRcv'''
~受信バッファ。~
ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。
--int '''sz'''
~受信バッファのサイズ。~
--int '''readsize'''
~予定されるステータスパケットのサイズ。
--int '''*pLength'''
~実際に受信されたステータスパケットのサイズ。
--int '''timeout'''
~受信タイムアウト[ms]。
--[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''
~エラーコード。
-戻り値
~受信成功時は受信データ長、失敗時は0。
-使用例
 int          i, len;
 DXDEVICEID   dev;
 TDxErrorCode err;
 UCHAR        param[2] = {
   25,    // アドレス (LED)
   1,     // サイズ
 };

 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {
   // ID=1のAX-12+からLEDの状態を読み出す要求
   if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) {
     // ステータスパケットを受信
     DX_RxPacket (dev, dat, sizeof (dat), 7, &len, 100, &err);
     for (i = 0; i < len; i++) {
       printf ("[%02X]", dat[i]);
     }
   }
   DX_ClosePort (dev);
 };
***DXLIB2のオリジナルな定義 [#af9ca340]
&aname(DXDEVICEID);
:DXDEVICEID | ''(HANDLE)''~
インターフェース毎に割り当てられるユニークな値。DX_OpenPortにて自動的に生成される。
&aname(TInstruction);~
:TInstruction | ''(UCHAR)''~
DX_TxPacketにてインストラクションパケットを送信する場合に使用される。~
使用可能なマクロは以下の通り。~
~INST_PING~
INST_READ~
INST_WRITE~
INST_REG_WRITE~
INST_ACTION~
INST_RESET~
INST_SYNC_WRITE~
INST_SYNG_REG_WRITE
&aname(TDxErrorCode);
:TDxErrorCode | ''(USHORT)''~
APIの内部処理とステータスパケットに含まれる16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。~
|CENTER:|LEFT:|LEFT:|c
|bit|macro name| |h
|15|ERR_INVALID_DEVID|使用できないDXDEVICEID |
|14|ERR_INVALID_ID|指定できないID |
|13|ERR_DIFF_ID|異なるIDからの応答 |
|12|ERR_ILLEGAL_SIZE|異常なデータサイズ |
|11|ERR_INVALID_PARAM|異常なパラメータ |
|10|ERR_COMM|シリアルポートエラー |
|9|ERR_CHECKSUM|異常なチェックサム |
|8|ERR_TIMEOUT|受信タイムアウト |
|7| | |
|6|ERR_DX_INST|未定義のインストラクションが指定された、もしくはreg_writeなしでactionが指定された|
|5|ERR_DX_OVERLOAD|指定された最大トルクで現在の負荷を制御できない|
|4|ERR_DX_CHECKSUM|インストラクションパケットのチェックサムが正しく無い|
|3|ERR_DX_RANGE|パラメータの設定範囲を超えた|
|2|ERR_DX_OVERHEAT|内部温度が設定温度を超えた|
|1|ERR_DX_ANGLE|Angle Limitの範囲外にGoal Positionが指定された|
|0|ERR_DX_OVERVOLTAGE|電源電圧が指定動作電圧の範囲を超えた|

« Prev[4]  Next »[5]