PMX PythonLib MemREAD()
『PMX Library for Python』のMemREAD()関数について解説します。
【解説】
MemREADコマンドは、メモリマップのRAM領域から情報を読み出すためのコマンドです。PMXサーボのメモリマップにはRAM領域とROM領域があります。サーボ起動時にROM領域からRAM領域にデータが展開され、サーボの制御にはRAM領域のデータが使用されます。
【構文】
[status, dataArray] = MemREAD(ID, address, dataSize)
【例】
1 2 |
flag, dataArray = pmx.MemREAD(0, PMX.RamAddrList.NowPosition, 6) # id , Addr ,dataSize print(hex(flag), dataArray) |
【パラメータ】
引数1:ID(int型)
第一引数の「ID」はサーボIDです。「ID」は、MemREADコマンドの命令の対象になるサーボを指定しています。「ID」を0に指定すると、ID0のサーボを指定することができます。
引数2:address(int型)
第二引数の「address」は先頭アドレスです。「先頭アドレス」とは、メモリマップのアドレスを指し、読み出すデータの先頭のアドレスを指定することができます。上記の例では「PMX.RamAddrList.NowPosition」と書いていますが、これはライブラリ内で定義された変数で、メモリマップのアドレスを指定しています。「PMX.RamAddrList.NowPosition」には300が代入されていますので、実行の際は300に変換されます。また数値で300と指定しても同じ番地からデータを読み出すことができます。アドレスは『オンラインマニュアル』をご参照ください。
引数3:dataSize(int型)
第三引数の「dataSize」は読出データ数です。例では6が指定されていますので、先頭アドレス300から6バイトのデータを読み出します。
【戻り値】
戻り値1:status(int型)
一つ目の戻り値は、サーボとの通信状態とサーボの状態が正常かどうかのステータスを足したものが返ってきます。データが0であれば問題ありません。0以外の場合は、なんらかの問題が発生していますので、ステータス部がエラーの場合はオンラインマニュアルの『5.エラー状態』を参照してください。
戻り値2:dataArray(byteArray型)
二つ目の戻り値「dataArray」にMemREADコマンドで読み出したデータが代入されます。2バイト以上のデータはリトルエンディアンで分割されていますので連結する必要があります。
【データ変換】
Pythonには、リトルエンディアンで分割されたデータを組み合わせるために便利な関数が用意されています。
1 2 3 |
posArray = [dataArray[0], dataArray[1]] # 現在位置のデータは300, 301番地のため[0], [1]が該当 pos = int.from_bytes(posArray, byteorder="little", signed=True) print("現在位置", pos) |
int.from_bytes()でデータを連結することができます。第一引数に連結するデータを渡します。今回は例として6バイトのデータを読み出しました。「現在位置」は先頭の2バイトのみですので、別のリストに2バイトのみ分けで代入しましたが、pmx.MemREAD()で2バイトのみ読み出した場合は、そのまま第一引数に渡しても問題ありません。
第二引数に"big"か"little"を指定します。今回はリトルエンディアンなので"little"を指定しました。
第三引数のsignedは、符号の有無を指定できます。データが符号付きの-32768~32767までの範囲でしたらTrue、符号なしの0~65535までの範囲でしたらFalseを指定します。「現在位置」の型はInt16で符号付きなのでsignedをTrueとしました。
データの符号の有無については、オンラインマニュアルの「メモリマップ一覧」で確認することができます。Uint16、Uint32は符号なし(False)、他は符号あり(True)です。
連結した結果をpos変数に代入してコンソールに表示しています。サーボの軸を指で回転させながら角度が変わるか確認してみてください。