Текущий раздел:

Описания RDS

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.5. Окно редактора модели

§3.5.7. Параметры модели

# Описание пользователя

## Глава 3. Использование стандартных модулей автокомпиляции

### §3.5. Окно редактора модели

#### §3.5.7. Параметры модели

Рассматривается ввод различных описаний и параметров модели, влияющих на ее общее поведение.

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

Чтобы изменить параметры модели, следует в окне ее редактора вызвать пункт главного меню «модель | параметры модели». При этом откроется окно с четырьмя вкладками, самая важная из которых – «компиляция» (рис. 356). На ней расположены флажки, большая часть которых управляет добавлением в программу модели тех или иных автоматически выполняемых действий.

Рис. 356. Окно параметров модели – параметры исходного текста

Флажок «не реагировать на события без динамических переменных» отключает все реакции модели на события, если хотя бы одна из динамических переменных, занесенных пользователем в список на вкладке «переменные», отсутствует. Динамические переменные, в отличие от статических, создаются не заранее, а в процессе работы схемы, и могут быть удалены создавшими их блоками в любой момент. Обращение к отсутствующей в данный момент динамической переменной вызывает критическую ошибку, поэтому модели блоков должны проверять их существование перед каждым обращением. Установка этого флажка добавляет в программу модели проверку существования всех указанных в модели динамических переменных перед вызовом реакции на каждое событие. Если эта проверка не проходит, программа модели немедленно завершается, и введенные пользователем фрагменты программ не выполняются. В этом случае внутри них можно обращаться к любым динамическим переменным, не заботясь об их существовании: если хотя бы одной переменной не будет, вся реакция не будет выполнена. Для большинства моделей такое поведение подходит – действительно, если одна из необходимых для работы блока переменных отсутствует, работа модели бессмысленна – поэтому в новых пустых моделях этот флажок установлен по умолчанию. Однако, если при отсутствии динамической переменной модель все равно должна предпринимать какие-либо действия (например, выводить пользователю сообщение об ошибке, или брать данные из статической переменной), флажок следует отключить, и проверять существование каждой динамической переменной вручную, при помощи функции-члена ее класса Exists.

Флажок «перехватывать ошибки математических функций» (активен только если эта функция поддерживается модулем автокомпиляции) добавляет в программу модели специальные функции, которые предотвращают прерывание выполнения модели при возникновении каких-либо ошибок в стандартной математической библиотеке. Какие именно функции необходимо вставить в программу при установке этого флажка, определяют параметры модуля автокомпиляции. По умолчанию в программу вставляется функция с названием _matherr, которая заменяет результат операции, которая не может быть выполнена, на ноль в случае ошибки потери точности, и на специальное значение, предусмотренное для индикации ошибки операции с вещественными числами, при любой другой ошибке (это значение хранится в глобальной переменной rdsbcppHugeDouble). Следует помнить, что данный флажок управляет только перехватом ошибок математической библиотеки, а не любых операций с вещественными числами: например, деление на ноль он отследить не в состоянии. Подробнее о перехвате математических ошибок можно прочесть в руководстве по используемому компилятору.

Флажок «перехватывать все исключения, возникшие в модели» (активен только если эта функция поддерживается модулем автокомпиляции) заключает всю функцию модели блока внутрь оператора try…catch. Если внутри этого оператора возникнет ошибка, приводящая к прерыванию работы модели, пользователю будет выведено сообщение об этом, и расчет, если он запущен, будет остановлен. Если не устанавливать этот флажок, возникшая ошибка все равно будет перехвачена RDS, и пользователю будет выведено стандартное диагностическое сообщение (рис. 357) с предложением завершить работу. С установленным флажком поведение модели будет зависеть от дополнительного флажка «игнорировать исключения и продолжать расчет»: если он установлен, модель продолжит работу, несмотря на исключение, в противном случае пользователю будет выведено короткое сообщение, причем модель не позволит пользователю завершить работу с потерей всех не сохраненных изменений в схеме. Использование общего перехвата исключений, управляемого данными двумя флажками, следует рассматривать только как временную меру: если в модели содержатся ошибки, вызывающие исключения, разработчик должен самостоятельно перехватывать их именно в тех местах, где они возникают, и обрабатывать должным образом.

