17: 2011-07-26 (Tue) 11:29:54 takaboo source Cur: 2021-03-27 (Sat) 08:17:58 takaboo source
Line 1: Line 1:
-TITLE:Dynamixel Library+TITLE:Dynamixel Protocol Library
**概要 [#va21cbfb] **概要 [#va21cbfb]
-Dynamixel LibraryはDynamixelの通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。+Dynamixel Protocol LibraryはDynamixel Protocol 1の通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。
-従来はユーザ自らシリアル通信に関するAPIを使用してタイミングやエラー処理を加えて利用するものでしたが、本APIを介する事でシリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができるはずです。+シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。
-なお、PCと[[BTE061D]]・[[BTE068]]・[[BTE082]]・[[BTE083]]のいずれかがUSBケーブルで接続され、PC上にWindowsのデバイスとして仮想COMポートが増設された状態で使用するものとします。+なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTX229>http://emanual.robotis.com/docs​/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f]
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。
--''2011/07/20 Ver.2.6''~ +-''2021/1/22 Ver.4.4''~ 
-#ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.6.zip)+#ref(https://www.besttechnology.co.jp/download/DXLIB_V4.4.zip) 
 +内容 
 +--新しく追加されたDynamixelの定義を追加 
 +--makedll.batの内容を一部変更 
 +-2019/11/15 Ver.4.3~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V4.3.zip) 
 +内容 
 +--Visual Studio上での動作検証を行いヘッダを一部修正 
 +--ライブラリソースのエンコードをUTF-8のBOM付きに統一 
 +--新しく追加されたDynamixelの定義を追加 
 +-2019/03/27 Ver.4.2~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V4.2.zip) 
 +内容 
 +--追加APIの正式リリース 
 +--C言語による追加APIのサンプルプログラムを拡充 
 +--Pythonによるサンプルプログラムを拡充 
 +-2016/07/13 Ver.3.3~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V3.3.zip) 
 +内容 
 +--Linux上でのttyの初期化処理を修正 
 +--Linux上でのスリープ命令をusleepに置換する様に変更 
 +-2016/01/12 Ver.3.2~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V3.2.zip) 
 +内容 
 +--ヘッダファイルを最近のVCで使用するとエラーになるのを修正 
 +--DLLMainの不用意な呼び出しで余計な処理をしないよう対応 
 +--デバイス毎に異なるパケットサイズの制限のうち最小に合わせていたが、ライブラリ内では250バイトとする 
 +--GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 
 +-2015/11/18 Ver.3.1~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V3.1.zip) 
 +内容 
 +--TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 
 +--ヘッダファイルの一部の記述がMSVCに対応していなかったのを修正 
 +--DX_SetBaudrateの処理に待ち時間を挿入 
 +-2014/06/11 Ver.3.0~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V3.0.zip) 
 +内容 
 +--各APIのアドレス指定が8bit幅だったものを16bitに拡張(後継のDYNAMIXEL2に合わせた) 
 +--TDxAlarmStatus構造体のアライメントを1バイト境界に変更 
 +--不定なDevice IDを指定された際のクラッシュを簡易的にブロック 
 +--似非ReadSync APIを追加 
 +--DX_Reset処理後に1秒の待ち時間を挿入 
 +--dllのソースをC++に 
 +--API引数の変更に伴い各サンプルを修正 
 +--LabVIEWのサンプルを大幅に拡充 
 +--EXCELのVBAを64bitに対応 
 +--アーカイブファイル名を変更 
 +-2013/10/10 Ver.2.9.1~ 
 +内容 
 +--DX_SetTimeOutOffsetでオフセットタイムを指定していない場合のデフォルト値が0ではタイムアウトが生じやすいため20に変更 
 +--DX_Ping2の検索最大数を254に修正 
 +--DXLIB.pasに追加したDX_SetTimeOutOffsetの定義ミスを修正 
 +-2013/09/15 Ver.2.9~ 
 +内容 
 +--タイムアウトの値を見定めるのが困難という事から基本的に引数から排除し、内部で理論値を算出する様に変更。 
 +--タイムアウト以外にタイムラグが必要ということでDX_SetTimeOutOffsetを新設。 
 +--USB搭載のマイコンのファームにおいてポートオープンの状態検出の仕様を変更したため、DTRの制御をイネーブルに変更。 
 +--DX_ChangeBaudrateをDX_SetBaudrateに改名。 
 +--サイズを指定する引数はuint32_tに統一。 
 +--Linux対応をさらに進め、USB搭載のマイコン等でioctlによるボーレートの変更が使えないケースに一部対応。 
 +--Win32とLinuxの相違部分を整理して多少見やすくしてみた。 
 +-2013/03/28 Ver.2.8.1~ 
 +内容 
 +--DX_Ping2の初期化部において不定なTDevicdIDを想定していなかったのを修正。 
 +-2013/03/28 Ver.2.8~ 
 +内容 
 +--名称をDXLIB2からDXLIBに戻す。 
 +--ROBO-ONE標準化フォーラムでの総意を元にAPIの定義と型を変更。~ 
 +dxlib2.7以前と互換性がなくなるので注意が必要。~ 
 +もちろんサンプルも修正。 
 +--64ビット環境が増えてきたため、DLL名のサフィックスを統一。 
 +--Linuxを真面目に対応。 
 +--受信スレッドを完全に廃止し処理をブロッキング化し可読性を向上。 
 +--パケットの整合性チェックを厳密化。 
 +--デバイスからのアラームステータスがAPIの応答に反映されないケースを修正。 
 +-2011/07/20 Ver.2.6~
