Проект
Однопользовательский проект в среде Полигон представляет собой файл с расширением .pl2. В нем хранится все содержимое проекта за исключением дополнительных файлов, которые могут использоваться, например, при создании пользовательского составного блока на C++. Файлы проектов можно копировать и таким образом передавать другим разработчикам. Каждый проект рекомендуется размещать в отдельной папке, поскольку внутри нее среда разработки создает временные файлы при трансляции и копии проекта (бэкапы).
При редактировании проекта все изменения происходят только в кратковременной
памяти. Для записи изменений в файл нужно использовать команду Сохранить в панели инструментов или комбинацию клавиш Ctrl + s. Последние 10 действий можно отменить командой Отменить
или
комбинацией клавиш Ctrl + z независимо
от того, был ли сохранен проект на диск или нет.
Автоматическое сохранение проекта по умолчанию производится каждые 5 минут. Период сохранения проекта можно изменить в меню Экран/Настройки (при установке 0 автосохранения производиться не будут). При каждом сохранении на диск создается копия проекта (бэкап) с таким же именем плюс суффикс с датой и временем сохранения.
Более подробную информацию о создании многопользовательского проекта можно найти в разделе.
Структура проекта
Проект в среде разработки Полигон имеет иерархическую структуру, которую можно увидеть в представлении Дерево. Узлы дерева могут быть разных типов. Основной узел с точки зрения создания программы для контроллера – Модуль.
В свойствах модуля задаются параметры подключения к контроллеру. Внутри модуля располагаются графическая структура алгоритмов и настройки для контроллера, из модуля транслируется исполняемый файл.
Проект может содержать несколько модулей.
Внутренняя структура модуля жестко определена: Модуль > Место работы > Программа > Страница > Функциональный блок.

Место работы задает способ выполнения находящихся в нем программ, т.е. поток, в котором программы будут выполняться.
ПО контроллера формируется таким образом, что каждый функциональный блок можно выполнять в одном из четырех потоков:
место работы Таймер (таймерное прерывание);
место работы Ввод-вывод (таймерное прерывание);
место работы Фон (фоновый поток);
место работы Поток (фоновый поток).
Часть алгоритма, помещенная в таймерном прерывании, всегда выполняется в режиме реального времени с заданной периодичностью (периодичность задается свойством места работы Таймерный промежуток) – это поток с самым высоким приоритетом.
Необходимо соизмерять размер программ (количество функциональных блоков), находящихся в таймере, со временем таймерного цикла. При недостаточном интервале таймерного цикла может появиться ошибка времени исполнения – Time Out. Данная ошибка повлечет за собой остановку программы (отслеживать реальное время выполнения можно с помощью функционального блока SysInfo).
Существуют функциональные блоки, такие, как логические таймеры, которые целесообразно помещать только в Таймер.
Фоновый поток представляет собой бесконечный цикл, который выполняется с более низким приоритетом в оставшееся от таймерного потока время. В Фон необходимо помещать некритичные по времени исполнения блоки, которые не привязаны к внешним событиям. Большинство блоков, которые обеспечивают обмен по интерфейсам, выполняют запись в файлы и т. п., целесообразно помещать только в Фон.


Программа – это относительно независимая алгоритмическая задача или группа однотипных задач.
Ради простоты дальнейшей поддержки проекта следует избегать двух крайностей: малого числа слишком длинных программ (т.е. с большим числом страниц) и слишком большого числа коротких программ.
Имя программы должно состоять только из символов латинского алфавита и нижнего подчеркивания «_», поскольку это имя при трансляции определяет имя файла исходных текстов и объектного файла. Важно давать программам осмысленные имена, чтобы впоследствии было проще понять их назначение. Желательно всегда присваивать разные порядковые номера выполнения программам одного потока.
Для удобства просмотра программы разбиты на Страницы. Количество страниц задает пользователь.
Страница, в свою очередь, содержит Функциональные блоки, соединенные между собой связями.
Поток данных
Программа, получаемая после трансляции, имеет двухпоточную структуру и сторожевой таймер.
При создании алгоритма функциональные блоки можно размещать либо в фоновом, либо в таймерном потоке. Для этого блок создается в определенном Месте работы.
Порядок выполнения алгоритма внутри потока определяется следующим образом:
Порядок выполнения программы (свойство Номер);
Номер страницы (свойство Номер);
Порядок выполнения блока на странице (свойство Порядок).
Если блоки на одной странице имеют одинаковый порядок выполнения, то их очередность определяется положением блока на странице – слева направо, сверху вниз. Во избежание логических ошибок, вызванных перемещением блоков, рекомендуется всегда задавать разные порядки выполнения для блоков, расположенных на одной странице.
Поток данных осуществляется исключительно за счет проведения связей между входами и выходами функциональных блоков.

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