Рис. 357. Стандартное сообщение RDS о критической ошибке в модели

Описанные выше флажки перехвата ошибок будут активны только в том случае, если соответствующие функции поддерживаются модулем автокомпиляции. На данный момент в стандартных модулях они отключены.

Флажок «автозапуск при изменении динамических переменных» добавляет в программу модели автоматическое присвоение единицы первой сигнальной переменной блока, всегда используемой в качестве команды на запуск модели, при изменении любой динамической переменной, внесенной пользователем в список на вкладке «переменные» дополнительной панели редактора. Очень многие блоки должны выполнять одинаковые действия и при изменении их статических переменных (то есть при поступлении данных на их входы), и при изменении динамических переменных, с которыми эти блоки связаны. Чтобы не записывать одну и ту же программу два раза и в реакции на такт расчета (событие RDS_BFM_MODEL), и в реакции на изменение динамических переменных (событие RDS_BFM_DYNVARCHANGE, см. список событий блоков в §3.5.4), можно включить этот флажок и записать необходимые действия только в реакции на такт расчета. При этом, как только какая-либо из связанных с блоком динамических переменных изменится, будет автоматически взведен сигнал запуска модели, и в ближайшем такте расчета блок выполнит свою программу. Разумеется, если в параметрах блоков с данной моделью включен запуск каждый такт, модель блока будет принудительно запускаться в каждом такте расчета независимо от изменений каких-либо переменных, и в установке данного флажка нет смысла.

Флажок «проверять индексы в массивах и матрицах (медленно)» добавляет в формируемую модулем автокомпиляции программу модели специальные функции для автоматической проверки допустимости индексов всех массивов и матриц, являющихся статическими и динамическими переменными блока. Если флажок выключен, то, как и принято в языке C, такая проверка не производится – это ускоряет работу программы. Однако, в этом случае при попытке обращения к элементу за пределами текущего размера массива или матрицы (например, при обращении к двадцатому элементу массива, в котором всего десять элементов), возникнет критическая ошибка. Правила написания моделей блоков для RDS требуют обязательной проверки допустимости индекса перед обращением к массиву или матрице, поэтому в правильно написанной модели устанавливать этот флажок не нужно: все проверки должны быть выполнены программистом явно. Тем не менее, если модель по непонятным причинам постоянно выдает исключения и отказывается работать, установка этого флажка может дать понять, в чем именно дело. Если после его установки модель начала выдавать сообщения о недопустимом индексе с указанием имени модели и имени массива или матрицы, значит, ошибки возникают именно из-за недопустимых индексов, и их проще будет найти и исправить. Следует, однако, помнить, что действие этого флажка распространяется только на статические и динамические переменные блока, для работы с которыми модуль автокомпиляции формирует специальные классы, в которые и добавляются функции автоматической проверки индексов. Для стандартных описаний массивов и матриц в синтаксисе языка C проверки не производятся: если, например, внутри какой-либо реакции блока описать массив из десяти элементов оператором «double a[10];», а затем выполнить оператор «a[20]=1;», исключение возникнет независимо от состояния описываемого флажка, и никаких диагностических сообщений выдано не будет.

Флажок «заменять символы в кавычках на их коды UTF8» заставляет модуль автокомпиляции искать во введенных пользователем фрагментах программ строки в кавычках, и заменять в них все символы, не соответствующие семибитной кодировке ASCII, на их коды в кодировке UTF8 в стандартном для языка C представлении «xNN». Например, строка

      "Заголовок"

будет преобразована в

      "\xD0\x97\xD0\xB0\xD0\xB3\xD0\xBE\xD0\xBB\xD0\xBE\xD0\xB2\xD0\xBE\xD0\xBA"

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

Флажок «создать макросы RDSBCPP_VT_ для классов переменных» добавляет для каждой статической и динамической переменной блока макроопределение для имени класса, сгенерированного модулем автокомпиляции для доступа к этой переменной. Макроопределение имеет следующий вид:

      #define RDSBCPP_VT_ИмяПеременной ИмяКласса

