43: 2021-03-27 (Sat) 08:17:58 takaboo source 44: 2021-10-05 (Tue) 21:28:30 takaboo source
Line 4: Line 4:
シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。
-なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTX229>http://emanual.robotis.com/docs​/en/parts/interface/u2d2/]][[BTE100]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。+なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTX229>http://emanual.robotis.com/docs​/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。[[BTE100]]の場合はRaspberry Piに依存します。
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f]
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。
--2021/9/? Ver.4.5~+-''2021/10/8 Ver.4.5''~
更新内容 更新内容
---Linux環境における受信処理の見直し +#ref(https://www.besttechnology.co.jp/download/DXLIB_V4.5.zip)
---makedll.batとbuild_dxlib.shの内容を一部変更 +
---dxlib.py内のDXL_ScanDevicesの誤記修正+
--タイムアウトのデフォルトオフセット時間を30msに変更 --タイムアウトのデフォルトオフセット時間を30msに変更
--全プラットホームにおけるコンパイル時のウォーニング抑止 --全プラットホームにおけるコンパイル時のウォーニング抑止
--Linux上における非標準ボーレート指定を許容 --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暫定対応 --macOS暫定対応
--C言語のサンプルコードをプラットホーム共通に --C言語のサンプルコードをプラットホーム共通に
--''2021/1/22 Ver.4.4''~+--放置していたRubyのサンプルを修正 
 +-2021/1/22 Ver.4.4~
#ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V4.4.zip) #ref(https://www.besttechnology.co.jp/do​wnload/DXLIB_V4.4.zip)
内容 内容
Line 130: Line 135:
--初期リリース~ --初期リリース~
-アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(※最新版のフォルダ構成を記載しています)+最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。
|DXLIB|dxlib_x32.dll|<|ライブラリ本体 | |DXLIB|dxlib_x32.dll|<|ライブラリ本体 |
|~|dxlib_x64.dll|<|~| |~|dxlib_x64.dll|<|~|
Line 144: Line 149:
|~|makelib.bat|<|ライブラリ再構築用バッチ | |~|makelib.bat|<|ライブラリ再構築用バッチ |
|~|83.bat|<|~| |~|83.bat|<|~|
-|SampleCode|GCCDeveloperLite|smpl*.c |サンプル |+|~|build_dxlib.sh|<|Linux向けライブラリ再構築用スクリプト | 
 +|SampleCode|C|smpl??.c |サンプル
 +|~|~|dxmisc.h |サンプル共通設定 | 
 +|~|~|kbhit.h |kbhitエミュレーション | 
 +|~|~|makefile |サンプルコンパイル用makefile | 
 +|~|~|makewin.bat|Windows向け再構築用バッチ | 
 +|~|~|83.bat|~|
|~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 |
|~|~|dxmemmap.h |~| |~|~|dxmemmap.h |~|
Line 155: Line 166:
|~|~|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化 |
Line 163: Line 179:
|~|~|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 |~|
Line 197: Line 210:
****DLLの動的リンク [#y15bf22f] ****DLLの動的リンク [#y15bf22f]
動的にDLLを使用する場合は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が利用できるようになります。
-  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を起動する必要は無く、サンプルフォルダ内に同梱される「makewin.bat」を実行すればmakefileを読み込んでGCC Developer Liteに同梱されるmakeを使用してコンパイルします。~ 
 +引数にソース名をしていするとそのソースだけコンパイル、何も付けなければフォルダ内の拡張子がCのソースファイル全てがコンパイル対象となります。 
 +#html{{ 
 +<pre class="brush: bash;"> 
 +makewin smpl4_byte_rw (特定のソースのみコンパイル) 
 +makewin (カレントの全ソースをコンパイル) 
 +</pre> 
 +}} 
 +なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。また64bit環境を優先します。
***Microsoft Visual C++ [#j5a74d33] ***Microsoft Visual C++ [#j5a74d33]
Line 261: Line 294:
***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\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するだけで済みます。
-&nbsp;from dxlib import *   # dxlibをインポート+#html{{ 
 +&lt;pre class="brush: python;"> 
 +from dxlib import * # dxlibをインポート 
 +</pre> 
 +}} 
 +なおdxlib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 
 + 
 +LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。
***Java [#ceff395d] ***Java [#ceff395d]
Line 299: Line 350:
 unloadlibrary('dxlib')  unloadlibrary('dxlib')
-***Linux [#w5c096b8] +***Linux & macOS[#w5c096b8] 
-Linux上でdxlibをコンパイルする方法を紹介します。+LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。
-+コンパイル準備++ダウンロードと展開
-ダウンロードファイルを解凍+ライブラリのアーカイブファイルをダウンロードし展開
-+ライブラリファイルの生成~ +#html{{ 
-&nbsp;$ gcc -c -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp +&lt;pre class="brush: bash;"&gt; 
-&nbsp;$ ar -rcsv libdxlib.a dxlib_intuitive.o dxlib.o +wget https://www.besttechnology.co.jp/download/DXLIB_V4.5.zip 
-+共有ライブラリの作成+unzip DXLIB_V4.5.zip 
-RubyやPython等で使用する場合等+</pre> 
-&nbsp;$ gcc -fPIC -shared -D__MAKE_LIB__ dxlib_intuitive.cpp dxlib.cpp -o dxlib.so.4.2+}} 
 ++ライブラリ及び共有ライブラリの生成
 +DXLIBディレクトリに移動し同梱のスクリプトファイルを実行~ 
 +gccは予めインストールされている必要がある 
 +#html{{ 
 +&lt;pre class="brush: bash;"> 
 +cd DXLIB_v4.5/DXLIB 
 +bash ./build_dxlib.sh 
 +</pre> 
 +}} 
 +コンパイルが成功するとライブラリファイルがサンプルディレクトリにコピーされる
