概要 anchor.png

Dynamixel Protocol LibraryはDynamixel Protocol 1の通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。
シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。

なお、PCとBTE061DBTE061EBTE068BTE068BBTE082BTE083・BTE074・BTE079BTE080のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。

Page Top

ライブラリおよびサンプルプログラムのダウンロード anchor.png

以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。

  • 2016/07/13 Ver.3.3
    内容
    • Linux上でのttyの初期化処理を修正
    • Linux上でのスリープ命令をusleepに置換する様に変更
  • 2016/01/12 Ver.3.2
    内容
    • ヘッダファイルを最近のVCで使用するとエラーになるのを修正
    • DLLMainの不用意な呼び出しで余計な処理をしないよう対応
    • デバイス毎に異なるパケットサイズの制限のうち最小に合わせていたが、ライブラリ内では250バイトとする
    • GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一
  • 2015/11/18 Ver.3.1
    内容
    • TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正
    • ヘッダファイルの一部の記述がMSVCに対応していなかったのを修正
    • DX_SetBaudrateの処理に待ち時間を挿入
  • 2014/06/11 Ver.3.0
    内容
    • 各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
    内容
    • 内部のイベント処理が一部破綻していたのを修正。
    • シリアルエラー時の停止措置を解除。
    • ゴミデータ受信時の停滞を解消。
  • 2011/03/03 Ver.2.3 内容
    • 内部のイベント処理がことごとく破綻していたのを修正。
    • DX_ChangeBaudrateの返り値が反転していたいのを修正。
    • BROADCASTING IDを使用したPING(DX_Ping2)を追加。
  • 2011/02/02 Ver.2.2 内容
    • ライブラリ構築のオプションを修正し、各言語毎の呼出規約に囚われないファンクション名を吐く様にした。
  • 2011/02/01 Ver.2.1
    内容
    • 呼出規約をstdcallに変更
    • LabVIEWのラッパーviの設定を共通化
    • 新規ターゲット向けにサンプルを追加
  • 2010/12/24 Ver.2.0
    内容
    • 初期リリース

アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(※最新版のフォルダ構成を記載しています)

DXLIBdxlib_x32.dllライブラリ本体
dxlib_x64.dll
libdxlib_x32.aGCC用ライブラリ(定義のみ)
libdxlib_x64.a
dxlib_x32.llbMSVC用ライブラリ(定義のみ)
dxlib_x64.lib
dxlib.cppライブラリソース
dxlib.hライブラリヘッダ
dxlib_matlab.hmatlab用ヘッダ
dxmemmap.hDX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ
makelib.batライブラリ再構築用バッチ
83.bat
SampleCodeGCCDeveloperLitesmpl1(template).cサンプル
smpl2(ping).c
smpl3(byte_rw).c
smpl4(word_rw).c
smpl5(multithread).c
smpl6(sync).c
smpl7(rawpacket).c
smpl8(dualport).c
smpl9(DynamicLoad).c
smpl10(USS3).c
dxlib.hDXLIBフォルダに収録されるものと同一
dxmemmap.h
dxlib_x32.dll
dxlib_x64.dll
DELPHIProject1.dprサンプル
Unit1.dfm
Unit1.pas
DXLIB.pas
dxlib_x32.dllDXLIBフォルダに収録されるものと同一
dxlib_x64.dll
LabVIEW2011sample1.viサンプル
sample2.vi
sample3.vi
sample4.vi
sample5.vi
sample6.vi
WaveForm.viサブvi
DXLIB.llbdllの呼び出しをvi化
DXLIB_Wrapper.llbアクチュエータに特化したvi
dxlib_x32.dllDXLIBフォルダに収録されるものと同一
EXCELtext.xlsサンプルシート
dxlib_x32.dllDXLIBフォルダに収録されるものと同一
dxlib_x64.dll
Linuxsmpl2.cサンプル
smpl4.c
RubySMPL1.cサンプル
SMPL3.c
PythonSMPL1.pyサンプル
SMPL3.py
Page Top

開発環境毎の設定 anchor.png

サンプルを元にいくつかのツール・環境で使用する場合の設定方法を説明します。ここで紹介されないツールにおいても、dllを利用できるのであれば必要とされる操作は概ね同様だと思います。、

Page Top

GCC Developer Lite anchor.png

GCC Developer Liteの詳細についてはこちら
'SampleCode\GCCDeveloperLite'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。