内容 内容
--DX_SyncWriteDataをDX_WriteSyncDataへ改名。 --DX_SyncWriteDataをDX_WriteSyncDataへ改名。
Line 16: Line 91:
--古いバージョンのmatlabがDEVICEIDを誤認するため型を変更。 --古いバージョンのmatlabがDEVICEIDを誤認するため型を変更。
-2011/03/28 Ver.2.5.1~ -2011/03/28 Ver.2.5.1~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.5.1.zip) 
内容 内容
--放置していたLinuxへの対応をマトモに見直し。 --放置していたLinuxへの対応をマトモに見直し。
-2011/03/16 Ver.2.5~ -2011/03/16 Ver.2.5~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.5.zip) 
内容 内容
--内部のイベント処理をさらに整理しパフォーマンスを改善。 --内部のイベント処理をさらに整理しパフォーマンスを改善。
Line 26: Line 99:
--DELPHI向けのサンプル追加。 --DELPHI向けのサンプル追加。
-2011/03/08 Ver.2.4~ -2011/03/08 Ver.2.4~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.4.zip) 
内容 内容
--内部のイベント処理が一部破綻していたのを修正。 --内部のイベント処理が一部破綻していたのを修正。
Line 32: Line 104:
--ゴミデータ受信時の停滞を解消。 --ゴミデータ受信時の停滞を解消。
-2011/03/03 Ver.2.3 -2011/03/03 Ver.2.3
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.3.zip) 
内容 内容
--内部のイベント処理がことごとく破綻していたのを修正。 --内部のイベント処理がことごとく破綻していたのを修正。
Line 38: Line 109:
--BROADCASTING IDを使用したPING(DX_Ping2)を追加。 --BROADCASTING IDを使用したPING(DX_Ping2)を追加。
-2011/02/02 Ver.2.2 -2011/02/02 Ver.2.2
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.2.zip) 
内容 内容
--ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。 --ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。
-2011/02/01 Ver.2.1~ -2011/02/01 Ver.2.1~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.1.zip) 
内容 内容
--呼出規約をstdcallに変更 --呼出規約をstdcallに変更
Line 48: Line 117:
--新規ターゲット向けにサンプルを追加~ --新規ターゲット向けにサンプルを追加~
-2010/12/24 Ver.2.0~ -2010/12/24 Ver.2.0~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.0.zip) 
内容 内容
--初期リリース~ --初期リリース~
-アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 +アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(※最新版のフォルダ構成を記載しています) 
-|DXLIB2|dxlib2.dll|<|ライブラリ本体 | +|DXLIB|dxlib_x32.dll|<|ライブラリ本体 | 
-|~|dxlib2_x64.dll|<|~| +|~|dxlib_x64.dll|<|~| 
-|~|libdxlib2.a|<|GCC用ライブラリ(定義のみ) | +|~|libdxlib_x32.a|<|GCC用ライブラリ(定義のみ) | 
-|~|libdxlib2_x64.a|<|~| +|~|libdxlib_x64.a|<|~| 
-|~|dxlib2.llb|<|MSVC用ライブラリ(定義のみ) | +|~|dxlib_x32.llb|<|MSVC用ライブラリ(定義のみ) | 
-|~|dxlib2_x64.lib|<|~| +|~|dxlib_x64.lib|<|~| 
-|~|dxlib2.c|<|ライブラリソース | +|~|dxlib.cpp|<|ライブラリソース | 
-|~|dxlib2.h|<|ライブラリヘッダ | +|~|dxlib.h|<|ライブラリヘッダ
-|~|dxmemmap.h|<|DX/AX/EXシリーズ用コントロールテーブル定義ヘッダ |+|~|dxlib_matlab.h|<|matlab用ヘッダ | 
 +|~|dxlib.py|<|python用API定義
 +|~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ |
|~|makelib.bat|<|ライブラリ再構築用バッチ | |~|makelib.bat|<|ライブラリ再構築用バッチ |
|~|83.bat|<|~| |~|83.bat|<|~|
-|SampleCode|GCCDeveloperLite|smpl1(template).c |サンプル | +|SampleCode|GCCDeveloperLite|smpl*.c |サンプル | 
-|~|~|smpl2(ping).c |~| +|~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 |
-|~|~|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 |~| |~|~|dxmemmap.h |~|
-|~|~|dxlib2.dll |~| +|~|~|dxlib_x32.dll |~| 
-|~|~|dxlib2_x64.dll |~|+|~|~|dxlib_x64.dll |~|
|~|DELPHI|Project1.dpr |サンプル | |~|DELPHI|Project1.dpr |サンプル |
-|~|~|Unit1.dfm |~| 
-|~|~|DXLIB2.pas |~| 
|~|~|Unit1.dfm |~| |~|~|Unit1.dfm |~|
|~|~|Unit1.pas |~| |~|~|Unit1.pas |~|
-|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 +|~|~|DXLIB.pas |~| 
-|~|LabVIEW2009|sample.vi |サンプル | +|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一
-|~|~|dbyte2word.vi |~| +|~|~|dxlib_x64.dll |~| 
-|~|~|DXLIB2.llb |DXLIB2ラッパーライブラリ +|~|LabVIEW2011|sample*.vi |サンプル | 
-|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |+|~|~|DXLIB.llb |dllの呼び出しをvi化 | 
 +|~|~|DXLIB_DXL.llb |dllの呼び出しをvi化
 +|~|~|DXLIB_Wrapper.llb |アクチュエータに特化したvi
 +|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 |