+ユーザプログラムとのリンク~ +ユーザプログラムとのリンク~
生成したライブラリファイルと自身のソースをリンクする。~ 生成したライブラリファイルと自身のソースをリンクする。~
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~
-ライブラリは必要に合わせて追加する。+ライブラリ検索パスは必要に合わせて変更する。~ 
-&nbsp;$ gcc sample.c -ldxlib -o sample+#html{{ 
 +&lt;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を使用するのに必要なプロトタイプとマクロの定義がなされます。
''注意事項'':~ ''注意事項'':~
Line 339: Line 412:
~オープンに成功した場合は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 354: Line 431:
~クローズに成功した場合は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_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);
-パラメータ -パラメータ
Line 377: Line 455:
~通信速度の変更が成功すると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_SetBaudrate (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 399: Line 481:
~指定された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] ***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);
-パラメータ -パラメータ
Line 438: Line 524:
~正常な応答が得られた場合は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, &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); 
-&nbsp;}+  // クローズ 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/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);
-パラメータ -パラメータ
Line 470: Line 560:
~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode  err; +&lt;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); 
-&nbsp;}+} 
 +&lt;/pre> 
 +}}
***DX_ReadByteData [#u7d86432] ***DX_ReadByteData [#u7d86432]
Line 508: Line 600:
~正常な応答が得られた場合は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, &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); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteByteData [#ma2205f0] ***DX_WriteByteData [#ma2205f0]
Line 540: Line 636:
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, &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); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadWordData [#x202d573] ***DX_ReadWordData [#x202d573]
Line 573: Line 673:
~正常な応答が得られた場合は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, &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); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteWordData [#pcc1b3ce] ***DX_WriteWordData [#pcc1b3ce]
Line 605: Line 709:
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, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のAX-12へ位置(511)を指令 
-&nbsp;}+  DX_WriteWordData (dev, 1, 30, 511, &err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadLongData [#w341e7a5] ***DX_ReadLongData [#w341e7a5]
Line 633: Line 741:
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
-&nbsp;TDeviceID  dev; +#html{{ 
- TErrorCode err; +&lt;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); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteLongData [#k42e5e5f] ***DX_WriteLongData [#k42e5e5f]
Line 665: Line 777:
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のXM430へ位置(1024)を指令 +dev = DX_OpenPort ("\\\\.\\COM10", 1000000); 
-  DX_WriteLongData (dev, 1, 30, 1024, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のXM430へ位置(1024)を指令 
-&nbsp;}+  DX_WriteLongData (dev, 1, 30, 1024, &err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadBlockData [#b8a1ae1e] ***DX_ReadBlockData [#b8a1ae1e]
Line 695: Line 811:
~正常な応答が得られた場合は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, &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); +    ); 
-&nbsp;}+  } 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_WriteBlockData [#fcf55aa0] ***DX_WriteBlockData [#fcf55aa0]
Line 731: Line 851:
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, &err); +if (dev) { 
-  DX_ClosePort (dev); +  // ID=1のAX-12+のコンプライアンスを変更 
-&nbsp;}+  DX_WriteBlockData (dev, 1, 26, comp, 4, &err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre> 
 +}}
***DX_ReadSyncData [#oc111b2e] ***DX_ReadSyncData [#oc111b2e]
Line 787: Line 911:
~インターフェースより送信が行われた場合は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 & 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); 
-&nbsp;};+} 
 +&lt;/pre>; 
 +}}
***DX_TxPacket [#r051327a] ***DX_TxPacket [#r051327a]
Line 831: Line 959:
~インターフェースより送信が行われた場合は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, &err); 
 +  DX_ClosePort (dev); 
 +} 
 +&lt;/pre>; 
 +}}
***DX_RxPacket [#r280cda8] ***DX_RxPacket [#r280cda8]
Line 866: Line 998:
~受信成功時はtrue、それ以外はfalseを返す。 ~受信成功時はtrue、それ以外はfalseを返す。
-使用例 -使用例
-&nbsp;int        i; +#html{{ 
- uint32_t  len; +&lt;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); 
-&nbsp;};+} 
 +&lt;/pre>; 
 +}}
***DXLIBのオリジナルな定義 [#af9ca340] ***DXLIBのオリジナルな定義 [#af9ca340]


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