19: 2013-03-29 (金) 02:09:00 takaboo ソース 現: 2021-10-08 (金) 21:38:39 takaboo ソース
Line 1: Line 1:
-TITLE:Dynamixel Library+TITLE:Dynamixel Protocol Library
**概要 [#va21cbfb] **概要 [#va21cbfb]
-Dynamixel LibraryはDynamixelの通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。+Dynamixel Protocol Libraryは[[DYNAMIXEL Communiation Protocol 1.0]]に対応した製品を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]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTE101]]・[[BTX229>http://emanual.robotis.com/docs​/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。[[BTE100]]の場合はRaspberry Piに依存します。
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f]
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。
--''2013/03/28 Ver.2.8''~ +-''2022/3/1 Ver.4.6''~ 
-#ref(http://www.besttechnology.co.jp/download/DXLIBforWin2.8.zip)+#ref(https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip) 
 +更新内容 
 +--最新GCC Developer Liteの更新に伴うコンパイル環境の調整 
 +--新しく追加されたDynamixelの定義を追加 
 +--コンパイル用バッチファイルの名称を変更 
 +--バッチファイル中のパスの指定はジャンクションを使用する事で空白を含むファイル名によるコンパイル時の問題を回避 
 +-2021/10/8 Ver.4.5~ 
 +更新内容 
 +#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V4.5.zip) 
 +--タイムアウトのデフォルトオフセット時間を30msに変更 
 +--全プラットホームにおけるコンパイル時のウォーニング抑止 
 +--Linux上における非標準ボーレート指定を許容 
 +--Linux環境における受信処理の見直し 
 +--追加APIの各デバイス毎の速度リミッタ見直し 
 +--追加APIのDX-116のモデル番号の誤記修正 
 +--Dynamixelの最新ファームに備わったTime-based profileに対応したAPI(DXL_SetDriveMode, DXL_SetDriveModesEquival, DXL_SetGoalAngleAndTime2, DXL_SetGoalAnglesAndTime2)を追加 
 +--makedll.batとbuild_dxlib.shの内容を一部変更 
 +--dxlib.py内のDXL_ScanDevicesの誤記修正 
 +--macOS暫定対応 
 +--C言語のサンプルコードをプラットホーム共通に 
 +--放置していたRubyのサンプルを修正 
 +-2021/1/22 Ver.4.4~ 
 +#ref(https://www.besttechnology.co.jp/do​wnload/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に戻す。 --名称をDXLIB2からDXLIBに戻す。
Line 21: Line 107:
--デバイスからのアラームステータスがAPIの応答に反映されないケースを修正。 --デバイスからのアラームステータスがAPIの応答に反映されないケースを修正。
-2011/07/20 Ver.2.6~ -2011/07/20 Ver.2.6~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.6.zip) 
内容 内容
--DX_SyncWriteDataをDX_WriteSyncDataへ改名。 --DX_SyncWriteDataをDX_WriteSyncDataへ改名。
Line 28: Line 113:
--古いバージョンの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 38: Line 121:
--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 44: Line 126:
--ゴミデータ受信時の停滞を解消。 --ゴミデータ受信時の停滞を解消。
-2011/03/03 Ver.2.3 -2011/03/03 Ver.2.3
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.3.zip) 
内容 内容
--内部のイベント処理がことごとく破綻していたのを修正。 --内部のイベント処理がことごとく破綻していたのを修正。
Line 50: Line 131:
--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 60: Line 139:
--新規ターゲット向けにサンプルを追加~ --新規ターゲット向けにサンプルを追加~
-2010/12/24 Ver.2.0~ -2010/12/24 Ver.2.0~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2forWin2.0.zip) 
内容 内容
--初期リリース~ --初期リリース~
-アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(注意:Ver2.8以降の記述に更新されています)+最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。
|DXLIB|dxlib_x32.dll|<|ライブラリ本体 | |DXLIB|dxlib_x32.dll|<|ライブラリ本体 |
|~|dxlib_x64.dll|<|~| |~|dxlib_x64.dll|<|~|
Line 71: Line 149:
|~|dxlib_x32.llb|<|MSVC用ライブラリ(定義のみ) | |~|dxlib_x32.llb|<|MSVC用ライブラリ(定義のみ) |
|~|dxlib_x64.lib|<|~| |~|dxlib_x64.lib|<|~|
-|~|dxlib.c|<|ライブラリソース |+|~|dxlib.cpp|<|ライブラリソース |
|~|dxlib.h|<|ライブラリヘッダ | |~|dxlib.h|<|ライブラリヘッダ |
 +|~|dxlib_matlab.h|<|matlab用ヘッダ |
 +|~|dxlib.py|<|python用API定義 |
