04-16-2024 10:10 PM
こちらはUSB-6501を使用した0.1秒ごとの0と1の切り替わりの30秒間の合計値のCSVファイルと同じ条件での0と1の生データのCSVファイルを取得するプログラムです。
また、開始時刻は現在時刻との差をとって待機させておくことで設定時刻になったら自動的に開始するようになるになっています。
この下のように30sごとに取れてはいるのですが、たとえば3段目から4段目の場合、27の次は57になるはずが58になっているように少しずつずれていってしまいます。
2024/3/11 16:25:27 |
2024/3/11 16:25:57 |
2024/3/11 16:26:27 |
2024/3/11 16:26:58 |
2024/3/11 16:27:28 |
2024/3/11 16:27:58 |
2024/3/11 16:28:28 |
2024/3/11 16:28:58 |
2024/3/11 16:29:28 |
2024/3/11 16:29:58 |
2024/3/11 16:30:28 |
2024/3/11 16:30:58 |
2024/3/11 16:31:28 |
2024/3/11 16:31:58 |
2024/3/11 16:32:29 |
2024/3/11 16:32:59 |
時間が少しずつずれてしまう改善策はないでしょうか、ご教授のほどよろしくお願いいたします。
解決済! 解決策の投稿を見る。
04-16-2024 10:50 PM
こちらプログラムの画像も添付しておきます
04-17-2024 02:12 AM - 編集済み 04-17-2024 02:21 AM
毎回の待機関数のわずかなずれが積算されて処理時間がずれているのであれば、待機関数を次のミリ秒倍数まで待機関数に置き換えることで位相を保持してくれるようになります。
もっとも、タイミングの取り方として毎回の実行時間の積算で行うより、30秒に1回週録処理が実行されるような作りの方が(30秒に1回実行することが大切なのであれば)良いように思えます。
コードの書き方に改善の余地がある(DAQを毎回初期化している、ファイルI/Oが同じループの中にある)ので、これらを改善(初期化は最初の1回のみ、ファイルI/Oは並列ループで記述する)をすることで改善すると思います。ただ、ステートマシンでのコーディングやキュー関数の使用方法を理解する必要があり、NI社のトレーニングコースでいうと実践集中コース1、2程度は理解しておく必要があるかと思います。
ご参考まで。
04-17-2024 09:30 PM
丁寧なご回答ありがとうございます。Labviewに関して初心者なため、改善点がおもいつかなかっため、ありがたいです。ご回答を踏まえたうえで質問させていただきたいです。
①でまず指定の時刻まで待機を行い
②で0,1s×30回のforループを回し、③で保存しています。
④で②、③をwhileループで終了ボタンを押すまで繰り返す
というようなプログラムです。
まず、待機関数についてなのですが、①の最初の一回しか使用していないため、待機関数によるずれではないと考えています。ミリ秒倍数で解決が可能なのでしょうか?
forループの0.1s×30回の計30sのデータを毎回保存するのは、もし何らかのエラーで保存に失敗した場合を避けるためです。
自分は今のところ④のwhileループ内の処理に要する時間で少しずつ時間がずれていっているのかなと考えています。
DAQの初期化を行っているというのはどこのことでしょうか。毎回データを保存するためにはDAQの関数をすべて④の中に入れる必要があると考えているのですが、具体的にはどのようにしたらいいか教えてくださると幸いです。
ファイルI/Oを並列ループで記述するのほうも申し訳ないのですが、並列ループの知識がなくて、ど具体的に教えて頂けると幸いです。
例えば処理が遅れても、次の30秒後には次のループを開始するような仕組みは作れるでしょうか。
勉強におすすめのものや上達のコツなども良ければ教えて頂けると嬉しいです。
細かい質問や要求ばかりですみません。
04-18-2024 08:00 PM
情報ありがとうございます。私が指摘したかったのはForループ内の待機関数について、です。一番最初の待機関数はおっしゃる通り問題ないと思います。(処理としては指定した開始時刻と現在時刻がイコールになったら止まるWhileループの実装が自然な気もしますが)
②ですが、30回の繰り返し回数でしょうか?300回ではないでしょうか。いずれにせよ保存処理がシーケンシャルに実行される状況では保存処理にかかった時間だけずれていくことは避けられないです。また、Windows上で実行しているので割り込みによってループの実行速度が保証できないので、どうしてもずれていってしまう仕様になります。100ミリ秒のForループは果たして毎回100ミリ秒で回るのでしょうか?という話になります。
どこで時間がずれるかによるのですが、もしForループの100ミリ秒周期がずれているのであれば「次のミリ秒倍数まで待機」関数を用いることで位相の保持は可能です。ひとまず②の中の待機関数を次のミリ秒倍数まで待機関数に置き換えてみていただけないでしょうか。
なお、初期化処理とは、サンプルプログラムでいう「Channel Settings」の部分となります。これは毎回実行する必要はなく、プログラムの最初で実行し、収録が終わったら最後に一回だけタスククリアすればOKとなります。
LabVIEWのあれこれを知るのにマーブルルールさんなど良いと思います。
マーブルルール
https://marblerule.com/
私も本業があるのであまりこちらに時間を割けないのですが、ご参考まで。
04-18-2024 10:03 PM
ご回答ありがとうございます。ご指摘の通り、繰り返しの回数は30回ではなく300回でした。forループ内の待機関数の存在を失念していて、「次のミリ秒倍数まで待機」関数に変更したところおそらくずれが解消されました。本当にありがとうございます。初期化処理のほうもおいおい変更させて頂きます。参考になるサイトの情報までありがとうございます。
お忙しい中細かいフォローまでありがとうございました。本当に助かりました!!