PMX C#Lib MemREAD()
『PMX Library for C#』のMemREAD()関数について解説します。
【解説】
MemREADコマンドは、メモリマップのRAM領域から情報を読み出すためのコマンドです。PMXサーボのメモリマップにはRAM領域とROM領域があります。サーボ起動時にROM領域からRAM領域にデータが展開され、サーボの制御にはRAM領域のデータが使用されます。
【構文】
status = MemREAD(ID, address, readDataSize, out List<byte> dataArray);
【例】
1 |
ushort flag = pmx.MemREAD(ServoID, (ushort)RamAddrList.NowPosition, 6, out List<byte> dataArray); |
【パラメータ】
引数1:ID(byte型)
第一引数の「ID」はサーボIDです。「ID」は、MemREADコマンドの命令の対象になるサーボを指定しています。「ID」を0に指定すると、ID0のサーボを指定することができます。
引数2:address(ushort型)
第二引数の「address」は先頭アドレスです。「先頭アドレス」とは、メモリマップのアドレスを指し、読み出すデータの先頭のアドレスを指定することができます。上記の例では「RamAddrList.NowPosition」と書いていますが、これはライブラリ内で定義された変数で、メモリマップのアドレスを指定しています。「RamAddrList.NowPosition」には300が代入されていますので、実行の際は300に変換されます。また数値で300と指定しても同じ番地からデータを読み出すことができます。アドレスは『オンラインマニュアル』をご参照ください。
引数3:readDataSize(int型)
第三引数の「readDataSize」は読出データ数です。例では6が指定されていますので、先頭アドレス300から6バイトのデータを読み出します。
引数4:out List<byte> dataArray(byte型のリスト)
第四引数の「dataArray」にリストを渡します。MemREADコマンドで読み出したデータが「dataArray」に格納されます。2バイト以上のデータはリトルエンディアンで分割されていますので1つのデータに変換する必要があります。変換方法は、下記の【データ変換】をご参照ください。
outキーワードについては、C#の資料をご参照ください。
【戻り値】
戻り値:status(ushort型)
戻り値は、サーボとの通信状態とサーボの状態が正常かどうかのステータスを足したものが返ってきます。データが0であれば問題ありません。0以外の場合は、なんらかの問題が発生していますので、ステータス部がエラーの場合はオンラインマニュアルの『5.エラー状態』、または『PmxStatusErrorList』を、通信部がエラーの場合は『ComError』を参照してください。
status = PMXからの返信のステータス(PmxStatusErrorList) + 送受信の状態(ComError)
【データ変換】
C#の機能として、リトルエンディアンで分割されたデータを組み合わせるために便利な「BitConverter.ToInt16()」を使用できます。
1 |
int posData = BitConverter.ToInt16(dataArray.ToArray(), 0); // 2Byteのデータを連結 |
ToInt16()で2つに分かれたbyte型のデータを、1つのint型(符号あり)のデータに変換することができます。第一引数に連結するデータが格納されている配列を渡します。リストを渡す場合は、".ToArray()"で配列に変換します。第二引数は、そのリストの何番目から連結するかを指定できます。
例えばdataAaray内に6個のデータがあり、index3のデータから使用する場合は"3"と指定するとindex3、index4のデータをリトルエンディアンで連結します。結果を戻り値として受け取ることができます。
詳しくはこちらをご参照ください。
他にもデータのサイズや型に合わせて関数を使用できます。
1 2 3 4 5 6 7 8 9 10 11 |
// 分割された2Byte(符号あり)データをまとめる int16Data = BitConverter.ToInt16(reByte.ToArray(), 0); // 分割された2Byte(符号なし)データをまとめる uint16Data = BitConverter.ToUInt16(reByte.ToArray(), 0); // 分割された4Byte(符号あり)データをまとめる int32Data = BitConverter.ToInt32(reByte.ToArray(), 0); // 分割された4Byte(符号なし)データをまとめる uint32Data = BitConverter.ToUInt32(reByte.ToArray(), 0); |
データのサイズと符号の有無については、オンラインマニュアルの「メモリマップ一覧」で確認することができます。