|~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ | |~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ |
-|~|makelib.bat|<|ライブラリ再構築用バッチ | +|~|makelib.cmd|<|ライブラリ再構築用バッチ | 
-|~|83.bat|<|~+|~|build_dxlib.sh|<|Linux向けライブラリ再構築用スクリプト
-|SampleCode|GCCDeveloperLite|smpl1(template).c |サンプル | +|SampleCode|C|smpl??.c |サンプル | 
-|~|~|smpl2(ping).c |~+|~|~|dxmisc.h |サンプル共通設定
-|~|~|smpl3(byte_rw).c |~+|~|~|kbhit.h |kbhitエミュレーション
-|~|~|smpl4(word_rw).c |~+|~|~|makefile |サンプルコンパイル用makefile
-|~|~|smpl5(multithread).c |~| +|~|~|makeexe.cmd|Windows向け再構築用バッチ |
-|~|~|smpl6(sync).c |~| +
-|~|~|smpl7(rawpacket).c |~| +
-|~|~|smpl8(dualport).c |~| +
-|~|~|smpl9(DynamicLoad).c |~| +
-|~|~|smpl10(USS3).c |~|+
|~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 |
|~|~|dxmemmap.h |~| |~|~|dxmemmap.h |~|
Line 96: Line 171:
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 |
|~|~|dxlib_x64.dll |~| |~|~|dxlib_x64.dll |~|
-|~|LabVIEW2010|sample.vi |サンプル | +|~|Python|smpl??.py |サンプル | 
-|~|~|sample_mx.vi |~| +|~|~|kbhit.py |kbhitエミュレーション | 
-|~|~|synctest.vi |~| +|~|~|dxlib.py |DXLIBフォルダに収録されるものと同一
-|~|~|dbyte2byte.vi |サブvi +|~|~|dxlib_x32.dll |~| 
-|~|~|dbyte2word.vi |~+|~|~|dxlib_x64.dll |~
-|~|~|errcnt.vi |~| +|~|LabVIEW2011|sample??.vi |サンプル
-|~|~|DXLIB.llb |DXLIBラッパーライブラリ |+|~|~|DXLIB.llb |dllの呼び出しをvi化 | 
 +|~|~|DXLIB_DXL.llb |dllの呼び出しをvi化
 +|~|~|DXLIB_Wrapper.llb |アクチュエータに特化したvi |
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 |
|~|EXCEL|text.xls |サンプルシート | |~|EXCEL|text.xls |サンプルシート |
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 |
|~|~|dxlib_x64.dll |~| |~|~|dxlib_x64.dll |~|
-|~|Linux|smpl2.c |サンプル | +|~|Ruby|smpl??.rb |サンプル | 
-|~|~|smpl4.c |~| +|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一
-|~|Ruby|SMPL1.c |サンプル | +|~|~|dxlib_x64.dll |~|
-|~|~|SMPL3.c |~| +
-|~|Python|SMPL1.py |サンプル +
-|~|~|SMPL3.py |~|+
**開発環境毎の設定 [#u3ff03d9] **開発環境毎の設定 [#u3ff03d9]
-ここでは3つのツールで使用する場合の設定方法を説明します。ここで紹介しないツールでも必要とされる操作は概ね同様ですが、全てに対応できるとまでは明言しません。+サンプルを元にいくつかのツール・環境で使用する場合の設定方法を説明します。ここで紹介されないツールにおいても、dllを利用できるのであれば必要とされる操作は概ね同様だと思います。、
***GCC Developer Lite [#e1d4017c] ***GCC Developer Lite [#e1d4017c]
GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~ GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~
-'SampleCode\GCCDeveloperLite'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。+「基本パック」と「WINパック」を[[ダウンロード>GCC Developer Lite#DOWNLOAD]]してインストールしてください。 
 + 
 +'SampleCode\C'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
****DLLの静的リンク [#la562acf] ****DLLの静的リンク [#la562acf]
-静的にDLLを使用する場合は以下の手順でDLLをリンクする指定を行った上でコンパイルします。なお、コンパイル後のファイルを実行する際にDLLが同一のフォルダに存在しないと、プログラムは起動直後に異常終了してしまいます。+静的にDLLを使用する場合は以下の手順でDLLをリンクする指定を行った上でコンパイルします。なお32bit環境を前提とします。
+ファイルの準備~ +ファイルの準備~
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
Line 140: Line 216:
****DLLの動的リンク [#y15bf22f] ****DLLの動的リンク [#y15bf22f]
-動的にDLLを使用する場合はライブラリの追加登録やオプションの指定は必要ありませんが、ソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 +動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 
-&nbsp;#define _DYNAMICLOAD +#html{{ 
- #include "dxlib.h"+&lt;pre class="brush: c;"> 
 +#define _DYNAMICLOAD 
 +#include "dxlib.h" 
 +</pre> 
 +}}
これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。
 +#html{{
 +<pre class="brush: c;">
 +  TDeviceID  dev;
 +  // DLLを読み込み
 +  if (LoadDLL ()) {
 +   if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) {
 +     ...
 +     DX_ClosePort (dev);
 +   }
 +   // DLLを破棄
 +   UnloadDLL ();
 +  }
 +</pre>
 +}}
 +LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。
 +
 +****サンプルフォルダ内のmakefileを使用 [#h09786e4]
 +サンプルをコンパイルするだけならばGCC Developer Liteを起動する必要は無く、サンプルフォルダ内に同梱される「makeexe.cmd」を実行すればmakefileを読み込んでGCC Developer Liteに同梱されるmakeを使用してコンパイルします。~
 +引数にソース名をしていするとそのソースだけコンパイル、何も付けなければフォルダ内の拡張子がCのソースファイル全てがコンパイル対象となります。
 +#html{{
 +<pre class="brush: bash;">
 +makeexe smpl4_byte_rw (特定のソースのみコンパイル)
 +makeexe (カレントの全ソースをコンパイル)
 +</pre>
 +}}
 +なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。また64bit環境を優先します。
