作成した返信
-
著者投稿
-
MZPlatformユーザー会サイト管理者
実際の計算処理を確認したところ、少々複雑な計算をしていました。
基本は指定位置(初期値は小数点以下第一位)での四捨五入で比率を計算するのですが、そうすると比率の合計が100にならない場合があるため、合計を100にするような補正処理をしていました。
この補正処理を自前で計算するのは無理があるので、メソッドを追加しようと思います。追加メソッドの機能として、指定項目の比率を数値で取得するということでよろしいでしょうか。あと、リストでの取得も追加します。他にもご希望があればお知らせください。
MZPlatformユーザー会サイト管理者残念ながら、円グラフコンポーネントから比率を取得するメソッドはありません。円グラフのテーブルデータから別途計算する必要があります。
円グラフは2列のデータなので、第1列目(0からのため)の列データのリストを使います。リストは基本統計処理コンポーネントで和を計算でき、リストの各位置の要素に100をかけて和で割るとパーセンテージを計算できます。
ご不明な点があれば再度お問い合わせください。
MZPlatformユーザー会サイト管理者作成当初のシリアル通信コンポーネントは、文字列データを送受信することを前提に作られています。ReadModeは当初から存在し、intでデータ受信のモードを指定します。指定可能なモードは下記になります。3のバイト読み込みは後から追加されたものです。
0:初期値。受信が途切れたらそれまでに受信した文字列のまとまりを含むイベント発生。
1:一文字(シングルバイト)読み込むとイベント発生。
2:一行(改行文字で判断)読み込むとイベント発生。
3:バイトデータを読み込むとイベント発生。それぞれ数字を覚えなくても、シリアル通信コンポーネントのメソッドで取得することが可能です。
getReadModeDefault()
getReadModeSingleChar()
getReadModeLineText()
getReadModeByte()ReadMode=3のときに、バイト列にもいろいろあるため、ByteReadModeを追加しました。これはReadMode=3のときのみ有効な属性です。指定可能なモードは前述の通り(他にもいくつか存在します)です。こちらも対応するメソッドが存在します。自分でいろいろバイト列を操作するなら1のシングル符号なしで良いと思います。
前回送っていただいたArduino側のスケッチは、5バイト単位で送っていますね。MZアプリ側のシリアル通信コンポーネントがReadMode=3のByteReadMode=1に設定されていると、1バイト受信した段階でイベント発生します。先頭分はすでに受信が終わっているので、先頭分を入れた配列として受信することはできませんが、後ろにあと4バイト来ることがわかっているので、配列の長さ4としてまとめて受信しています。このとき、メソッドで後続の受信データを処理しているので、処理したデータについては、イベント発生しません。
なお、こちらで作成したアプリで4バイト目(最後尾)は使っていないので、3バイト分の配列として受信してもよいです。その場合、最後の1バイトについては、イベント発生します。この場合、サンプルではイベント発生して受信データがXでないと判定されて次のイベント発生に進むことになります。
MZPlatformユーザー会サイト管理者いただいたサンプルを改変して、動作する状態にしたものを圧縮して添付します。
注意点として、シリアル通信コンポーネントはバイトデータを受信できますが、データ生成イベントのイベント内包データに入った時点でintに変換されてしまいます。先頭の’X’を受信した時点でデータ生成イベントの内包データが88で出力されるので、それを判定したらメソッドでバイト配列を取得します。その後の処理は添付のサンプルをご覧ください。
前回書いた内容も含まれますが、ご質問への回答は下記になります。
(1) ReadMode に入れる数値は、取込のバイト数ではなく、この場合は常に3です。
(2) ByteReadMode のシングルとダブルの違いは数値のサイズのことではなく、1バイトずつ読むか2バイトずつ読むかということで、この場合は常にシングル符号なしの1です。
(3) ByteReadMode のシングル符号なしとは、1バイトが示す内容が0-255ということです。添付のサンプルアプリの処理であれば、負の値や127より大きな値を受信した時も正常に読み込めると思います。もし何か問題があれば再度お知らせください。
よろしくお願いします。
添付ファイル:
MZPlatformユーザー会サイト管理者文字列データの受信で欠落があるということでバイト単位の受信にすることは、本質的な解決にはならないように思います。送信側を自由に決められるのであれば、むしろ文字列データ側に工夫をして、エラー検出やエラー補正の仕組みを検討してはいかがでしょうか。
とは言え、バイトデータ受信についても、回答します。文字列データ受信に比べて複雑なので、あまりおすすめできませんが、バイト列を送信する既存機器からのデータ受信では避けて通れないため、機能としては存在します。性質上、必ず動作するサンプルを作成するのが難しいため、下記長文の説明にてご容赦ください。ご不明な点は再度お問い合わせください。
まず準備として、シリアル通信コンポーネントの属性情報設定で、下記を変更します。
ReadMode 3(バイトデータ読み込み)
ByteReadMode
0(シングル符号あり)
1(シングル符号なし)
2(ダブル符号あり)
3(ダブル符号なし)
ご自身で上位バイトと下位バイトに分けて送信する場合は、0か1になります。バイトデータ読み込みモードでは、データの区切りを認識するために、ご自身で書式を適切に決めていただく必要があります。例えば、受信したいバイトデータの前に、データの開始を示す特定の1バイトを送ります。シリアル通信コンポーネントのデータ生成イベントの処理で受信したバイトを整数として判定して、そのバイトデータを受信したら、所定の読み込み処理を実行し、それ以外は無視するようにします。
特定の1バイトの直後に2バイトで整数を送っている場合、所定の読み込み処理として次のような処理を実行します。ここでは符号なし(ByteReadModeが1)としたときの処理について書きます。
下記はすべてシリアル通信コンポーネントのメソッドで、続けて実行します。
#0: readByteSingleUnsignedArray(2) // 要素数2の配列としてバイト列を読み込む
#1: getPacketValueAt(0) // 配列の0番目の要素のバイトデータを取得
#2: getPacketValueAt(1) // 配列の1番目の要素のバイトデータを取得
#3: getDoubleByteValue(#1処理結果,#2処理結果) // 2つのバイトデータから整数を取得このような処理を実行すると、2バイトデータから1つの整数を取得できます。
なお、この方法では想定するバイト長に従って読み込んでいき、必要数取得したら進む感じになるため、逆に受信したデータのバイト数チェックはできません。以上、お試しください。
MZPlatformユーザー会サイト管理者ライセンスに関する注意点としましては、付属のマニュアル「インストールガイド」P.21「6.3ライセンス管理についての注意点」にありますように、有線LANと無線LANを切り替えて使うノートPCで問題が生じることが多いので、まずは上記の説明をお読みいただければと思います。
なお、試用期間はインストール後の初回起動から30日ですので、それ以降にライセンスエラーとなって再申請をしても再取得まで使えなくなる点はご容赦ください。
確認させていただきたい点としては、上記のようなネットワーク接続の切り替えであれば、「チェックエラー(マシンID)」と表示されると思うのですが、そのようなメッセージが出るでしょうか。下記リンク先FAQもご参照ください。それ以外のメッセージであれば別の原因かもしれません。
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/license_install/license_install_a32.html上記のチェックではネットワークの物理アドレスを参照していまして、ネットワークインタフェースの有効無効によって参照できる物理アドレスの状態が変わると、エラーになる場合があります。また、最近のOSでは仮想の物理アドレスが割り当てられる場合もあるようなので、そのようなアドレスを用いてライセンスファイルが作られた場合には、仮想のアドレスが何かのタイミングで変わってしまうことでエラーとなる可能性があります。
確認する方法としては、Windowsのコマンドプロンプトで、
> ipconfig /all
と入力するとそのときのネットワークインタフェースの状態がわかります。もしそのような状況が疑われましたら、有効無効の設定を変更して仮想のアドレスが参照されない状態にしてからライセンス申請ファイルを作成するなどの工夫が必要かもしれません。MZPlatformユーザー会サイト管理者帳票要素の繰り返し印刷は、一種類のデータしか扱えないという制限があります。そのため、同じテーブルでも別の列を同時に繰り返し印刷することができません。元のテーブルデータで列がわかれている二種類のデータを、同じ帳票内で繰り返し印刷をしたい場合は、印刷用にテーブルを作成して同じ列に必要な順番でデータが並ぶように工夫する必要があります。
FAQでも同様の回答がありますので、ご覧ください。
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/paper_print/paper_print_a36.htmlMZPlatformユーザー会サイト管理者帳票コンポーネントの起動メソッドを駆使することで、一応ページの追加は可能です。しかし、このやり方ですとすべての処理をご自身で書かなければならず、おすすめできません。例えば、データが何ページ分になるか判定し、その数のページを追加し、各ページに必要な帳票要素を起動メソッドで追加することになります。できなくはないですが、あまりにも処理が複雑になりますし、すべての処理を実現できるかわかりません。
それよりも、繰り返し印刷用のテーブルデータをテーブル格納変数などで作成して、ページ数が自動で増えるようにした方がまだ楽だと思います。サンプルを改変した例を添付します。2列のテーブルの行をデータ数に応じて5行ずつ追加して、左の列の上から順にデータを埋めていって作成したテーブルを印刷用のテーブルデータとして、帳票に表示しています。このように印刷用のテーブルを別に作成すれば、ページの方はデータに応じて自動的に追加されます。このやり方は印刷用のテーブルの形式によっては今回のように処理が長くなりますが、さまざまなパターンに対応できます。
一方、もしラベルの繰り返し印刷でテーブルのような印刷レイアウトを実現するのでよければ、かなり処理が簡単になります。こちらもサンプルを改変してありますのでご確認ください。ラベルの繰り返し印刷では、テーブルに対して特定列のセルの値を、繰り返し印刷が設定されたラベル要素に対して行の順に埋めていくので、要素が不足すればページも自動で追加されますし、上記のように印刷用のテーブルデータを別に作成する必要がありません。
添付ファイル:
MZPlatformユーザー会サイト管理者説明していただいた内容であれば、テーブル帳票要素の「繰り返し印刷機能」で対応できそうに思います。付属ドキュメントの「サンプル(帳票).pdf」(C:\MZPlatform\3.6\docs\sample)をご覧ください。帳票要素のテーブルに「繰り返し印刷」を設定すれば、データが多い場合に自動的に複数ページが印刷されます。
いろいろ制限がありますので、ご希望の処理が実現できそうかお試しいただけますでしょうか。ご不明な点は再度お問い合わせください。
FAQにも同様の質問がありますので、こちらもご覧ください。
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/paper_print/paper_print_a20.htmlMZPlatformユーザー会サイト管理者ご希望の処理は、前回と同様に整数(BigInteger)格納変数を用いて計算できます。各セルの値を取得して変数に設定し、2を足してから5で割った値に5を掛けると5単位で丸めた値が得られます。
整数の計算の部分だけ作成したサンプルを添付しますので、お試しください。ところで、切り下げでなくなりますと、58と59が60になってしまいますが、大丈夫でしょうか。
ご確認ください。添付ファイル:
-
著者投稿