Формат файлов описания переменных расчетных модулей

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

Исполняемый файл содержит непосредственно исполняемый код, скомпилированный компилятором из исходных текстов, сгенерированных генератором кода SimInTech.

Все файлы приборного ПО, включая исполняемые файлы расчётных модулей, диспетчера расчётных модулей DispExemod, сервера обмена данными GdbServer и файлов описания конфигурации и переменных должны быть размещены в файловой системе прибора в одной директории.

Файл описания внешних переменных содержит таблицу с информацией о типах данных, размерностях и именах переменных, которые расчётный модуль должен получить из общей для всех РМ в загрузке области памяти (рабочей области памяти внешних переменных). Т.е. диспетчер при загрузке РМ прочитывает файлы описания внешних переменных для всех РМ и выделяет единую область памяти под все внешние переменные. При этом переменные для разных РМ , имеющие одинаковое имя, объединяются (т.е. на них выделяется одна и та же область памяти в рабочей памяти). При несовпадении типов – выдаётся диагностическое сообщение в консоль и происходит аварийное прекращение работы диспетчера. После того как диспетчер выделил общую область памяти для всех внешних переменных РМ он сообщает расчётным модулям с каким именно смещением лежат нужные переменные для каждого из модулей, данная информация располагается в общей области памяти с именем /extvars_struct.

Файлы описания внутренних переменных такие же по формату, как и файлы описания внешних переменных. Они необходимы только для того чтобы сервер отладки мог получить по имени нужный адрес для доступа к внутренней переменной конкретного запущенного экземпляра расчётного модуля. Области памяти под внутренние переменные выделяются не диспетчером, а самим РМ в соответствии с типом конкретной переменной и именем алгоритма, указанным при запуске РМ.

Файлы описания внешних и внутренних переменных представляют собой бинарные файлы и состоят из записей типа:

typedefstruct {
unsigned char sizeofname;
char name[64];
unsigned char sizeofdecsription;
chardecsription[128];
unsigned char data_type;
unsigned long dims[3];
unsigned char direction;
unsigned char var_type;
unsigned long index;
unsigned short hash;
} ext_var_info_record;

Здесь представлены следующие элементы:

sizeofname длина имени переменной;
name массив символов, содержащий имя переменной в кодировке ASCII (допустимая длина – не более 64 символа);
sizeofdecsription длина текстового описания переменной;
decsription массив символов, содержащий описание переменной в кодировке ASCII (допустимая длина – не более 128 символа);
data_type

идентификатор типа данных переменной. Допустимые значения:

0 – вещественный;

1 – двоичный;

2 – целый.

dims массив из трех элементов целого типа, показывающий размерности переменной. Например, если значение dims равно {10,0,0}, то переменная является вектором заданного типа с количеством элементов равным 10;
direction

идентификатор направления переменной. Допустимые значения:

0 – вход;

1 – выход;

2 – выход-выход (т.е. сигнал и читается и пишется в модели).

var_type

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

0 – Внешняя, это означает, что данная переменная выделяется в памяти диспетчером и делится данным расчётным модулем с другими модулями. К этому классу переменных относятся входы и выходы модели. Отличается тем что в заголовочном файле для этих переменных используется другая адресация (с присваиваемым смещением). Сохраняется в рестарте (то есть, когда пользователь сохранят состояние исполняемой среды на приборе, значения переменных в данной области памяти записываются в файл на диске с именем соответствующим имени сохраняемого состояния). Располагаются в /extvars_value;

1 – Динамическая – переменные состояния, которые интегрируются в едином массиве при помощи выбранного метода интегрирования. Данные переменные не расшариваются между отдельными расчётными модулями. Для каждой из таких переменных существуют 2 массива – собственно переменная состояния и её производная. Используются только для интеграторов и динамических блоков. Сохраняется в рестарте. Располагаются в области памяти /din_vars_<имя алгоритма указанное при запуске>;

2 – Алгебраическая – переменные состояния, которые содержат значения алгебраических функций и состояний, в данной версии исполняемой среды не используются. Данные переменные не расшариваются между отдельными расчётными модулями. Для каждой из таких переменных существуют 2 массива – собственно переменная состояния и значений алгебраической функции. Используются только для блоков типа Нелинейное уравнение F(y) = y и Нелинейное уравнение F(y) = 0. Сохраняется в рестарте. Располагаются в области памяти /alg_vars _<имя алгоритма указанное при запуске>;

3 – Внутреннее состояние – выделяются для каждого из загруженных РМ отдельно (т.е. не расшариваются). Предназначены для хранения разнотипных данных (переменных состояния, таймеров, триггеров и т.п.), сохраняется в рестарте. Располагаются в области памяти /state_vars _vars_<имя алгоритма указанное при запуске>;

4 – Константа – выделяются для каждого из загруженных РМ отдельно (т.е. не расшариваются). Предназначены для хранения разнотипных данных, которые не меняются в процессе расчёта (но могут быть изменены удалённо пользователем) (постоянных времени, к-тов усиления и т.п.), не сохраняется в рестарте. Располагаются в области памяти /constants _vars_<имя алгоритма указанное при запуске>.

index байтовое смещение переменной в массиве (какой массив определяется согласно var_type). Для внешних переменных байтовое смещение определяется диспетчером при загрузке РМ, и затем передаётся в область памяти /extvars_struct, в файле описания внешних переменных на диске (*.extvars.table) в качестве индекса передаётся номер внешней переменной в массиве указателей внутри расчётного модуля;
hash хэш имени переменной вычисленный по алгоритму CRC16.