Задание настроек компиляции

Для настройки компилятора необходимо выполнить следующие действия:

  1. Вызвать рабочее окно «Кодогенератор СИ» нажатием левой клавишей «мыши» на соответствующий пункт главного меню Кодогенератор → Кодогенератор СИ (Рисунок 1).

    Рисунок 1. Открытие окна настройки кодогенератора СИ

  2. Добавить файлы схем алгоритмов, сохранённые ранее на диске в список загружаемых в исполняемую среду задач. Для этого необходимо в окне «Кодогенератор СИ» нажать левой клавишей «мыши» на кнопку Добавить файлы (Рисунок 2). После выбора файлов (Рисунок 3), их имена появятся в строках таблицы в закладке «Загрузка» окна «Кодогенератор СИ».

    Исполняемая среда для приборов позволяет загружать в один прибор одновременно несколько различных расчётных модулей и выполнять их с разным тактом. При этом возможна загрузка одного и того же расчётного модуля, сгенерированного по единой схеме несколько раз с разным уникальным именем, при этом каждый из экземпляров расчётного модуля может быть подключен к разным сигналам. Каждой строке в таблице «Загрузки» соответствует вызов расчётного модуля, который сгенерировался по соответствующей схеме указанной в поле «Файл схемы». Имя исполняемого файла расчётного модуля, соответствующего данной схеме указывается в самом файле схемы (Параметры расчёта – Имя алгоритма). Следует различать в данном случае имя алгоритма, заданное внутри схемы и поле «Имя алгоритма», заданное в таблице «Загрузки». По первому определяется имя файла расчётного модуля, а по второму – уникальное имя, по которому данный исполняемый файл загружается в исполняемой среде прибора. При этом если в поле «Имя алгоритма» в таблице «Загрузки» ничего не задано, то среда разработки в файл конфигурации загрузки в качестве имени алгоритма принимает имя исполняемого файла. Если же данное поле задано, то имя алгоритма не совпадает с именем исполняемого файла. Например, на рисунке (Рисунок 4) изображено, что расчётный модуль, сгенерированный по файлу схемы «Проект 2.prt» будет загружен 2 раза, но под разными именами алгоритмов (algo1 и algo2), а расчётный модуль, сгенерированный по файлу «ШРП - штатный регулятор питания БС.prt», будет загружен один раз под именем алгоритма, соответствующем имени исполняемого файла, заданному в настройках проекта. При этом, для того чтобы загрузить один и тот же расчётный модуль под разными именами алгоритмов и привязать их к разным сигналам, необходимо задать имена сигналов в блоках типа Входной контакт и Выходной контакт в схеме соответствующего алгоритма с применением специального выражения %name%, которое при загрузке расчётного модуля в исполняемую среду прибора заменяется на имя алгоритма, заданное в поле «Имя алгоритма» в таблице «Загрузки» окна «Инструменты автоматики». Например, если вы в блоке «Входной контакт» примените имя сигнала %name%XB01, и укажите имя алгоритма в таблице загрузки Al , то при загрузке расчётного модуля данный блок будет подключен к сигналу A1XB01. При изменении имени алгоритма (например, добавлении нового, с той же схемой, но привязанного к другим сигналам) перекомпиляция самого расчётного модуля не требуется, требуется переписать только файл конфигурации загрузки (см. Руководство системного программиста).

    Рисунок 2. Кнопка добавления файлов

    Рисунок 3. Выбор файлов проекта

    Рисунок 4. Список добавленных файлов

  3. Настроить параметры вызова расчетных модулей на приборе. В закладке «Загрузка» рабочего окна «Инструменты автоматики» необходимо задать значения следующих параметров:

    Имя алгоритма— имя алгоритма. Если имя алгоритма не заполнено, то оно принимается по умолчанию равным имени образа исполняемого файла. Если указанный исполняемый файл расчетного модуля планируется использовать в приборе многократно, то следует указать имя алгоритма (разное для разных объектов). Многократно, значит для обработки одинаковых по структуре алгоритмов может использоваться один сгенерированный расчётный модуль, при этом он запускается несколько раз, но подключается к различным внешним переменным для каждого из запущенных процессов;

    Период, мс— период вызова расчетного модуля в миллисекундах;

    К-во вызовов количество вызовов одного расчетного модуля за период вызова. Нужно если за период необходимо выполнить алгоритм последовательно несколько раз (если к-во вызовов больше 1), например это может понадобится для реализации итераций;

    Образ (exe)— имя исполняемого файла расчетного модуля. Если файл проекта (например, Scheme.prt) задан, то параметр заполняется автоматически.

    Если указанный исполняемый файл расчетного модуля планируется использовать в приборе многократно, то следует указать имя алгоритма (разное для разных объектов).

    Рисунок 5. Дополнительные параметры вкладки Загрузка

  4. Выполнить настройку инструментов автоматики. Настройка инструментов автоматики производится в закладке «Настройки» рабочего окна «Инструменты автоматики», показано на рисунке (Рисунок 6):

    Рисунок 6. Вкладка настроек кодогенератора

    Параметры, которые следует определить:

    Имя конфигурации загрузки — имя конфигурационного файла загрузки (указывается без расширения, по умолчанию default);

    Директория исходников — путь сохранения сгенерированных программ (расчётных модулей);

    Директория шаблона кода — настройка генерации программ, выбирается в зависимости от типа целевой операционной системы, приведено в таблице (Таблица 1);

    Таблица 1. Список шаблонов кодогенератора СИ
    Значение параметра Примечание
    %codetemplates%MinGW_DLL\ для компиляции динамически загружаемой библиотеки (dll) с расчетной моделью для ОС Windows;
    %codetemplates%MinGW_SampleApp\ для простой консольной программы для ОС Windows;
    %codetemplates%QNX4\ для ОСРВ QNX версии 4;
    %codetemplates%QNX6\ для ОСРВ QNX версии 6;
    %codetemplates%VC2008\ для компиляции динамически загружаемой библиотеки (dll) с расчетной моделью для ОС Windows. Для настоящего шаблона кода применяется компилятор Visual C++ 2008.
    ... ...

    Имя блока в коде = — правило формирования имён переменных для блоков расчетной схемы (алгоритма). Расшифровка значений параметра приведена в таблице (Таблица 2);

    Таблица 2. Варианты имени блока в коде
    Значение параметра Примечание
    Номер при сортировке

    В качестве базы для имени внутренних переменных в генерируемом Си-коде используются сквозные номера, присвоенные при сортировке расчетной схемы;

    Примечание - При дополнении или изменении расчетной схемы внутренним переменным будут присвоены новые номера.

    Ограниченный md5-хэш (6 символов) В качестве базы для имени внутренней переменной используются первые 5 символов от md5-хэш функции полного имени блока.
    Транслитерированное имя

    В качестве базы для имени внутренней переменной используется текстовое имя в формате

    <имя субмодели>_<имя блока>

    Полный md5-хэш (32 символа) В качестве базы для имени внутренней переменной используются первые 32 символа от md5-хэш функции полного имени блока.
    Ограниченный md5-хэш (12 символов) В качестве базы для имени внутренней переменной используются первые 12 символов от md5-хэш функции полного имени блока.

    Стиль заголовка кода — способ генерации заголовочного файла на языке программирования Си необходимого для автоматической привязки текстовых идентификаторов переменных к нужным адресам в памяти. Расшифровка значений параметра приведена в таблице (Таблица 3);

    Таблица 3. Варианты стиля заголовка кода
    Значение параметра Примечание
    С внутренними таблицами переменных (DLL) В заголовочный файл, на основе которого генерируется динамически загружаемая библиотека или программа, встраиваются служебные таблицы с указанием имён переменных, соответствующим им адресом в памяти и типом данных (целый, вещественный и т.п.);
    С внешними таблицами переменных (EXE) В обрабатываемый компилятором заголовочный файл не пишутся служебные таблицы с именами переменных. Служебные таблицы генерируются в бинарные файлы, структура которых подробно описана в руководстве системного программиста [2];
    Автоопределение по ini-файлу в шаблоне кода Опция позволяет автоматически выбирать тип генерации заголовочного файла: с внутренними или внешними таблицами переменных в соответствии с выбранным шаблоном кода. При этом в директории шаблона кода должен присутствовать ini-файл, в котором в текстовом виде указывается идентификатор способа определения генерации заголовочного файла.

    Команда сборки модуля— текст вызова скрипт-файла (bat-файл), который производит автоматическую компиляцию расчетного модуля по сгенерированным кодгенератором исходным текстам;

    Команда загрузки в целевую систему— текст вызова скрипт-файла (bat-файл), который производит загрузку скомпилированных расчетных модулей (программ) и других необходимых файлов на прибор;

    Префикс имён переменных— символ, дописываемый в начало имени локальных переменных при генерации кода.

  5. Задать параметры отладчика. Параметры отладчика задаются в закладке «Отладчик» рабочего окна «Инструменты автоматики», показано на рисунке (Рисунок 7).

    Рисунок 7. Вкладка Отладчик

    Параметры, которые следует определить:

    Режим отладки— выбор способа расчета схемы (алгоритма). Расшифровка значений параметра приведена в таблице (Таблица 4);

    Таблица 4. Варианты режима отладки
    Значение параметра Примечание
    Локальная расчетная схема считается на рабочем месте разработчика (компьютере пользователя) без доступа к прибору;
    Удалённая на расчетной схеме отображаются данные с прибора. Пользователь может изменять параметры блоков, при этом происходит автоматическое изменение соответствующей переменной на приборе;
    Получать только входы в режиме происходит только получение значений переменных входа/выхода для расчетной модели. Все остальные переменные состояния рассчитываются локальным ядром автоматики и не синхронизируются со значением переменных, существующих в приборе.

    Режим изменения параметров — опция, позволяющая изменить режим пересылки изменяемых пользователем параметров в прибор. Расшифровка значений параметра приведена в таблице (Таблица 5);

    Таблица 5. Варианты режима изменения параметров
    Значение параметра Примечание
    Однократный При изменении пользователем значения свойства блока на расчетной схеме (например, коэффициента усиления инерционно-дифференцирующего звена) происходит его однократное изменение на расчетной схеме с однократной пересылкой на прибор;
    Списочный Графическая оболочка SimInTech программно составляет список требуемых параметров, который на каждом расчетном шаге транслируется на прибор.

    Параметры соединения (хост:порт)— адрес сервера (прибора), например 127.001:22375. Если номер порта после двоеточия не указан (или в параметрах соединения отсутствует), то по умолчанию номер порта равен 22375;

    Имя DLL удаленного доступа— имя динамически загружаемой библиотеки, реализующей алгоритм получения данных от сервера отладки прибора GdbServer;

    Примечание: Пользователь не должен изменять значение параметра при использовании протокола передачи данных, реализованного в данной исполняемой среде.

    Имя объекта внутри DLL— Имя модуля, которое обеспечивает связь ПО прибора с сервером отладки. Используется при необходимости создания поддержки собственного протокола передачи данных, отличающегося от заложенного в динамическую библиотеку avrordbg.dll.

    Имя состояния— текстовый параметр, используемый для именованного сохранения состояния прибора (имя рестарта).

  6. Сохранить конфигурацию инструментов автоматики. Конфигурацию сохраняют нажатием левой клавишей «мыши» на кнопку Сохранить конфигурацию в рабочем окне «Кодогенератор СИ» (Рисунок 8). Соответствующий файл лучше хранить вместе с файлами расчетных схем.

    Рисунок 8. Кнопка сохранения конфигурации кодогенератора

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

