NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

数値結合

sample1のVIでは指標配列とデシメート1D配列を用いて4つの制御器に適当な値を入れたところ適切な動作を行います.
指標配列の代わりに数値結合を用いてsample1と同様の動作を行うよう作成した,制御器数を2つに減らしたsample3では所望の動作をしたのですが,sample2のVIのように制御器数・指示器数を増やすと制御器の値の和を示す指示器の値が0になる等適切に動作しません.
数値結合を用いて制御器数を拡張する際,sample1と同様の動作を行うためには(制御器の値の和も正しく表示させるには)sample2のVIをどのように変えればよろしいのでしょうか.
よろしくお願いいたします.
すべてをダウンロード
0 件の賞賛
メッセージ1/4
3,357件の閲覧回数

1~3のすべてでそうですが、Selectでつないでいる8つの数値(上から1,0,2,0,3,0,4,0と並んでいる数値)が、「U8」タイプになっていないためにSample2で意図しない動作になると思われます。おそらく、ただ置いただけの数値とすると、I32になっていると思われます。

この8つの数値を全てU8にする(右クリックでタイプからU8にできます)ことで、所望の結果になると思います。

これは、数値結合関数が、入力がU8(I8)なら出力がU16(I16)に、入力がU16(I16)なら出力がU32(I32)になるようになっていることと関係します。基本的には入力のタイプのビット数の多いほうで判断されます。入力がU32(I32)の場合はなぜか下16ビットだけ取ってそれらでU32(I32)を作るという変な動作になります。そのため、Sample2で所望の動作にするためには、初段の数値結合の入力がU8(I8)である必要がありますが、Selectにつないだ数値が8ビット以外だと、初段か2段目どちらかの数値結合で意図しない結果になるおそれがあります。数値結合を2段つかって、U8→U16→U32のように格上げしたい場合は、初段の数値結合の入力を確実に8ビットにしなければなりません。1段だけの場合で、数値が小さい場合は、たまたま意図する答えになるケースもあります。

今回の場合、Sample1で、4つの数値で配列を作っているところで、一番上と一番下が赤印(タイプキャストが発生)がついているところがポイントと思います。これは、真ん中2つのSelectから出てきた数値を入れているところが8ビットより広いことを意味します。

以上、ご確認下さい。

 

0 件の賞賛
メッセージ2/4
3,339件の閲覧回数
ついでに述べますと、これはNI殿へのお願いにもなりますが、、
 
「数値結合(Join Numbers)」は、入力の2つの数値に、例えば「U8とU16」をつないだ場合でも、U8をU16にタイプキャスト(格上げ)した印が付きません。U8とU16を入力すると、出力は自動的にU32になりますが、数値結合の関数の見た目が変わらないため、また必ずしも出力を表示器につながないで次の演算に使用する場合もあるため、(注意深く配線すれば分かるのですが)デバッグの際に混乱の元にもなります。予め自分でU8なりU16なりに明示的にキャストしてから数値結合に入れれば良いのですが、出来ることならば、①数値結合関数でも入力の片方をキャストした(つまり入力のビット幅が一致しない)場合には片方にタイプキャストした印が付くようにする、②結果的に何ビット+何ビットを何ビットに結合しようとしているのか関数アイコンの見た目が変わるようにする(小さく8とか16とか32とか出るようにする)、③入力が32ビットだったときでも下16ビットしか使わない(つまり16ビットに“格下げ”のタイプキャストした)ことが分かるよう①②の表示をする、といった改善は出来ないものでしょうか。
 
個人的には、「数値結合」がこういうクセを持っているので、注意はしながら組んでいたり、ワイヤのデータタイプを確認して間違っていないか確認したりしているのですが、表示で分かれば簡便ですし、なにより「タイプキャストした印が付かない」というのが誤認の一要因にもなっているのではないか・・と思います。
 
0 件の賞賛
メッセージ3/4
3,330件の閲覧回数

白石様

 素早いご回答を下さり,誠にありがとうございます.白石様のご回答の通り,数値定数は「I32」になっていましたので「U8」に変更したところ,所望の結果になりました.

また以前より疑問に思っていた赤印の意味も理解することができ大変感謝しております.今後ともよろしくお願い申し上げます.

0 件の賞賛
メッセージ4/4
3,321件の閲覧回数