***Microsoft Visual C++ [#j5a74d33] ***Microsoft Visual C++ [#j5a74d33]
Line 164: Line 270:
***National Instruments LabVIEW [#mdd5d507] ***National Instruments LabVIEW [#mdd5d507]
-'SampleCode\LabVIEW2010'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ +'SampleCode\LabVIEW2011'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 
-[[LabVIEW2010:http://www.ni.com/labview/ja/]]には外部のDLLへアクセスする手段が提供されています。しかしながらDXLIBそのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB.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へ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB.pas内にdxlib_x32.dllないしdxlib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlibを追記すれば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]
-'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。+'SampleCode\Ruby'フォルダにサンプルが同梱されます。ライブラリ名・ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
-[[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ +[[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のライブラリはfiddleを使用してアクセスします。 
-&nbsp; require 'dl/import' +#html{{ 
-  molude dxlib +&lt;pre class="brush: ruby;"> 
-    extend DL::Importer +require "fiddle/import" 
-    dlload "./dxlib_x32.dll" + 
-    extern "int DX_OpenPort( char *, long )" +module DXLIB 
-  end +  extend Fiddle::Importer 
-  devid = dxlib.DX_OpenPort( "ポート名", ボーレート )+  dlload './dxlib_x32.dll' 
 +  extern 'void * DX_OpenPort( const char *, long )' 
 +  extern 'char DX_Active( void * )' 
 +  extern 'char DX_Ping( void *, unsigned char, unsigned short * )' 
 +  extern 'char DX_ClosePort( void * )' 
 +end 
 + 
 +devid = dxlib.DX_OpenPort( 'ポート名', ボーレート ) 
 +</pre> 
 +}} 
 + 
 +LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。
***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するだけで済みます。 
-&nbsp; dxlib = windll.LoadLibrary( "dxlib_x32.dll" ) # for window +#html{{ 
-&nbsp; dxlib = cdll.LoadLibrary( "./dxlib.so" )  # for linux+&lt;pre class="brush: python;"
 +from dxlib import * # dxlibをインポート 
 +&lt;/pre> 
 +}} 
 +なおdxlib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 
 + 
 +LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。
***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)」でdxlib_x32.dllとdxlib.hの格納されたパスを指定します。+~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib_x32.dll(MATALBが64bitの場合はdxlib_x64.dll)とdxlib_matlab.hの格納されたパスを指定します。dxlib.hはMATLABでは解釈できない記述が多いため使用しないでください。~
+DLLのロード +DLLのロード
- loadlibrary('dxlib_x32.dll','dxlib.h','alias','dxlib');+ loadlibrary('dxlib_x32.dll','dxlib_matlab.h','alias','dxlib')
+ポートのオープン +ポートのオープン
~ロードされたdxlibのDX_OpenPortを呼出します。関数名の後はポートとボーレートです。 ~ロードされたdxlibのDX_OpenPortを呼出します。関数名の後はポートとボーレートです。
- devid = calllib('dxlib','DX_OpenPort','\\.\COM3'​,1000000);+ devid = calllib('dxlib','DX_OpenPort','\\.\COM3'​,1000000)
+TErrorCodeの取得 +TErrorCodeの取得
-~TErrorCodeはポインタで引き渡している為、事前に型宣言をしておきます。値はErr.Valueで取得可能です。+~TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。
 Err = libpointer('uint16Ptr', 0);  Err = libpointer('uint16Ptr', 0);
- Ret = calllib('dxlib', '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('dxlib','DX_ClosePort',devi​d);+ calllib('dxlib','DX_ClosePort',devi​d)
+DLLのアンロード +DLLのアンロード
- unloadlibrary('dxlib');+ unloadlibrary('dxlib')
-***Linux [#w5c096b8] +***Linux & macOS[#w5c096b8] 
-Linux上でのdxlibのコンパイル方法を紹介します。+LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。
-+コンパイル準備++ダウンロードと展開
-ダウンロードファイルを解凍+ライブラリのアーカイブファイルをダウンロードし展開
-+オブジェクトファイルの作成~ +#html{{ 
-&nbsp; gcc dxlib.c -o dxlib.o +&lt;pre class="brush: bash;"> 
-+共有ライブラリの作成+wget https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip 
-RubyやPython等で使用する場合のみ。+unzip DXLIB_V4.6.zip 
-&nbsp; gcc -fPIC -shared dxlib.c -o dxlib.so +</pre> 
-+コンパイル+}} 
-dxlibのオブジェクトファイルとC言語ソースを合わせてコンパイルする。~++ライブラリ及び共有ライブラリの生成
 +DXLIBディレクトリに移動し同梱のスクリプトファイルを実行~ 
 +gccは予めインストールされている必要がある 
 +#html{{ 
 +&lt;pre class="brush: bash;"> 
 +cd DXLIB_v4.6/DXLIB 
 +bash ./build_dxlib.sh 
 +</pre> 
 +}} 
 +コンパイルが成功するとライブラリファイルがサンプルディレクトリにコピーされる 
 ++ユーザプログラムとのリンク
 +生成したライブラリファイルと自身のソースをリンクする。~
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~
-ライブラリは必要に合わせて追加する。+ライブラリ検索パスは必要に合わせて変更する。~ 
-&nbsp; gcc sample.c dxlib.o -o sample+#html{{ 
 +&lt;pre class="brush: bash;"> 
 +gcc sample.c -L. -ldxlib -o sample 
 +</pre> 
 +}} 
 + 
 +'SampleCode\C'のサンプルプログラムはmakeを使ってコンパイルできます。 
 +#html{{ 
 +<pre class="brush: bash;"> 
 +make smpl14_DXL_velocity (特定のソースのみコンパイル) 
 +make (カレントの全ソースをコンパイル) 
 +</pre> 
 +}} 
 +コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。またWindowsを前提とした_DYNAMICLOADマクロが宣言されているとコンパイルできません。~ 
 +なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。
