11: 2019-11-16 (土) 18:40:20 takaboo | 12: 2020-07-11 (土) 12:06:40 takaboo | ||
---|---|---|---|
Line 10: | Line 10: | ||
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | ||
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | ||
- | -''2019/11/16 Ver.2.4''~ | + | -''2020/08/04 Ver.2.5''~ |
+ | #ref(http://www.besttechnology.co.jp/download/DX2LIB_V2.5.zip) | ||
+ | 更新内容 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | --WriteBlockDataの変数定義を変更 | ||
+ | -2019/11/16 Ver.2.4~ | ||
#ref(http://www.besttechnology.co.jp/download/DX2LIB_V2.4.zip) | #ref(http://www.besttechnology.co.jp/download/DX2LIB_V2.4.zip) | ||
- | 内容 | + | 更新内容 |
--Visual Studio上での動作検証を行いヘッダを一部修正 | --Visual Studio上での動作検証を行いヘッダを一部修正 | ||
--ライブラリソースのエンコードをUTF-8のBOM付きに統一 | --ライブラリソースのエンコードをUTF-8のBOM付きに統一 | ||
Line 96: | Line 101: | ||
****DLLの動的リンク [#y15bf22f] | ****DLLの動的リンク [#y15bf22f] | ||
- | 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdx2lib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | + | 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりソース中でdx2lib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
Line 103: | Line 108: | ||
</pre> | </pre> | ||
}} | }} | ||
- | これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 | + | これによりヘッダファイル内の諸定義が切り替わり、LoadDLLとUnloadDLLで動的なDLL読み込みと破棄ができます。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
TDeviceID dev; | TDeviceID dev; | ||
- | // DLLをロード | + | // DLLを読み込み |
if (LoadDLL ()) { | if (LoadDLL ()) { | ||
if ((dev = DX2_OpenPort (COMPORT, BAUDRATE))) { | if ((dev = DX2_OpenPort (COMPORT, BAUDRATE))) { | ||
Line 113: | Line 118: | ||
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
- | // DLLをアンロード | + | // DLLを破棄 |
UnloadDLL (); | UnloadDLL (); | ||
} | } | ||
</pre> | </pre> | ||
}} | }} | ||
+ | LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | ||
***Microsoft Visual C++ [#j5a74d33] | ***Microsoft Visual C++ [#j5a74d33] | ||
Line 247: | Line 253: | ||
~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 | ~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | ... (中略) | + | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); |
- | // クローズ | + | if (dev) { |
- | DX2_ClosePort (dev); | + | ... (中略) |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_SetBaudrate [#ba9f52b8] | ***DX2_SetBaudrate [#ba9f52b8] | ||
Line 270: | Line 280: | ||
~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ | ~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | // 通信速度を1M[bps]に変更 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); |
- | DX2_SetBaudrate (dev, 1000000); | + | if (dev) { |
- | ... (中略) | + | // 通信速度を1M[bps]に変更 |
- | // クローズ | + | DX2_SetBaudrate (dev, 1000000); |
- | DX2_ClosePort (dev); | + | ... (中略) |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_Active [#ie20e4a7] | ***DX2_Active [#ie20e4a7] | ||
Line 292: | Line 306: | ||
~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 | ~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | while (DX2_Active (dev)) { | + | dev = DX2_OpenPort ("\\\\.\\COM10", 9600); |
- | ... (中略) | + | if (dev) { |
- | } | + | while (DX2_Active (dev)) { |
- | // クローズ | + | ... (中略) |
- | DX2_ClosePort (dev); | + | } |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_SetTimeOutOffset [#h4a1b54e] | ***DX2_SetTimeOutOffset [#h4a1b54e] | ||
Line 331: | Line 349: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1にPINGを発行 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); |
- | if (DX2_Ping (dev, 1, &err)) | + | if (dev) { |
- | printf ("Found [%08X]\n", err); | + | // ID=1にPINGを発行 |
- | else | + | if (DX2_Ping (dev, 1, &err)) |
- | printf ("Not found [%08X]\n", err); | + | printf ("Found [%08X]\n", err); |
- | // クローズ | + | else |
- | DX2_ClosePort (dev); | + | printf ("Not found [%08X]\n", err); |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_Ping2 [#g16504b3] | ***DX2_Ping2 [#g16504b3] | ||
Line 363: | Line 385: | ||
~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t id; | + | TDeviceID dev; |
- | TDxAlarmStatus stat[254]; | + | TErrorCode err; |
- | int i; | + | uint8_t id; |
- | uint32_t num = 252; | + | TDxAlarmStatus stat[254]; |
- | // オープン | + | int i; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); | + | uint32_t num = 252; |
- | if (dev) { | + | // オープン |
- | // 不明な対象に対してPINGを発行 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); |
- | if (DX2_Ping2 (dev, &num, stat, &err)) { | + | if (dev) { |
- | for (i = 0; i < num; i++) | + | // 不明な対象に対してPINGを発行 |
- | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | + | if (DX2_Ping2 (dev, &num, stat, &err)) { |
- | } | + | for (i = 0; i < num; i++) |
- | // クローズ | + | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); |
- | DX2_ClosePort (dev); | + | } |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_Reset [#fd640394] | ***DX2_Reset [#fd640394] | ||
Line 395: | Line 421: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1にRESETを発行 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); |
- | if (DX2_Reset (dev, 1, &err)) | + | if (dev) { |
- | printf ("Success [%08X]\n", err); | + | // ID=1にRESETを発行 |
- | else | + | if (DX2_Reset (dev, 1, &err)) |
- | printf ("Fail [%08X]\n", err); | + | printf ("Success [%08X]\n", err); |
- | // クローズ | + | else |
- | DX2_ClosePort (dev); | + | printf ("Fail [%08X]\n", err); |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_Reboot [#becb91ef] | ***DX2_Reboot [#becb91ef] | ||
Line 423: | Line 453: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1にREBOOTを発行 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 57143); |
- | if (DX2_Reboot (dev, 1, &err)) | + | if (dev) { |
- | printf ("Success [%08X]\n", err); | + | // ID=1にREBOOTを発行 |
- | else | + | if (DX2_Reboot (dev, 1, &err)) |
- | printf ("Fail [%08X]\n", err); | + | printf ("Success [%08X]\n", err); |
- | // クローズ | + | else |
- | DX2_ClosePort (dev); | + | printf ("Fail [%08X]\n", err); |
- | } | + | // クローズ |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_ReadByteData [#u7d86432] | ***DX2_ReadByteData [#u7d86432] | ||
Line 455: | Line 489: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | uint8_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXL-320からLEDの状態を取得 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (dev) { |
- | printf ("LED STAT=%d\n", dat); | + | // ID=1のXL-320からLEDの状態を取得 |
- | } | + | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { |
- | DX2_ClosePort (dev); | + | printf ("LED STAT=%d\n", dat); |
- | } | + | } |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_WriteByteData [#ma2205f0] | ***DX2_WriteByteData [#ma2205f0] | ||
Line 487: | Line 525: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | uint8_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXL-320からLEDの状態を取得 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (dev) { |
- | dat = (dat + 1) & 7; | + | // ID=1のXL-320からLEDの状態を取得 |
- | // ID=1のXL-320へLEDの状態を設定 | + | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { |
- | DX2_WriteByteData (dev, 1, 25, dat, &err); | + | dat = (dat + 1) & 7; |
- | } | + | // ID=1のXL-320へLEDの状態を設定 |
- | DX2_ClosePort (dev); | + | DX2_WriteByteData (dev, 1, 25, dat, &err); |
- | } | + | } |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_ReadWordData [#x202d573] | ***DX2_ReadWordData [#x202d573] | ||
Line 520: | Line 562: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint16_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | uint16_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXL-320から現在位置を取得 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX2_ReadWordData (dev, 1, 30, &dat, &err)) { | + | if (dev) { |
- | printf ("PRESENT POS=%d\n", dat); | + | // ID=1のXL-320から現在位置を取得 |
- | } | + | if (DX2_ReadWordData (dev, 1, 30, &dat, &err)) { |
- | DX2_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_WriteWordData [#pcc1b3ce] | ***DX2_WriteWordData [#pcc1b3ce] | ||
Line 552: | Line 598: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1のXL-320へ位置(511)を指令 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX2_WriteWordData (dev, 1, 30, 511, &err); | + | if (dev) { |
- | DX2_ClosePort (dev); | + | // ID=1のXL-320へ位置(511)を指令 |
- | } | + | DX2_WriteWordData (dev, 1, 30, 511, &err); |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_ReadLongData [#d27bfdc2] | ***DX2_ReadLongData [#d27bfdc2] | ||
Line 580: | Line 630: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint32_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | uint32_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430から現在位置を取得 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX2_ReadWordData (dev, 1, 132, &dat, &err)) { | + | if (dev) { |
- | printf ("PRESENT POS=%d\n", dat); | + | // ID=1のXM430から現在位置を取得 |
- | } | + | if (DX2_ReadWordData (dev, 1, 132, &dat, &err)) { |
- | DX2_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_WriteLongData [#c3bc7240] | ***DX2_WriteLongData [#c3bc7240] | ||
Line 612: | Line 666: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430へ位置(2047)を指令 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX2_WriteWordData (dev, 1, 116, 2047, &err); | + | if (dev) { |
- | DX2_ClosePort (dev); | + | // ID=1のXM430へ位置(2047)を指令 |
- | } | + | DX2_WriteWordData (dev, 1, 116, 2047, &err); |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_ReadBlockData [#b8a1ae1e] | ***DX2_ReadBlockData [#b8a1ae1e] | ||
Line 642: | Line 700: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t gain[3]; | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | uint8_t gain[3]; |
- | // ID=1のXL-320からPIDゲインのデータを取得 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX2_ReadBlockData (dev, 1, 26, gain, 3, &err) { | + | if (dev) { |
- | printf ( | + | // ID=1のXL-320からPIDゲインのデータを取得 |
- | "D=%d I=%d P=%d\n", | + | if (DX2_ReadBlockData (dev, 1, 26, gain, 3, &err) { |
- | gain[0], gain[1], gain[2] | + | printf ( |
- | ); | + | "D=%d I=%d P=%d\n", |
- | } | + | gain[0], gain[1], gain[2] |
- | DX2_ClosePort (dev); | + | ); |
- | } | + | } |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_WriteBlockData [#fcf55aa0] | ***DX2_WriteBlockData [#fcf55aa0] | ||
Line 678: | Line 740: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t gain[3] = { 1, 1, 1 }; | + | TDeviceID dev; |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | uint8_t gain[3] = { 1, 1, 1 }; |
- | // ID=1のXL-320のPIDゲインを変更 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX2_WriteBlockData (dev, 1, 26, gain, 3, &err); | + | if (dev) { |
- | DX2_ClosePort (dev); | + | // ID=1のXL-320のPIDゲインを変更 |
- | } | + | DX2_WriteBlockData (dev, 1, 26, gain, 3, &err); |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_ReadSyncData [#iac9751e] | ***DX2_ReadSyncData [#iac9751e] | ||
Line 707: | Line 773: | ||
~指定したデバイス数が応答したらtrue、それ以外はfalseを返す。~ | ~指定したデバイス数が応答したらtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // XM430の120番地から2バイト分のデータをid=1,2,3より読み出すパラメータ | ||
+ | const TSyncReadParam param = { | ||
+ | addr:120, | ||
+ | length:2, | ||
+ | ids:{1,2,3}, | ||
+ | }; | ||
- | // XM430の120番地から2バイト分のデータをid=1,2,3より読み出すパラメータ | + | // 読み出しすデータの構造体 |
- | const TSyncReadParam param = { | + | typedef struct { |
- | addr:120, | + | uint8_t id; |
- | length:2, | + | TErrorCode err; |
- | ids:{1,2,3}, | + | uint16_t RTTick; |
- | }; | + | } __attribute__ ((gcc_struct, __packed__)) TSyncR[3]; |
- | // 読み出しすデータの構造体 | + | TSyncR rdat; |
- | typedef struct { | + | TDeviceID dev; |
- | uint8_t id; | + | TErrorCode err; |
- | TErrorCode err; | + | if ((dev = DX2_OpenPort ("\\\\.\\COM5", 1000000))) { |
- | uint16_t RTTick; | + | uint32_t num = 3; // 3軸 |
- | } __attribute__ ((gcc_struct, __packed__)) TSyncR[3]; | + | DX2_ReadSyncData (dev, ¶m, &num, (uint8_t *)&rdat, &err); |
- | TSyncR rdat; | + | printf("resul num=%d\n", num); |
- | + | for (int i = 0; i < num; i++) { | |
- | TDeviceID dev; | + | printf("ID:%d ERR:%04X tick=%d\n", rdat[i].id, rdat[i].err, rdat[i].RTTick); |
- | TErrorCode err; | + | } |
- | if ((dev = DX2_OpenPort ("\\\\.\\COM5", 1000000))) { | + | DX2_ClosePort (dev); |
- | uint32_t num = 3; // 3軸 | + | } |
- | DX2_ReadSyncData (dev, ¶m, &num, (uint8_t *)&rdat, &err); | + | </pre> |
- | printf("resul num=%d\n", num); | + | }} |
- | for (int i = 0; i < num; i++) { | + | |
- | printf("ID:%d ERR:%04X tick=%d\n", rdat[i].id, rdat[i].err, rdat[i].RTTick); | + | |
- | } | + | |
- | DX2_ClosePort (dev); | + | |
- | }; | + | |
***DX2_WriteSyncData [#v566e16b] | ***DX2_WriteSyncData [#v566e16b] | ||
Line 752: | Line 821: | ||
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // 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; | ||
- | // 2台のXM430へ位置を指令する想定の構造体 | + | TSyncW syncw = { |
- | typedef struct { | + | 116, // アドレス (Goal Position) |
- | uint16_t addr; | + | 4, // データ長 (4 byte) |
- | uint16_t length; | + | {{ 1, 3072 }, // 1軸目 ID=1, GoalPosition=3072 |
- | struct { | + | { 2, 1024 }} // 2軸目 ID=2, GoalPosition=1024 |
- | uint8_t id; | + | }; |
- | uint32_t goalpos; | + | |
- | } __attribute__ ((gcc_struct, __packed__)) data[2]; | + | |
- | } __attribute__ ((gcc_struct, __packed__)) TSyncW; | + | |
- | TSyncW syncw = { | + | TDeviceID dev; |
- | 116, // アドレス (Goal Position) | + | TErrorCode err; |
- | 4, // データ長 (4 byte) | + | |
- | {{ 1, 3072 }, // 1軸目 ID=1, GoalPosition=3072 | + | |
- | { 2, 1024 }} // 2軸目 ID=2, GoalPosition=1024 | + | |
- | }; | + | |
- | TDeviceID dev; | + | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); |
- | TErrorCode err; | + | if (dev) { |
- | + | // 2台のXM430へ個別の位置を指令 | |
- | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); | + | DX2_WriteSyncData (dev, (uint8_t *)&syncw, sizeof(syncw), &err); |
- | if (dev) { | + | DX2_ClosePort (dev); |
- | // 2台のXM430へ個別の位置を指令 | + | } |
- | DX2_WriteSyncData (dev, (uint8_t *)&syncw, sizeof(syncw), &err); | + | </pre> |
- | DX2_ClosePort (dev); | + | }} |
- | }; | + | |
***DX2_ReadBulkData [#wf7d9427] | ***DX2_ReadBulkData [#wf7d9427] | ||
Line 800: | Line 872: | ||
~指定したデバイス数が応答したらtrue、それ以外はfalseを返す。~ | ~指定したデバイス数が応答したらtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | TDeviceID dev; | ||
+ | TErrorCode err; | ||
+ | uint8_t rdat[1000]; // 読み出したデータの保存先 | ||
- | TDeviceID dev; | + | const TBulkReadParam param[3] = { |
- | TErrorCode err; | + | {1,100,20}, // ID=1の124番地から20バイト分 |
- | uint8_t rdat[1000]; // 読み出したデータの保存先 | + | {2,124,12}, // ID=2の124番地から12バイト分 |
+ | {3, 0, 7} // ID=3の0番地から7バイト分 | ||
+ | }; | ||
- | const TBulkReadParam param[3] = { | + | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); |
- | {1,100,20}, // ID=1の124番地から20バイト分 | + | if (dev) { |
- | {2,124,12}, // ID=2の124番地から12バイト分 | + | uint32_t num = 3; // 3軸 |
- | {3, 0, 7} // ID=3の0番地から7バイト分 | + | PBulkReadResult pr = (void *)rdat; |
- | }; | + | DX2_ReadBulkData (dev, ¶m[0], &num, (uint8_t *)&rdat, &err); |
- | + | printf("resul num=%d err=$%04x\n", num, err); | |
- | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); | + | for (int i = 0; i < num; i++) { |
- | if (dev) { | + | if (pr->size > 0) { |
- | uint32_t num = 3; // 3軸 | + | printf("\nID:%d err:$%04X ",pr->id, pr->err); |
- | PBulkReadResult pr = (void *)rdat; | + | for (int j = 0; j < pr->size - 5; j++) printf("%02X ", pr->dat[j]); |
- | DX2_ReadBulkData (dev, ¶m[0], &num, (uint8_t *)&rdat, &err); | + | pr = (void *)pr + pr->size; // 次のデータ用にポインタを更新 |
- | printf("resul num=%d err=$%04x\n", num, err); | + | } |
- | for (int i = 0; i < num; i++) { | + | } |
- | if (pr->size > 0) { | + | DX2_ClosePort (dev); |
- | printf("\nID:%d err:$%04X ",pr->id, pr->err); | + | } |
- | for (int j = 0; j < pr->size - 5; j++) printf("%02X ", pr->dat[j]); | + | </pre> |
- | pr = (void *)pr + pr->size; // 次のデータ用にポインタを更新 | + | }} |
- | } | + | |
- | } | + | |
- | DX2_ClosePort (dev); | + | |
- | }; | + | |
***DX2_WriteBulkData [#r6a06745] | ***DX2_WriteBulkData [#r6a06745] | ||
Line 843: | Line 918: | ||
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // 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 | ||
+ | }; | ||
- | // 3台のXM430へ位置を指令する想定の構造体 | + | TDeviceID dev; |
- | typedef struct { | + | TErrorCode err; |
- | 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; | + | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); |
- | TErrorCode err; | + | if (dev) { |
- | + | // 3台のXM430へ個別の情報を書き込み | |
- | dev = DX2_OpenPort ("\\\\.\\COM5", 1000000); | + | DX2_WriteBulkData (dev, (uint8_t *)&BW, sizeof(BW), &err); |
- | if (dev) { | + | DX2_ClosePort (dev); |
- | // 3台のXM430へ個別の情報を書き込み | + | } |
- | DX2_WriteBulkData (dev, (uint8_t *)&BW, sizeof(BW), &err); | + | </pre> |
- | DX2_ClosePort (dev); | + | }} |
- | }; | + | |
***DX2_TxPacket [#r051327a] | ***DX2_TxPacket [#r051327a] | ||
Line 886: | Line 964: | ||
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t param[2] = { | + | TDeviceID dev; |
- | 25, // アドレス (LED) | + | TErrorCode err; |
- | 0, // データ | + | uint8_t param[2] = { |
- | }; | + | 25, // アドレス (LED) |
- | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | 0, // データ |
- | if (dev) { | + | }; |
- | // ID=1のAX-12+のLEDを消灯 | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err); | + | if (dev) { |
- | DX2_ClosePort (dev); | + | // ID=1のAX-12+のLEDを消灯 |
- | }; | + | DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err); |
+ | DX2_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX2_RxPacket [#r280cda8] | ***DX2_RxPacket [#r280cda8] | ||
Line 921: | Line 1003: | ||
~受信成功時はtrue、それ以外はfalseを返す。 | ~受信成功時はtrue、それ以外はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | int i; | + | #html{{ |
- | uint32_t len; | + | <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 = DX2_OpenPort ("\\\\.\\COM10", 1000000); | + | dev = DX2_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (dev) { | + | if (dev) { |
- | // ID=1のAX-12+からLEDの状態を読み出す要求 | + | // ID=1のAX-12+からLEDの状態を読み出す要求 |
- | if (DX2_TxPacket (dev, 1, INST_READ, param, 2, &err)) { | + | if (DX2_TxPacket (dev, 1, INST_READ, param, 2, &err)) { |
- | // ステータスパケットを受信 | + | // ステータスパケットを受信 |
- | DX2_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); | + | DX2_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]); |
- | } | + | } |
- | } | + | } |
- | DX2_ClosePort (dev); | + | DX2_ClosePort (dev); |
- | }; | + | } |
+ | </pre> | ||
+ | }} | ||
***DX2LIBのオリジナルな定義 [#af9ca340] | ***DX2LIBのオリジナルな定義 [#af9ca340] |