Создание программ

Работа с диаграммами

Программа в QReal:Robots представляется в виде последовательности блоков, соединённых связями. Каждой программе соответствует отдельная диаграмма. Диаграммы упаковываются в проекты, хранящиеся на диске. С помощью пункта меню 
Файл -> Импортировать... можно объединять диаграммы из различных проектов. Создание диаграмм и проектов осуществляется через панель "Файл". Переключение, удаление и редактирование свойств самих диаграмм осуществляется из обозревателя графической модели, который по умолчанию находится на вкладке рядом с редактором свойств: 


Создание блоков

Блоки в QReal:Robots создаются перетаскиванием соответствующих иконок из палитры элементов на диаграмму. Рассмотрим доступные типы блоков:

Служебные блоки

Название элементаПиктограммаОписание
Начало
Начальная точка выполнения программы. На каждой диаграмме такой блок должен быть только один, в него не должно быть входящих связей, исходящая связь из этого элемента должна быть только одна. Процесс интерпретации диаграммы начинается именно с этого блока.
Конец
Конец программы. Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает этот участок. У данного блока не может быть исходящих связей.

Функциональные блоки

Название элементаПиктограммаОписание
Моторы вперёд
Включить моторы по заданным портам с заданной мощностью. Порты задаются буквами A, B или C, разделенными запятыми. Мощность задается в процентах числом от -100 до 100, если задано отрицательное значение, мотор включается в режиме реверса. Можно также задать предел оборотов (в градусах), после которых мотор отключится (если задан 0, значение игнорируется). Предел оборотов указывается один для всех портов сразу. Так, на картинке изображена команда включения моторов на портах A и B с мощностью 100%.
Моторы назад
Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока "Моторы вперёд".
Моторы стоп
Выключить моторы по заданным портам.
Таймер
Ждать заданное количество времени, в миллисекундах.
Гудок
Проиграть на роботе звук с фиксированной частотой. Имеется один параметр — ждать ли завершения проигрывания звука или сразу же перейти к следующему блоку. Допустимые значения — true и false.
Играть звук
Проиграть на роботе звук с заданной частотой и длительностью. Аналогичен блоку "Гудок", но позволяет задавать параметры звука. Имеется параметр, определяющий, ждать ли завершения проигрывания звука или сразу же перейти к следующему блоку.
Сбросить показания энкодера
Ждать сенсор касания
Ждать, пока не сработает сенсор касания. Параметром указывается номер порта, к которому подключен сенсор касания. Допустимые значения: 1, 2, 3, 4.
Ждать сонар
Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние" (расстояние задается в сантиметрах, от 0 до 255). Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет меньше, чем 40 см.
Ждать цвет
Ждать интенсивность
Ждать свет
Ждать энкодер

Логические блоки

Название элементаПиктограммаОписание
Породить поток
Разделить выполнение программы на несколько потоков, которые с точки зрения программиста будут выполняться параллельно. Так, например, можно одновременно ждать срабатывания сенсора и истечения временного интервала. Блок должен иметь хотя бы две исходящие связи.
Функция
Посчитать значение некоего выражения. Также в данном блоке допускается определение переменных. Подробнее про синтаксис допустимых выражений параметра "Функция" см. в разделе Синтаксис выражений.
Условие
Разделить выполнение программы в соответствии с заданным условием. Значением параметра "Условие" является некое арифметическое выражение (подробнее см. раздел Синтаксис выражений), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. У данного блока должны быть две исходящие связи, у одной из которых должно быть задано значение параметра "Условие" (возможные варианты — "больше 0", "меньше 0", "равно 0"). При невыполнении данного условия выполнение передается по другой связи.
Цикл
Блок, организующий выполнение последовательности блоков несколько раз. Число повторений задается значением параметра "Итераций". Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением "итерация" (то есть значение параметра "Условие" должно быть "итерация"). Другая связь, исходящая из блока "Цикл" должна оставаться непомеченной, по ней будет осуществляться переход, когда программа пройдет через блок "Цикл" указанное число раз. Также

Создание связей

Связи между элементами в QReal:Robots обозначают направление передачи управления между блоками. Это означает, что если Вы хотите, например, чтобы вслед за выключением моторов робота программа сразу же завершилась, Вам необходимо соединить блоки "Моторы стоп" и "Конец" стрелкой, имеющей направление от блока включения моторов к блоку заавершения программы: 



Связи в QReal:Robots можно создавать несколькими способами. Первый подход аналогичен созданию блоков — нужно найти в палитре элементов соответствующую пиктограмму ("Поток управления") и перетащить его в нужное место диаграммы. При этом если "бросить" эту пиктограмму на уже существующий блок, то связь автоматически прикрепится к этому элементу. Если навести на связь курсор мыши, то на ее концах отобразятся серые маркеры:



Потянув за один из этих маркеров, можно управлять тем, к каким блокам присоединен тот или иной конец данной связи. Так, чтобы присоединить один из концов связи к блоку, нужно потянуть за соответствующий серый маркер и отпустить его на интересующем блоке.


