Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство NL5.pdf
Скачиваний:
86
Добавлен:
15.03.2016
Размер:
6.44 Mб
Скачать

NL5 circuit simulator

Руководство Пользователя

Работа с моделью DLL

Функционирование компонента Code с моделью DLL описывается программой, написанной на стандартном языке C, скомпилированной любым доступным компилятором, и помещенной в DLL файл (Dynamic-linked library). Функции DLL будут вызываться во время симуляции переходного процесса. Программа, помещенная в DLL, будет выполняться значительно быстрее, чем написанная на языке C в модели C, однако любое изменение программы потребует создания новой DLL.

Выполнение программы. Пример выполнения программы из DLL приведен на следующей диаграмме:

Напряжение на входе компонента (―in‖) измеряется вольтметром, и его величина присваивается соответствующему элементу массива data типа double. Выполняется функция DLL main с указателем на этот массив в качестве параметра. При этом вычисляется новое значение выхода компонента ―out‖, которое помещается в соответственный элемент массива data. И, наконец, напряжение, равное по величине этому значению, выставляется на заземленный источник напряжения, подключенный к выходу компонента.

Входы и выходы. Как видно из диаграммы, вход являются вольтметром с бесконечным входным сопротивленим, а выход являются заземленным источником напряжения с нулевым выходным сопротивлением. Массив double data[] используется для передачи входных/выходных величин в/из функции DLL. Размер массива равен <число входов> + <число выходов>. При вызове функции DLL первые < число входов > элементов массива заполнены входными величинами, в том же порядке, как они показаны на изображении элемента (левая сторона, сверху-вниз). Выходные величины, вычисленные функцией DLL, помещаются в последующие <число выходов> элементов массива, в том же порядке, как они показаны на изображении элемента (правая сторона, сверху-вниз). Например, для компонента с тремя входами и двумя выходами следующий код присвоит первому выходу минимальное значение на входах, и второму выходу – максимальное значение на входах:

data[3] = min( data[0], min(data[1],data[2]) ); data[4] = max( data[0], max(data[1],data[2]) );

Переменные компонента. Для отладки кода внутренние переменные DLL кода могут быть доступны и выведены на график без добавления специальных выводов компонента. Чтобы это сделать, добавьте имена переменных в окне Var диалогового окна Edit Component (см. главу

Редактирование конфигурируемого компонента, X - Code). Размер массива data[] должен быть равен <number of inputs> + <number of outputs> + <number of variables>. В коде DLL присвойте

136

NL5 circuit simulator

Руководство Пользователя

необходимые значения элементам массива dat, следующим за значениями выходов. Например, если добавить переменную counter компоненту из предыдущего примера, то следующи код возвратит значение внутренней переменной DLL counter в NL5:

data[5] = counter;

Чтобы отобразить переменную counter на графике, добавьте кривую типа function, и введите имя переменной (или выражение с этой переменной) в следующем формате:

component_name.counter

Функции DLL. Функции DLL должны быть определены следующим образом:

extern "C" __declspec (dllexport) int NAME(double t, double* data);

где:

NAME – произвольное имя функции, например main t – текущее время переходного процесса

data – указатель на массив с входными/выходными данными

Функция возвращает ноль, если нет ошибок, или определенное пользователем ненулевое целое число – код ошибки. Код ошибки будет показан в сообщении об ошибке.

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

extern "C" __declspec (dllexport) int sum(double t, double* x)

{

double y=0;

for( int i=0; i<8; ++i ) { y += x[i];

}

x[8] = y; return 0;

}

Функция инициализации выполняется один раз в начале симуляции при t=0. Эта функция не является обязательной и может быть опущена (оставьте пустым параметр ―Init‖).

Функция инициализации используется для присвоения начальных значений выходам (выходным переменным), путем установки нужных значений соответствующим элементам массива data[], а также описания и инициализации глобальных переменных DLL и массивов. Глобальные переменные могут быть использованы для хранения глобальных параметров, вычисляемых только один раз в начале симуляции, и затем используемых в основной функции. Также глобальные переменные могут хранить величины, вычисляемые на одном шаге симуляции, и затем используемые на следующем шаге. Следует иметь в виду, что если несколько компонентов используют одну DLL, то в память программы будет загружена только одна копия DLL, так что все компоненты будут использовать одни и те же глобальные переменные.

137

NL5 circuit simulator

Руководство Пользователя

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

Создание DLL. Программа может быть скомпилирована и сохранена в виде DLL помощью любого доступного средства разработки C/C++. В настоящее время были протестированы

Borland C++ Builder и Microsoft Visual C++. Примеры проектов для Borland C++ Builder 6

находятся в директории примеров Examples/Components/X folder полного загрузочного пакета

NL5.

138