0

DC モーターを制御するために、ロータリー エンコーダーの位置を監視する必要があります。ロータリー エンコーダーの変更を見逃さないようにするために、BackgroundWorker を使用しました。

私のアプリケーションは期待どおりに動作しなかったので、デバッグを行って、なぜ目標を達成できないことが多いのかを調べています。

Console.WriteLine を使用してストップウォッチの状態を書き出していますが、スレッドが「スキップ」しているか、ループが欠落していることに気付きました。これは、コンソールへの書き出しの癖でしょうか?

出力の一部を次に示します。190 ミリ秒のギャップがあることがわかります。

Inside Thread. Time: 25, Position: 117, Velocity: 0
Inside Thread. Time: 26, Position: 117, Velocity: 0
Inside Thread. Time: 27, Position: 117, Velocity: 0
Inside Thread. Time: 28, Position: 117, Velocity: 0
Inside Thread. Time: 29, Position: 117, Velocity: 0
Inside Thread. Time: 30, Position: 117, Velocity: 0
Inside Thread. Time: 212, Position: 117, Velocity: 0
Inside Thread. Time: 213, Position: 117, Velocity: 0
Inside Thread. Time: 214, Position: 117, Velocity: 0
Inside Thread. Time: 215, Position: 117, Velocity: 0
Inside Thread. Time: 216, Position: 117, Velocity: 0
Inside Thread. Time: 217, Position: 117, Velocity: 0

バックグラウンドワーカー内で実行しているコードは次のとおりです(現在、デバッグ中にコンソールに書き込んでいることに注意してください。作業中はDCモーターを制御します):

    public void dcMotorMove(DCMotorSettings dcMotorSettings)
    {
        try
        {
            dcMotorSettings.Moving = true;

            Stopwatch dcMotorStopwatch = Stopwatch.StartNew();
            dcMotorStopwatch.Restart();

            int MoveState = 1;

            while (MoveState != 0)
            {
                Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds + ", Position: " + dcMotorControl.encoders[0].Position + ", Velocity: " + dcMotorControl.motors[0].Velocity);

                Thread.Sleep(dcMotorSettings.SampleRate); // Processor Rest
                if (dcMotorStopwatch.ElapsedMilliseconds > dcMotorSettings.Duration)  MoveState = 0;

            }

            dcMotorSettings.Moving = false;
        }
        catch
        {
            Console.WriteLine("Problem within dcMotorMove");
        }
    }
4

3 に答える 3

2

ここにバグがあるとは思わない。リアルタイム OS ではなく、仮想プラットフォーム (.NET) でコードの正確な時間実行を編成する方法はありません。ストップウォッチ自体は、時間間隔を測定する機会しか与えません。特定のケースは、何百万もの要因(システム内で実行されている現在のプロセス、メモリ量など)に依存します

于 2012-02-08T23:17:08.797 に答える
2

Consoleクラスの問題になる可能性は非常に低いです。

これを引き起こす唯一の理由は、おそらく使用する接続の制限が原因で、コンソールにダンプしているプロパティ ( PositionVelocity) の評価に時間がかかる可能性があることです。

毎秒 1000 サンプルがなくても生きていけるかどうか、接続がそれをサポートできるかどうかを確認してください。または、ライブラリが非常に頻繁に更新されたり、最後に読み取られたキャッシュされた値が送信されたりしても.

于 2012-02-08T23:10:57.360 に答える
1

これはコンソールの癖ではありません。dcMotorSettings.SampleRate も印刷してみてください。

編集:内側のループを次のように変更してみてください:

            Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds);
            Thread.Sleep(1);

それでも問題が発生する場合は、オペレーティング システムの問題です (またはシステムに負荷がかかりすぎています)。効果が発生しない場合は、効果が再び発生するまでコードをコメントします。

于 2012-02-08T22:51:14.053 に答える