ブログ - ExcelでDXLIB2を動かす

ExcelでDXLIB2を動かす

カテゴリ : 
その他
2011-2-1 17:08
2011/2/2 dxlib2 Ver2.2公開にあたり

各開発環境毎でdllの扱いが違いすぎてごっつ使い辛いのがイラついたので、再度更新。
V2.0およびV2.1の使用を即刻中止し、V2.2に移行する事を強く推奨。

たびたびの修正ご容赦を。


これまで、Java,Ruby,Pythonよりdxlib2を使用したDynamixelの動作確認を行ってきた。

諸々試し始めている方は気付かれているかも知れないが、dxlib2はVBからの利用ができなくなっている。dxlib2の関数呼出規約がcdeclになっているが故に、VBから見えないという訳である。

そこで、VBないしVBAからの呼出しを可能にするため、dxlib2 Version2.1から呼出規約のデフォルトをstdcallに変更することとした。

それに伴う影響が以前紹介した言語にどこまで波及するか確認してみた。Javaはラッピング関数作成時のリンカオプションに-mrtdを付加することで解決。Pythonはcdllクラスからwindllクラスことで解決。Rubyに至っては影響なしという結果だった。
Ruby恐るべし。

肝心のVB(ここではExcelのVBA)での使用だが、通常のAPI呼出しと同様にdxlib2内の関数を適宜Declareするだけで使用することができる。
検証環境は以下の通り。
  1. OS: Windows 7(32bit)
  2. Microsoft Excel
  3. dxlib2 V2.1
準備はdxlib2.dllと同一フォルダに適当なExcelファイルを作成するだけ。
  1. VBAサンプル
    サンプルとして0~10のIDにPingを発行して結果をメッセージダイアログに表示する。
    宣言
    Declare Function DX_OpenPort Lib "dxlib2.dll" (ByVal pcom As String, ByVal br As Long) As Long
    Declare Function DX_ClosePort Lib "dxlib2.dll" (ByVal id As Long) As Boolean
    Declare Function DX_Ping Lib "dxlib2.dll" (ByVal devid As Long, ByVal uid As Byte, ByVal tout As Integer, ByRef terr As Integer) As Boolean
    本文抜粋
    Dim sMsg As String
    Dim devid As Long
    Dim i As Integer, terr As Integer
    Dim vRet As Variant
    ChDrive ActiveWorkbook.Path
    ChDir ActiveWorkbook.Path
    devid = DX_OpenPort("\\.\COM3", 1000000)
    If devid = 0 Then
    MsgBox "Port open failed!", vbCritical, "COMポートオープン失敗"
    Else
    For i = 0 To 10
    vRet = DX_Ping(devid, i, 50, terr)
    If vRet Then
    sMsg = sMsg & i & " Alive" & Chr(13) & Chr(10)
    Else
    sMsg = sMsg & i & " Dead : " & Hex(terr) & Chr(13) & Chr(10)
    End If
    Next
    DX_ClosePort devid
    End If
    MsgBox sMsg, , "DXLIB2 TEST"
  2. 実行結果

EXCELであればセルにデータを保持すればグラフなり何なりにする事も可能だが、既にdxlib2 V2.1のサンプルとして同梱されてるのでそちらをを参考に。

それと、dxlib2 V2.1をGCC Developer Liteで使う際は、コンパイルオプションに -mrtd を付けてビルドしないと自殺アプリになってしまうのでご注意を。

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/69