|~|EXCEL|text.xls |サンプルシート | |~|EXCEL|text.xls |サンプルシート |
-|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 +|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一
-|~|Linux|smpl2(ping).c |サンプル +|~|~|dxlib_x64.dll |~
-|~|~|smpl4(word_rw).c |サンプル | +|~|Linux|smpl*.c |サンプル | 
-|~|Ruby|SMPL1.c |サンプル | +|~|Ruby|smpl*.rb |サンプル | 
-|~|~|SMPL3.c |サンプル | +|~|Python|smpl*.py |サンプル | 
-|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 | +|~|~|dxlib.py |DXLIBフォルダに収録されるものと同一
-|~|Python|SMPL1.py |サンプル +|~|~|dxlib_x32.dll |~
-|~|~|SMPL3.py |サンプル +|~|~|dxlib_x64.dll |~|
-|~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 |+
**開発環境毎の設定 [#u3ff03d9] **開発環境毎の設定 [#u3ff03d9]
-ここでは3つのツールで使用する場合の設定方法を説明します。ここで紹介しないツールでも必要とされる操作は概ね同様ですが、全てに対応できるとまでは明言しません。+サンプルを元にいくつかのツール・環境で使用する場合の設定方法を説明します。ここで紹介されないツールにおいても、dllを利用できるのであれば必要とされる操作は概ね同様だと思います。、
***GCC Developer Lite [#e1d4017c] ***GCC Developer Lite [#e1d4017c]
Line 108: Line 168:
****DLLの静的リンク [#la562acf] ****DLLの静的リンク [#la562acf]
-静的にDLLを使用する場合は以下の手順でライブラリをリンクする指定を行った上でコンパイルします。なお、コンパイル後のファイルを実行する際にdxlib2.dllが同一のフォルダに存在しないと、プログラムは起動直後に異常終了してしまいます。+静的にDLLを使用する場合は以下の手順でDLLをリンクする指定を行った上でコンパイルします。なお32bit環境を前提とします。
+ファイルの準備~ +ファイルの準備~
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 | |=ファイル |=ファイル名 |=備考 |
-|<ヘッダ |<dxlib2.h |<必要な宣言を集約 | +|<ヘッダ |<dxlib.h |<必要な宣言を集約 | 
-|<DLL |<dxlib2.dll |<DLL本体(実行時に必要) +|<DLL |<dxlib_x32.dll |<DLL本体(実行時およびリンク時に必要) |
-|<ライブラリ |<libdxlib2.a |<リンク時に必要 |+
+コンパイルオプションの選択 +コンパイルオプションの選択
~ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択~ ~ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択~
-#ref(GCC_CompileOption_dxlib2.png)~+#ref(GCC_CompileOption_sel.png)~
+ライブラリの追加 +ライブラリの追加
-~リンクタブ内の追加ボタンを押し、新規に行を追加+~etc...タブ内の追加ボタンを押し、新規に行を追加
-#ref(GCC_CompileOption_Link_add_btn.png)~ +#ref(GCC_CompileOption_AddEtc.png)~ 
-~新規に追加された空の行をクリックし'dxlib2'と入力~ +~新規に追加された空の行をクリックし'dxlib_x32.dll'と入力~ 
-#ref(GCC_ComplileOption_Link_add_dxlib2.png)~+#ref(GCC_CompileOption_AddDxlib2.png)~
~OKを押して設定を反映 ~OKを押して設定を反映
****DLLの動的リンク [#y15bf22f] ****DLLの動的リンク [#y15bf22f]
-動的にDLLを使用する場合はライブラリの追加登録やオプションの指定は必要ありませんが、ソース中でdxlib2.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。+動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。
 #define _DYNAMICLOAD  #define _DYNAMICLOAD
- #include "dxlib2.h" + #include "dxlib.h" 
-これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うDX_LoadDLLとDX_UnloadDLLが利用できるようになります。+これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 
 +   TDeviceID  dev; 
 +   // DLLをロード 
 +   if (LoadDLL ()) { 
 +     if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) { 
 +       ... 
 +       DX_ClosePort (dev); 
 +     } 
 +     // DLLをアンロード 
 +     UnloadDLL (); 
 +   }
***Microsoft Visual C++ [#j5a74d33] ***Microsoft Visual C++ [#j5a74d33]
Line 137: Line 206:
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 | |=ファイル |=ファイル名 |=備考 |
-|<ヘッダ |<dxlib2.h |<必要な宣言を集約 | +|<ヘッダ |<dxlib.h |<必要な宣言を集約 | 
-|<DLL |<dxlib2.dll |<DLL本体(実行時に必要) +|<DLL |<dxlib_x32.dll |<実行時に必要 | 
-|<ライブラリ |<dxlib2.lib |<リンク時に必要 |+|<ライブラリ |<dxlib_x32.lib |<リンク時に必要 |
+プロジェクトのプロパティを変更~ +プロジェクトのプロパティを変更~
~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~ ~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~
Line 151: Line 220:
***National Instruments LabVIEW [#mdd5d507] ***National Instruments LabVIEW [#mdd5d507]
-'SampleCode\LabVIEW2009'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ +'SampleCode\LabVIEW2011'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 
-[[LabVIEW2009:http://www.ni.com/labview/ja/]]には外部のDLLへアクセスする手段が提供されています。しかしながらDXLIB2そのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB2.llbにまとめて提供しています。+[[LabVIEW:http://www.ni.com/labview/ja/]]には外部のDLLへアクセスする手段が提供されています。しかしながらDXLIBそのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB.llbにまとめて提供しています。
#ref(vi_frontpanel.png) #ref(vi_frontpanel.png)
#ref(vi_diagram.png) #ref(vi_diagram.png)
 +
 +****関数パレットへの登録 [#v135be5a]
 +DXLIB.llbから各viを開き、開いたviの右上にあるアイコンを自分のブロックダイアグラムにドラッグドロップするという操作でviを使用しても良いのですが、頻繁に操作するとなると少々煩雑です。~
 +関数パレットに登録すればスムーズに操作できますので、その手順を紹介します。
 ++LabVIEWのメニューの「ツール」→「上級」→パレットセットを編集」をクリック。
 +#ref(lvmenu_step1.png,100%)
 ++開いた関数パレットの空いたスペースで右クリックし、ポップアップメニューから「挿入」→「サブパレット」をクリック。
 +#ref(lvmenu_step2.png,100%)
 ++開いたダイアログボックスから「LLBへリンク(.llb)」を選びOKを押す。
 +#ref(lvmenu_step3.png,100%)
 ++LLBを選択するファイルダイアログボックスから、先に解凍したファイルの中から「DXLIB.llb」を選択しOKを押す。
 +#ref(lvmenu_step4.png,100%)
 ++次の様なメニューが追加されたらOK。
 +#ref(lvmenu_step5.png,100%)
 +
***DELPHI [#bdd8ef87] ***DELPHI [#bdd8ef87]
'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
-[[DELPHI:http://www.embarcadero.com/jp/p​roducts/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB2.pas内にDXLIB2.DLLを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlib2を追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。+[[DELPHI:http://www.embarcadero.com/jp/p​roducts/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB.pas内にdxlib_x32.dllないしdxlib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlibを追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。 
 + 
 +***VB [#p8d7963b] 
 +'SampleCode\EXCEL'フォルダにサンプルが同梱されます。~ 
 +ここではVBと似たMicrosoft OfficeのVBAを使用し、マクロの標準モジュールにDXLIB_HEADという名称でDLLに含まれるいくつかのAPIが定義してあります。~ 
 +Module1にPingTestとMotorTestというマクロが記述されていますので、ワークシートから適宜マクロを呼び出して実行してください。結果がシート上に反映されます。 
 + 
 +なお、Officeにも32bit版と64bit版があるため、Declare宣言の方法が異なります。その部分はDXLIB_HEADにて判定していますので、参考にしてください。
***Ruby [#r63b1e3e] ***Ruby [#r63b1e3e]
Line 163: Line 254:
[[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~
  require 'dl/import'   require 'dl/import'
-  molude dxlib2+  molude dxlib
   extend DL::Importer    extend DL::Importer
-   dlload "./dxlib2.dll"+   dlload "./dxlib_x32.dll"
   extern "int DX_OpenPort( char *, long )"    extern "int DX_OpenPort( char *, long )"
  end   end
-  devid = dxlib2.DX_OpenPort( "ポート名", ボーレート )+  devid = dxlib.DX_OpenPort( "ポート名", ボーレート )
***Python [#mc6a5a49] ***Python [#mc6a5a49]
-'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ +'SampleCode\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 
-[[Python:http://www.python.jp/Zope]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ +[[Python:http://www.python.jp/]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ 
-LinuxでLoadLibraryを呼び出す際はcdllインスタンスを使用します。 +各APIのPython用の宣言を定義したdxlib.pyをimportするだけで済みます。 
-  dxlib2 = windll.LoadLibrary( "dxlib2.dll" )  # for window + from dxlib import *   # dxlibをインポート
-  dxlib2 = cdll.LoadLibrary( "./dxlib2.so" )   # for linux+
***Java [#ceff395d] ***Java [#ceff395d]
***MathWorks MATLAB [#mad2ebed] ***MathWorks MATLAB [#mad2ebed]
-[[MATLAB:http://www.mathworks.co.jp/prod​ucts/matlab]]からの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。~+[[MATLAB:http://www.mathworks.co.jp/prod​ucts/matlab]]からの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。また、mex-setupにて[[Cコンパイラを選択>http://www.mathworks.co.jp/jp/help/matl​ab/matlab_external/building-mex-files.ht​ml#f23734]]しておく必要があります。~
+事前準備 +事前準備
-~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib2.dllとdxlib2.hの格納されたパスを指定します。+~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib_x32.dll(MATALBが64bitの場合はdxlib_x64.dll)とdxlib_matlab.hの格納されたパスを指定します。dxlib.hはMATLABでは解釈できない記述が多いため使用しないでください。~
+DLLのロード +DLLのロード
- loadlibrary('dxlib2.dll','dxlib2.h');+ loadlibrary('dxlib_x32.dll','dxlib_matlab.h','alias','dxlib')
+ポートのオープン +ポートのオープン
-~ロードされたdxlib2のDX_OpenPortを呼出します。関数名の後はポートとボーレートです。 +~ロードされたdxlibのDX_OpenPortを呼出します。関数名の後はポートとボーレートです。 
- devid = calllib('dxlib2','DX_OpenPort','\\.\COM3',1000000); + devid = calllib('dxlib','DX_OpenPort','\\.\COM3',1000000) 
-+TDxErrorCodeの取得 ++TErrorCodeの取得 
-~TDxErrorCodeはポインタで引き渡している為、事前に型宣言をしておきます。値はErr.Valueで取得可能です。+~TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。
 Err = libpointer('uint16Ptr', 0);  Err = libpointer('uint16Ptr', 0);
- Ret = calllib('dxlib2', 'DX_Ping', devid, 1, 10, Err);+ Ret = calllib('dxlib', 'DX_Ping', devid, 1, Err);
 fprintf('%x', Err.Value);  fprintf('%x', Err.Value);
+ポートのクローズ +ポートのクローズ
~DX_OpenPortを行ったので、DX_ClosePortを使用してポートを閉じます。 ~DX_OpenPortを行ったので、DX_ClosePortを使用してポートを閉じます。
- calllib('dxlib2','DX_ClosePort',devid);+ calllib('dxlib','DX_ClosePort',devid)
+DLLのアンロード +DLLのアンロード
- unloadlibrary('dxlib2');+ unloadlibrary('dxlib')
***Linux [#w5c096b8] ***Linux [#w5c096b8]
-Linux上でのdxlib2のコンパイル方法を紹介します。~+Linux上でdxlibをコンパイルする方法を紹介します。~
+コンパイル準備~ +コンパイル準備~
ダウンロードファイルを解凍~ ダウンロードファイルを解凍~
-+オブジェクトファイルの作成++ライブラリファイルの生成
-  gcc dxlib2.c -o dxlib2.o+ $ gcc -c -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp 
 + $ ar -rcsv libdxlib.a dxlib_intuitive.o dxlib.o
+共有ライブラリの作成~ +共有ライブラリの作成~
-RubyやPython等で使用する場合のみ。+RubyやPython等で使用する場合等
-  gcc -fPIC -shared dxlib2.c -o dxlib2.so -lpthread -lrt + $ gcc -fPIC -shared -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp -o dxlib.so.4.2 
-+コンパイル++ユーザプログラムとのリンク
-dxlib2のオブジェクトファイルとC言語ソースを合わせてコンパイルする。~+生成したライブラリファイルと自身のソースをリンクする。~
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~
ライブラリは必要に合わせて追加する。~ ライブラリは必要に合わせて追加する。~
-  gcc sample.c dxlib2.o -o sample -lpthread -lrt + $ gcc sample.c -ldxlib -o sample 
-+Windowsとの相違点~ + 
-起動時にattach()、終了時にdetach()を呼び出す。+なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。
**API [#ybae1454] **API [#ybae1454]
-dxlib2.dllは、シリアル通信を意識する必要が無いレベルで、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。+本ライブラリはシリアル通信を行うコードを記述しなくて良いのですが、デバイスIDという番号を用いて使用するシリアルI/Fを一元的に管理します。また、制御対象となるDynamixelのIDを指定し、そのコントロールテーブルへの読み書き行うAPIが用意されています。
-C言語のソースにdxlib2.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。+自身のC言語で記述されたソースプログラムにdxlib.hをインクルードする事で、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 
 + 
 +''注意事項'':~ 
 +DynamixelのStatus Return Levelを必ず''2''に設定した上で使用する事。それ以外の値が設定されていた場合はAPIが想定した応答が得られず、タイムアウトするまでAPIから返らない。
***DX_OpenPort [#zbd2f6ef] ***DX_OpenPort [#zbd2f6ef]
-ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、ユニークな[[DXDEVICEID>#DXDEVICEID]]を返す。以後はこの[[DXDEVICEID>#DXDEVICEID]]を使用して各APIを使用する。~ +ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、[[DX_SetBaudrate>#ba9f52b8]]を使用して通信速度を設定した後、ユニークな[[TDeviceID>#TDeviceID]]を返す。以後はこの[[TDeviceID>#TDeviceID]]を使用して各APIを使用する。~ 
-複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行い[[DXDEVICEID>#DXDEVICEID]]を取得しなくてはならない。 +複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行い[[TDeviceID>#TDeviceID]]を取得しなくてはならない。
- DXDEVICEID DX_OpenPort (char *pcom, long br);+なお、Linuxにおけるボーレートの指定に関しては、[[DX_SetBaudrate>#ba9f52b8]]の解説に注意の事。 
 + TDeviceID DX_OpenPort (char *name, uint32_t baud);
-パラメータ -パラメータ
---char '''*pcom'''+--char '''*name'''
~インターフェースが提供するCOMポート名。~ ~インターフェースが提供するCOMポート名。~
記述方法は[[こちら:http://support.microsoft.com/default.as​px?scid=kb;ja;JP115831]]の情報に従う。 記述方法は[[こちら:http://support.microsoft.com/default.as​px?scid=kb;ja;JP115831]]の情報に従う。
---long '''br'''+--long '''baud'''
~インターフェースとデバイス間の通信速度[bps]。 ~インターフェースとデバイス間の通信速度[bps]。
-戻り値 -戻り値
---[[DXDEVICEID>#DXDEVICEID]]~+--[[TDeviceID>#TDeviceID]]~
~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~
-使用例 -使用例
- DXDEVICEID dev;+ TDeviceID dev;
 // COM10を9600bpsでオープン  // COM10を9600bpsでオープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);  dev = DX_OpenPort ("\\\\.\\COM10", 9600);
Line 240: Line 335:
***DX_ClosePort [#w1ab7cbb] ***DX_ClosePort [#w1ab7cbb]
DX_OpenPortで開いたCOMポートを閉じる。~ DX_OpenPortで開いたCOMポートを閉じる。~
-DX_ClosePortが実行された以後は指定された[[DXDEVICEID>#DXDEVICEID]]での通信が行えなくなる。 +DX_ClosePortが実行された以後は指定された[[TDeviceID>#TDeviceID]]での通信が行えなくなる。 
- BOOL DX_ClosePort (DXDEVICEID dvid);+ bool DX_ClosePort (TDeviceID dvid);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。+~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
-戻り値 -戻り値
---BOOL +--bool 
-~クローズに成功した場合はTRUE、失敗した場合はFALSEを返す。+~クローズに成功した場合はtrue、失敗した場合はfalseを返す。
-使用例 -使用例
- DXDEVICEID dev;+ TDeviceID dev;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);  dev = DX_OpenPort ("\\\\.\\COM10", 9600);
Line 258: Line 353:
 }  }
-***DX_ChangeBaudrate [#ba9f52b8] +***DX_SetBaudrate [#ba9f52b8] 
-既にオープンされている[[DXDEVICEID>#DXDEVICEID]]の通信速度の変更を行う。~ +既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ 
-実行すると強制的に受信バッファがクリアされる。 +実行すると強制的に受信バッファがクリアされる。
- BOOL DX_ChangeBaudrate (DXDEVICEID dvid, long br);+なお、Linux環境におけるボーレートの設定は、POSIX.1でサポートする値(50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000)であればtcsetattrを使用して処理するが、これらの値に当てはまらない場合はioctrlを使用する。その際I/Fがこれらのボーレートに対応していなかったり、ioctrlをサポートしない場合、本APIは失敗する。 
 + bool DX_SetBaudrate (TDeviceID dvid, long baud);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---long '''br'''~+--long '''baud'''~
~新しい通信速度[bps]。 ~新しい通信速度[bps]。
-戻り値 -戻り値
---BOOL +--bool 
-~通信速度の変更が成功するとTRUE、失敗するとFALSE。~+~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~
-使用例 -使用例
- DXDEVICEID dev;+ TDeviceID dev;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);  dev = DX_OpenPort ("\\\\.\\COM10", 9600);
 if (dev) {  if (dev) {
   // 通信速度を1M[bps]に変更    // 通信速度を1M[bps]に変更
-   DX_ChangeBaudrate (dev, 1000000);+   DX_SetBaudrate (dev, 1000000);
   ... (中略)    ... (中略)
   // クローズ    // クローズ
Line 283: Line 379:
***DX_Active [#ie20e4a7] ***DX_Active [#ie20e4a7]
-指定された[[DXDEVICEID>#DXDEVICEID]]のポートが使用可能であるかを確認する。+指定された[[TDeviceID>#TDeviceID]]のポートが開かれており、使用可能であるかを確認する。
-USB接続等によりインターフェースが取り外し可能な場合に、実際に使用可能であるかを判断するために使用するが、状況によっては正確に判断できない場合もある。 +USB接続等によりインターフェース自体が取り外し可能な場合に、実際に使用可能であるかを判断するために使用するが、状況によっては正確に判断できない場合もある。 
- BOOL DX_Active (DXDEVICEID dvid);+ bool DX_Active (TDeviceID dvid);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。+~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
-戻り値 -戻り値
---BOOL +--bool 
-~指定されたdvidが使用可能な場合はTRUE、使用不可の場合はFALSE。+~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。
-使用例 -使用例
- DXDEVICEID dev;+ TDeviceID dev;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 9600);  dev = DX_OpenPort ("\\\\.\\COM10", 9600);
Line 303: Line 399:
   DX_ClosePort (dev);    DX_ClosePort (dev);
 }  }
 +
 +***DX_SetTimeOutOffset [#h4a1b54e]
 +I/FやOSの都合で生じるであろうタイムラグを予め設定する。~
 +ライブラリ内で想定した受信時間と指定されたタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理される。~
 +デフォルトは20。
 + void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime);
 +-パラメータ
 +--[[TDeviceID>#TDeviceID]] '''dvid'''
 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
 +--uint32_t '''offsettime'''
 +~タイムアウトオフセット時間[ms]
 +-戻り値
 +--bool
 +~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。
***DX_Ping [#v393b505] ***DX_Ping [#v393b505]
PINGインストラクションを使用して対象IDからの応答を確認する。 PINGインストラクションを使用して対象IDからの応答を確認する。
- BOOL DX_Ping (DXDEVICEID dvid, UCHAR id, int timeout, TDxErrorCode *errcode);+ bool DX_Ping (TDeviceID dvid, uint8_t id, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id''' +--uint8_t '''id''' 
-~対象とするID (0~253, 254)。 +~対象とするID (0~254)。 
---int '''timeout''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err;+ TErrorCode err;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 57143);  dev = DX_OpenPort ("\\\\.\\COM10", 57143);
 if (dev) {  if (dev) {
   // ID=1にPINGを発行    // ID=1にPINGを発行
-   if (DX_Ping (dev, 1, 100, &err))+   if (DX_Ping (dev, 1, &err))
     printf ("Found [%08X]\n", err);      printf ("Found [%08X]\n", err);
   else    else
Line 335: Line 443:
***DX_Ping2 [#g16504b3] ***DX_Ping2 [#g16504b3]
-PINGインストラクションを使用して不特定の対象の応答を確認する。 +PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ 
- BOOL DX_Ping (DXDEVICEID dvid, UCHAR *id, int timeout, TDxErrorCode *errcode);+応答時間がDynamixelの種類によって差があるため、それらが混在している環境では正確な情報を取得できない場合がある。 
 + bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''*id''' +--uint32_t '''*num''' 
-~検索で見つかったIDの保存先。 +~検索する最大数及び検索で見つかったデバイス数の保存先。 
---int '''timeout''' +--[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' 
-~受信タイムアウト[ms]。 +~検索で見つかったデバイス情報の保存先。~ 
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+少なくともnumで指定したサイズを確保しておく必要がある。 
 +--[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- DXDEVICEID   dev; + TDeviceID   dev; 
- TDxErrorCode err; + TErrorCode  err; 
- UCHAR        id;+ uint8_t    id
 + TDxAlarmStatus stat[254]; 
 + int        i; 
 + uint32_t    num = 254;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 57143);  dev = DX_OpenPort ("\\\\.\\COM10", 57143);
 if (dev) {  if (dev) {
   // 不明な対象に対してPINGを発行    // 不明な対象に対してPINGを発行
-   if (DX_Ping (dev, &id, 100, &err)) +   // numには予め254の値を指定したので、最大254台まで見つけようとする 
-     printf ("Found ID=%d [%08X]\n", id, err); +   if (DX_Ping2 (dev, &num, stat, &err)) { 
-   else +     // 1台以上見つかるとnumには見つかった数が返ってくる 
-     printf ("Not found [%08X]\n", err);+     for (i = 0; i < num; i++) 
 +       printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); 
 +   }
   // クローズ    // クローズ
   DX_ClosePort (dev);    DX_ClosePort (dev);
Line 367: Line 482:
***DX_ReadByteData [#u7d86432] ***DX_ReadByteData [#u7d86432]
対象IDのコントロールテーブルから1バイトのデータを読み出す。 対象IDのコントロールテーブルから1バイトのデータを読み出す。
- BOOL DX_ReadByteData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR *result, int timeout, TDxErrorCode *errcode);+ bool DX_ReadByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---UCHAR '''*result'''+--uint8_t '''*rdata'''
~読み出した値の保存先。 ~読み出した値の保存先。
---int '''timeout''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR dat;+ uint8_t    dat;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
-   // ID=1のAX-12+からLEDの状態を取得 +   // ID=1のAX-12からLEDの状態を取得 
-   if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) {+   if (DX_ReadByteData (dev, 1, 25, &dat, &err)) {
     printf ("LED STAT=%d\n", dat);      printf ("LED STAT=%d\n", dat);
   }    }
Line 400: Line 513:
***DX_WriteByteData [#ma2205f0] ***DX_WriteByteData [#ma2205f0]
対象IDのコントロールテーブルへ1バイトのデータを書き込む。 対象IDのコントロールテーブルへ1バイトのデータを書き込む。
- BOOL DX_WriteByteData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR dat, int timeout, TDxErrorCode *errcode);+ bool DX_WriteByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t dat, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---UCHAR '''dat'''~+--uint8_t '''dat'''~
~書き込む値。 ~書き込む値。
---int '''timeout''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR dat;+ uint8_t    dat;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
-   // ID=1のAX-12+からLEDの状態を取得 +   // ID=1のAX-12からLEDの状態を取得 
-   if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) { +   if (DX_ReadByteData (dev, 1, 25, &dat, &err)) { 
-     dat ~= 1; // ビット反転 +     dat ^= 1; // ビット反転 
-     // ID=1のAX-12+へLEDの状態を設定 +     // ID=1のAX-12へLEDの状態を設定 
-     DX_WriteByteData (dev, 1, 25, 1, 100, &err);+     DX_WriteByteData (dev, 1, 25, dat, &err);
   }    }
   DX_ClosePort (dev);    DX_ClosePort (dev);
Line 436: Line 547:
***DX_ReadWordData [#x202d573] ***DX_ReadWordData [#x202d573]
対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。 対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。
- BOOL DX_ReadWordData (DXDEVICEID dvid, UCHAR id, UCHAR adr, USHORT *result, int timeout, TDxErrorCode *errcode);+ bool DX_ReadWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t *rdata, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---USHORT '''*result'''+--uint16_t '''*rdata'''
~読み出した値の保存先。 ~読み出した値の保存先。
---int '''timeout''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- USHORT dat;+ uint16_t  dat;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
-   // ID=1のAX-12+から現在位置を取得 +   // ID=1のAX-12から現在位置を取得 
-   if (DX_ReadWordData (dev, 1, 36, &dat, 100, &err)) {+   if (DX_ReadWordData (dev, 1, 36, &dat, &err)) {
     printf ("PRESENT POS=%d\n", dat);      printf ("PRESENT POS=%d\n", dat);
   }    }
Line 469: Line 578:
***DX_WriteWordData [#pcc1b3ce] ***DX_WriteWordData [#pcc1b3ce]
対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。 対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。
- BOOL DX_WriteWordData (DXDEVICEID dvid, UCHAR id, UCHAR adr, USHORT dat, int timeout, TDxErrorCode *errcode);+ bool DX_WriteWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t dat, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---USHORT '''dat'''+--uint16_t '''dat'''
~書き込む値。 ~書き込む値。
---int '''timeout''' +--[[TErrorCode>#TErrorCode]] '''*errcode'''
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err;+ TErrorCode err;
 // オープン  // オープン
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
-   // ID=1のAX-12+へ位置(511)を指令 +   // ID=1のAX-12へ位置(511)を指令 
-   DX_WriteWordData (dev, 1, 30, 511, 100, &err);+   DX_WriteWordData (dev, 1, 30, 511, &err); 
 +   DX_ClosePort (dev); 
 + } 
 + 
 +***DX_ReadLongData [#w341e7a5] 
 +対象IDのコントロールテーブルから2ワード(4バイト)のデータを読み出す。 
 + bool DX_ReadLongData(TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t *rdata, TErrorCode *err); 
 +-パラメータ 
 +--[[TDeviceID>#TDeviceID]] '''dvid''' 
 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
 +--uint8_t '''id''' 
 +~対象とするID (0~253)。 
 +--uint16_t '''adr''' 
 +~コントロールテーブルのアドレス。 
 +--uint32_t '''*rdata''' 
 +~読み出した値の保存先。 
 +--[[TErrorCode>#TErrorCode]] '''*err''' 
 +~エラーコード。 
 +-戻り値 
 +--bool 
 +~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ 
 +-使用例 
 + TDeviceID  dev; 
 + TErrorCode err; 
 + uint32_t  dat; 
 + // オープン 
 + dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
 + if (dev) { 
 +   // ID=1のXM430から現在位置を取得 
 +   if (DX_ReadLongData (dev, 1, 132, &dat, &err)) { 
 +     printf ("PRESENT POS=%d\n", dat); 
 +   } 
 +   DX_ClosePort (dev); 
 + } 
 + 
 +***DX_WriteLongData [#k42e5e5f] 
 +対象IDのコントロールテーブルへ2ワード(4バイト)のデータを書き込む。 
 + bool DX_WriteLongData(TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t dat, TErrorCode *err); 
 +-パラメータ 
 +--[[TDeviceID>#TDeviceID]] '''dvid''' 
 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
 +--uint8_t '''id''' 
 +~対象とするID (0~253, 254)。 
 +--uint16_t '''adr''' 
 +~コントロールテーブルのアドレス。 
 +--uint32_t '''dat''' 
 +~書き込む値。 
 +--[[TErrorCode>#TErrorCode]] '''*errcode''' 
 +~エラーコード。 
 +-戻り値 
 +--bool 
 +~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ 
 +BROADCASTING IDを指定した場合は応答待ちを行わない。 
 +-使用例 
 + TDeviceID  dev; 
 + TErrorCode err; 
 + // オープン 
 + dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
 + if (dev) { 
 +   // ID=1のXM430へ位置(1024)を指令 
 +   DX_WriteLongData (dev, 1, 30, 1024, &err);
   DX_ClosePort (dev);    DX_ClosePort (dev);
 }  }
Line 500: Line 667:
***DX_ReadBlockData [#b8a1ae1e] ***DX_ReadBlockData [#b8a1ae1e]
対象IDのコントロールテーブルから指定サイズのデータを読み出す。 対象IDのコントロールテーブルから指定サイズのデータを読み出す。
- BOOL DX_ReadBlockData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR size, UCHAR *result, int timeout, TDxErrorCode *errcode);+ bool DX_ReadBlockData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---UCHAR '''size'''+--uint8_t '''*rdata''' 
 +~読み出したデータの保存先。 
 +--uint32_t '''len'''
~読み出すデータのサイズ。 ~読み出すデータのサイズ。
---UCHAR '''*result''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~読み出したデータの保存先。 +
---int '''timeout''' +
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR        comp[4];+ uint8_t    comp[4];
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
   // ID=1のAX-12+からコンプライアンスのデータを取得    // ID=1のAX-12+からコンプライアンスのデータを取得
-   if (DX_ReadBlockData (dev, 1, 26, 4, comp, 100, &err) {+   if (DX_ReadBlockData (dev, 1, 26, comp, 4, &err) {
     printf (      printf (
     "CWM=%d CCWM=%d CWS=%d CCWS=%d\n",      "CWM=%d CCWM=%d CWS=%d CCWS=%d\n",
Line 537: Line 702:
***DX_WriteBlockData [#fcf55aa0] ***DX_WriteBlockData [#fcf55aa0]
対象IDのコントロールテーブルへ指定サイズのデータを書き込む。 対象IDのコントロールテーブルへ指定サイズのデータを書き込む。
- BOOL DX_WriteBlockData (DXDEVICEID dvid, UCHAR id, UCHAR adr, UCHAR size, UCHAR *dat, int timeout, TDxErrorCode *errcode);+ bool DX_WriteBlockData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *dat, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''id'''+--uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---UCHAR '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
---UCHAR '''size'''+--uint8_t '''*dat''' 
 +~書き込むデータの保存先。 
 +--uint32_t '''len'''
~書き込むデータのサイズ。 ~書き込むデータのサイズ。
---UCHAR '''*dat''' +--[[TErrorCode>#TErrorCode]] '''*err'''
-~書き込むデータの保存先。 +
---int '''timeout''' +
-~受信タイムアウト[ms]。 +
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~正常な応答が得られた場合はTRUE、それ以外はFALSE。~+~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR        comp[4] = { 0, 1, 200, 200 };+ uint8_t    comp[4] = { 0, 1, 200, 200 };
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
   // ID=1のAX-12+のコンプライアンスを変更    // ID=1のAX-12+のコンプライアンスを変更
-   DX_WriteBlockData (dev, 1, 26, 4, comp, 100, &err);+   DX_WriteBlockData (dev, 1, 26, comp, 4, &err);
   DX_ClosePort (dev);    DX_ClosePort (dev);
 }  }
 +
 +***DX_ReadSyncData [#oc111b2e]
 +SYNCインストラクションには読み出し機能が無いが、DX_ReadBlockDataを使用して指定された複数IDからブロック読み出しを行う。正確には「同期」していない。
 + bool DX_ReadSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, uint8_t *retdat, TErrorCode *err);
 +-パラメータ
 +--[[TDeviceID>#TDeviceID]] '''dvid'''
 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
 +--uint8_t '''*dat'''
 +~読み出す情報の保存先~
 +[addr][length][ID1][ID2]...[IDn]~
 +addr:先頭アドレス (1バイト)~
 +length:先頭アドレスからのバイト数 (1バイト)~
 +IDn:読み出す対象IDを列挙 (nバイト)。
 +--uint32_t '''size'''
 +~datのサイズ。
 +--uint8_t '''result'''~
 +読み出したデータの保存先~
 +[ID1][ALARM1][DATA1_0]....[DATA1_m]~
 +[ID2][ALARM2][DATA2_0]....[DATA2_m]~
 +...
 +[IDn][ALARMn][DATAn_0]....[DATAn_m]~
 +IDn:対象ID (1バイト)~
 +ALARMn:TErrorCode (2バイト)~
 +DATAn_m:読み出されたデータ
 +--[[TErrorCode>#TErrorCode]] '''*err'''
 +~エラーコード。
 +-戻り値
 +--bool
 +~指定された全てのIDに対する読み出しが正常に完了したらtrue、それ以外はfalseを返す。~
***DX_WriteSyncData [#v566e16b] ***DX_WriteSyncData [#v566e16b]
SYNCインストラクションを使用して複数IDへブロック書き込みを行う。~ SYNCインストラクションを使用して複数IDへブロック書き込みを行う。~
書き込まれるデータの構成はユーザに委ねられる。 書き込まれるデータの構成はユーザに委ねられる。
- BOOL DX_WriteSyncData (DXDEVICEID dvid, UCHAR size, UCHAR *dat, TDxErrorCode *errcode);+ bool DX_WriteSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''size''' +--uint8_t '''*dat'''
-~パラメータのサイズ。 +
---UCHAR '''*dat'''+
~書き込むパラメータの保存先。 ~書き込むパラメータの保存先。
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+--uint32_t '''size''' 
 +~パラメータのサイズ。 
 +--[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
---BOOL +--bool 
-~インターフェースより送信が行われた場合はTRUE、それ以外はFALSE。~+~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
 #define _POS1 (400)  #define _POS1 (400)
 #define _POS2 (511)  #define _POS2 (511)
- +  
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR        param[8] = {+ uint8_t    param[8] = {
   30,    // アドレス (Goal Position)    30,    // アドレス (Goal Position)
   2,    // データ長 (2 byte)    2,    // データ長 (2 byte)
Line 602: Line 794:
   _POS2 >> 8    _POS2 >> 8
 };  };
 + 
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
-   // 2つのAX-12+へ同時に位置を指令 +   // 2つのAX-12へ同時に位置を指令 
-   DX_WriteSyncData (dev, 8, param, &err);+   DX_WriteSyncData (dev, param, 8, &err);
   DX_ClosePort (dev);    DX_ClosePort (dev);
 };  };
Line 612: Line 804:
***DX_TxPacket [#r051327a] ***DX_TxPacket [#r051327a]
任意のインストラクションパケットを送信する。 任意のインストラクションパケットを送信する。
- int DX_TxPacket (DXDEVICEID dvid, UCHAR cID, TInstruction cInst, UCHAR *pParam, int iLength, TDxErrorCode *errcode);+ bool DX_TxPacket (TDeviceID dvid, uint8_t id, TInstruction inst, uint8_t *param, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''cID'''+--uint8_t '''id'''
~対象とするID (0~254)。 ~対象とするID (0~254)。
---[[TInstruction>#TInstruction]] '''cInst''' +--[[TInstruction>#TInstruction]] '''inst''' 
-~使用するインストラクションの種類。 +~使用するインストラクション。 
---UCHAR '''*pParam'''+--uint8_t '''*param'''
~送信するパラメータの保存先。 ~送信するパラメータの保存先。
---int '''iLength'''~+--uint32_t '''len'''~
~送信するパラメータのサイズ。 ~送信するパラメータのサイズ。
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+--[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
-~インターフェースより送信が行われた場合は送信バイト数、それ以外は0。+~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。
-使用例 -使用例
- DXDEVICEID  dev; + TDeviceID  dev; 
- TDxErrorCode err; + TErrorCode err; 
- UCHAR        param[2] = {+ uint8_t    param[2] = {
   25,    // アドレス (LED)    25,    // アドレス (LED)
   0,    // データ    0,    // データ
Line 644: Line 836:
***DX_RxPacket [#r280cda8] ***DX_RxPacket [#r280cda8]
ステータスパケットを受信する。~ ステータスパケットを受信する。~
-基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。 +基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。
- int DX_RxPacket (DXDEVICEID dvid, UCHAR *pRcv, int sz, int readsize, int *pLength, int timeout, TDxErrorCode *errcode);+なお、本APIは[[DX_SetTimeOutOffset>#h4a1b54e]]で設定されたオフセット値は使用せず、引数で指定された受信タイムアウトのみが適用される。 
 + bool DX_RxPacket (TDeviceID dvid, uint8_t *rdata, uint32_t rdatasize, uint32_t *rlen, uint32_t timeout, TErrorCode *err);
-パラメータ -パラメータ
---[[DXDEVICEID>#DXDEVICEID]] '''dvid''' +--[[TDeviceID>#TDeviceID]] '''dvid''' 
-~DX_OpenPortで開いた際の[[DXDEVICEID>#DXDEVICEID]]。 +~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 
---UCHAR '''*pRcv'''+--uint8_t '''*rdata'''
~受信バッファ。~ ~受信バッファ。~
ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。 ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。
---int '''sz''' +--uint32_t '''readsize''' 
-~受信バッファのサイズ。~ +~rdataのサイズ。
---int '''readsize''' +--uint32_t '''*rlen'''
-~予定されるステータスパケットのサイズ。 +
---int '''*pLength'''+
~実際に受信されたステータスパケットのサイズ。 ~実際に受信されたステータスパケットのサイズ。
--int '''timeout''' --int '''timeout'''
~受信タイムアウト[ms]。 ~受信タイムアウト[ms]。
---[[TDxErrorCode>#TDxErrorCode]] '''*errcode'''+--[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
-戻り値 -戻り値
-~受信成功時は受信データ長、失敗時は0。+~受信成功時はtrue、それ以外はfalseを返す。
-使用例 -使用例
- int         i, len+ int       i; 
- DXDEVICEID   dev; + uint32_t   len; 
- TDxErrorCode err; + TDeviceID  dev; 
- UCHAR        param[2] = {+ TErrorCode err; 
 + uint8_t    param[2] = {
   25,    // アドレス (LED)    25,    // アドレス (LED)
   1,    // サイズ    1,    // サイズ
 };  };
 + 
 dev = DX_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
Line 678: Line 870:
   if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) {    if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) {
     // ステータスパケットを受信      // ステータスパケットを受信
-     DX_RxPacket (dev, dat, sizeof (dat), 7, &len, 100, &err);+     DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &err);
     for (i = 0; i < len; i++) {      for (i = 0; i < len; i++) {
       printf ("[%02X]", dat[i]);        printf ("[%02X]", dat[i]);
Line 685: Line 877:
   DX_ClosePort (dev);    DX_ClosePort (dev);
 };  };
-***DXLIB2のオリジナルな定義 [#af9ca340] + 
-&aname(DXDEVICEID); +***DXLIBのオリジナルな定義 [#af9ca340] 
-:DXDEVICEID | ''(unsigned int|unsigned long long)''~+&aname(TDeviceID); 
 +:TDeviceID | ''(uint32_t|uint64_t)''~
インターフェース毎に割り当てられるユニークな値。DX_OpenPortにて自動的に生成される。 インターフェース毎に割り当てられるユニークな値。DX_OpenPortにて自動的に生成される。
&aname(TInstruction);~ &aname(TInstruction);~
-:TInstruction | ''(UCHAR)''~+:TInstruction | ''(uint8_t)''~
DX_TxPacketにてインストラクションパケットを送信する場合に使用される。~ DX_TxPacketにてインストラクションパケットを送信する場合に使用される。~
使用可能なマクロは以下の通り。~ 使用可能なマクロは以下の通り。~
Line 701: Line 894:
INST_SYNC_WRITE~ INST_SYNC_WRITE~
INST_SYNG_REG_WRITE INST_SYNG_REG_WRITE
-&aname(TDxErrorCode); +&aname(TDxAlarmStatus); 
-:TDxErrorCode | ''(USHORT)''~ +:TDxAlarmStatus | struct {&br; uint8_t id;&br; TErrorCode Status;&br; 
-APIの内部処理とステータスパケットに含まれる16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。~+}~ 
 +idとTErrorCodeを対にした構造体。 
 +&aname(TErrorCode); 
 +:TErrorCode | ''(uint16_t)''~ 
 +API内で検出される16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。~
|CENTER:|LEFT:|LEFT:|c |CENTER:|LEFT:|LEFT:|c
|bit|macro name| |h |bit|macro name| |h
-|15|ERR_INVALID_DEVID|使用できないDXDEVICEID |+|15|ERR_INVALID_DEVID|使用できないTDeviceID |
|14|ERR_INVALID_ID|指定できないID | |14|ERR_INVALID_ID|指定できないID |
|13|ERR_DIFF_ID|異なるIDからの応答 | |13|ERR_DIFF_ID|異なるIDからの応答 |
Line 722: Line 919:
|1|ERR_DX_ANGLE|Angle Limitの範囲外にGoal Positionが指定された| |1|ERR_DX_ANGLE|Angle Limitの範囲外にGoal Positionが指定された|
|0|ERR_DX_OVERVOLTAGE|電源電圧が指定動作電圧の範囲を超えた| |0|ERR_DX_OVERVOLTAGE|電源電圧が指定動作電圧の範囲を超えた|
 +
 +**追加API [#i7e58b8f]
 +#include(DXL_intuitive,notitle)


Front page   Diff ReloadPrint View   Page list Search Recent changes   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)