05-20-2025 02:35 AM
アドバイスありがとうございます。
無事保存することができました!
追加で質問させてください。
現在65536(256×256pixel)×3(x,y,z)=196608のデータ数を保存しようとしています。16bitで保存しているので、2バイトの2をかけて計算すると、196608×2=393216でファイルの大きさは=0.39MBになると考えています。
「書き込む配列サイズ」というところで保存の様子を確認していますが、3配列ずつ増えていて保存にとても時間がかかっています。
現在のプログラムで、早く保存する方法をお聞きしたいです。
また、保存ファイルの中身が、65536×3(x,y,z)のデータ数に達したときに、保存プログラムは止まってくれるのでしょうか。
アドバイスいただけたら幸いです。よろしくお願いいたします。
05-20-2025 05:18 AM
データ構造と希望するファイル内容が不明ですが、少なくとも高頻度で上書きを繰り返すのは悪手です。
基本的にファイルへの保存は、(1)ファイルの作成、(2)書き込み、(3)クローズですが、
書き込みを連続的に繰り返す場合、(1)を1回だけ実行し、(2)だけを繰り返し、最後に(3)で閉じます。途中でファイルポインタを操作しない限りデータは追記されます。
添付画像の「配列に挿入」関数の使い方だと、2次元配列の行を伸ばしていく動きなのでファイルへの追記と同じです。
動作説明のVIを添付します。繰返し中に「単配列」のサイズが変化しないことを前提とした例です。
条件を満足したときに保存を完了するにはそのようにコーディングする必要があります。自動的に止まってはくれません。
05-20-2025 08:42 PM
@J.H.Watson さんは書きました:
データ構造と希望するファイル内容が不明ですが、少なくとも高頻度で上書きを繰り返すのは悪手です。
基本的にファイルへの保存は、(1)ファイルの作成、(2)書き込み、(3)クローズですが、
書き込みを連続的に繰り返す場合、(1)を1回だけ実行し、(2)だけを繰り返し、最後に(3)で閉じます。途中でファイルポインタを操作しない限りデータは追記されます。
添付画像の「配列に挿入」関数の使い方だと、2次元配列の行を伸ばしていく動きなのでファイルへの追記と同じです。
動作説明のVIを添付します。繰返し中に「単配列」のサイズが変化しないことを前提とした例です。
条件を満足したときに保存を完了するにはそのようにコーディングする必要があります。自動的に止まってはくれません。
アドバイスと動作説明のVIの方、ありがとうございます。
部分配列関数で65536と指定したので、てっきり65536のデータを保存したら保存プログラムが自動的に止まってくれると思っていました。
条件を満足したときに保存を完了するコーディングについては、具体的にどのようにすればよいのでしょうか。
現在使用しているプログラムを添付します。
よろしくお願いいたします。
05-21-2025 03:42 AM
局所的にやるなら、「ファイル保存ディザ」ボタンONで書き込み開始し、書き込んだデータポイント数が65536個(393216バイト)以上になったらボタンをOFF、という動作でしょうか。
サンプルVIを作成する上で明確にしたいことがあります。
この部分で何のデータを保存したいのですか?
host_test4.viを見る限り「原子像」と同じデータ(XY座標とトンネル電流値)のようです。
ただし「付加配列2」の作り方とフィードバックノードの使い方に問題がありデータが欠損またはゴミが混じります。毎回データポイント数が異なるとしたらなおさら、後で読み込んだときに解釈ができず困ると思います。
05-21-2025 04:19 AM
>>局所的にやるなら、「ファイル保存ディザ」ボタンONで書き込み開始し、書き込んだデータポイント数が65536個(393216バイト)以上になったらボタンをOFF、という動作でしょうか。
まさにおっしゃる通りです。
>>この部分で何のデータを保存したいのですか?
xとyの位置の情報を持ったz(トンネル電流値)を保存したいです。
プログラムの背景を説明いたします。
私が使っている装置には、データを取得する針があり、LabVIEWでその針を操作するために信号を作っています。
LabVIEWのプログラムでは、x方向に255pixelまで進んだらy方向に1進み、x方向に0pixelまで戻りまたy方向に1進みこれを繰り返しています(ラスター走査)。x方向だけでみると三角波、y方向だけでみるとノコギリ波のような挙動をとっています。
この挙動に、外部の加算回路から円運動(ディザ円運動)を加えています。
すなわち針は、実際にはラスター走査+円運動を行っています。
リアルタイムの原子像の描画では、一つの円運動のどこかの位置のトンネル電流値を取得していて、データの取得タイミングは一定なので、どの円でも同じ位置のトンネル電流値を取得していることになります。それを256×256の数だけトンネル電流値を取得して、画像を描画しています(すなわちディザ円も256×256個ある)。
今後、1つのディザ円で198点のトンネル電流値を取得しようと思っています。つまりデータ数は198×256×256になります。そのあと、各円の1データ目のみを抜き出して256×256の原子画像を作ろうと考えています。各円の2データ目のみ、3データ目のみ...198データ目のみ抜き出すといったようにして、最終的に198枚の原子画像を作ろうと考えているところです。
これの前段階として、256×256=65536のデータを保存できるプログラムを作ろうとしています。(最終的には198×256×256=12976128データ取得したら保存が自動的に止まるようにする)
長くなり申し訳ございません。
つたない説明ですが、少しでも参考になれば幸いです。
よろしくお願いいたします。
05-21-2025 09:13 AM
だいたいの目的はわかりました。ファイル保存のサンプルVIを添付します。
16ビット値3つ(X,Y,Z)を1ポイントデータとして、65536データをファイルに書き込みます。
「ファイル保存」ボタンを押すたびに新しいデータを上書きします。上書きしたくない場合はファイル名を自動生成するよう組み直してください。
また、FPGAから読み取った64ビットデータを分解してX,Y,Zペアにするのなら、ポイントデータ(付加配列2)の作り方は下図になると思います。host_test4.viの方法だと行と列が逆になりますし、DBL(64ビット浮動小数点)は不適です。