Мне нужно контролировать положение вращающегося энкодера для управления двигателем постоянного тока.Чтобы не пропустить изменения в Rotary Encoder, я использовал 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
Вот код, который я запускаю в фоновом режиме (обратите внимание, что в данный момент он просто записывает данные на консоль, пока я отлаживаю, при работе он будет управлять двигателем постоянного тока):
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");
}
}