Второй подход не требует перетаскивания элементов из палитры. Для того, чтобы создать связь между двумя элементами A и B, нужно навести курсор на элемент A, нажать правую кнопку мыши и, не отпуская ее, провести линию до элемента B (форма линии может быть произвольной, важно, чтобы она начиналась строго на элементе A и заканчивалась на элементе B). При этом на сцене это будет отражено следующим образом (элемент A в нашем случае — это блок "Начало", B — блок "Конец"):


При отпускании правой кнопки мыши элементы A и B окажутся соединенными связью:



Третий подход — использование встроенных линкеров, т.е. цветных кружков, размещающихся при выделении элементов на диаграмме чуть выше соответствующей иконки.


При нажатии на этот кружок и движении мыши с зажатой левой клавишей, из элемента начинает вытягиваться связь. Если "бросить" эту связь на существующем элементе, произойдет соединение данных элементов. Если же отпустить левую клавишу мыши, когда курсор находится на пустом участке диаграммы, то появится следующее меню:



При выборе пункта меню "Удалить" созданная ассоциация удаляется, при выборе пункта "Убрать меню" связь остается на диаграмме и меню закрывается. При наведении на пункт меню "Создать новый элемент" появляется новое меню, в котором перечислены все возможные для создания элементы. При выборе одного из этих пунктов на диаграмме создастся соответствующий элемент и присоединится к текущему связью.

Связи в QReal:Robots могут быть ломаными линиям. Для того, чтобы добавить новую точку излома, нужно навести курсор мыши на точку линии связи, где хочется сделать излом, нажать левой кнопкой мыши и потянуть появившийся серый маркер:


При этом, если точку излома связи разместить так, что она и две ближайших к ней будут располагаться примерно на одной прямой (см. рисунок ниже), то это приведет к уничтожению этой точки излома и сглаживанию ломаной в этом месте:


Также удалить точку излома можно, нажав на соответствующий ей серый маркер правой кнопкой мыши и выбрав пункт выпадающего меню "Удалить точку":


При выборе пункта меню "Удалить все точки" все точки изломов связи уничтожаются и линия становится прямой, соединяющей начало и конец ломаной.

Синтаксис выражений

Для объявления переменных и задания им определенных значений используется отдельный блок "Функция". Все переменные, объявленные в блоке, являются в программе глобальными (т.е. их значения могут использоваться в любом другом блоке). 


Для объявления новых переменных в QReal:Robots не используется какого-то специального синтаксиса. Для того, чтобы завести новую переменную, нужно просто присвоить ей какое-нибудь значение. Имена переменных могут указываться на русском языке. При желании в одном блоке "Функция" можно объявлять несколько переменных, в этом случае объявления нужно разделять знаком ";". Пример объявления переменных выглядит следующим образом: "R = 10; L = R/2":


В правых частях выражений допускается использование базовых арифметических операций (сложение, вычитание, умножение, деление), а также использование круглых скобок. Далее значения этих переменных могут использоваться для указания различных параметров в управляющих блоках. Например, в следующем примере изображена программа пропорционального регулятора:



В случае синтаксических и семантических ошибок сообщения о них при попытке выполнения программы появляются в информационном окне в нижней части QReal:Robots с выделением блока, где появилась ошибка, и указанием позиции ошибки внутри выражения. 

Помимо использования константных числовых значений программисту в QReal:Robots доступны зарезервированные переменные “Sensor1”, “Sensor2”, “Sensor3” и “Sensor4”, которые хранят значения показаний сенсоров, подключенных по соответствующим портам (номер сенсора соответствует номеру порта). Их значения можно присваивать переменным и использовать в математических выражениях.

Редактрование свойств элементов

В QReal:Robots имеется несколько способов редактирования значений свойств, которые имеются у блоков и связей на диаграммах. Основным из них является использование редактора свойств (см. раздел Интерфейс QReal:Robots). При выделении блока связи или элемента на сцене в редакторе свойств начинают отображаться все свойства текущего элемента (на рисунке представлено изображение редактора свойств блока "Моторы вперёд"):



Редактор свойств представляет собой таблицу, в которой в левой колонке отображается название свойства элемента, а в левой — его значение. Изменить значение любого свойства можно кликнув на соответствующей ячейке правой колонки и введя нужное значение. Для свойств, которые допускают только определенный набор значений (например, свойство "Порт" у блока "Ждать сенсор касания") при попытке их редактирования появится выпадающее меню, в котором нужно выбрать интересующее значение:


Помимо редактора свойств, значения свойств элементов можно редактировать прямо на диаграмме. Для этого нужно навести курсор мыши на значение нужного свойства, двойным нажатием левой кнопки мыши активировать редактирование свойства, ввести нужное значение и кликнуть в произвольное место сцены. Стоит отметить, что данный подход может служить источником ошибок, поскольку позволяет ввести произвольное текстовое значение свойства, в том числе и некорректное. Будьте осторожны.
Comments