Page Top
DLLの静的リンク anchor.png

静的にDLLを使用する場合は以下の手順でDLLをリンクする指定を行った上でコンパイルします。なお32bit環境を前提とします。

  1. ファイルの準備

    ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー

    ファイルファイル名備考
    ヘッダdxlib.h必要な宣言を集約
    DLLdxlib_x32.dllDLL本体(実行時およびリンク時に必要)
  2. コンパイルオプションの選択

    ツールメニュー→コンパイラオプションをクリックし、表示されるダイアログボックスの設定リストから'x86 (Console)'を選択

    GCC_CompileOption_sel.png
  3. ライブラリの追加

    etc...タブ内の追加ボタンを押し、新規に行を追加

    GCC_CompileOption_AddEtc.png

    新規に追加された空の行をクリックし'dxlib_x32.dll'と入力

    GCC_CompileOption_AddDxlib2.png

OKを押して設定を反映

Page Top
DLLの動的リンク anchor.png

動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。

#define _DYNAMICLOAD
#include "dxlib.h"

これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。

  TDeviceID   dev;
  // DLLをロード
  if (LoadDLL ()) {
    if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) {
      ...
      DX_ClosePort (dev);
    }
    // DLLをアンロード
    UnloadDLL ();
  }
Page Top

Microsoft Visual C++ anchor.png

Visual C++ 2010 ExpressでDLLの静的なリンク方法のみ紹介します。

  1. ファイルの準備

    ダウンロードファイルを解凍後、コンパイルするソースファイルと同一フォルダに以下のファイルをコピー

    ファイルファイル名備考
    ヘッダdxlib.h必要な宣言を集約
    DLLdxlib_x32.dll実行時に必要
    ライブラリdxlib_x32.libリンク時に必要
  2. プロジェクトのプロパティを変更

    構成プロパティ→C/C++→全般→追加のインクルードディレクトリの項目にヘッダファイルの格納フォルダを指定

    vcc_property_includetrq.png

    構成プロパティ→リンカー→全般→追加のライブラリディレクトリの項目にLIBファイルの格納フォルダを指定

    vcc_property_lib_pathtrq.png

    構成プロパティ→リンカー→入力→追加の依存ファイルの項目にLIBファイル名を指定

    vcc_property_lib_filetrq.png

    構成プロパティ→C/C++→プリコンパイル済ヘッダーの項目にプリコンパイル済ヘッダーを使用しないを指定

    vcc_property_precompiletrq.png
Page Top

National Instruments LabVIEW anchor.png

'SampleCode\LabVIEW2011'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
LabVIEWには外部のDLLへアクセスする手段が提供されています。しかしながらDXLIBそのままの定義ではLabVIEWからは使いづらいため、サンプルプログラムではサブviでラッピングしてDXLIB.llbにまとめて提供しています。

vi_frontpanel.png
vi_diagram.png
Page Top
関数パレットへの登録 anchor.png

DXLIB.llbから各viを開き、開いたviの右上にあるアイコンを自分のブロックダイアグラムにドラッグドロップするという操作でviを使用しても良いのですが、頻繁に操作するとなると少々煩雑です。
関数パレットに登録すればスムーズに操作できますので、その手順を紹介します。

  1. LabVIEWのメニューの「ツール」→「上級」→パレットセットを編集」をクリック。
    lvmenu_step1.png
  2. 開いた関数パレットの空いたスペースで右クリックし、ポップアップメニューから「挿入」→「サブパレット」をクリック。
    lvmenu_step2.png
  3. 開いたダイアログボックスから「LLBへリンク(.llb)」を選びOKを押す。
    lvmenu_step3.png
  4. LLBを選択するファイルダイアログボックスから、先に解凍したファイルの中から「DXLIB.llb」を選択しOKを押す。
    lvmenu_step4.png
  5. 次の様なメニューが追加されたらOK。
    lvmenu_step5.png
Page Top

DELPHI anchor.png

'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
DELPHIはPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDXLIB.pas内にdxlib_x32.dllないしdxlib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdxlibを追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。

Page Top

VB anchor.png

'SampleCode\EXCEL'フォルダにサンプルが同梱されます。
ここではVBと似たMicrosoft OfficeのVBAを使用し、マクロの標準モジュールにDXLIB_HEADという名称でDLLに含まれるいくつかのAPIが定義してあります。
Module1にPingTestとMotorTestというマクロが記述されていますので、ワークシートから適宜マクロを呼び出して実行してください。結果がシート上に反映されます。

なお、Officeにも32bit版と64bit版があるため、Declare宣言の方法が異なります。その部分はDXLIB_HEADにて判定していますので、参考にしてください。

Page Top

Ruby anchor.png

'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
Rubyはオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。

 require 'dl/import'
 molude dxlib
   extend DL::Importer
   dlload "./dxlib_x32.dll"
   extern "int DX_OpenPort( char *, long )"
 end
 devid = dxlib.DX_OpenPort( "ポート名", ボーレート )
Page Top

Python anchor.png

'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。
Pythonはオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。
LinuxでLoadLibraryを呼び出す際はcdllインスタンスを使用します。

 dxlib = windll.LoadLibrary( "dxlib_x32.dll" )  # for window
 dxlib = cdll.LoadLibrary( "./dxlib.so" )   # for linux
Page Top

Java anchor.png

Page Top

MathWorks MATLAB anchor.png

MATLABからの使用例を紹介します。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して下さい。また、mex-setupにてCコンパイラを選択しておく必要があります。

  1. 事前準備

    まずはMATLAB起動後、「ファイル(F)」→「パス設定(H)」でdxlib_x32.dll(MATALBが64bitの場合はdxlib_x64.dll)とdxlib_matlab.hの格納されたパスを指定します。dxlib.hはMATLABでは解釈できない記述が多いため使用しないでください。

  2. DLLのロード
    loadlibrary('dxlib_x32.dll','dxlib_matlab.h','alias','dxlib')
  3. ポートのオープン

    ロードされたdxlibのDX_OpenPortを呼出します。関数名の後はポートとボーレートです。

    devid = calllib('dxlib','DX_OpenPort','\\.\COM3',1000000)
  4. TErrorCodeの取得

    TErrorCodeはポインタで引き渡しているため、事前に型宣言をしておきます。値はErr.Valueで取得可能です。必要なければ0を指定しても構いません。

    Err = libpointer('uint16Ptr', 0);
    Ret = calllib('dxlib', 'DX_Ping', devid, 1, Err);
    fprintf('%x', Err.Value);
  5. ポートのクローズ

    DX_OpenPortを行ったので、DX_ClosePortを使用してポートを閉じます。

    calllib('dxlib','DX_ClosePort',devid)
  6. DLLのアンロード
    unloadlibrary('dxlib')
Page Top

Linux anchor.png

Linux上でdxlibをコンパイルする方法を紹介します。

  1. コンパイル準備
    ダウンロードファイルを解凍
  2. オブジェクトファイルの作成
     gcc dxlib.cpp -o dxlib.o
  3. 共有ライブラリの作成
    RubyやPython等で使用する場合のみ。
     gcc -fPIC -shared dxlib.cpp -o dxlib.so
  4. コンパイル
    dxlibのオブジェクトファイルとC言語ソースを合わせてコンパイルする。
    ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。
    ライブラリは必要に合わせて追加する。
     gcc sample.c dxlib.o -o sample

なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。

Page Top

API anchor.png

本ライブラリはシリアル通信を行うコードを記述しなくて良いのですが、デバイスIDという番号を用いて使用するシリアルI/Fを一元的に管理します。また、制御対象となるDynamixelのIDを指定し、そのコントロールテーブルへの読み書き行うAPIが用意されています。
自身のC言語で記述されたソースプログラムにdxlib.hをインクルードする事で、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。

注意事項
DynamixelのStatus Return Levelを必ず2に設定した上で使用する事。それ以外の値が設定されていた場合はAPIが想定した応答が得られず、タイムアウトするまでAPIから返らない。

Page Top

DX_OpenPort anchor.png

ライブラリの内部情報を初期化すると同時に指定されたCOMポートをオープンし、DX_SetBaudrateを使用して通信速度を設定した後、ユニークなTDeviceIDを返す。以後はこのTDeviceIDを使用して各APIを使用する。
複数のCOMポートを使用する場合は、使用するポート毎にDX_OpenPortを行いTDeviceIDを取得しなくてはならない。
なお、Linuxにおけるボーレートの指定に関しては、DX_SetBaudrateの解説に注意の事。