(здесь «ИмяПеременной» – имя переменной блока, «ИмяКласса» – имя класса, созданного для этой переменной). Например, для доступа к статическим переменным типа «матрица double» автоматически создается класс с именем «rdsbcstMDouble». Если в блоке есть статическая матрица с именем «A», то при включенном флажке создания макросов в текст программы будет добавлена следующая строка:

      #define RDSBCPP_VT_A rdsbcstMDouble

В большинстве случаев разработчику модели можно не задумываться, как именно называется класс, созданный для работы с переменной, поскольку к переменным внутри реакций на события можно обращаться просто по именам. Однако, если необходимо создать отдельную функцию, которая будет работать с переменными блока, для описания параметров этой функции необходимо будет указать типы переменных, что проще всего сделать с использованием автоматически созданных макросов. Пусть, например, требуется создать функцию, суммирующую все элементы статической матрицы вещественных чисел, причем в блоке есть переменная «A» нужного типа «матрица double». Тогда функцию можно записать следующим образом:

      double SumMatr(RDSBCPP_VT_A &matr)
      { double sum=0.0;
        for(int c=0;c<matr.Cols();c++)
          for(int r=0;r<matr.Rows();r++)
            sum+=matr[r][c];
        return sum;
      }

Разместить эту функцию нужно будет в описаниях после класса блока, поскольку строки с макроопределениями добавляются после описания каждой переменной, то есть внутри класса блока.

Флажок «#undef для констант, совпадающих с именами переменных» добавляет в программу перед каждым описанием переменной блока имя_переменной конструкцию

      #ifdef имя_переменной
        #undef имя_переменной
      #endif

Без нее компилятор выдаст ошибку, если имя переменной блока совпадет с одной из стандартных констант в подключенных пользователем (или автоматически) описаниях. С этой конструкцией описание константы будет отменено. Это не должно привести к проблемам, поскольку, если пользователь так назвал переменную, он, очевидно, не использует одноименную константу.