/* ------------------------------------------------------
      Routine name: calc
      Generated: 27.09.2011 11:44:36
      Description: 
      Project file: ШРП - штатный регулятор питания БС.prt
------------------------------------------------------ */

Где:

Routine name – имя сгенерированного исполняемого файла расчётного модуля;

Generated – дата и время генерации;

Description – краткое текстовое описание проекта, заполняемое пользователем в параметрах расчёта;

Project file – имя исходного файла схемы, по которой был сгенерирован исходный текст.

Также в исходном тексте для каждого из блоков схемы перед исходным текстом, описывающим данный блок, генерируется комментарий вида:

/* Index=367
   UID=367
   GeneratorClassName=TLimitIntegrator
   Name=klap2.int
   Type=Интегратор с ограничением */

Где:

Index – уникальный номер при сортировке блока (т.е. порядковый номер блока, который автоматически определяется математическим ядром). Номера блоков на схеме можно вывести при помощи пункта в главном меню «Вид-Показывать номера блоков». Для поиска блока по его UID необходимо нажать кнопку «Поиск блока» на главной панели инструментов программы и там пометить тип поиска «По индексу блока», ввести туда данный идентификатор, программа покажет блок в проекте.
Примечание: номера блоков при изменении топологии модели могут меняться, поэтому если вы изменили схему и по старым исходникам ищете блок на ней, то поиск может быть неверным.
UID – уникальный идентификатор блока, который является базовым для формирования имён переменных состояния для данного блока. Способ вычисления идентификатора указывается в настройках генерации кода (см. таблицу 2). Для поиска блока по его UID необходимо нажать кнопку «Поиск блока» на главной панели инструментов программы и там пометить тип поиска «По тексту», ввести туда данный идентификатор, программа покажет все блоки, где встречается данное сочетание символов;

GeneratorClassName – имя класса генератора кода в исходном тексте генератора кода в файле

<директория установки>\source\MBTY\AVRORA_GEN\Blocks.pas

По данному имени можно легко найти исходный текст, описывающий процесс генерации Си-кода для данного блока;

Name – полное имя блока, для которого был сгенерирован данный фрагмент кода. Оно формируется по следующему принципу:

<имя субмодели в которой стоит блок>.<имя блока внутри субмодели>

где имя блока – поле «Имя объекта» (Name) в закладке «Общие» в редакторе свойств блока. Если блок стоит во вложенной структуре, то в полное имя через точку включаются все имена субмоделей начиная с самой верхней, к которым этот блок принадлежит. Таким образом, по полному имени на схеме можно однозначно найти данный блок, для которого сгенерирован фрагмент кода.

Type – это идентификатор типа блока, который берётся из параметра «Тип элемента» (ClassName) закладки, «Общие» в редакторе свойств блока.