| С этой статьи начинается публикация материалов из методички по языку программирования Not eXactly C, подготовленной в рамках учебных курсов Нижегородского Института Информационных Технологий. | 
В данной статье рассматриваются команды управления движением.
Пример 1.
OnFwd(), OnRev()Данный пример предназначен для рассмотрения семейств команд
OnFwd(), OnRev(), OnFwdSync(), OnRevSync() и его цель - проверить на то, что после OnFwd() управление сразу передается на следующую команду.task main() {
    /*
    Даже если команда "движение вперед" задана до команды "движение назад",
    робот едет сразу назад, поскольку OnFwd() сразу передает управление
    следующей команде.
    */
    OnFwd(OUT_AB, 50);
    OnRev(OUT_AB, 50);
}
OnFwdSync(), OnRevSync()Этот пример подобен предыдущему, только использует другие команды того же семейства. Он выполняет проверку на то, что после
OnFwdSync() управление сразу передается на следующую команду.task main() {
    /*
    Даже если команда "движение вперед" задана до команды "движение назад",
    робот едет сразу назад, поскольку OnFwdSync() сразу передает управление
    следующей команде.
    */
    //        Двигатели
    //           |    мощность
    //           |    |   распределение нагрузки между моторами
    //           |    |   |
    OnFwdSync(OUT_AB, 50, 0);
    OnRevSync(OUT_AB, 50, 0);
}
RotateMotor()Здесь рассматривается команда управления моторами, принадлежащая другому семейству:
RotateMotor(), RotateMotorEx(). Цель пример - показать отличие от предыдущего семейства команд - RotateMotor() передает управление к следующей команде только после того, как мотор передвинется на заданное количество градусов.task main() {
    /*
    RotateMotor() работает как функция в "обычном" ее понимании - управление
    к следующей команде происходит только после полного выполнения текущей.
    */
    //        Двигатели
    //           |      мощность
    //           |      |   угол поворота оси мотора в градусах
    //           |      |   |
    RotateMotor(OUT_AB, 50, 360);
    RotateMotor(OUT_AB, 50, -360);
}
RotateMotorEx()Функция
RotateMotorEx() является одной из самых мощных функций управления моторами из-за больщого количества параметров, которые она может контролировать. Эта функция, как и предыдущая, также передает управление к следующей команде только после того, как мотор передвинется на заданное количество градусов.task main() {
    /*
    RotateMotorEx() работает как функция в "обычном" ее понимании -
    управление к следующей команде происходит только после полного
    выполнения текущей.
    */
    //          Двигатели
    //             |      мощность
    //             |      |   угол поворота оси мотора в градусах
    //             |      |   |    распределение движения между моторами
    //             |      |   |    |  синхронизация моторов
    //             |      |   |    |  |     включать торможение после
    //             |      |   |    |  |     |  окончания движения или
    //             |      |   |    |  |     |  останавливаться своим ходом
    RotateMotorEx(OUT_AB, 50, 360, 0, true, true);
    RotateMotorEx(OUT_AB, 50, -360, 0, true, true);
}
RotateMotor() и циклыВызов
RotateMotor() (а также и RotateMotorEx) в цикле приводит к серии отрывистых движений.task main() {
    /*
    Переход к следующей итерации цикла происходит только после выполнения
    "движение тележки", поэтому в итоге тележка двигается прерывисто,
    неоднородно.
    */
    int i = 0;
    while (i < 3) {
        RotateMotor(OUT_AB, 50, 360);
        i++;
    }
}
OnFwd() и циклыВ отличие от
RotateMotor(), вызов OnFwd() (так же как и OnRev, OnFwdSync, OnRevSync) в цикле позволяет почти одновременно с движением проверять состояние системы (значения переменных, датчиков, таймеров), т.е. движение не будет прерываться на время проверки.task main() {
    /*
    Приведенную ниже конструкцию можно условно описать словами следующим 
    образом:
    - начинаем двигаться
    - проверяем i
    - все еще двигаемся
    - проверяем i
    - все еще двигаемся
    . . .
    - цикл закончился.
    
    Поскольку команды серии (OnFwd) передают управление сразу следующей
    команде, переход к следующей итерации осуществляется сразу после начала
    движения. Останова двигателей при этом не происходит, т.е. ощущение
    от движения – плавность, беспрерывность.
    */
    int i = 0;
    while (i < 10000) {
        OnFwd(OUT_AB, 50);
        i++;
    }
}
 
Спасибо из ТПУ ^_^
ОтветитьУдалить