**API [#ybae1454] **API [#ybae1454]
Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~
C言語のソースにdxlib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 C言語のソースにdxlib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。
 +
 +''注意事項'':~
 +DynamixelのStatus Return Levelを必ず''2''に設定した上で使用する事。それ以外の値が設定されていた場合はAPIが想定した応答が得られず、タイムアウトするまでAPIから返らない。
***DX_OpenPort [#zbd2f6ef] ***DX_OpenPort [#zbd2f6ef]
-ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、ユニークな[[TDeviceID>#TDeviceID]]を返す。以後はこの[[TDeviceID>#TDeviceID]]を使用して各APIを使用する。~ +ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、[[DX_SetBaudrate>#ba9f52b8]]を使用して通信速度を設定した後、ユニークな[[TDeviceID>#TDeviceID]]を返す。以後はこの[[TDeviceID>#TDeviceID]]を使用して各APIを使用する。~ 
-複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行い[[TDeviceID>#TDeviceID]]を取得しなくてはならない。 +複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行い[[TDeviceID>#TDeviceID]]を取得しなくてはならない。
- TDeviceID DX_OpenPort (char *name, long baud);+なお、Linuxにおけるボーレートの指定に関しては、[[DX_SetBaudrate>#ba9f52b8]]の解説に注意の事。 
 + TDeviceID DX_OpenPort (char *name, uint32_t baud);
-パラメータ -パラメータ
--char '''*name''' --char '''*name'''
Line 246: Line 419:
~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~
-使用例 -使用例
-&nbsp;TDeviceID dev; +#html{{ 
- // COM10を9600bpsでオープン +&lt;pre class="brush: c;"> 
- dev = DX_OpenPort ("\\\\.\\COM10", 9600);+TDeviceID dev; 
 +// COM10を9600bpsでオープン 
 +dev = DX_OpenPort ("\\\\.\\COM10", 9600); 
 +</pre> 
 +}}
***DX_ClosePort [#w1ab7cbb] ***DX_ClosePort [#w1ab7cbb]
Line 261: Line 438:
~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 ~クローズに成功した場合はtrue、失敗した場合はfalseを返す。
-使用例 -使用例
-&nbsp;TDeviceID dev; +#html{{ 
-&nbsp;// オープン +&lt;pre class="brush: c;"&gt
- dev = DX_OpenPort ("\\\\.\\COM10", 9600); +dev = DX_OpenPort ("\\\\.\\COM10", 9600); 
- if (dev) { +if (dev) { 
-  ... (中略) +  ... (中略) 
-  // クローズ +  // クローズ 
-  DX_ClosePort (dev); +  DX_ClosePort (dev); 
-&nbsp;}+} 
 +&lt;/pre> 
 +}}
-***DX_ChangeBaudrate [#ba9f52b8]+***DX_SetBaudrate [#ba9f52b8]
既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~
-実行すると強制的に受信バッファがクリアされる。 +実行すると強制的に受信バッファがクリアされる。~ 
- bool DX_ChangeBaudrate (TDeviceID dvid, long baud);+ bool DX_SetBaudrate (TDeviceID dvid, long baud);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 283: Line 462:
~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ ~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID dev; +#html{{ 
- // オープン +&lt;pre class="brush: c;"> 
- dev = DX_OpenPort ("\\\\.\\COM10", 9600); +TDeviceID dev; 
- if (dev) { +// オープン 
-  // 通信速度を1M[bps]に変更 +dev = DX_OpenPort ("\\\\.\\COM10", 9600); 
-  DX_ChangeBaudrate (dev, 1000000); +if (dev) { 
-  ... (中略) +  // 通信速度を1M[bps]に変更 
-  // クローズ +  DX_SetBaudrate (dev, 1000000); 
-  DX_ClosePort (dev); +  ... (中略) 
-&nbsp;}+  // クローズ 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_Active [#ie20e4a7] ***DX_Active [#ie20e4a7]
Line 305: Line 488:
~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 ~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。
-使用例 -使用例
-&nbsp;TDeviceID dev; +#html{{ 
- // オープン +&lt;pre class="brush: c;"> 
- dev = DX_OpenPort ("\\\\.\\COM10", 9600); +TDeviceID dev; 
- if (dev) { +// オープン 
-  while (DX_Active (dev)) { +dev = DX_OpenPort ("\\\\.\\COM10", 9600); 
-    ... (中略) +if (dev) { 
-  +  while (DX_Active (dev)) { 
-  // クローズ +    ... (中略) 
-  DX_ClosePort (dev); +  } 
-&nbsp;}+  // クローズ 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}
 + 
 +***DX_SetTimeOutOffset [#h4a1b54e] 
 +I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ 
 +内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ 
 +デフォルトは30[ms]。 
 + 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 (TDeviceID dvid, uint8_t id, int timeout, TErrorCode *err);+ bool DX_Ping (TDeviceID dvid, uint8_t id, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 ~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
--uint8_t '''id''' --uint8_t '''id'''
-~対象とするID (0~253)。 +~対象とするID (0~254)。
---int '''timeout''' +
-~受信タイムアウト[ms]+
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 332: Line 531:
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- // オープン +TDeviceID  dev; 
- dev = DX_OpenPort ("\\\\.\\COM10", 57143); +TErrorCode err; 
- if (dev) { +// オープン 
-  // ID=1にPINGを発行 +dev = DX_OpenPort ("\\\\.\\COM10", 57143); 
-  if (DX_Ping (dev, 1, 100, &err)) +if (dev) { 
-    printf ("Found [%08X]\n", err); +  // ID=1にPINGを発行 
-  else +  if (DX_Ping (dev, 1, &amp;err)) 
-    printf ("Not found [%08X]\n", err); +    printf ("Found [%08X]\n", err); 
-  // クローズ +  else 
-  DX_ClosePort (dev); +    printf ("Not found [%08X]\n", err); 
-&nbsp;}+  // クローズ 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_Ping2 [#g16504b3] ***DX_Ping2 [#g16504b3]
PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~
-BROADCASTING IDを指定した場合の応答がデバイスのシリーズによって差が生じるため、正確な情報を取得できない場合がある。 +BROADCASTING IDを指定した場合の応答時間はデバイスによって差があるため、異なるデバイスが混在している環境では正確な情報を取得できない場合がある。 
- bool DX_Ping2 (TDeviceID dvid, int *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);+ bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。 ~DX_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
---int '''*num'''+--uint32_t '''*num'''
~検索する最大数及び検索で見つかったデバイス数の保存先。 ~検索する最大数及び検索で見つかったデバイス数の保存先。
--[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' --[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus'''
~検索で見つかったデバイス情報の保存先。~ ~検索で見つかったデバイス情報の保存先。~
-少なくともnumで指定したサイズを確保しておく必要がある。+少なくともnumで指定したサイズ分の領域を確保しておく必要がある。
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 364: Line 567:
~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode  err; +&lt;pre class="brush: c;"> 
- uint8_t    id; +TDeviceID  dev; 
- TDxAlarmStatus stat[253]; +TErrorCode  err; 
- int        i, num = 100+uint8_t    id; 
- // オープン +TDxAlarmStatus stat[254]; 
- dev = DX_OpenPort ("\\\\.\\COM10", 57143); +int        i
- if (dev) { +uint32_t    num = 252
-  // 不明な対象に対してPINGを発行 +// オープン 
-  if (DX_Ping2 (dev, &num, stat, &err)) { +dev = DX_OpenPort ("\\\\.\\COM10", 57143); 
-    for (i = 0; i < num; i++) +if (dev) { 
-      printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); +  // 不明な対象に対してPINGを発行 
-  +  if (DX_Ping2 (dev, &amp;num, stat, &amp;err)) { 
-  // クローズ +    for (i = 0; i < num; i++) 
-  DX_ClosePort (dev); +      printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); 
-&nbsp;}+  } 
 +  // クローズ 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadByteData [#u7d86432] ***DX_ReadByteData [#u7d86432]
対象IDのコントロールテーブルから1バイトのデータを読み出す。 対象IDのコントロールテーブルから1バイトのデータを読み出す。
- bool DX_ReadByteData(TDeviceID dvid, uint8_t id, uint8_t adr, uint8_t *rdata, int timeout, TErrorCode *err);+ bool DX_ReadByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 389: Line 597:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint8_t '''*rdata''' --uint8_t '''*rdata'''
~読み出した値の保存先。 ~読み出した値の保存先。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 401: Line 607:
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint8_t    dat; +TDeviceID  dev; 
- // オープン +TErrorCode err; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +uint8_t    dat; 
- if (dev) { +// オープン 
-  // ID=1のAX-12からLEDの状態を取得 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) { +if (dev) { 
-    printf ("LED STAT=%d\n", dat); +  // ID=1のAX-12からLEDの状態を取得 
-  +  if (DX_ReadByteData (dev, 1, 25, &amp;dat, &amp;err)) { 
-  DX_ClosePort (dev); +    printf ("LED STAT=%d\n", dat); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteByteData [#ma2205f0] ***DX_WriteByteData [#ma2205f0]
対象IDのコントロールテーブルへ1バイトのデータを書き込む。 対象IDのコントロールテーブルへ1バイトのデータを書き込む。
- bool DXAPIDLL DX_WriteByteData(TDeviceID dvid, uint8_t id, uint8_t adr, uint8_t dat, int timeout, TErrorCode *err);+ bool DX_WriteByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t dat, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 422: Line 632:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint8_t '''dat'''~ --uint8_t '''dat'''~
~書き込む値。 ~書き込む値。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 435: Line 643:
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint8_t    dat; +TDeviceID  dev; 
- // オープン +TErrorCode err; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +uint8_t    dat; 
- if (dev) { +// オープン 
-  // ID=1のAX-12からLEDの状態を取得 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  if (DX_ReadByteData (dev, 1, 25, &dat, 100, &err)) { +if (dev) { 
-    dat ^= 1; // ビット反転 +  // ID=1のAX-12からLEDの状態を取得 
-    // ID=1のAX-12へLEDの状態を設定 +  if (DX_ReadByteData (dev, 1, 25, &amp;dat, &amp;err)) { 
-    DX_WriteByteData (dev, 1, 25, dat, 100, &err); +    dat ^= 1; // ビット反転 
-  +    // ID=1のAX-12へLEDの状態を設定 
-  DX_ClosePort (dev); +    DX_WriteByteData (dev, 1, 25, dat, &amp;err); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadWordData [#x202d573] ***DX_ReadWordData [#x202d573]
対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。 対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。
- bool DX_ReadWordData(TDeviceID dvid, uint8_t id, uint8_t adr, uint16_t *rdata, int timeout, TErrorCode *err);+ bool DX_ReadWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t *rdata, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 458: Line 670:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint16_t '''*rdata''' --uint16_t '''*rdata'''
~読み出した値の保存先。 ~読み出した値の保存先。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 470: Line 680:
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint16_t  dat; +TDeviceID  dev; 
- // オープン +TErrorCode err; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +uint16_t  dat; 
- if (dev) { +// オープン 
-  // ID=1のAX-12から現在位置を取得 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  if (DX_ReadWordData (dev, 1, 36, &dat, 100, &err)) { +if (dev) { 
-    printf ("PRESENT POS=%d\n", dat); +  // ID=1のAX-12から現在位置を取得 
-  +  if (DX_ReadWordData (dev, 1, 36, &amp;dat, &amp;err)) { 
-  DX_ClosePort (dev); +    printf ("PRESENT POS=%d\n", dat); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteWordData [#pcc1b3ce] ***DX_WriteWordData [#pcc1b3ce]
対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。 対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。
- bool DX_WriteWordData(TDeviceID dvid, uint8_t id, uint8_t adr, uint16_t dat, int timeout, TErrorCode *err);+ bool DX_WriteWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t dat, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 491: Line 705:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint16_t '''dat''' --uint16_t '''dat'''
~書き込む値。 ~書き込む値。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*errcode''' --[[TErrorCode>#TErrorCode]] '''*errcode'''
~エラーコード。 ~エラーコード。
Line 504: Line 716:
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- // オープン +TDeviceID  dev; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +TErrorCode err; 
- if (dev) { +// オープン 
-   // ID=1のAX-12へ位置(511)を指令 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  DX_WriteWordData (dev, 1, 30, 511, 100, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のAX-12へ位置(511)を指令 
-&nbsp;}+  DX_WriteWordData (dev, 1, 30, 511, &err)
 + ; DX_ClosePort (dev); 
 +
 +<;/pre> 
 +}} 
 + 
 +***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を返す。~ 
 +-使用例 
 +#html{{ 
 +<pre class="brush: c;"> 
 +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); 
 +
 +</pre> 
 +}} 
 + 
 +***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を指定した場合は応答待ちを行わない。 
 +-使用例 
 +#html{{ 
 +<pre class="brush: c;"> 
 +TDeviceID dev; 
 +TErrorCode err; 
 +// オープン 
 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
 +if (dev) { 
 +  // ID=1のXM430へ位置(1024)を指令 
 +  DX_WriteLongData (dev, 1, 30, 1024, &amp;err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadBlockData [#b8a1ae1e] ***DX_ReadBlockData [#b8a1ae1e]
対象IDのコントロールテーブルから指定サイズのデータを読み出す。 対象IDのコントロールテーブルから指定サイズのデータを読み出す。
- bool DX_ReadBlockData (TDeviceID dvid, uint8_t id, uint8_t adr, uint8_t *rdata, int len, int timeout, TErrorCode *err);+ bool DX_ReadBlockData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 522: Line 806:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253)。 ~対象とするID (0~253)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint8_t '''*rdata''' --uint8_t '''*rdata'''
~読み出したデータの保存先。 ~読み出したデータの保存先。
---int '''len'''+--uint32_t '''len'''
~読み出すデータのサイズ。 ~読み出すデータのサイズ。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 536: Line 818:
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint8_t    comp[4]; +TDeviceID  dev; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +TErrorCode err; 
- if (dev) { +uint8_t    comp[4]; 
-  // ID=1のAX-12+からコンプライアンスのデータを取得 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  if (DX_ReadBlockData (dev, 1, 26, comp, 4, 100, &err) { +if (dev) { 
-    printf ( +  // ID=1のAX-12+からコンプライアンスのデータを取得 
-      "CWM=%d CCWM=%d CWS=%d CCWS=%d\n", +  if (DX_ReadBlockData (dev, 1, 26, comp, 4, &amp;err) { 
-      comp[0], comp[1], comp[2], comp[3] +    printf ( 
-    ); +    "CWM=%d CCWM=%d CWS=%d CCWS=%d\n", 
-  +    comp[0], comp[1], comp[2], comp[3] 
-  DX_ClosePort (dev); +    ); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteBlockData [#fcf55aa0] ***DX_WriteBlockData [#fcf55aa0]
対象IDのコントロールテーブルへ指定サイズのデータを書き込む。 対象IDのコントロールテーブルへ指定サイズのデータを書き込む。
- bool DX_WriteBlockData(TDeviceID dvid, uint8_t id, uint8_t adr, uint8_t *dat, int len, int timeout, TErrorCode *err);+ bool DX_WriteBlockData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *dat, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 559: Line 845:
--uint8_t '''id''' --uint8_t '''id'''
~対象とするID (0~253, 254)。 ~対象とするID (0~253, 254)。
---uint8_t '''adr'''+--uint16_t '''adr'''
~コントロールテーブルのアドレス。 ~コントロールテーブルのアドレス。
--uint8_t '''*dat''' --uint8_t '''*dat'''
~書き込むデータの保存先。 ~書き込むデータの保存先。
---int '''len'''+--uint32_t '''len'''
~書き込むデータのサイズ。 ~書き込むデータのサイズ。
---int '''timeout''' 
-~受信タイムアウト[ms]。 
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 574: Line 858:
BROADCASTING IDを指定した場合は応答待ちを行わない。 BROADCASTING IDを指定した場合は応答待ちを行わない。
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint8_t    comp[4] = { 0, 1, 200, 200 }; +TDeviceID  dev; 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +TErrorCode err; 
- if (dev) { +uint8_t    comp[4] = { 0, 1, 200, 200 }; 
-  // ID=1のAX-12+のコンプライアンスを変更 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  DX_WriteBlockData (dev, 1, 26, comp, 4, 100, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のAX-12+のコンプライアンスを変更 
-&nbsp;}+  DX_WriteBlockData (dev, 1, 26, comp, 4, &amp;err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}
 + 
 +***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 (TDeviceID dvid, uint8_t *dat, int size, TErrorCode *err);+ bool DX_WriteSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 593: Line 910:
--uint8_t '''*dat''' --uint8_t '''*dat'''
~書き込むパラメータの保存先。 ~書き込むパラメータの保存先。
---int '''size'''+--uint32_t '''size'''
~パラメータのサイズ。 ~パラメータのサイズ。
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
Line 601: Line 918:
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;#define _POS1 (400) +#html{{ 
- #define _POS2 (511)+&lt;pre class="brush: c;"> 
 +#define _POS1 (400) 
 +#define _POS2 (511)
- TDeviceID  dev; +TDeviceID  dev; 
- TErrorCode err; +TErrorCode err; 
- uint8_t    param[8] = { +uint8_t    param[8] = { 
-  30,    // アドレス (Goal Position) +  30,    // アドレス (Goal Position) 
-  2,    // データ長 (2 byte) +  2,    // データ長 (2 byte) 
-  // ID=1用データ +  // ID=1用データ 
-  1, +  1, 
-  _POS1 & 0xff, +  _POS1 &amp; 0xff, 
-  _POS1 >> 8, +  _POS1 >> 8, 
-  // ID=2用データ +  // ID=2用データ 
-  2, +  2, 
-  _POS2 & 0xff, +  _POS2 &amp; 0xff, 
-  _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, param, 8, &err); +  DX_WriteSyncData (dev, param, 8, &amp;err); 
-  DX_ClosePort (dev); +  DX_ClosePort (dev); 
-&nbsp;};+} 
 +&lt;/pre>; 
 +}}
***DX_TxPacket [#r051327a] ***DX_TxPacket [#r051327a]
任意のインストラクションパケットを送信する。 任意のインストラクションパケットを送信する。
- bool DX_TxPacket (TDeviceID dvid, uint8_t id, TInstruction inst, uint8_t *param, int len, TErrorCode *err);+ bool DX_TxPacket (TDeviceID dvid, uint8_t id, TInstruction inst, uint8_t *param, uint32_t len, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 638: Line 959:
--uint8_t '''*param''' --uint8_t '''*param'''
~送信するパラメータの保存先。 ~送信するパラメータの保存先。
---int '''len'''~+--uint32_t '''len'''~
~送信するパラメータのサイズ。 ~送信するパラメータのサイズ。
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
Line 645: Line 966:
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;pre class="brush: c;"> 
- uint8_t    param[2] = { +TDeviceID  dev; 
-  25,    // アドレス (LED) +TErrorCode err; 
-  0,    // データ +uint8_t    param[2] = { 
- }; +  25,    // アドレス (LED) 
- dev = DX_OpenPort ("\\\\.\\COM10", 1000000); +  0,    // データ 
- if (dev) { +}; 
-  // ID=1のAX-12+のLEDを消灯 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のAX-12+のLEDを消灯 
-&nbsp;};+  DX_TxPacket (dev, 1, INST_WRITE, param, 2, &amp;err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre>; 
 +}}
***DX_RxPacket [#r280cda8] ***DX_RxPacket [#r280cda8]
ステータスパケットを受信する。~ ステータスパケットを受信する。~
-基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。 +基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。
- bool DXAPIDLL DX_RxPacket (TDeviceID dvid, uint8_t *rdata, int rdatasize, int *rlen, int timeout, TErrorCode *err);+なお、本APIは[[DX_SetTimeOutOffset>#h4a1b54e]]で設定されたオフセット値は使用せず、引数で指定された受信タイムアウトのみが適用される。 
 + bool DX_RxPacket (TDeviceID dvid, uint8_t *rdata, uint32_t rdatasize, uint32_t *rlen, uint32_t timeout, TErrorCode *err);
-パラメータ -パラメータ
--[[TDeviceID>#TDeviceID]] '''dvid''' --[[TDeviceID>#TDeviceID]] '''dvid'''
Line 668: Line 994:
~受信バッファ。~ ~受信バッファ。~
ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。 ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。
---int '''readsize'''+--uint32_t '''readsize'''
~rdataのサイズ。~ ~rdataのサイズ。~
---int '''*rlen'''+--uint32_t '''*rlen'''
~実際に受信されたステータスパケットのサイズ。 ~実際に受信されたステータスパケットのサイズ。
--int '''timeout''' --int '''timeout'''
Line 679: Line 1005:
~受信成功時はtrue、それ以外はfalseを返す。 ~受信成功時はtrue、それ以外はfalseを返す。
-使用例 -使用例
-&nbsp;int        i, len; +#html{{ 
- TDeviceID  dev; +&lt;pre class="brush: c;"> 
- TErrorCode err; +int        i
- uint8_t    param[2] = { +uint32_t  len; 
-  25,    // アドレス (LED) +TDeviceID  dev; 
-  1,    // サイズ +TErrorCode err; 
- };+uint8_t    param[2] = { 
 +  25,    // アドレス (LED) 
 +  1,    // サイズ 
 +};
- 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_TxPacket (dev, 1, INST_READ, param, 2, &err)) { +  if (DX_TxPacket (dev, 1, INST_READ, param, 2, &amp;err)) { 
-    // ステータスパケットを受信 +    // ステータスパケットを受信 
-    DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); +    DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &amp;err); 
-    for (i = 0; i < len; i++) { +    for (i = 0; i < len; i++) { 
-      printf ("[%02X]", dat[i]); +      printf ("[%02X]", dat[i]); 
-    +   
-  +  } 
-  DX_ClosePort (dev); +  DX_ClosePort (dev); 
-&nbsp;};+} 
 +&lt;/pre>; 
 +}}
***DXLIBのオリジナルな定義 [#af9ca340] ***DXLIBのオリジナルな定義 [#af9ca340]
Line 722: Line 1053:
&aname(TErrorCode); &aname(TErrorCode);
:TErrorCode | ''(uint16_t)''~ :TErrorCode | ''(uint16_t)''~
-APIの内部処理とステータスパケットに含まれる16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。~+API内で検出される16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。~
|CENTER:|LEFT:|LEFT:|c |CENTER:|LEFT:|LEFT:|c
|bit|macro name| |h |bit|macro name| |h
Line 741: Line 1072:
|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)


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom