09-07-2010 07:24 PM
こんにちは、教えてください。
現在、1s周期にてPLCからデータを通信にて取得し、そのデータをグラフ表示とデータを保存するためそれぞれ配列に入れています。
ところが、約10時間経過後(36000s)から周期が2sになる場合があります。
データ数が多くなると通信の処理が追いつかなくなり2s周期になったりするのでは。。。と思っています。(推測ですが)
このようなことが起こる可能性はあるのでしょうか?
またプログラムの組み方で回避できるのでしょうか?
よろしくお願いします。
09-07-2010 09:31 PM
各処理にかかる時間を計測してみてはいかがですか?
時間経過に比例して、通信データが増える様なシステムの場合は
当然ですが、通信時間は増えていきます。
通信エラー時、リトライするプログラムの場合は
通信エラーが発生すると、リトライ回数分 処理時間は長くなります。
グラフデータのバッファ量が増えて、メモリが足らなくなったり、スワップファイルの
作成が始まったりすると、処理時間が長くなると思います。
まずは各処理時間を計測して見て下さい。
09-08-2010 01:41 AM
データの処理や、表示が追いつかない場合も有ります。
周期が2sになった状態で、CPUの使用率はいかがでしょうか?
Windowsのタスクマネージャーで確認してみてください。
もし、100%近くになっているのでしたら、通信ではなく、表示などの処理が原因だと考えられます。
36000個のデータを全てグラフに表示するのをやめて、1000個程度を配列から取り出して表示するなどの対策が考えられます。
場合によっては、メモリが足りなくなることもあります。
同じくタスクマネージャーでメモリの使用率を確認してください。
メモリが足りない場合、ハードディスクにキャッシュする事があります。
そうすると極端に実行スピードが遅くなります。
対策としては、データの一部をファイルに保存して配列サイズを減らす方法が考えられます。
09-08-2010 05:01 AM
xyzzさん、 KONDOHさん ありがとうございます。
まずは、お二人に教えていただいた方法をためしてみます。
また不明点ありましたら連絡します。
よろしくお願いします。
09-21-2011 08:35 PM
以前はありがとうございました。
解決できたと思っていましたが、また、問題が発生しましたので
お力をお借りできればと思います。
前回は、古いデータをファイルに保存して配列サイズを一定に保ち、データの歯抜けが起こらなくなりました。
しかし、1回目の測定、2回目、3,4,5とviを閉じずに測定しているとデータの歯抜けが起こることがわかりました。
このとき、viを閉じるとまた正常にデータ取得できます。
メモリの状況は、
合計1953MB、利用可:975MB、キャッシュ済み:840MB、空き:150MB となっていました。
何か解決できる方法はないでしょうか?よろしくお願いします。
09-22-2011 09:57 PM
データの歯抜けが具体的にどのようなものか分かりませんが
原因は色々考えられるので、まずは問題の切り分けを行った方が良いと思います。
デバッグしやすくする為に、通信正常終了?、受信データ数、何回目の計測、タイムスタンプ等のデータを
付加すると良いと思います。
異常状態の再現がすぐ出来そうなので、デバッグ用データを付加した
受信生データ、抽出データ、抽出データ保存ファイルの内容を
比較すれば、何か判ると思います。
09-25-2011 11:00 PM
返信ありがとうございます。
実際にラインモニタに接続し通信の状況を見ましたが、
最初は約0.5周期で通信できていましたが、異常状態時には
2s位になっていました。
また、ラインモニタのデータと抽出データは同じでした。
ですので、処理が重くなり通信できなくなるのかなと思います。
また、何かお気づきの点がありましたらお願いします。
09-26-2011 05:28 AM
通信周期が延びる原因を探る為に、各処理の実行時間、実行回数を
計測すれば良いと思います。