Вход или выход на поле обозначается следующим образом:

Для того, чтобы быстро найти вход или выход, указанный на поле, следует щелкнуть по нему левой кнопкой мыши (для правого поля может понадобиться выбрать один из входов из списка). После этого в текущем рабочем окне появится страница, которой принадлежит данный вход или выход.
Размер страницы можно поменять при помощи свойства Размер листа, однако следует учитывать, что слишком большая страница, на которой размещено много блоков, может долго открываться.
Масштаб каждой открытой страницы можно менять при помощи колеса мыши при нажатом Ctrl. Масштаб открытых страниц меняется относительно общего масштаба всего приложения, который задается комбинациями Ctrl + и Ctrl -.
Для перемещения по странице можно использовать ползунки справа – перемещение вверх-вниз и снизу – влево-вправо. Также можно использовать колесо мыши – перемещение вверх-вниз и Shift + колесо мыши – перемещение влево-вправо.
Функциональный блок
Функциональный блок представляет из себя элементарный алгоритм. Программа в среде Полигон состоит только из функциональных блоков, входы и выходы которых связаны между собой связями.
Типы функциональных блоков описаны в библиотеках (файлы с расширением .ll2) и реализованы как классы C++. Информацию о работе блока можно получить из справки библиотеки, выделив блок и нажав F1.
Графическое отображение функционального блока на странице несет информацию об его свойствах и свойствах его входов и выходов.

Основные свойства функционального блока и его входов/выходов
Свойство | Описание |
---|---|
Имя блока | Любая строка, удобная для навигации по проекту |
Порядок выполнения | Положительное целое число, которое задает очередность выполнения блока на странице (поток данных). Для корректного выполнения программы рекомендуется не использовать одинаковые порядки выполнения для блоков на одной странице |
Тип блока | Имя типа функционального блока, тип блока выбирается при создании и не может быть изменен в процессе работы |
Имя входа | Строка, уникальная для данного типа блока (может содержать число – индекс в массиве, в случае циклических входов) |
Тип входа | Сокращенное имя типа данных входа |
Константа | Выражение, формат которого зависит от типа входа. Константа задается на входе, не связанном ни с каким выходом и определяет значение входа при выполнении программы. Полигон не ограничивает возможные форматы констант. Если константа будет задана неправильно (например, на входе типа flt (float) будет задана строковая константа "s"), при трансляции возникнет ошибка |
Имя выхода | Строка, уникальная для данного типа блока (может содержать число – индекс в массиве, в случае циклических выходов) |
Тип выхода | Сокращенное имя типа данных выхода |
Связи | Связи между входами и выходами блоков на одной странице или между блоками, расположенных на разных страницах |
Комментарии | Комментарии, относящиеся к входам/выходам. Комментарии отображаются в дереве проекта |
Свойства блока и его входов/выходов можно менять в окне Свойства. Для изменения имени, порядка выполнения, констант на входах и комментариев достаточно дважды нажать мышкой на соответствующем параметре блока в представлении Страница и ввести новое значение.
Входы
Входы функционального блока могут быть следующих типов:
Циклические – входы, количество которых может изменяться. Входы добавляются командой Создать в контекстном меню блока.
Циклические группы – входы, объединенные в группы, количество которых может изменяться (аналогично циклическим входам). Группа соответствует структуре в C++.
Нециклические – входы, количество которых определяется исключительно типом функционального блока и не изменяется.
Типы входов ФБ
По отношению к возможности проведения связи входы делятся на следующие типы (задается свойством входа Тип связей):
- Обычный вход – вход, на котором можно (необязательно) задать константу или провести связь (свойство Тип связей = 0).
Константный вход – вход, на котором требуется задать константу и нельзя провести связь (Тип связей = 1).
Необязательный вход – вход, на котором можно (необязательно) провести связь и нельзя задать константу. При отсутствии связи вход не используется в программе. Данный вход обычно обозначается символом # в поле констант и имеет свойство Тип связей = 2.
Обязательный вход – вход, на котором следует провести связь и нельзя задать константу. Если на вход данного типа не будет проведена связь, то при трансляции будет выдана ошибка. Данный вход обозначается обычно символами ??? в поле констант и имеет свойство Тип связей = 3.
Выходы
Выходы функционального блока могут быть двух типов:
Циклические – выходы, количество которых может изменяться. Выходы добавляются командой Создать в контекстном меню блока. Количество циклических выходов может зависеть от количества входов: при изменении количества входов меняется и количество выходов, и наоборот.
Нециклические – обычные выходы, количество которых нельзя изменить.

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