TDeviceID DX_OpenPort (char *name, uint32_t baud);
  • パラメータ
    • char *name

      インターフェースが提供するCOMポート名。
      記述方法はこちらの情報に従う。

    • long baud

      インターフェースとデバイス間の通信速度[bps]。

  • 戻り値
    • TDeviceID

      オープンに成功した場合は0以外の値、失敗した場合は0を返す。

  • 使用例
    TDeviceID dev;
    // COM10を9600bpsでオープン
    dev = DX_OpenPort ("\\\\.\\COM10", 9600);
Page Top

DX_ClosePort anchor.png

DX_OpenPortで開いたCOMポートを閉じる。
DX_ClosePortが実行された以後は指定されたTDeviceIDでの通信が行えなくなる。

bool DX_ClosePort (TDeviceID dvid);
  • パラメータ
  • 戻り値
    • bool

      クローズに成功した場合はtrue、失敗した場合はfalseを返す。

  • 使用例
    TDeviceID dev;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 9600);
    if (dev) {
      ... (中略)
      // クローズ
      DX_ClosePort (dev);
    }
Page Top

DX_SetBaudrate anchor.png

既にオープンされている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);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • long baud

      新しい通信速度[bps]。

  • 戻り値
    • bool

      通信速度の変更が成功するとtrue、失敗するとfalseを返す。

  • 使用例
    TDeviceID dev;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 9600);
    if (dev) {
      // 通信速度を1M[bps]に変更
      DX_SetBaudrate (dev, 1000000);
      ... (中略)
      // クローズ
      DX_ClosePort (dev);
    }
Page Top

DX_Active anchor.png

指定されたTDeviceIDのポートが開かれており、使用可能であるかを確認する。
USB接続等によりインターフェース自体が取り外し可能な場合に、実際に使用可能であるかを判断するために使用するが、状況によっては正確に判断できない場合もある。

bool DX_Active (TDeviceID dvid);
  • パラメータ
  • 戻り値
    • bool

      指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。

  • 使用例
    TDeviceID dev;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 9600);
    if (dev) {
      while (DX_Active (dev)) {
        ... (中略)
      }
      // クローズ
      DX_ClosePort (dev);
    }
Page Top

DX_SetTimeOutOffset anchor.png

I/FやOSの都合で生じるであろうタイムラグを予め設定する。
ライブラリ内で想定した受信時間と指定されたタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理される。
デフォルトは20。

void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint32_t offsettime

      タイムアウトオフセット時間[ms]

  • 戻り値
    • bool

      指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。

Page Top

DX_Ping anchor.png

PINGインストラクションを使用して対象IDからの応答を確認する。

bool DX_Ping (TDeviceID dvid, uint8_t id, TErrorCode *err);
  • パラメータ
  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 57143);
    if (dev) {
      // ID=1にPINGを発行
      if (DX_Ping (dev, 1, &err))
        printf ("Found [%08X]\n", err);
      else
        printf ("Not found [%08X]\n", err);
      // クローズ
      DX_ClosePort (dev);
    }
Page Top

DX_Ping2 anchor.png

PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。
応答時間がDynamixelの種類によって差があるため、それらが混在している環境では正確な情報を取得できない場合がある。

bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint32_t *num

      検索する最大数及び検索で見つかったデバイス数の保存先。

    • TDxAlarmStatus *AlarmStatus

      検索で見つかったデバイス情報の保存先。
      少なくともnumで指定したサイズを確保しておく必要がある。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID   dev;
    TErrorCode  err;
    uint8_t     id;
    TDxAlarmStatus stat[254];
    int         i;
    uint32_t    num = 254;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 57143);
    if (dev) {
      // 不明な対象に対してPINGを発行
      // numには予め254の値を指定したので、最大254台まで見つけようとする
      if (DX_Ping2 (dev, &num, stat, &err)) {
        // 1台以上見つかるとnumには見つかった数が返ってくる
        for (i = 0; i < num; i++)
          printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status);
      }
      // クローズ
      DX_ClosePort (dev);
    }
Page Top

DX_ReadByteData anchor.png

対象IDのコントロールテーブルから1バイトのデータを読み出す。

bool DX_ReadByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint8_t *rdata

      読み出した値の保存先。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    dat;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12からLEDの状態を取得
      if (DX_ReadByteData (dev, 1, 25, &dat, &err)) {
        printf ("LED STAT=%d\n", dat);
      }
      DX_ClosePort (dev);
    }
