42: 2019-11-16 (土) 18:38:51 takaboo |
現: 2021-10-08 (金) 21:38:39 takaboo |
| TITLE:Dynamixel Protocol Library | | TITLE:Dynamixel Protocol Library |
| **概要 [#va21cbfb] | | **概要 [#va21cbfb] |
- | Dynamixel Protocol LibraryはDynamixel Protocol 1の通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。~ | + | Dynamixel Protocol Libraryは[[DYNAMIXEL Communiation Protocol 1.0]]に対応した製品をWindows等のOSから操作するためのライブラリ集です。~ |
| シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 | | シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 |
| | | |
- | なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTX229>http://emanual.robotis.com/docs/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。 | + | なお、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] |
| 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | | 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 |
- | -''2019/11/15 Ver.4.3''~ | + | -''2022/3/1 Ver.4.6''~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V4.3.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上での動作検証を行いヘッダを一部修正 | | --Visual Studio上での動作検証を行いヘッダを一部修正 |
| --新しく追加されたDynamixelの定義を追加 | | --新しく追加されたDynamixelの定義を追加 |
| -2019/03/27 Ver.4.2~ | | -2019/03/27 Ver.4.2~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V4.2.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.2.zip) |
| 内容 | | 内容 |
| --追加APIの正式リリース | | --追加APIの正式リリース |
| --Pythonによるサンプルプログラムを拡充 | | --Pythonによるサンプルプログラムを拡充 |
| -2016/07/13 Ver.3.3~ | | -2016/07/13 Ver.3.3~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.3.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.3.zip) |
| 内容 | | 内容 |
| --Linux上でのttyの初期化処理を修正 | | --Linux上でのttyの初期化処理を修正 |
| --Linux上でのスリープ命令をusleepに置換する様に変更 | | --Linux上でのスリープ命令をusleepに置換する様に変更 |
| -2016/01/12 Ver.3.2~ | | -2016/01/12 Ver.3.2~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.2.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.2.zip) |
| 内容 | | 内容 |
| --ヘッダファイルを最近のVCで使用するとエラーになるのを修正 | | --ヘッダファイルを最近のVCで使用するとエラーになるのを修正 |
| --GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 | | --GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 |
| -2015/11/18 Ver.3.1~ | | -2015/11/18 Ver.3.1~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.1.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.1.zip) |
| 内容 | | 内容 |
| --TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 | | --TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 |
| --DX_SetBaudrateの処理に待ち時間を挿入 | | --DX_SetBaudrateの処理に待ち時間を挿入 |
| -2014/06/11 Ver.3.0~ | | -2014/06/11 Ver.3.0~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.0.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.0.zip) |
| 内容 | | 内容 |
| --各APIのアドレス指定が8bit幅だったものを16bitに拡張(後継のDYNAMIXEL2に合わせた) | | --各APIのアドレス指定が8bit幅だったものを16bitに拡張(後継のDYNAMIXEL2に合わせた) |
| --初期リリース~ | | --初期リリース~ |
| | | |
- | アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(※最新版のフォルダ構成を記載しています) | + | 最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 |
| |DXLIB|dxlib_x32.dll|<|ライブラリ本体 | | | |DXLIB|dxlib_x32.dll|<|ライブラリ本体 | |
| |~|dxlib_x64.dll|<|~| | | |~|dxlib_x64.dll|<|~| |
| |~|dxlib.py|<|python用API定義 | | | |~|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|smpl*.c |サンプル | | + | |SampleCode|C|smpl??.c |サンプル | |
| + | |~|~|dxmisc.h |サンプル共通設定 | |
| + | |~|~|kbhit.h |kbhitエミュレーション | |
| + | |~|~|makefile |サンプルコンパイル用makefile | |
| + | |~|~|makeexe.cmd|Windows向け再構築用バッチ | |
| |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | | | |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | |
| |~|~|dxmemmap.h |~| | | |~|~|dxmemmap.h |~| |
| |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |
| |~|~|dxlib_x64.dll |~| | | |~|~|dxlib_x64.dll |~| |
- | |~|LabVIEW2011|sample*.vi |サンプル | | + | |~|Python|smpl??.py |サンプル | |
| + | |~|~|kbhit.py |kbhitエミュレーション | |
| + | |~|~|dxlib.py |DXLIBフォルダに収録されるものと同一| |
| + | |~|~|dxlib_x32.dll |~| |
| + | |~|~|dxlib_x64.dll |~| |
| + | |~|LabVIEW2011|sample??.vi |サンプル | |
| |~|~|DXLIB.llb |dllの呼び出しをvi化 | | | |~|~|DXLIB.llb |dllの呼び出しをvi化 | |
| |~|~|DXLIB_DXL.llb |dllの呼び出しをvi化 | | | |~|~|DXLIB_DXL.llb |dllの呼び出しをvi化 | |
| |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |
| |~|~|dxlib_x64.dll |~| | | |~|~|dxlib_x64.dll |~| |
- | |~|Linux|smpl*.c |サンプル | | + | |~|Ruby|smpl??.rb |サンプル | |
- | |~|Ruby|smpl*.rb |サンプル | | + | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |
- | |~|Python|smpl*.py |サンプル | | + | |
- | |~|~|dxlib.py |DXLIBフォルダに収録されるものと同一| | + | |
- | |~|~|dxlib_x32.dll |~| | + | |
| |~|~|dxlib_x64.dll |~| | | |~|~|dxlib_x64.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の動的リンク [#y15bf22f] | | ****DLLの動的リンク [#y15bf22f] |
| 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | | 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 |
- | #define _DYNAMICLOAD | + | #html{{ |
- | #include "dxlib.h" | + | <pre class="brush: c;"> |
| + | #define _DYNAMICLOAD |
| + | #include "dxlib.h" |
| + | </pre> |
| + | }} |
| これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 | | これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 |
- | TDeviceID dev; | + | #html{{ |
- | // DLLをロード | + | <pre class="brush: c;"> |
- | if (LoadDLL ()) { | + | TDeviceID dev; |
- | if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) { | + | // DLLを読み込み |
- | ... | + | if (LoadDLL ()) { |
- | DX_ClosePort (dev); | + | if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) { |
- | } | + | ... |
- | // DLLをアンロード | + | DX_ClosePort (dev); |
- | UnloadDLL (); | + | } |
- | } | + | // 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] |
| | | |
| ***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を使用してアクセスします。 |
- | require 'dl/import' | + | #html{{ |
- | molude dxlib | + | <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\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | | 'SampleCode\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ |
- | [[Python:http://www.python.jp/]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ | + | [[Python:http://www.python.jp]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスできます。~ |
| 各APIのPython用の宣言を定義したdxlib.pyをimportするだけで済みます。 | | 各APIのPython用の宣言を定義したdxlib.pyをimportするだけで済みます。 |
- | from dxlib import * # dxlibをインポート | + | #html{{ |
| + | <pre class="brush: python;"> |
| + | from dxlib import * # dxlibをインポート |
| + | </pre> |
| + | }} |
| + | なおdxlib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 |
| + | |
| + | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 |
| | | |
| ***Java [#ceff395d] | | ***Java [#ceff395d] |
| unloadlibrary('dxlib') | | unloadlibrary('dxlib') |
| | | |
- | ***Linux [#w5c096b8] | + | ***Linux & macOS[#w5c096b8] |
- | Linux上でdxlibをコンパイルする方法を紹介します。~ | + | LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。~ |
- | +コンパイル準備~ | + | +ダウンロードと展開~ |
- | ダウンロードファイルを解凍~ | + | ライブラリのアーカイブファイルをダウンロードし展開~ |
- | +ライブラリファイルの生成~ | + | #html{{ |
- | $ gcc -c -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp | + | <pre class="brush: bash;"> |
- | $ ar -rcsv libdxlib.a dxlib_intuitive.o dxlib.o | + | wget https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip |
- | +共有ライブラリの作成~ | + | unzip DXLIB_V4.6.zip |
- | RubyやPython等で使用する場合等~ | + | </pre> |
- | $ gcc -fPIC -shared -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp -o dxlib.so.4.2 | + | }} |
| + | +ライブラリ及び共有ライブラリの生成~ |
| + | DXLIBディレクトリに移動し同梱のスクリプトファイルを実行~ |
| + | gccは予めインストールされている必要がある |
| + | #html{{ |
| + | <pre class="brush: bash;"> |
| + | cd DXLIB_v4.6/DXLIB |
| + | bash ./build_dxlib.sh |
| + | </pre> |
| + | }} |
| + | コンパイルが成功するとライブラリファイルがサンプルディレクトリにコピーされる |
| +ユーザプログラムとのリンク~ | | +ユーザプログラムとのリンク~ |
| 生成したライブラリファイルと自身のソースをリンクする。~ | | 生成したライブラリファイルと自身のソースをリンクする。~ |
| ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ | | ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ |
- | ライブラリは必要に合わせて追加する。~ | + | ライブラリ検索パスは必要に合わせて変更する。~ |
- | $ gcc sample.c -ldxlib -o sample | + | #html{{ |
| + | <pre class="brush: bash;"> |
| + | gcc sample.c -L. -ldxlib -o sample |
| + | </pre> |
| + | }} |
| | | |
- | なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。 | + | '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] |
- | 本ライブラリはシリアル通信を行うコードを記述しなくて良いのですが、デバイスIDという番号を用いて使用するシリアルI/Fを一元的に管理します。また、制御対象となるDynamixelのIDを指定し、そのコントロールテーブルへの読み書き行うAPIが用意されています。~ | + | Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ |
- | 自身のC言語で記述されたソースプログラムにdxlib.hをインクルードする事で、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 | + | C言語のソースにdxlib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 |
| | | |
| ''注意事項'':~ | | ''注意事項'':~ |
| ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ | | ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID 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] |
| ~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 | | ~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 |
| -使用例 | | -使用例 |
- | TDeviceID 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_SetBaudrate [#ba9f52b8] | | ***DX_SetBaudrate [#ba9f52b8] |
| 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ | | 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ |
| 実行すると強制的に受信バッファがクリアされる。~ | | 実行すると強制的に受信バッファがクリアされる。~ |
- | なお、Linux環境におけるボーレートの設定は、POSIX.1でサポートする値(50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000)であればtcsetattrを使用して処理するが、これらの値に当てはまらない場合はioctrlを使用する。その際I/Fがこれらのボーレートに対応していなかったり、ioctrlをサポートしない場合、本APIは失敗する。 | |
| bool DX_SetBaudrate (TDeviceID dvid, long baud); | | bool DX_SetBaudrate (TDeviceID dvid, long baud); |
| -パラメータ | | -パラメータ |
| ~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ | | ~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | // 通信速度を1M[bps]に変更 | + | dev = DX_OpenPort ("\\\\.\\COM10", 9600); |
- | DX_SetBaudrate (dev, 1000000); | + | if (dev) { |
- | ... (中略) | + | // 通信速度を1M[bps]に変更 |
- | // クローズ | + | DX_SetBaudrate (dev, 1000000); |
- | DX_ClosePort (dev); | + | ... (中略) |
- | } | + | // クローズ |
| + | DX_ClosePort (dev); |
| + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_Active [#ie20e4a7] | | ***DX_Active [#ie20e4a7] |
| ~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 | | ~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 |
| -使用例 | | -使用例 |
- | TDeviceID 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] | | ***DX_SetTimeOutOffset [#h4a1b54e] |
| I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ | | I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ |
- | ライブラリ内で想定した受信時間と指定されたタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理される。~ | + | 内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ |
- | デフォルトは20。 | + | デフォルトは30[ms]。 |
| void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); | | void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); |
| -パラメータ | | -パラメータ |
| ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode 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, &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インストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ | | PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ |
- | 応答時間がDynamixelの種類によって差があるため、それらが混在している環境では正確な情報を取得できない場合がある。 | + | BROADCASTING IDを指定した場合の応答時間はデバイスによって差があるため、異なるデバイスが混在している環境では正確な情報を取得できない場合がある。 |
| bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err); | | bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err); |
| -パラメータ | | -パラメータ |
| --[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' | | --[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' |
| ~検索で見つかったデバイス情報の保存先。~ | | ~検索で見つかったデバイス情報の保存先。~ |
- | 少なくともnumで指定したサイズを確保しておく必要がある。 | + | 少なくともnumで指定したサイズ分の領域を確保しておく必要がある。 |
| --[[TErrorCode>#TErrorCode]] '''*err''' | | --[[TErrorCode>#TErrorCode]] '''*err''' |
| ~エラーコード。 | | ~エラーコード。 |
| ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t id; | + | TDeviceID dev; |
- | TDxAlarmStatus stat[254]; | + | TErrorCode err; |
- | int i; | + | uint8_t id; |
- | uint32_t num = 254; | + | TDxAlarmStatus stat[254]; |
- | // オープン | + | int i; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 57143); | + | uint32_t num = 252; |
- | if (dev) { | + | // オープン |
- | // 不明な対象に対してPINGを発行 | + | dev = DX_OpenPort ("\\\\.\\COM10", 57143); |
- | // numには予め254の値を指定したので、最大254台まで見つけようとする | + | if (dev) { |
- | if (DX_Ping2 (dev, &num, stat, &err)) { | + | // 不明な対象に対してPINGを発行 |
- | // 1台以上見つかるとnumには見つかった数が返ってくる | + | if (DX_Ping2 (dev, &num, stat, &err)) { |
- | for (i = 0; i < num; i++) | + | for (i = 0; i < num; i++) |
- | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | + | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); |
- | } | + | } |
- | // クローズ | + | // クローズ |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | } | + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_ReadByteData [#u7d86432] | | ***DX_ReadByteData [#u7d86432] |
| ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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, &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] |
| BROADCASTING IDを指定した場合は応答待ちを行わない。 | | BROADCASTING IDを指定した場合は応答待ちを行わない。 |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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, &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, dat, &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] |
| ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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, &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] |
| BROADCASTING IDを指定した場合は応答待ちを行わない。 | | BROADCASTING IDを指定した場合は応答待ちを行わない。 |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode 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, &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] | | ***DX_ReadLongData [#w341e7a5] |
| ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint32_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | uint32_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430から現在位置を取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadLongData (dev, 1, 132, &dat, &err)) { | + | if (dev) { |
- | printf ("PRESENT POS=%d\n", dat); | + | // ID=1のXM430から現在位置を取得 |
- | } | + | if (DX_ReadLongData (dev, 1, 132, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
| + | DX_ClosePort (dev); |
| + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_WriteLongData [#k42e5e5f] | | ***DX_WriteLongData [#k42e5e5f] |
| BROADCASTING IDを指定した場合は応答待ちを行わない。 | | BROADCASTING IDを指定した場合は応答待ちを行わない。 |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430へ位置(1024)を指令 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX_WriteLongData (dev, 1, 30, 1024, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のXM430へ位置(1024)を指令 |
- | } | + | DX_WriteLongData (dev, 1, 30, 1024, &err); |
| + | DX_ClosePort (dev); |
| + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_ReadBlockData [#b8a1ae1e] | | ***DX_ReadBlockData [#b8a1ae1e] |
| ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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, &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] |
| BROADCASTING IDを指定した場合は応答待ちを行わない。 | | BROADCASTING IDを指定した場合は応答待ちを行わない。 |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のAX-12+のコンプライアンスを変更 |
- | } | + | DX_WriteBlockData (dev, 1, 26, comp, 4, &err); |
| + | DX_ClosePort (dev); |
| + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_ReadSyncData [#oc111b2e] | | ***DX_ReadSyncData [#oc111b2e] |
| ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ |
| -使用例 | | -使用例 |
- | #define _POS1 (400) | + | #html{{ |
- | #define _POS2 (511) | + | <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 & 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_WriteSyncData (dev, param, 8, &err); | + | DX_WriteSyncData (dev, param, 8, &err); |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | }; | + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_TxPacket [#r051327a] | | ***DX_TxPacket [#r051327a] |
| ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 | | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 |
| -使用例 | | -使用例 |
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <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を消灯 |
- | }; | + | DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err); |
| + | DX_ClosePort (dev); |
| + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DX_RxPacket [#r280cda8] | | ***DX_RxPacket [#r280cda8] |
| ~受信成功時はtrue、それ以外はfalseを返す。 | | ~受信成功時はtrue、それ以外はfalseを返す。 |
| -使用例 | | -使用例 |
- | int i; | + | #html{{ |
- | uint32_t len; | + | <pre class="brush: c;"> |
- | TDeviceID dev; | + | int i; |
- | TErrorCode err; | + | uint32_t len; |
- | uint8_t param[2] = { | + | TDeviceID dev; |
- | 25, // アドレス (LED) | + | TErrorCode err; |
- | 1, // サイズ | + | 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), &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); |
- | }; | + | } |
| + | </pre> |
| + | }} |
| | | |
| ***DXLIBのオリジナルな定義 [#af9ca340] | | ***DXLIBのオリジナルな定義 [#af9ca340] |