Генерация кода Си на основе математических вычислений с фиксированной точкой

В качестве примера используется регулятор уровня, созданный на основе библиотеки нечёткой логики в SimInTech. Данный пример находится в папке ..\SimInTech\Demo\Automatic\Нечёткая Логика\Фиксированная точка\

Схема регулятора для генерации кода находится в файле fl_controller_fp.prt

Схема для тестирования находится в файле fuzzy_fix_point_dll_test.prt

На рисунке (Рисунок 1) представлена схема регулятора, подготовленная для генерации кода:

Рисунок 1. Регулятор уровня на основе нечеткой логики

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

%codetemplates%FixPoint_16_16_MinGW_DLL\

Данный шаблон обеспечивает создание кода с фиксированной точкой и его компиляцию в dll для тестирования расчета. На рисунке (Рисунок 2) представлен вид окна настройки генерации кода.

Рисунок 2. Настройка генерации кода расчета с фиксированной точкой

Для сравнения работы кода с вычислениями с фиксированной точкой и стандартного способа с плавающей точкой создадим код из схемы, представленной на рисунке (Рисунок 1). Для задания имени файлов для генерации кода необходимо задать имя алгоритма. Выберите схему из которой мы будем генерировать код, сделайте ее окно активным, после этого выберите в главном окне пункт меню «Расчет» подпункт «Параметры расчета». Можно так же нажать на кнопку , непосредственно в схемном окне. В появившемся диалоговом окне установите имя алгоритма fl_contrоller_fp,как показано на рисунке (Рисунок 3):

Рисунок 3. Настройка имени файлов для генерации кода

Нажмите кнопку «Ок» для сохранения параметров расчета и генерации кода из схемы.

В главном окне программы выберите пункт «Инструменты» подпункт «Сгенерировать программу». Будет запущен модуль генерации кода, в случае когда модуль не зарегистрирован, будет выдано предупреждение.

Для схем содержащих более чем 200 блоков, генерация кода производиться только при наличии ключа регистрации программы.

Схема используемая в данном примере содержит в себе 58 блоков, поэтому несмотря на предупреждения происходит генерация кода. В нижней часть схемного окна, выводятся сообщения о работе программы, как на рисунке (Рисунок 4).

Рисунок 4. Сообщения генератора кода для схемы

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

и файл с динамической библиотекой:

Для сравнения расчетов с использованием фиксированной точки и плавающей точкой создадим код Си и динамическую библиотеку с использованием стандартного кодогенератора. Для этого в настройках кодогенератора (в главном меню программы пункт «Кодогенератор» в диалоговом окне выбрать закладку «Настройки») для директории шаблона кода выбрать в выпадающем меню строку:
%codetemplates%MinGW_DLL\
см. Рисунок 5

Рисунок 5. Настройки генерации стандартного кода с плавающей точкой

Для получения второго варианта dll изменим наименования алгоритма в свойствах «Расчетная схема» на fl_controller, см. Рисунок 6

Рисунок 6. Настройка имени файлов с тексами кода и dll

В главном окне программы выберите пункт «Инструменты» подпункт «Сгенерировать программу». Будет запущен модуль генерации кода (в случае если модуль не зарегистрирован, будет выдано предупреждение).

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

и файл с динамической библиотекой:

Для проверки работоспособности созданного кода расчета с фиксированной точкой и сравнения его стандартными средствами воспользуемся проектом fuzzy_fix_point_dll_test.prt, он находится в той же директории: ..\SimInTech\Demo\Automatic\Нечёткая Логика\Фиксированная точка\.

Расчетная схема верхнего уровня представлена на рисунке (Рисунок 7). На данной схеме в субмодели «РЕГУЛЯТОР НА БАЗЕ НЕЧЕТКОЙ ЛОГИКИ», находится расчетная схема регулятор аналогичная приведенной на рисунке (Рисунок 1) – исходной схемы для формирования кода и компиляции DLL.

В блоке DLL настроен вызов в расчетной динамической библиотеки созданной из исходной расчетной схемы. Свойства блока DLL приведены на рисунке (Рисунок 8). Для тестирования можно менять имя вызываемой библиотеки (fl_controller.dll или fl_controller_fp.dll) для сравнения результатов расчета.

На выход в блок DLL поступают значения, что и в субмодель регулятора выход блока сравнивается с выходом модели регулятора и разность выводиться на график.

Рисунок 7. Схема модели для проверки работы кода вычисления с фиксированной точкой

Рисунок 8. Свойства блока для загрузки библиотеки созданной кодогенератором

При установления в качестве библиотеки варианта скомпилированного стандартным способом (fl_controller.dll), в процессе моделирования отличия в результатах работы dll и схемы не обнаружено. На графиках 0. В случае если в качестве dll, указана библиотека созданная на базе вычислений с фиксированной точкой (fl_controller_fp.dll), на графике появляться отклонения вызванные потерей точности расчёта. (см. Рисунок 9)

Рисунок 9. Отклонение расчета с фиксированной точкой