В поле «отменить (#undef) определения констант (через запятую)» можно ввести имена каких-либо дополнительных констант, для которых будут добавлены команды препроцессора «#undef». Это может потребоваться при конфликтах описаний в сложных моделях.

Флажок «блок участвует в инициализационном расчете» разрешает вызов модели блока для реакции на такт расчета не только в обычном режиме расчета, но и при проведении предварительного расчета в момент выхода из режима редактирования. Предварительный расчет обычно выполняется по запросу начальных блоков алгебраических цепочек (например, полей ввода) и позволяет уменьшить число тактов переходного процесса в таких цепочках. При этом блоки в цепочке последовательно вызываются для обработки значения, поступившего с предыдущего блока, и правильное значение на конечном блоке цепочки устанавливается не через несколько тактов после начала расчета, как обычно (см. рис. 10), а непосредственно перед запуском расчета. Флажок предварительного расчета следует устанавливать только в том случае, если блок должен вычислять свои выходные значения немедленно при изменении входных. Если, например, блок моделирует какой-либо длящийся во времени процесс, включать его в предварительный расчет не следует, поскольку он должен вычислять выходы не при изменении входов, а при изменении динамической переменной времени. Установка этого флажка вызывает взведение флага RDS_INITCALC в поле Flags структуры данных блока RDS_BLOCKDATA. В абсолютном большинстве простых моделей можно обойтись и без предварительного расчета, поскольку задержка данных на несколько тактов, как правило, не влияет на работоспособность схемы.

Флажок «блок начинает инициализационный расчет» устанавливается у блоков, с которых обычно начинаются алгебраические цепочки, чтобы выходные значения этих блоков были обработаны этой цепочкой в момент выхода из режима редактирования. Установка этого флажка вызывает взведение флага RDS_INITCALCFIRST в структуре данных блока.

Флажок, «запретить редактирование модели», блокирует все операции по изменению параметров, переменных, функций и фрагментов программ модели. После его установки модель можно только просматривать, но нельзя редактировать. Это может оказаться полезным при передаче модели другому пользователю, чтобы он случайно не изменил ее. При попытке вызвать редактор модели пользователю будет предложено либо открыть окно редактора в режиме просмотра, либо сделать копию модели для ее изменения. Если установить дополнительный флажок «при запрете открывать редактор в режиме просмотра», окно редактора будет открываться в режиме просмотра без запроса. Чтобы снова редактировать модель, этот флажок необходимо будет сбросить.

Вкладка «связанные файлы» окна параметров модели (рис. 358) содержит список файлов, при изменении которых модуль автокомпиляции будет считать, что модель необходимо скомпилировать заново. Как правило, это файлы заголовков, включаемых в программу модели. Если, например, в модели используются описания из файла «AuxDefs.h», и в этот файл внесены изменения, модель необходимо компилировать заново, хотя сама модель не менялась.

Рис. 358. Окно параметров модели – связанные файлы

Верхнюю часть вкладки занимает автоматически созданный список файлов, ссылки на которые (то есть команды препроцессора «#include») модуль автокомпиляции нашел в глобальных описаниях, внесенных пользователем в модель. Для формирования этого списка должен быть включен флажок «искать в глобальных описаниях». Если при этом включен еще и флажок «искать в найденных файлах», в список попадут не только файлы, найденные в глобальных описаниях, но и файлы, на которые ссылаются эти найденные файлы – таким образом, в список будут добавлены все цепочки ссылающихся друг на друга файлов заголовков. Пользователь не может самостоятельно добавлять файлы в этот список.

Нижнюю часть вкладки занимает список связанных файлов, создаваемый пользователем вручную. В него обычно включаются файлы, которые модуль автокомпиляции не нашел автоматически, или которые связаны с моделью каким-либо образом, отличным от команды «#include» в описаниях. Для работы со списком используются кнопки:

Кнопка | Действие
--- | ---
| Добавить новый файл (открывается стандартный диалог выбора файла).
| Удалить выбранный в списке файл.

Для файлов, находящихся в стандартных папках RDS, имена этих папок заменяются на символические обозначения. На рис. 358, например, добавленный в список файл «About.h» находится в стандартной папке настроек RDS (обозначение «$INI$»).

На вкладке «описание» окна параметров модели (рис. 359) вводится текст описания модели и информация о ее версии.

Рис. 359. Окно параметров модели – описание и версия

Описание модели – это произвольный многострочный текст, он никак не влияет на работу и обычно используется для ввода каких-либо комментариев. Этот текст также отображается при создании модели по шаблону в нижней части окна выбора шаблона.

Для включения в модель информации о ее версии следует установить флажок «версия модели» и ввести в поля ввода справа от него три числа, которыми в RDS обозначаются версии всех моделей и библиотек. Первое число считается старшим номером версии (допустимый диапазон – 0…127), второе – младшим (0…255), третье – номером сборки (0…32767). Номер версии позволяет пользователю сравнивать разные версии модели друг с другом, чтобы выбрать из них самую последнюю. При сравнении версий сначала сравниваются старшие номера, и модель с большим старшим номером считается более поздней. Если старшие номера одинаковы, сравниваются младшие, и более поздней считается модель с большим младшим номером. Если же и младшие номера одинаковы, сравниваются номера сборки. Например, модель с версией «1.0.0» сделана позднее модели с версией «0.100.1», а модель с версией «1.2.3» сделана позднее модели с версией «1.2.2». Дополнительный флажок «+ время» позволяет включить в модель не только информацию о версии, но и информацию о времени последнего изменения. И номер версии, и время последнего изменения, если эта информация есть в модели, отображаются на вкладке «компиляция» окна информации о загруженной схеме. Следует помнить, что номер версии не добавляется в параметры создаваемого файла DLL, поэтому, с точки зрения Windows, а также сторонних программ создания установочных пакетов, созданные модулем автокомпиляции файлы DLL не имеют версий.

На вкладке, «ошибки» (рис. 360) описывается реакция на ошибки и предупреждения при компиляции.

Рис. 360. Окно параметров модели – обработка ошибок компиляции

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

Флажок «показывать фиксированное сообщение об ошибках» предназначен для сложных моделей блоков, которые программно изменяют свои модели. По умолчанию список ошибок, обнаруженных компилятором, выдается в нижней части окна редактора модели. Тексты сообщений об ошибках при этом формируются самим компилятором. Если модель создается блоком программно, сами сообщения и строки программы, к которым они относятся, вероятнее всего, ничего не скажут пользователю. Чаще всего блоки, программно формирующие свои модели, собирают эти модели из каких-то отдельных фрагментов, введенных пользователем, то есть, фактически, работают специализированной «надстройкой» над модулем автокомпиляции, где пользователь вводит не реакции на системные события, а, например, какие-либо функции, используемые блоком для формирования своей сложной вычислительной программы. Если собранная на основе этих фрагментов модель не компилируется, это указывает на ошибки во введенных пользователем текстах, но исправлять их нужно не в редакторе модели, а в специализированном интерфейсе, который блок предоставляет пользователю для ввода. В таких случаях лучше показать пользователю не сообщение об ошибке, выданное компилятором, а другое, поясняющее, что ошибки возникли в программно сформированной модели и предлагающее пользователю варианты действий по ее исправлению. Для вывода такого сообщения и служит данный флажок, а само сообщение вводится в многострочное поле ввода под ним. Если флажок включен, редактор модели не откроется, а вместо него появится окно с введенным текстом сообщения. Дополнительный флажок «показывать блок с ошибкой в модели» добавляет в это окно кнопку, нажав на которую пользователь сможет увидеть в схеме блок, при компиляции модели которого возникли ошибки.

Флажок «пытаться принудительно создать отсутствующую DLL» также предназначен для программного изменения модели. Если программа модели изменяет сама себя, то после первой же ошибки компиляции она уже не сможет этого делать: DLL модели не смогла скомпилироваться, старая DLL уже отключена, и некому запросить у пользователя исправления или исправить ошибки самостоятельно. Если данный флажок включен и при компиляции возникли ошибки, производится повторная компиляция с добавленным определением константы BCPP55_ERRORRETRYCOMPILE. Текст модели при этом должен программно формироваться таким образом, чтобы при наличии этого определения все «пользовательские» фрагменты, являющиеся потенциальными источниками ошибок компиляции, отключались, и модель гарантированно могла бы скомпилироваться и подключиться к схеме и исправить ошибки – возможно, с запросами к пользователю.

На последней вкладке окна параметров модели, «дополнительно» (рис. 361), собраны параметры, которые не относятся к рассмотренным выше разделам.

Рис. 361. Окно параметров модели – дополнительные параметры

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

- «Разрешено любое использование» – один и тот же файл модели может использоваться в нескольких блоках как в одной, так и в разных схемах. Это самый распространенный вариант использования моделей, он установлен по умолчанию. При копировании блока с такой моделью пользователю выдается запрос, должна ли копия блока использовать тот же самый файл модели, или нужно сделать его копию. При стирании блока из схемы файл его модели всегда остается на диске.
- «Модель используется только этой схемой» – один и тот же файл модели может использоваться несколькими блоками, принадлежащими одной схеме, но не может использоваться в других схемах (обычно файл модели при этом находится в одной папке с файлом схемы). При копировании блока с этой моделью в пределах схемы пользователю выдается запрос на копирование файла модели, при копировании блока в другую схему файл модели копируется без запроса. При удалении последнего в схеме блока, использующего этот файл модели, файл модели стирается.
- «Модель используется единственным блоком этой схемы» – файл модели связан с конкретным блоком схемы (обычно файл модели при этом находится в одной папке с файлом схемы). При копировании этого блока автоматически создается и копия файла модели. При удалении блока файл модели тоже удаляется.
- «Модель используется всеми блоками без запросов» – один и тот же файл модели может использоваться в нескольких блоках как в одной, так и в разных схемах, при этом при копировании блока созданная копия автоматически подключается к тому же файлу модели без запросов пользователю.

Выпадающий список «для неизвестных языков использовать тексты языка» позволяет задать язык интерфейса пользователя, который будет использоваться в том случае, если в настройках RDS будет выбран язык, для которого нет перевода.

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