2: 2016-08-19 (金) 20:08:06 takaboo ソース 3: 2016-08-29 (月) 18:27:25 takaboo ソース
Line 11: Line 11:
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。
-''2014/05/xx Ver.1.0''~ -''2014/05/xx Ver.1.0''~
-#ref(http://www.besttechnology.co.jp/dow​nload/DXLIB2_V1.0.zip)+#ref(http://www.besttechnology.co.jp/dow​nload/DX2LIB_V1.0.zip)
内容 内容
--初期リリース~ --初期リリース~
アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。
-|DXLIB2|dxlib2_x32.dll|<|ライブラリ本体 | +|DX2LIB|dx2lib_x32.dll|<|ライブラリ本体 | 
-|~|dxlib2_x64.dll|<|~| +|~|dx2lib_x64.dll|<|~| 
-|~|libdxlib2_x32.a|<|GCC用ライブラリ(定義のみ) | +|~|libdx2lib_x32.a|<|GCC用ライブラリ(定義のみ) | 
-|~|libdxlib2_x64.a|<|~| +|~|libdx2lib_x64.a|<|~| 
-|~|dxlib2_x32.llb|<|MSVC用ライブラリ(定義のみ) | +|~|dx2lib_x32.llb|<|MSVC用ライブラリ(定義のみ) | 
-|~|dxlib2_x64.lib|<|~| +|~|dx2lib_x64.lib|<|~| 
-|~|dxlib2.c|<|ライブラリソース | +|~|dx2lib.c|<|ライブラリソース | 
-|~|dxlib2.h|<|ライブラリヘッダ | +|~|dx2lib.h|<|ライブラリヘッダ | 
-|~|dxlib2_matlab.h|<|matlab用ヘッダ |+|~|dx2lib_matlab.h|<|matlab用ヘッダ |
|~|makelib.bat|<|ライブラリ再構築用バッチ | |~|makelib.bat|<|ライブラリ再構築用バッチ |
|~|83.bat|<|~| |~|83.bat|<|~|
Line 37: Line 37:
|~|~|smpl9(DynamicLoad).c |~| |~|~|smpl9(DynamicLoad).c |~|
|~|~|smpl10(USS3).c |~| |~|~|smpl10(USS3).c |~|
-|~|~|dxlib2.h |DXLIB2フォルダに収録されるものと同一 |+|~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 |
|~|~|dxmemmap.h |~| |~|~|dxmemmap.h |~|
-|~|~|dxlib_x32.dll |~| +|~|~|dx2lib_x32.dll |~| 
-|~|~|dxlib_x64.dll |~|+|~|~|dx2lib_x64.dll |~|
|~|DELPHI|Project1.dpr |サンプル | |~|DELPHI|Project1.dpr |サンプル |
|~|~|Unit1.dfm |~| |~|~|Unit1.dfm |~|
|~|~|Unit1.pas |~| |~|~|Unit1.pas |~|
-|~|~|DXLIB2.pas |~| +|~|~|DX2LIB.pas |~| 
-|~|~|dxlib2_x32.dll |DXLIB2フォルダに収録されるものと同一 +|~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一
-|~|~|dxlib2_x64.dll |~|+|~|~|dx2lib_x64.dll |~|
|~|LabVIEW2011|sample.vi |サンプル | |~|LabVIEW2011|sample.vi |サンプル |
|~|~|sample_mx.vi |~| |~|~|sample_mx.vi |~|
Line 53: Line 53:
|~|~|dbyte2word.vi |~| |~|~|dbyte2word.vi |~|
|~|~|errcnt.vi |~| |~|~|errcnt.vi |~|
-|~|~|DXLIB2.llb |DXLIB2ラッパーライブラリ +|~|~|DX2LIB.llb |DX2LIBラッパーライブラリ
-|~|~|dxlib2_x32.dll |DXLIB2フォルダに収録されるものと同一 |+|~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一 |
|~|EXCEL|text.xls |サンプルシート | |~|EXCEL|text.xls |サンプルシート |
-|~|~|dxlib2_x32.dll |DXLIB2フォルダに収録されるものと同一 +|~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一
-|~|~|dxlib2_x64.dll |~|+|~|~|dx2lib_x64.dll |~|
|~|Linux|smpl2.c |サンプル | |~|Linux|smpl2.c |サンプル |
|~|~|smpl4.c |~| |~|~|smpl4.c |~|
Line 77: Line 77:
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 | |=ファイル |=ファイル名 |=備考 |
-|<ヘッダ |<dxlib2.h |<必要な宣言を集約 | +|<ヘッダ |<dx2lib.h |<必要な宣言を集約 | 
-|<DLL |<dxlib2_x32.dll |<DLL本体(実行時およびリンク時に必要) |+|<DLL |<dx2lib_x32.dll |<DLL本体(実行時およびリンク時に必要) |
+コンパイルオプションの選択 +コンパイルオプションの選択
~ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択~ ~ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択~
Line 85: Line 85:
~etc...タブ内の追加ボタンを押し、新規に行を追加~ ~etc...タブ内の追加ボタンを押し、新規に行を追加~
#ref(GCC_CompileOption_AddEtc.png)~ #ref(GCC_CompileOption_AddEtc.png)~
-~新規に追加された空の行をクリックし'dxlib2_x32.dll'と入力~ +~新規に追加された空の行をクリックし'dx2lib_x32.dll'と入力~ 
-#ref(GCC_CompileOption_AddDxlib2.png)~+#ref(GCC_CompileOption_AddDx2lib.png)~
~OKを押して設定を反映 ~OKを押して設定を反映
****DLLの動的リンク [#y15bf22f] ****DLLの動的リンク [#y15bf22f]
-動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib2.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。+動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdx2lib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。
 #define _DYNAMICLOAD  #define _DYNAMICLOAD
- #include "dxlib2.h"+ #include "dx2lib.h"
これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。
   TDeviceID  dev;    TDeviceID  dev;
Line 111: Line 111:
~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~ ~ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー~
|=ファイル |=ファイル名 |=備考 | |=ファイル |=ファイル名 |=備考 |
-|<ヘッダ |<dxlib2.h |<必要な宣言を集約 | +|<ヘッダ |<dx2lib.h |<必要な宣言を集約 | 
-|<DLL |<dxlib2_x32.dll |<実行時に必要 | +|<DLL |<dx2lib_x32.dll |<実行時に必要 | 
-|<ライブラリ |<dxlib2_x32.lib |<リンク時に必要 |+|<ライブラリ |<dx2lib_x32.lib |<リンク時に必要 |
+プロジェクトのプロパティを変更~ +プロジェクトのプロパティを変更~
~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~ ~構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定~
Line 126: Line 126:
***National Instruments LabVIEW [#mdd5d507] ***National Instruments LabVIEW [#mdd5d507]
'SampleCode\LabVIEW2011'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 'SampleCode\LabVIEW2011'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
-[[LabVIEW:http://www.ni.com/labview/ja/]​]には外部のDLLへアクセスする手段が提供されています。しかしながらDXLIB2そのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB2.llbにまとめて提供しています。+[[LabVIEW:http://www.ni.com/labview/ja/]​]には外部のDLLへアクセスする手段が提供されています。しかしながらDX2LIBそのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDX2LIB.llbにまとめて提供しています。
#ref(vi_frontpanel.png) #ref(vi_frontpanel.png)
#ref(vi_diagram.png) #ref(vi_diagram.png)
Line 132: Line 132:
***DELPHI [#bdd8ef87] ***DELPHI [#bdd8ef87]
'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ 'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~
-[[DELPHI:http://www.embarcadero.com/jp/p​roducts/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB2.pas内にdxlib2_x32.dllないしdxlib2_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlib2を追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。+[[DELPHI:http://www.embarcadero.com/jp/p​roducts/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDX2LIB.pas内にdx2lib_x32.dllないしdx2lib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdx2libを追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。
***VB [#p8d7963b] ***VB [#p8d7963b]
'SampleCode\EXCEL'フォルダにサンプルが同梱されます。~ 'SampleCode\EXCEL'フォルダにサンプルが同梱されます。~
-ここではVBと似たMicrosoft OfficeのVBAを使用し、マクロの標準モジュールにDXLIB2HEADという名称でDLLに含まれるいくつかのAPIが定義してあります。~+ここではVBと似たMicrosoft OfficeのVBAを使用し、マクロの標準モジュールにDX2LIBHEADという名称でDLLに含まれるいくつかのAPIが定義してあります。~
Module1にPingTestとMotorTestというマクロが記述されていますので、ワークシートから適宜マクロを呼び出して実行してください。結果がシート上に反映されます。 Module1にPingTestとMotorTestというマクロが記述されていますので、ワークシートから適宜マクロを呼び出して実行してください。結果がシート上に反映されます。
Line 143: Line 143:
[[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~
  require 'dl/import'   require 'dl/import'
-  molude dxlib2+  molude dx2lib
   extend DL::Importer    extend DL::Importer
-   dlload "./dxlib_x32.dll"+   dlload "./dx2lib_x32.dll"
   extern "int DX2_OpenPort( char *, long )"    extern "int DX2_OpenPort( char *, long )"
  end   end
-  devid = dxlib2.DX2_OpenPort( "ポート名", ボーレート )+  devid = dx2lib.DX2_OpenPort( "ポート名", ボーレート )
***Python [#mc6a5a49] ***Python [#mc6a5a49]
Line 154: Line 154:
[[Python:http://www.python.jp/Zope]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ [[Python:http://www.python.jp/Zope]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~
LinuxでLoadLibraryを呼び出す際はcdllインスタンスを使用します。 LinuxでLoadLibraryを呼び出す際はcdllインスタンスを使用します。
-  dxlib = windll.LoadLibrary( "dxlib2_x32.dll" )  # for window +  dx2lib = windll.LoadLibrary( "dx2lib_x32.dll" )  # for window 
-  dxlib = cdll.LoadLibrary( "./dxlib2.so" )  # for linux+  dx2lib = cdll.LoadLibrary( "./dx2lib.so" )  # for linux
***Java [#ceff395d] ***Java [#ceff395d]
Line 162: Line 162:
[[MATLAB:http://www.mathworks.co.jp/prod​ucts/matlab]]からの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。また、mex-setupにて[[Cコンパイラを選択>http://www.mathworks.co.jp/jp/help/matl​ab/matlab_external/building-mex-files.ht​ml#f23734]]しておく必要があります。~ [[MATLAB:http://www.mathworks.co.jp/prod​ucts/matlab]]からの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。また、mex-setupにて[[Cコンパイラを選択>http://www.mathworks.co.jp/jp/help/matl​ab/matlab_external/building-mex-files.ht​ml#f23734]]しておく必要があります。~
+事前準備 +事前準備
-~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib_x32.dll(MATALBが64bitの場合はdxlib_x64.dll)とdxlib_matlab.hの格納されたパスを指定します。dxlib2.hはMATLABでは解釈できない記述が多いため使用しないでください。~+~まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdx2lib_x32.dll(MATALBが64bitの場合はdx2lib_x64.dll)とdx2lib_matlab.hの格納されたパスを指定します。dx2lib.hはMATLABでは解釈できない記述が多いため使用しないでください。~
+DLLのロード +DLLのロード
- loadlibrary('dxlib_x32.dll','dxlib_matlab.h','alias','dxlib2')+ loadlibrary('dx2lib_x32.dll','dx2lib_matlab.h','alias','dx2lib')
+ポートのオープン +ポートのオープン
-~ロードされたdxlib2のDX2_OpenPortを呼出します。関数名の後はポートとボーレートです。 +~ロードされたdx2libのDX2_OpenPortを呼出します。関数名の後はポートとボーレートです。 
- devid = calllib('dxlib2','DX2_OpenPort','\\.\COM3',1000000)+ devid = calllib('dx2lib','DX2_OpenPort','\\.\COM3',1000000)
+TErrorCodeの取得 +TErrorCodeの取得
~TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。 ~TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。
 Err = libpointer('uint16Ptr', 0);  Err = libpointer('uint16Ptr', 0);
- Ret = calllib('dxlib2', 'DX2_Ping', devid, 1, Err);+ Ret = calllib('dx2lib', 'DX2_Ping', devid, 1, Err);
 fprintf('%x', Err.Value);  fprintf('%x', Err.Value);
+ポートのクローズ +ポートのクローズ
~DX2_OpenPortを行ったので、DX2_ClosePortを使用してポートを閉じます。 ~DX2_OpenPortを行ったので、DX2_ClosePortを使用してポートを閉じます。
- calllib('dxlib2','DX2_ClosePort',devid)+ calllib('dx2lib','DX2_ClosePort',devid)
+DLLのアンロード +DLLのアンロード
- unloadlibrary('dxlib2')+ unloadlibrary('dx2lib')
***Linux [#w5c096b8] ***Linux [#w5c096b8]
-Linux上でのdxlib2のコンパイル方法を紹介します。~+Linux上でのdx2libのコンパイル方法を紹介します。~
+コンパイル準備~ +コンパイル準備~
ダウンロードファイルを解凍~ ダウンロードファイルを解凍~
+オブジェクトファイルの作成~ +オブジェクトファイルの作成~
-  gcc dxlib2.c -o dxlib2.o+  gcc dx2lib.c -o dx2lib.o
+共有ライブラリの作成~ +共有ライブラリの作成~
RubyやPython等で使用する場合のみ。~ RubyやPython等で使用する場合のみ。~
-  gcc -fPIC -shared dxlib2.c -o dxlib2.so+  gcc -fPIC -shared dx2lib.c -o dx2lib.so
+コンパイル~ +コンパイル~
-dxlib2のオブジェクトファイルとC言語ソースを合わせてコンパイルする。~+dx2libのオブジェクトファイルとC言語ソースを合わせてコンパイルする。~
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~
ライブラリは必要に合わせて追加する。~ ライブラリは必要に合わせて追加する。~
-  gcc sample.c dxlib2.o -o sample+  gcc sample.c dx2lib.o -o sample
なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。 なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。
Line 198: Line 198:
**API [#ybae1454] **API [#ybae1454]
Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~
-C言語のソースにdxlib2.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。+C言語のソースにdx2lib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。
***DX2_OpenPort [#zbd2f6ef] ***DX2_OpenPort [#zbd2f6ef]
ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、[[DX2_SetBaudrate>#ba9f52b8]]を使用して通信速度を設定した後、ユニークな[[TDeviceID>#TDeviceID]]を返す。以後はこの[[TDeviceID>#TDeviceID]]を使用して各APIを使用する。~ ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、[[DX2_SetBaudrate>#ba9f52b8]]を使用して通信速度を設定した後、ユニークな[[TDeviceID>#TDeviceID]]を返す。以後はこの[[TDeviceID>#TDeviceID]]を使用して各APIを使用する。~
-複数のCOMポートを使用する場合は、使用するポート毎にDX2_OpenPortを行い[[TDeviceID>#TDeviceID]]を取得しなくてはならない。~+複数のCOMポートを使用する場合は使用するポート毎にDX2_OpenPortを行い、各々のポートに対して[[TDeviceID>#TDeviceID]]を取得しなくてはならない。~
なお、Linuxにおけるボーレートの指定に関しては、[[DX2_SetBaudrate>#ba9f52b8]]の解説に注意の事。 なお、Linuxにおけるボーレートの指定に関しては、[[DX2_SetBaudrate>#ba9f52b8]]の解説に注意の事。
 TDeviceID DX2_OpenPort (char *name, uint32_t baud);  TDeviceID DX2_OpenPort (char *name, uint32_t baud);
Line 208: Line 208:
--char '''*name''' --char '''*name'''
~インターフェースが提供するCOMポート名。~ ~インターフェースが提供するCOMポート名。~
-記述方法は[[こちら:http://support.microsoft.com/default.aspx?scid=kb;ja;JP115831]]の情報に従う。+Windowsの場合の記述方法は[[こちら:https://support.microsoft.com/ja-jp/kb/115831]]の情報に従う。
--long '''baud''' --long '''baud'''
~インターフェースとデバイス間の通信速度[bps]。 ~インターフェースとデバイス間の通信速度[bps]。
Line 221: Line 221:
***DX2_ClosePort [#w1ab7cbb] ***DX2_ClosePort [#w1ab7cbb]
DX2_OpenPortで開いたCOMポートを閉じる。~ DX2_OpenPortで開いたCOMポートを閉じる。~
-DX2_ClosePortが実行された以後は指定された[[TDeviceID>#TDeviceID]]での通信が行えなくなる。+DX2_ClosePortが実行された以後は[[TDeviceID>#TDeviceID]]は使用できなくなる。
 bool DX2_ClosePort (TDeviceID dvid);  bool DX2_ClosePort (TDeviceID dvid);
-パラメータ -パラメータ
Line 289: Line 289:
I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ I/FやOSの都合で生じるであろうタイムラグを予め設定する。~
内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ 内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~
-デフォルトは20。+デフォルトは20[ms]。
 void DX2_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime);  void DX2_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime);
-パラメータ -パラメータ
Line 330: Line 330:
***DX2_Ping2 [#g16504b3] ***DX2_Ping2 [#g16504b3]
PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~
-BROADCASTING IDを指定した場合の応答時間がデバイスのシリーズによって差があるため、それらが混在している環境では正確な情報を取得できない場合がある。+BROADCASTING IDを指定した場合の応答時間はデバイスによって差があるため、異なるデバイスが混在している環境では正確な情報を取得できない場合がある。
 bool DX2_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);  bool DX2_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);
-パラメータ -パラメータ
Line 339: Line 339:
--[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' --[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus'''
~検索で見つかったデバイス情報の保存先。~ ~検索で見つかったデバイス情報の保存先。~
-少なくともnumで指定したサイズを確保しておく必要がある。+少なくともnumで指定したサイズ分の領域を確保しておく必要がある。
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 486: Line 486:
   // ID=1のXL-320へ位置(511)を指令    // ID=1のXL-320へ位置(511)を指令
   DX2_WriteWordData (dev, 1, 30, 511, &err);    DX2_WriteWordData (dev, 1, 30, 511, &err);
 +   DX2_ClosePort (dev);
 + }
 +
 +***DX2_ReadLongData [#d27bfdc2]
 +対象IDのコントロールテーブルからロング(4バイト)のデータを読み出す。
 + bool DX2_ReadLongData(TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t *rdata, TErrorCode *err);
 +-パラメータ
 +--[[TDeviceID>#TDeviceID]] '''dvid'''
 +~DX2_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
 +--uint8_t '''id'''
 +~対象とするID (0~252)。
 +--uint16_t '''adr'''
 +~コントロールテーブルのアドレス。
 +--uint32_t '''*rdata'''
 +~読み出した値の保存先。
 +--[[TErrorCode>#TErrorCode]] '''*err'''
 +~エラーコード。
 +-戻り値
 +--bool
 +~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
 +-使用例
 + TDeviceID  dev;
 + TErrorCode err;
 + uint32_t  dat;
 + // オープン
 + dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);
 + if (dev) {
 +   // ID=1のXM430から現在位置を取得
 +   if (DX2_ReadWordData (dev, 1, 132, &dat, &err)) {
 +     printf ("PRESENT POS=%d\n", dat);
 +   }
 +   DX2_ClosePort (dev);
 + }
 +
 +***DX2_WriteLongData [#c3bc7240]
 +対象IDのコントロールテーブルへロング(4バイト)のデータを書き込む。
 + bool DX2_WriteLongData(TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t dat, TErrorCode *err);
 +-パラメータ
 +--[[TDeviceID>#TDeviceID]] '''dvid'''
 +~DX2_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
 +--uint8_t '''id'''
 +~対象とするID (0~252, 254)。
 +--uint16_t '''adr'''
 +~コントロールテーブルのアドレス。
 +--uint32_t '''dat'''
 +~書き込む値。
 +--[[TErrorCode>#TErrorCode]] '''*errcode'''
 +~エラーコード。
 +-戻り値
 +--bool
 +~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~
 +BROADCASTING IDを指定した場合は応答待ちを行わない。
 +-使用例
 + TDeviceID  dev;
 + TErrorCode err;
 + // オープン
 + dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);
 + if (dev) {
 +   // ID=1のXM430へ位置(2047)を指令
 +   DX2_WriteWordData (dev, 1, 116, 2047, &err);
   DX2_ClosePort (dev);    DX2_ClosePort (dev);
 }  }
Line 515: Line 575:
 if (dev) {  if (dev) {
   // ID=1のXL-320からPIDゲインのデータを取得    // ID=1のXL-320からPIDゲインのデータを取得
-   if (DX2_ReadBlockData (dev, 1, 27, comp, 3, &err) {+   if (DX2_ReadBlockData (dev, 1, 26, gain, 3, &err) {
     printf (      printf (
     "D=%d I=%d P=%d\n",      "D=%d I=%d P=%d\n",
Line 547: Line 607:
 TDeviceID  dev;  TDeviceID  dev;
 TErrorCode err;  TErrorCode err;
- uint8_t    gain[3] = { 5, 1, 35 };+ uint8_t    gain[3] = { 1, 1, 1 };
 dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);  dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);
 if (dev) {  if (dev) {
   // ID=1のXL-320のPIDゲインを変更    // ID=1のXL-320のPIDゲインを変更
-   DX2_WriteBlockData (dev, 1, 27, gain, 3, &err);+   DX2_WriteBlockData (dev, 1, 26, gain, 3, &err);
   DX2_ClosePort (dev);    DX2_ClosePort (dev);
 }  }
Line 575: Line 635:
-使用例 -使用例
- // XM430のRealtimeTick(120番地)を読み出す想定の構造体+ // XM430の120番地から2バイト分のデータをid=1,2,3より読み出すパラメータ 
 + const TSyncReadParam param = { 
 +   addr:120, 
 +   length:2, 
 +   ids:{1,2,3}, 
 + }; 
 + 
 + // 読み出しすデータの構造体
 typedef struct {  typedef struct {
   uint8_t    id;    uint8_t    id;
Line 581: Line 648:
   uint16_t    RTTick;    uint16_t    RTTick;
 } __attribute__ ((gcc_struct, __packed__)) TSyncR[3];  } __attribute__ ((gcc_struct, __packed__)) TSyncR[3];
- 
- TDeviceID  dev; 
- TErrorCode err; 
 TSyncR    rdat;  TSyncR    rdat;
- // 120番地から2バイト分のデータをid=1,2,3より読み出す + TDeviceID  dev
- ;const TSyncReadParam param = { + TErrorCode err
-   addr:120, + if ((dev = DX2_OpenPort ("\\\\.\\COM5", 1000000))) {
- ; length:2, +
-   ids:{1,2,3}, +
- }; +
- +
- dev = DX2_OpenPort ("\\\\.\\COM10", 1000000)+
- if (dev) {+
   uint32_t num = 3; // 3軸    uint32_t num = 3; // 3軸
   DX2_ReadSyncData (dev, ¶m, &num, (uint8_t *)&rdat, &err);    DX2_ReadSyncData (dev, ¶m, &num, (uint8_t *)&rdat, &err);
 +   printf("resul num=%d\n", num);
   for (int i = 0; i < num; i++) {    for (int i = 0; i < num; i++) {
-     printf("\nID:%d ERR:%04X ", rdat[i].id, rdat[i].err, rdat[i].RTTick);+     printf("ID:%d ERR:%04X tick=%d\n", rdat[i].id, rdat[i].err, rdat[i].RTTick);
   }    }
   DX2_ClosePort (dev);    DX2_ClosePort (dev);
Line 620: Line 679:
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~
-使用例 -使用例
- #define _POS1 (400+ 
- #define _POS2 (511)+ // 2台のXM430へ位置を指令する想定の構造体 
 + typedef struct { 
 +   uint16_t    addr; 
 +   uint16_t    length; 
 +   struct { 
 +     uint8_t  id; 
 +     uint32_t  goalpos; 
 +   } __attribute__ ((gcc_struct, __packed__)) data[2]; 
 + } __attribute__ ((gcc_struct, __packed__)) TSyncW; 
 + 
 + TSyncW syncw = { 
 +   116,  // アドレス (Goal Position) 
 +   4,    // データ長 (4 byte) 
 +   {{ 1, 3072 },  // 1軸目 ID=1, GoalPosition=3072 
 +   { 2, 1024 }}  // 2軸目 ID=2, GoalPosition=1024 
 + };
 TDeviceID  dev;  TDeviceID  dev;
 TErrorCode err;  TErrorCode err;
- uint8_t    param[8] = { 
-   30,    // アドレス (Goal Position) 
-   2,    // データ長 (2 byte) 
-   // ID=1用データ 
-   1, 
-   _POS1 & 0xff, 
-   _POS1 >> 8, 
-   // ID=2用データ 
-   2, 
-   _POS2 & 0xff, 
-   _POS2 >> 8 
- }; 
- dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);+ dev = DX2_OpenPort ("\\\\.\\COM5", 1000000);
 if (dev) {  if (dev) {
-   // 2つのAX-12へ同時に位置を指令 +   // 2台のXM430へ個別の位置を指令 
-   DX2_WriteSyncData (dev, param, 8, &err);+   DX2_WriteSyncData (dev, (uint8_t *)&syncw, sizeof(syncw), &err);
   DX2_ClosePort (dev);    DX2_ClosePort (dev);
 };  };
Line 647: Line 709:
***DX2_ReadBulkData [#wf7d9427] ***DX2_ReadBulkData [#wf7d9427]
BULK READインストラクションを使用して複数IDの指定アドレス・サイズでブロック読み出しを行う。~ BULK READインストラクションを使用して複数IDの指定アドレス・サイズでブロック読み出しを行う。~
-読み出されるデータの1軸分の構造は[SIZE(16bit)][ID(8bit)][ERR(16bit)][PRAM1(8bit)]...[PARAMn(8bit)]の様にデータの前にSIZE(SIZEを含む1軸分のデータ長)・ID・ERRの計5バイトが付与され、複数軸の場合は本データが軸数分だけスタックする。+読み出されるデータの1軸分の構造は[SIZE(16bit)][ID(8bit)][ERR(16bit)][DATA1(8bit)]...[DATAn(8bit)]とし、DATAの前にSIZE(SIZEを含む1軸分のデータ長)・ID・ERRの計5バイトが付与される。複数軸の場合はSIZEから始まる本データが軸数分連続して取得される。
 bool DX2_ReadBulkData (TDeviceID dvid, const TBulkReadParam *param, uint32_t *num, uint8_t *dat, TErrorCode *err);  bool DX2_ReadBulkData (TDeviceID dvid, const TBulkReadParam *param, uint32_t *num, uint8_t *dat, TErrorCode *err);
-パラメータ -パラメータ
Line 657: Line 719:
~読み出すデバイス数を指定。APIの処理後に応答したデバイス数が入る ~読み出すデバイス数を指定。APIの処理後に応答したデバイス数が入る
--uint8_t '''dat''' --uint8_t '''dat'''
-~取得データの保存先。十分な領域を確保の事。+~取得データの保存先。十分な領域を確保の事。
 +[[TBulkReadResult>#TBulkReadResult]]を介して解析すると便利。
--[[TErrorCode>#TErrorCode]] '''*err''' --[[TErrorCode>#TErrorCode]] '''*err'''
~エラーコード。 ~エラーコード。
Line 667: Line 730:
 TDeviceID  dev;  TDeviceID  dev;
 TErrorCode err;  TErrorCode err;
- uint8_t    rdat[1000];+ uint8_t    rdat[1000]; // 読み出したデータの保存先
 const TBulkReadParam param[3] = {  const TBulkReadParam param[3] = {
-   {1,124,4}, // ID=1の124番地から4バイト分 +   {1,100,20}, // ID=1の124番地から20バイト分 
-   {2,128,8}, // ID=2の128番地から8バイト分 +   {2,124,12}, // ID=2の124番地から12バイト分 
-   {3,136,8}  // ID=3の136番地から8バイト分+   {3, 0, 7}  // ID=3の0番地から7バイト分
 };  };
- dev = DX2_OpenPort ("\\\\.\\COM10", 1000000);+ dev = DX2_OpenPort ("\\\\.\\COM5", 1000000);
 if (dev) {  if (dev) {
   uint32_t num = 3; // 3軸    uint32_t num = 3; // 3軸
   PBulkReadResult pr = (void *)rdat;    PBulkReadResult pr = (void *)rdat;
-   DX2_ReadBulkData (dev, ¶m, &num, (uint8_t *)&rdat, &err);+   DX2_ReadBulkData (dev, ¶m[0], &num, (uint8_t *)&rdat, &err); 
 +   printf("resul num=%d err=$%04x\n", num, err);
   for (int i = 0; i < num; i++) {    for (int i = 0; i < num; i++) {
     if (pr->size > 0) {      if (pr->size > 0) {
-       printf("\nID:%d ERR:%04X ",pr->id, pr->err); +       printf("\nID:%d err:$%04X ",pr->id, pr->err); 
-       for (int j = 0; j < pr->size - 5; j++) printf("[%02X]", pr->dat[j]);+       for (int j = 0; j < pr->size - 5; j++) printf("%02X ", pr->dat[j]);
       pr = (void *)pr + pr->size; // 次のデータ用にポインタを更新        pr = (void *)pr + pr->size; // 次のデータ用にポインタを更新
     }      }
Line 719: Line 783:
   // ID=1のAX-12+のLEDを消灯    // ID=1のAX-12+のLEDを消灯
   DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err);    DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err);
 +   DX2_ClosePort (dev);
 + };
 +
 +***DX2_WriteBulkData [#r6a06745]
 +BULKインストラクションを使用して複数の個別なID・アドレス・データサイズで書き込みを行う。
 + bool DX2_WriteBulkData (TDeviceID dvid, uint8_t *dat, uint32_t size, TErrorCode *err);
 +-パラメータ
 +--[[TDeviceID>#TDeviceID]] '''dvid'''
 +~DX2_OpenPortで開いた際の[[TDeviceID>#TDeviceID]]。
 +--uint8_t '''*dat'''
 +~書き込むパラメータの保存先。
 +--uint32_t '''size'''
 +~パラメータのサイズ。
 +--[[TErrorCode>#TErrorCode]] '''*err'''
 +~エラーコード。
 +-戻り値
 +--bool
 +~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~
 +-使用例
 +
 + // 3台のXM430へ位置を指令する想定の構造体
 + typedef struct {
 +   uint8_t  id;
 +   uint16_t addr;
 +   uint16_t len;
 +   int32_t  pos;
 + } __attribute__ ((gcc_struct, __packed__)) TBW[3];
 + TBW BW = {
 +   {1, 116, 4, 0},    // 1軸目 ID=1, アドレス=116, サイズ=4, GPos=0
 +   {2, 116, 4, 2047}, // 2軸目 ID=1, アドレス=116, サイズ=4, GPos=2047
 +   {3, 116, 4, 4095}  // 3軸目 ID=1, アドレス=116, サイズ=4, GPos=4095
 + };
 +
 + TDeviceID  dev;
 + TErrorCode err;
 +
 + dev = DX2_OpenPort ("\\\\.\\COM5", 1000000);
 + if (dev) {
 +   // 3台のXM430へ個別の情報を書き込み
 +   DX2_WriteBulkData (dev, (uint8_t *)&BW, sizeof(BW), &err);
   DX2_ClosePort (dev);    DX2_ClosePort (dev);
 };  };
Line 766: Line 870:
 };  };
-***DXLIB2のオリジナルな定義 [#af9ca340]+***DX2LIBのオリジナルな定義 [#af9ca340]
&aname(TDeviceID); &aname(TDeviceID);
:TDeviceID | ''(uint32_t|uint64_t)''~ :TDeviceID | ''(uint32_t|uint64_t)''~
Line 796: Line 900:
:TBulkReadParam | struct {&br; uint8_t id;&br; uint16_t addr;&br; uint16_t length;&br;}~ :TBulkReadParam | struct {&br; uint8_t id;&br; uint16_t addr;&br; uint16_t length;&br;}~
id, addr, lengthをまとめた構造体でアライメントは1バイト。[[DX2_ReadBulkData>#wf7d9427]]で使用される。 id, addr, lengthをまとめた構造体でアライメントは1バイト。[[DX2_ReadBulkData>#wf7d9427]]で使用される。
 +&aname(TBulkReadResult);
 +:TBulkReadResult| struct {&br; uint16_t size;&br; uint8_t id;&br; TErrorCode err;&br; uint8_t dat[];&br;}~
 +size, id, err, datをまとめた構造体でアライメントは1バイト。[[DX2_ReadBulkData>#wf7d9427]]で読み出されたデータのアクセスに使用される。
&aname(TErrorCode); &aname(TErrorCode);
:TErrorCode | ''(uint16_t)''~ :TErrorCode | ''(uint16_t)''~


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