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するだけで使用することができる。
検証環境は以下の通り。
- OS: Windows 7(32bit)
- Microsoft Excel
- dxlib2 V2.1
準備はdxlib2.dllと同一フォルダに適当なExcelファイルを作成するだけ。
- 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"
- 実行結果
EXCELであればセルにデータを保持すればグラフなり何なりにする事も可能だが、既にdxlib2 V2.1のサンプルとして同梱されてるのでそちらをを参考に。
それと、dxlib2 V2.1をGCC Developer Liteで使う際は、コンパイルオプションに -mrtd を付けてビルドしないと自殺アプリになってしまうのでご注意を。