Page Top

DX_WriteByteData anchor.png

対象IDのコントロールテーブルへ1バイトのデータを書き込む。

bool DX_WriteByteData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t dat, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253, 254)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint8_t dat

      書き込む値。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。
      BROADCASTING IDを指定した場合は応答待ちを行わない。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    dat;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12からLEDの状態を取得
      if (DX_ReadByteData (dev, 1, 25, &dat, &err)) {
        dat ^= 1; // ビット反転
        // ID=1のAX-12へLEDの状態を設定
        DX_WriteByteData (dev, 1, 25, dat, &err);
      }
      DX_ClosePort (dev);
    }
Page Top

DX_ReadWordData anchor.png

対象IDのコントロールテーブルから1ワード(2バイト)のデータを読み出す。

bool DX_ReadWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t *rdata, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint16_t *rdata

      読み出した値の保存先。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint16_t   dat;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12から現在位置を取得
      if (DX_ReadWordData (dev, 1, 36, &dat, &err)) {
        printf ("PRESENT POS=%d\n", dat);
      }
      DX_ClosePort (dev);
    }
Page Top

DX_WriteWordData anchor.png

対象IDのコントロールテーブルへ1ワード(2バイト)のデータを書き込む。

bool DX_WriteWordData(TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t dat, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253, 254)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint16_t dat

      書き込む値。

    • TErrorCode *errcode

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。
      BROADCASTING IDを指定した場合は応答待ちを行わない。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    // オープン
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12へ位置(511)を指令
      DX_WriteWordData (dev, 1, 30, 511, &err);
      DX_ClosePort (dev);
    }
Page Top

DX_ReadBlockData anchor.png

対象IDのコントロールテーブルから指定サイズのデータを読み出す。

bool DX_ReadBlockData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, uint32_t len, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint8_t *rdata

      読み出したデータの保存先。

    • uint32_t len

      読み出すデータのサイズ。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    comp[4];
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12+からコンプライアンスのデータを取得
      if (DX_ReadBlockData (dev, 1, 26, comp, 4, &err) {
        printf (
         "CWM=%d CCWM=%d CWS=%d CCWS=%d\n",
         comp[0], comp[1], comp[2], comp[3]
        );
      }
      DX_ClosePort (dev);
    }
Page Top

DX_WriteBlockData anchor.png

対象IDのコントロールテーブルへ指定サイズのデータを書き込む。

bool DX_WriteBlockData(TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *dat, uint32_t len, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~253, 254)。

    • uint16_t adr

      コントロールテーブルのアドレス。

    • uint8_t *dat

      書き込むデータの保存先。

    • uint32_t len

      書き込むデータのサイズ。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      正常な応答が得られた場合はtrue、それ以外はfalseを返す。
      BROADCASTING IDを指定した場合は応答待ちを行わない。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    comp[4] = { 0, 1, 200, 200 };
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12+のコンプライアンスを変更
      DX_WriteBlockData (dev, 1, 26, comp, 4, &err);
      DX_ClosePort (dev);
    }
Page Top

DX_ReadSyncData anchor.png

SYNCインストラクションには読み出し機能が無いが、DX_ReadBlockDataを使用して指定された複数IDからブロック読み出しを行う。正確には「同期」していない。

bool DX_ReadSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, uint8_t *retdat, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際の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 *err

      エラーコード。

  • 戻り値
    • bool

      指定された全てのIDに対する読み出しが正常に完了したらtrue、それ以外はfalseを返す。

Page Top

DX_WriteSyncData anchor.png

SYNCインストラクションを使用して複数IDへブロック書き込みを行う。
書き込まれるデータの構成はユーザに委ねられる。

bool DX_WriteSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t *dat

      書き込むパラメータの保存先。

    • uint32_t size

      パラメータのサイズ。

    • TErrorCode *err

      エラーコード。

  • 戻り値
    • bool

      インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。

  • 使用例
    #define _POS1 (400)
    #define _POS2 (511)
    
    TDeviceID  dev;
    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 = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // 2つのAX-12へ同時に位置を指令
      DX_WriteSyncData (dev, param, 8, &err);
      DX_ClosePort (dev);
    };
Page Top

DX_TxPacket anchor.png

任意のインストラクションパケットを送信する。

