MZ Platformとは › 掲示板 › MZプラットフォームユーザー会掲示板 › バイト配列の変数について
タグ: バイト変数 配列
- このトピックは、 7 返信、 2 投稿者 です。最終更新日: 3 年, 10 ヶ月 前 伊予研究会
-
著者投稿
-
2020年12月24日 at 1:25 PM #6270伊予研究会一般参加者
バイト変数を配列として格納する方法をご教示ください。
具体的にはJavaScriptからの戻り値が、バイト配列(4バイト)となっています。これをバイト配列の変数として格納したいのですが、配列操作が理解できておりません(配列操作によらない方法でも結構です)。格納した後、4byteをfloatに変換したいと考えています。
よろしくお願いいたします。2020年12月25日 at 1:10 PM #6271MZPlatformユーザー会サイト管理者確認ですが、スクリプト実行コンポーネントからbyte配列が戻り値として得られて、それをMZ側でfloatにしたいから変数に入れたいという趣旨ですよね。
以前のご質問に対する回答に書いた通り、MZでバイト配列からfloatに変換するためにはスクリプト実行コンポーネントでfloatにすることになります。つまり、スクリプト実行コンポーネントの処理中で得られるbyte配列をそのままfloatに変換する方が良いと思いますが、何か理由があるのでしょうか。
2020年12月29日 at 11:21 AM #6279伊予研究会一般参加者JavaScriptでfloatにしてからMzに取り込むのは、前回ご教示いただいた方法で解決できています。問題を簡素化するため、byte配列をMzに取り込む方法を質問させていただきました。
したいことは、JavaScriptで受信したbyte配列
’A'(char), 温度1(float), 温度2(float), 温度2(float), 温度2(float), ‘@'(char)
の18byte(= 1 + 4 * 4 + 1)を、Mzに4つのfloatとして取り込みたいことです。
理解できていない問題点をテストしながら開発していますが、何分不明な点が多く一度に質問するのも丸投げのようになり、断片的にさせていただいておりました。前記解決策として、Script内でfloat * 4の配列データに変換してをMzに読み込むか、18byteそのままMzに読み込んだ後、4つのfloatに変換するかという問題の過程で、Mzのバイト変数の配列はどのように取り扱うのかと言う疑問がありました。
【以下話は長くなりますが、ご容赦ください】
製紙会社からの相談に、抄紙機のベアリングが故障すると交換に何日も機械を止めなくてはならないため、定期点検に合わせて交換しています。まだ、使える状態であっても交換しており、これをできる限り減らしたいという要望がありました。
現状は主軸近辺の温度が上昇していないか毎時検査し、また熟練工が聴診器を当てて回転軸の振動検査も1日に1~2回しています。回転軸の振動検査は個人差があるため、センサーなどを使って測定できないかということです。また、ベアリングの診断システムは1台800万円と高いため抄紙機に対し1カ所しか測定できず、安価なセンサーで抄紙機1台に対し100~200個取り付けたいということです。
そこでArduinoを使って振動センサとサーミスタ(4本)を繋いで測定し(1台1万円強)、そのプログラムをMzで開発しています。
振動センサ(ADXL345)はX, Y, Z軸のそれぞれから整数(int)がバイトデータとして、温度(サーミスタ103ATから)は実数(float)がバイトデータとして出力されており、USB接続によるMzへの取り込みはこれまでの質疑で解決し完成しました。
ところで、別の製紙会社では工場内にWi-Fi設備を既に備えていることから、XBee Wi-Fi(S6B)モジュールで送受信する方法に改造しているところです。【ここから本題です】
Wi-Fi から受信するデータ配列は振動センサからのバイト配列と、温度センサ4本からのバイト配列になります。手始めに温度センサに絞ってMzに取り込もうとしています。
取り込むデータは、
’A'(char), 温度1(float), 温度2(float), 温度2(float), 温度2(float), ‘@'(char)
の18byte(= 1 + 4 * 4 + 1)。
1つのfloatだけをJavaScript内で変換し、Mzに取り込むサンプルはできました(wifi_FloatRead.mzax)。しかし、複数のfloatを配列としてMzに取り込む方法が分かりません。JavaScriptからの戻り値が配列であれば同じと思いbyte配列を例としてMzで受け取る方法の過程で、質問させていただいております(厚かましいお願いですが、この方法も合わせてご教示いただけると助かります)。ByteArray.mzaxに問題のプログラムを添付しておきます。
1.byte[] bytes = new byte[4];
と初期化した後、byte[0] = 1; でエラーが出る点。MzのJavaScriptは初期化の後変数を代入できないのでしょうか。
2.return bytes; で戻り値は、Mzでは[B@6b92a7eeになっています。return bytes[0];では正常に表示します。バイト配列としては正常な戻り値かも知れませんが、Mzへの取り込み方法が分からないためテキストでの表示しか確認できません。これをMzのバイト配列に入れるにはどのようにすればよろしいでしょうか。以上、よろしくお願いします。
添付ファイル:
2021年1月4日 at 7:33 PM #6282MZPlatformユーザー会サイト管理者過去に回答したと思いますが、MZではbyte値を直接扱うことが難しいため、byte配列をMZ側に取り込まない方法をご検討いただけると助かります。MZに取り込むのがfloatの配列であれば、まだ対応の方法があります。
ひとまず最後の2つのご質問に回答いたします。
bytes[0]=1;では型が違うという理由でエラーが出るようです。
bytes[0]=(byte)1;のように型変換を明示的に書くとエラーは出なくなると思います。スクリプト実行で配列をreturnして、それを文字列出力する場合、その出力は正常で[Bがbyte値の配列を示しています。@以降はポインタアドレスを示すので値には変換できません。
配列を扱うためには、配列操作コンポーネントを使います。添付のZIPファイルを展開したMZアプリをビルダーでご確認ください。配列操作を使うと配列オブジェクトとインデックスを指定して値を取り出すことが可能です。ただ、値がbyteのためMZではintに変換されてしまいます。この配列の中身がfloatなどであればMZで値をそのまま使うことができます。
添付ファイル:
2021年1月5日 at 11:52 AM #6284伊予研究会一般参加者サンプルファイル、ありがとうございました。
Wifiで4つのFloat配列の戻り値をMzに取り込むことができ、配列操作の使い方も理解できました。また、質問1につきましても、Javaでコンパイルしてできているのに、JavaScriptでできない理由が分かりませんでしたので、助かりました。2021年1月6日 at 9:21 AM #6288伊予研究会一般参加者等価演算子の処理について、ご教示ください。
一連のイベントの途中に等価演算子(ID4)があり、条件によって実行したいメソッド(ID4のコメント「引数0番目」)とそれを実行しない方法が分かりません。ID4ではメソッド処理結果が取得できないため、ID4の「受信データOK」に配置できません。
したいことは、エラーがあった場合はfalseを返し、正常な場合は実数4配列を返すスクリプトで、falseなら「引数0番目」以下の処理を飛ばしたいことです。ファイルを添付しますので、よろしくお願いいたします。
添付ファイル:
2021年1月6日 at 7:39 PM #6290MZPlatformユーザー会サイト管理者演算コンポーネントの演算実行結果で処理を分岐したい場合は、演算実行メソッドを起動した以降は処理を書かず、演算コンポーネントの処理完了イベント処理に必要な処理を書いて、イベント番号で分岐します。また、処理完了イベント処理にすべて書くとイベント番号の設定がたいへんなので、分岐処理用のサブルーチンを作成してその処理を呼び出す方が良いでしょう。そのイメージを作成しましたので添付します。実際に動作するか確認していませんが、参考にしていただければと思います。
なお、スクリプト実行の戻り値として、falseか配列データが返るというのは、あまり良くないと思います。添付したZIPを展開したMZアプリでは、エラー時にnullを返すように修正しています。それによって、等価演算ではなくNull判定を使用しました。
添付ファイル:
2021年1月7日 at 8:41 AM #6292伊予研究会一般参加者添付ファイルありがとうございました。
要求通りの出力が得られました。ご指摘の通り、戻り値は関数などの定義で型を決めているのが一般的で、統一していないのは不適切でした。
Null判定があるのは知っていましたが、等価演算で判定できるのであれば使う必要がないと思っておりましたので、今回のような使用方法があることで理解できました。 -
著者投稿
- このトピックに返信するには、ログインしてください。