6: 2011-03-08 (火) 21:15:05 takaboo[6] [7] | 現: 2021-10-08 (金) 21:38:39 takaboo[6] [8] | ||
---|---|---|---|
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] | ||
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | ||
- | -''2011/03/08 Ver.2.4''~ | + | -''2022/3/1 Ver.4.6''~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.4.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/download/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/download/DXLIB_V4.4.zip) | ||
+ | 内容 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | --makedll.batの内容を一部変更 | ||
+ | -2019/11/15 Ver.4.3~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.3.zip) | ||
+ | 内容 | ||
+ | --Visual Studio上での動作検証を行いヘッダを一部修正 | ||
+ | --ライブラリソースのエンコードをUTF-8のBOM付きに統一 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | -2019/03/27 Ver.4.2~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.2.zip) | ||
+ | 内容 | ||
+ | --追加APIの正式リリース | ||
+ | --C言語による追加APIのサンプルプログラムを拡充 | ||
+ | --Pythonによるサンプルプログラムを拡充 | ||
+ | -2016/07/13 Ver.3.3~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.3.zip) | ||
+ | 内容 | ||
+ | --Linux上でのttyの初期化処理を修正 | ||
+ | --Linux上でのスリープ命令をusleepに置換する様に変更 | ||
+ | -2016/01/12 Ver.3.2~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.2.zip) | ||
+ | 内容 | ||
+ | --ヘッダファイルを最近のVCで使用するとエラーになるのを修正 | ||
+ | --DLLMainの不用意な呼び出しで余計な処理をしないよう対応 | ||
+ | --デバイス毎に異なるパケットサイズの制限のうち最小に合わせていたが、ライブラリ内では250バイトとする | ||
+ | --GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 | ||
+ | -2015/11/18 Ver.3.1~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.1.zip) | ||
+ | 内容 | ||
+ | --TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 | ||
+ | --ヘッダファイルの一部の記述がMSVCに対応していなかったのを修正 | ||
+ | --DX_SetBaudrateの処理に待ち時間を挿入 | ||
+ | -2014/06/11 Ver.3.0~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/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へ改名。 | ||
+ | --ByteおよびWordのRead/WriteをBlock Read/Writeで簡素化。 | ||
+ | --余計な受信データがあった場合でもできるだけ受信処理が進捗する様に改変。 | ||
+ | --古いバージョンのmatlabがDEVICEIDを誤認するため型を変更。 | ||
+ | -2011/03/28 Ver.2.5.1~ | ||
+ | 内容 | ||
+ | --放置していたLinuxへの対応をマトモに見直し。 | ||
+ | -2011/03/16 Ver.2.5~ | ||
+ | 内容 | ||
+ | --内部のイベント処理をさらに整理しパフォーマンスを改善。 | ||
+ | --イリガルクローズ時のリソースリーク対策。 | ||
+ | --DELPHI向けのサンプル追加。 | ||
+ | -2011/03/08 Ver.2.4~ | ||
内容 | 内容 | ||
--内部のイベント処理が一部破綻していたのを修正。 | --内部のイベント処理が一部破綻していたのを修正。 | ||
Line 15: | Line 126: | ||
--ゴミデータ受信時の停滞を解消。 | --ゴミデータ受信時の停滞を解消。 | ||
-2011/03/03 Ver.2.3 | -2011/03/03 Ver.2.3 | ||
- | #ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.3.zip) | ||
内容 | 内容 | ||
--内部のイベント処理がことごとく破綻していたのを修正。 | --内部のイベント処理がことごとく破綻していたのを修正。 | ||
Line 21: | 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/download/DXLIB2forWin2.2.zip) | ||
内容 | 内容 | ||
--ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。 | --ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。 | ||
-2011/02/01 Ver.2.1~ | -2011/02/01 Ver.2.1~ | ||
- | #ref(http://www.besttechnology.co.jp/download/DXLIB2forWin2.1.zip) | ||
内容 | 内容 | ||
--呼出規約をstdcallに変更 | --呼出規約をstdcallに変更 | ||
Line 31: | Line 139: | ||
--新規ターゲット向けにサンプルを追加~ | --新規ターゲット向けにサンプルを追加~ | ||
-2010/12/24 Ver.2.0~ | -2010/12/24 Ver.2.0~ | ||
- | #ref(http://www.besttechnology.co.jp/download/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用ヘッダ | |
- | |~|makelib.bat|<|ライブラリ再構築用バッチ | | + | |~|dxlib.py|<|python用API定義 | |
- | |~|83.bat|<|~| | + | |~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ | |
- | |SampleCode|GCCDeveloperLite|smpl1(template).c |サンプル | | + | |~|makelib.cmd|<|ライブラリ再構築用バッチ | |
- | |~|~|smpl2(ping).c |~| | + | |~|build_dxlib.sh|<|Linux向けライブラリ再構築用スクリプト | |
- | |~|~|smpl3(byte_rw).c |~| | + | |SampleCode|C|smpl??.c |サンプル | |
- | |~|~|smpl4(word_rw).c |~| | + | |~|~|dxmisc.h |サンプル共通設定 | |
- | |~|~|smpl5(multithread).c |~| | + | |~|~|kbhit.h |kbhitエミュレーション | |
- | |~|~|smpl6(sync).c |~| | + | |~|~|makefile |サンプルコンパイル用makefile | |
- | |~|~|smpl7(rawpacket).c |~| | + | |~|~|makeexe.cmd|Windows向け再構築用バッチ | |
- | |~|~|smpl9(DynamicLoad).c |~| | + | |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | |
- | |~|~|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 |~| |
- | |~|LabVIEW2009|sample.vi |サンプル | | + | |~|DELPHI|Project1.dpr |サンプル | |
- | |~|~|dbyte2word.vi |~| | + | |~|~|Unit1.dfm |~| |
- | |~|~|DXLIB2.llb |DXLIB2ラッパーライブラリ | | + | |~|~|Unit1.pas |~| |
- | |~|~|dxlib2.dll |DXLIB2フォルダに収録されるものと同一 | | + | |~|~|DXLIB.pas |~| |
+ | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | ||
+ | |~|~|dxlib_x64.dll |~| | ||
+ | |~|Python|smpl??.py |サンプル | | ||
+ | |~|~|kbhit.py |kbhitエミュレーション | | ||
+ | |~|~|dxlib.py |DXLIBフォルダに収録されるものと同一| | ||
+ | |~|~|dxlib_x32.dll |~| | ||
+ | |~|~|dxlib_x64.dll |~| | ||
+ | |~|LabVIEW2011|sample??.vi |サンプル | | ||
+ | |~|~|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フォルダに収録されるものと同一 | |
- | |~|Ruby|SMPL1.rb |サンプル | | + | |~|~|dxlib_x64.dll |~| |
- | |~|~|SMPL3.rb |サンプル | | + | |~|Ruby|smpl??.rb |サンプル | |
- | |~|Python|SMPL1.py |サンプル | | + | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |
- | |~|~|SMPL3.py |サンプル | | + | |~|~|dxlib_x64.dll |~| |
**開発環境毎の設定 [#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を使用する場合は以下の手順でライブラリをリンクする指定を行った上でコンパイルします。なお、コンパイル後のファイルを実行する際に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 | + | #html{{ |
- | #include "dxlib2.h" | + | <pre class="brush: c;"> |
- | これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うDX_LoadDLLとDX_UnloadDLLが利用できるようになります。 | + | #define _DYNAMICLOAD |
+ | #include "dxlib.h" | ||
+ | </pre> | ||
+ | }} | ||
+ | これによりヘッダファイル内の諸定義が切り替わり、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 110: | Line 256: | ||
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ | ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ | ||
|=ファイル |=ファイル名 |=備考 | | |=ファイル |=ファイル名 |=備考 | | ||
- | |<ヘッダ |<dxlib2.h |<必要な宣言を集約 | | + | |<ヘッダ |<dxlib.h |<必要な宣言を集約 | |
- | |<DLL |<dxlib2.dll |<DLL本体(実行時に必要) | | + | |<DLL |<dxlib_x32.dll |<実行時に必要 | |
- | |<ライブラリ |<dxlib2.lib |<リンク時に必要 | | + | |<ライブラリ |<dxlib_x32.lib |<リンク時に必要 | |
+プロジェクトのプロパティを変更~ | +プロジェクトのプロパティを変更~ | ||
~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~ | ~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~ | ||
Line 124: | Line 270: | ||
***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] | ||
+ | 'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | ||
+ | [[DELPHI:http://www.embarcadero.com/jp/products/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等は使用する環境に合わせて適宜修正して使用します。~ | ||
+ | [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のライブラリはfiddleを使用してアクセスします。 | ||
+ | #html{{ | ||
+ | <pre class="brush: ruby;"> | ||
+ | require "fiddle/import" | ||
+ | |||
+ | module DXLIB | ||
+ | extend Fiddle::Importer | ||
+ | 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\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | ||
+ | [[Python:http://www.python.jp]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスできます。~ | ||
+ | 各APIのPython用の宣言を定義したdxlib.pyをimportするだけで済みます。 | ||
+ | #html{{ | ||
+ | <pre class="brush: python;"> | ||
+ | from dxlib import * # dxlibをインポート | ||
+ | </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/products/matlab]]からの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。また、mex-setupにて[[Cコンパイラを選択>http://www.mathworks.co.jp/jp/help/matlab/matlab_external/building-mex-files.html#f23734]]しておく必要があります。~ | ||
+ | +事前準備 | ||
+ | ~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib_x32.dll(MATALBが64bitの場合はdxlib_x64.dll)とdxlib_matlab.hの格納されたパスを指定します。dxlib.hはMATLABでは解釈できない記述が多いため使用しないでください。~ | ||
+ | +DLLのロード | ||
+ | loadlibrary('dxlib_x32.dll','dxlib_matlab.h','alias','dxlib') | ||
+ | +ポートのオープン | ||
+ | ~ロードされたdxlibのDX_OpenPortを呼出します。関数名の後はポートとボーレートです。 | ||
+ | devid = calllib('dxlib','DX_OpenPort','\\.\COM3',1000000) | ||
+ | +TErrorCodeの取得 | ||
+ | ~TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。 | ||
+ | Err = libpointer('uint16Ptr', 0); | ||
+ | Ret = calllib('dxlib', 'DX_Ping', devid, 1, Err); | ||
+ | fprintf('%x', Err.Value); | ||
+ | +ポートのクローズ | ||
+ | ~DX_OpenPortを行ったので、DX_ClosePortを使用してポートを閉じます。 | ||
+ | calllib('dxlib','DX_ClosePort',devid) | ||
+ | +DLLのアンロード | ||
+ | unloadlibrary('dxlib') | ||
+ | |||
+ | ***Linux & macOS[#w5c096b8] | ||
+ | LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。~ | ||
+ | +ダウンロードと展開~ | ||
+ | ライブラリのアーカイブファイルをダウンロードし展開~ | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | wget https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip | ||
+ | unzip DXLIB_V4.6.zip | ||
+ | </pre> | ||
+ | }} | ||
+ | +ライブラリ及び共有ライブラリの生成~ | ||
+ | DXLIBディレクトリに移動し同梱のスクリプトファイルを実行~ | ||
+ | gccは予めインストールされている必要がある | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | cd DXLIB_v4.6/DXLIB | ||
+ | bash ./build_dxlib.sh | ||
+ | </pre> | ||
+ | }} | ||
+ | コンパイルが成功するとライブラリファイルがサンプルディレクトリにコピーされる | ||
+ | +ユーザプログラムとのリンク~ | ||
+ | 生成したライブラリファイルと自身のソースをリンクする。~ | ||
+ | ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ | ||
+ | ライブラリ検索パスは必要に合わせて変更する。~ | ||
+ | #html{{ | ||
+ | <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] | ||
- | dxlib2.dllは、シリアル通信を意識する必要が無いレベルで、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ | + | Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象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.aspx?scid=kb;ja;JP115831]]の情報に従う。 | 記述方法は[[こちら:http://support.microsoft.com/default.aspx?scid=kb;ja;JP115831]]の情報に従う。 | ||
- | --long '''br''' | + | --long '''baud''' |
~インターフェースとデバイス間の通信速度[bps]。 | ~インターフェースとデバイス間の通信速度[bps]。 | ||
-戻り値 | -戻り値 | ||
- | --[[DXDEVICEID>#DXDEVICEID]]~ | + | --[[TDeviceID>#TDeviceID]]~ |
~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ | ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ | ||
-使用例 | -使用例 | ||
- | DXDEVICEID dev; | + | #html{{ |
- | // COM10を9600bpsでオープン | + | <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] | ||
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; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | dev = DX_OpenPort ("\\\\.\\COM10", 9600); |
- | if (dev) { | + | if (dev) { |
- | ... (中略) | + | ... (中略) |
- | // クローズ | + | // クローズ |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | } | + | } |
+ | </pre> | ||
+ | }} | ||
- | ***DX_ChangeBaudrate [#ba9f52b8] | + | ***DX_SetBaudrate [#ba9f52b8] |
- | 既にオープンされている[[DXDEVICEID>#DXDEVICEID]]の通信速度の変更を行う。~ | + | 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ |
- | 実行すると強制的に受信バッファがクリアされる。 | + | 実行すると強制的に受信バッファがクリアされる。~ |
- | BOOL DX_ChangeBaudrate (DXDEVICEID dvid, long br); | + | 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; | + | #html{{ |
- | // オープン | + | <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); | + | ... (中略) |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | // オープン | + | <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); | + | } |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </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 (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; | + | #html{{ |
- | TDxErrorCode err; | + | <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, &err)) |
- | printf ("Not found [%08X]\n", err); | + | printf ("Found [%08X]\n", err); |
- | // クローズ | + | else |
- | DX_ClosePort (dev); | + | printf ("Not found [%08X]\n", err); |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_Ping2 [#g16504b3] | ***DX_Ping2 [#g16504b3] | ||
- | PINGインストラクションを使用して不特定の対象の応答を確認する。 | + | PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ |
- | BOOL DX_Ping (DXDEVICEID dvid, UCHAR *id, int timeout, TDxErrorCode *errcode); | + | BROADCASTING IDを指定した場合の応答時間はデバイスによって差があるため、異なるデバイスが混在している環境では正確な情報を取得できない場合がある。 |
+ | 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; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR id; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 57143); | + | uint8_t id; |
- | if (dev) { | + | TDxAlarmStatus stat[254]; |
- | // 不明な対象に対してPINGを発行 | + | int i; |
- | if (DX_Ping (dev, &id, 100, &err)) | + | uint32_t num = 252; |
- | printf ("Found ID=%d [%08X]\n", id, err); | + | // オープン |
- | else | + | dev = DX_OpenPort ("\\\\.\\COM10", 57143); |
- | printf ("Not found [%08X]\n", err); | + | if (dev) { |
- | // クローズ | + | // 不明な対象に対してPINGを発行 |
- | DX_ClosePort (dev); | + | if (DX_Ping2 (dev, &num, stat, &err)) { |
- | } | + | for (i = 0; i < num; i++) |
+ | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | ||
+ | } | ||
+ | // クローズ | ||
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR 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, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("LED STAT=%d\n", dat); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR 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, &dat, &err)) { |
- | DX_WriteByteData (dev, 1, 25, 1, 100, &err); | + | dat ^= 1; // ビット反転 |
- | } | + | // ID=1のAX-12へLEDの状態を設定 |
- | DX_ClosePort (dev); | + | DX_WriteByteData (dev, 1, 25, dat, &err); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | USHORT 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, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | TDxErrorCode err; | + | <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)を指令 |
- | } | + | 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, &err); | ||
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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''' |
- | ~読み出すデータのサイズ。 | + | |
- | --UCHAR '''*result''' | + | |
~読み出したデータの保存先。 | ~読み出したデータの保存先。 | ||
- | --int '''timeout''' | + | --uint32_t '''len''' |
- | ~受信タイムアウト[ms]。 | + | ~読み出すデータのサイズ。 |
- | --[[TDxErrorCode>#TDxErrorCode]] '''*errcode''' | + | --[[TErrorCode>#TErrorCode]] '''*err''' |
~エラーコード。 | ~エラーコード。 | ||
-戻り値 | -戻り値 | ||
- | --BOOL | + | --bool |
- | ~正常な応答が得られた場合はTRUE、それ以外はFALSE。~ | + | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
-使用例 | -使用例 | ||
- | DXDEVICEID dev; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR 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, 4, comp, 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, &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); | + | ); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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''' |
- | ~書き込むデータのサイズ。 | + | |
- | --UCHAR '''*dat''' | + | |
~書き込むデータの保存先。 | ~書き込むデータの保存先。 | ||
- | --int '''timeout''' | + | --uint32_t '''len''' |
- | ~受信タイムアウト[ms]。 | + | ~書き込むデータのサイズ。 |
- | --[[TDxErrorCode>#TDxErrorCode]] '''*errcode''' | + | --[[TErrorCode>#TErrorCode]] '''*err''' |
~エラーコード。 | ~エラーコード。 | ||
-戻り値 | -戻り値 | ||
- | --BOOL | + | --bool |
- | ~正常な応答が得られた場合はTRUE、それ以外はFALSE。~ | + | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | DXDEVICEID dev; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR 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, 4, comp, 100, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のAX-12+のコンプライアンスを変更 |
- | } | + | DX_WriteBlockData (dev, 1, 26, comp, 4, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
- | ***DX_SyncWriteData [#v566e16b] | + | ***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] | ||
SYNCインストラクションを使用して複数IDへブロック書き込みを行う。~ | SYNCインストラクションを使用して複数IDへブロック書き込みを行う。~ | ||
書き込まれるデータの構成はユーザに委ねられる。 | 書き込まれるデータの構成はユーザに委ねられる。 | ||
- | BOOL DX_SyncWriteData (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) | + | #html{{ |
- | #define _POS2 (511) | + | <pre class="brush: c;"> |
+ | #define _POS1 (400) | ||
+ | #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) |
- | // ID=1用データ | + | // ID=1用データ |
- | 1, | + | 1, |
- | _POS1 & 0xff, | + | _POS1 & 0xff, |
- | _POS1 >> 8, | + | _POS1 >> 8, |
- | // ID=2用データ | + | // ID=2用データ |
- | 2, | + | 2, |
- | _POS2 & 0xff, | + | _POS2 & 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_SyncWriteData (dev, 8, param, &err); | + | DX_WriteSyncData (dev, param, 8, &err); |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | }; | + | } |
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | TDxErrorCode err; | + | <pre class="brush: c;"> |
- | UCHAR 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を消灯 |
- | }; | + | DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***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; | + | #html{{ |
- | DXDEVICEID dev; | + | <pre class="brush: c;"> |
- | TDxErrorCode err; | + | int i; |
- | UCHAR 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, &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]); |
- | } | + | } |
- | } | + | } |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | }; | + | } |
- | ***DXLIB2のオリジナルな定義 [#af9ca340] | + | </pre> |
- | &aname(DXDEVICEID); | + | }} |
- | :DXDEVICEID | ''(HANDLE)''~ | + | |
+ | ***DXLIBのオリジナルな定義 [#af9ca340] | ||
+ | &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 619: | Line 1047: | ||
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 640: | 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) |
(This host) = https://www.besttechnology.co.jp