bool DX_TxPacket (TDeviceID dvid, uint8_t id, TInstruction inst, uint8_t *param, uint32_t len, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t id

      対象とするID (0~254)。

    • TInstruction inst

      使用するインストラクション。

    • uint8_t *param

      送信するパラメータの保存先。

    • uint32_t len

      送信するパラメータのサイズ。

    • TErrorCode *err

      エラーコード。

  • 戻り値

    インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。

  • 使用例
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    param[2] = {
      25,    // アドレス (LED)
      0,     // データ
    };
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12+のLEDを消灯
      DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err);
      DX_ClosePort (dev);
    };
Page Top

DX_RxPacket anchor.png

ステータスパケットを受信する。
基本的にDX_TxPacketとペアで使用する。ステータスパケットが得られない状況で使用するとタイムアウトするまで返らない。
なお、本APIはDX_SetTimeOutOffsetで設定されたオフセット値は使用せず、引数で指定された受信タイムアウトのみが適用される。

bool DX_RxPacket (TDeviceID dvid, uint8_t *rdata, uint32_t rdatasize, uint32_t *rlen, uint32_t timeout, TErrorCode *err);
  • パラメータ
    • TDeviceID dvid

      DX_OpenPortで開いた際のTDeviceID

    • uint8_t *rdata

      受信バッファ。
      ステータスパケットを受信するのに十分なサイズを確保しておく必要がある。

    • uint32_t readsize

      rdataのサイズ。

    • uint32_t *rlen

      実際に受信されたステータスパケットのサイズ。

    • int timeout

      受信タイムアウト[ms]。

    • TErrorCode *err

      エラーコード。

  • 戻り値

    受信成功時はtrue、それ以外はfalseを返す。

  • 使用例
    int        i;
    uint32_t   len;
    TDeviceID  dev;
    TErrorCode err;
    uint8_t    param[2] = {
      25,    // アドレス (LED)
      1,     // サイズ
    };
    
    dev = DX_OpenPort ("\\\\.\\COM10", 1000000);
    if (dev) {
      // ID=1のAX-12+からLEDの状態を読み出す要求
      if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) {
        // ステータスパケットを受信
        DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &err);
        for (i = 0; i < len; i++) {
          printf ("[%02X]", dat[i]);
        }
      }
      DX_ClosePort (dev);
    };
Page Top

DXLIBのオリジナルな定義 anchor.png

TDeviceID
(uint32_t|uint64_t)
インターフェース毎に割り当てられるユニークな値。DX_OpenPortにて自動的に生成される。
TInstruction
(uint8_t)
DX_TxPacketにてインストラクションパケットを送信する場合に使用される。
使用可能なマクロは以下の通り。

INST_PING
INST_READ
INST_WRITE
INST_REG_WRITE
INST_ACTION
INST_RESET
INST_SYNC_WRITE
INST_SYNG_REG_WRITE

TDxAlarmStatus
struct {
uint8_t id;
TErrorCode Status;
}
idとTErrorCodeを対にした構造体。
TErrorCode
(uint16_t)
API内で検出される16ビットのエラーコード。上位8ビットはAPI内部で検出したエラー、下位8ビットはステータスパケットに含まれるエラーフラグが割り当てられている。
bitmacro name
15ERR_INVALID_DEVID使用できないTDeviceID
14ERR_INVALID_ID指定できないID
13ERR_DIFF_ID異なるIDからの応答
12ERR_ILLEGAL_SIZE異常なデータサイズ
11ERR_INVALID_PARAM異常なパラメータ
10ERR_COMMシリアルポートエラー
9ERR_CHECKSUM異常なチェックサム
8ERR_TIMEOUT受信タイムアウト
7
6ERR_DX_INST未定義のインストラクションが指定された、もしくはreg_writeなしでactionが指定された
5ERR_DX_OVERLOAD指定された最大トルクで現在の負荷を制御できない
4ERR_DX_CHECKSUMインストラクションパケットのチェックサムが正しく無い
3ERR_DX_RANGEパラメータの設定範囲を超えた
2ERR_DX_OVERHEAT内部温度が設定温度を超えた
1ERR_DX_ANGLEAngle Limitの範囲外にGoal Positionが指定された
0ERR_DX_OVERVOLTAGE電源電圧が指定動作電圧の範囲を超えた


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
最終更新: 2016-12-04 (日) 21:50:40 (JST) (316d)