В этом примере показан базовый рабочий процесс и ключевые API для генерации кода C из алгоритма управления двигателем и для проверки его скомпилированного поведения и времени выполнения. Вы будете использовать моделирование Processor-in-the-loop (PIL), чтобы получить уверенность в том, что код C будет работать так, как ожидалось, когда вы интегрируете его со встроенным программным обеспечением, которое взаимодействует с оборудованием двигателя. Хотя в этом рабочем процессе используется приложение управления двигателем для определенного процессора, этот рабочий процесс можно применить практически к любому приложению или процессору.

Мы используем алгоритм управления, ориентированный на поле, для синхронной машины с постоянным магнитом, чтобы показать этот рабочий процесс. Этот метод управления является обычным в системах моторного привода для гибридных электромобилей, производственных машин и промышленной автоматизации.
В этом примере создайте и проверьте код C из модели алгоритма управления, который можно интегрировать с дополнительным встроенным программным обеспечением, необходимым для сопряжения с оборудованием двигателя.
Среда моделирования используется для моделирования и проверки работы системы управления двигателем с замкнутым контуром. Как только поведение системы управления окажется в пределах спецификации, вы создадите код C из модели контроллера. После проверки кода вы оцените его функциональное поведение и время выполнения с помощью тестирования процессора в цикле (PIL).

Для упрощения тестирования PIL необходимо выбрать тестовые сигналы для выполнения модели контроллера и установки опорных выходов. Рассмотрим пример реализации PIL для процессора Texas Instruments™ F28335, который взаимодействует с Simulink ® на хост-компьютере по последовательному соединению. Этот пример можно использовать в качестве отправной точки для создания реализации PIL для собственного процессора. Модель контроллера будет запущена в режиме PIL для измерения времени выполнения и проверки выполнения кода, выполняемого на встроенном процессоре, по ссылочным выводам моделирования.
При окончательной реализации на встроенном процессоре генерируемый код контроллера C будет интегрирован с дополнительным встроенным программным обеспечением, таким как периферийные устройства и прерывания, необходимые для взаимодействия с оборудованием двигателя.
Примечания
Simscape™ Electrical требуется для моделирования системы в разделе «Проверка поведения с помощью моделирования системы». Это не требуется для других задач.
Внедрение Texas Instruments™ F28335 PIL является эталонным подходом, который можно применить практически к любому процессору. Тем не менее, если вы хотите использовать эту реализацию напрямую, вам понадобятся дополнительные файлы поддержки, компиляторы и инструменты из Texas Instruments™. Для получения дополнительной информации см. раздел «Create PIL Implementation and Register with Simulink ®» в этом примере. Эта эталонная реализация PIL не требует функции Texas Instrument C2000™ Embedded Target в Embedded Coder ®, но C2000™ пользователям рекомендуется устанавливать пакет поддержки Texas Instruments C2000 с помощью Add-On Explorer.
В этом разделе выполняется проверка контроллера при моделировании системы с замкнутым контуром.
Стенд тестирования модели системы состоит из тестовых входов, встроенного процессора, электроники питания и аппаратных средств двигателей, а также визуализаций. Модель системы можно использовать для выполнения упражнений контроллера и изучения его ожидаемого поведения. Для выполнения модели и печати регистрируемых сигналов можно использовать следующие команды.
open_system('rtwdemo_pmsmfoc_system') out_system = sim('rtwdemo_pmsmfoc_system') rtwdemo_pmsmfoc_plotsignals(out_system.logsout)
out_system =
Simulink.SimulationOutput:
logsout: [1x1 Simulink.SimulationData.Dataset]
SimulationMetadata: [1x1 Simulink.SimulationMetadata]
ErrorMessage: [0x0 char]


Графики показывают, что двигатель неподвижен до motor_on сигнал истинен. Затем двигатель вращается в разомкнутом контуре до тех пор, пока не будет обнаружено известное положение, которое указывается индексным импульсом кодера. Затем контроллер переходит к работе по замкнутому контуру, и двигатель достигает скорости установившегося состояния.
В этом разделе рассматривается архитектура модели, включая порядок указания данных, порядок разделения контроллера с тестового стенда и порядок планирования контроллера. Эта архитектура облегчает моделирование системы, генерацию алгоритмического кода и тестирование PIL.
Файл определения данных создает данные MATLAB ®, необходимые для моделирования и генерации кода. Этот файл данных автоматически запускается в пределах PreLoadFcn обратный вызов модели испытательного стенда системы.
edit('rtwdemo_pmsmfoc_data.m')
В модели стенда для тестирования системы встроенный процессор моделируется как комбинация периферийных устройств и программного обеспечения контроллера.
open_system('rtwdemo_pmsmfoc_system/Embedded Processor')

Программное обеспечение контроллера указывается в отдельной модели. В рамках этой модели подсистема Mode_Scheduler использует Stateflow ® для планирования различных режимов работы алгоритма Motor_Control.
open_system('rtwdemo_pmsmfoc')

В подсистеме Motor_Control сигналы датчиков преобразуются в технические блоки и передаются в алгоритм контроллера активной зоны. Алгоритм контроллера вычисляет напряжения. Затем напряжения преобразуются в сигнал возбуждения.
open_system('rtwdemo_pmsmfoc/Motor_Control')

Основным законом управления является полевой контроллер. Контроллер имеет низкоскоростной внешний контур, который управляет скоростью, и более скоростной внутренний контур, который управляет током.
open_system('rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller')

Внешний контур контроллера скорости выполняется как кратный времени цикла управления током. Можно просмотреть переменные MATLAB ®, которые определяют следующие примеры времени:
fprintf('High rate sample time = %f seconds\n', ctrlConst.TsHi) fprintf('Low rate sample time = %f seconds\n', ctrlConst.TsLo)
High rate sample time = 0.000040 seconds Low rate sample time = 0.005000 seconds
Обратите внимание, что наибольшая частота в алгоритме контроллера составляет 25 кГц.
fprintf('High rate frequency = %5.0f Hz\n', 1/ctrlConst.TsHi)
High rate frequency = 25000 Hz
В этом разделе рассматривается создание и визуальный контроль функции кода C для контроллера.
Для упрощения интеграции модель контроллера конфигурируется в режиме однозадачности, так что генерируемый код может быть вызван с помощью одного вызова функции. Эта функция обрабатывает более низкие и более высокие скорости. Сгенерированная функция контроллера должна выполняться во время высокоскоростной выборки.
Прототип функции указывается в параметрах конфигурации модели, а входной и выходной порты передаются в качестве аргументов. Можно просмотреть спецификацию функции для алгоритма контроллера.
mdlFcn = RTW.getFunctionSpecification('rtwdemo_pmsmfoc'); disp(mdlFcn.getPreview('init')) disp(mdlFcn.getPreview('step'))
Controller_Init ( ) error = Controller ( motor_on, command_type, current_request, * sensors, * pwm_compare )
Используя глобальную структуру в сгенерированном коде, можно получить доступ к ориентированному на поле контроллеру пропорционального и интегрального выигрышей. Эта глобальная структура указана в файле определения данных.
disp(ctrlParams.Value) disp(ctrlParams.CoderInfo)
Current_P: 10
Current_I: 10000
Velocity_P: 0.0050
Velocity_I: 0.0150
Position_P: 0.1000
Position_I: 0.6000
StartupAcceleration: 1
StartupCurrent: 0.2000
RampToStopVelocity: 20
AdcZeroOffsetDriverUnits: 2.2523e+03
AdcDriverUnitsToAmps: 0.0049
EncoderToMechanicalZeroOffsetRads: 0
PmsmPolePairs: 4
Simulink.CoderInfo
StorageClass: 'ExportedGlobal'
Identifier: ''
Alignment: -1
Код C генерируется из модели следующим образом.
slbuild('rtwdemo_pmsmfoc')
### Starting build procedure for: rtwdemo_pmsmfoc ### Successful completion of build procedure for: rtwdemo_pmsmfoc Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ rtwdemo_pmsmfoc Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 59.217s
Используйте созданный отчет для проверки созданного файла кода C и проверки того, что были созданы правильные функции шага и инициализации. Также убедитесь, что структура параметров создана как глобальная переменная.
В этом разделе устанавливаются контрольные входные и ссылочные выходные данные для проверки поведения и времени выполнения профиля во время тестирования PIL. Вы создадите локальную копию модели контроллера, а затем загрузите набор тестовых входных сигналов, которые используют различные режимы в контроллере. Затем необходимо сконфигурировать модель контроллера для подключения этих зарегистрированных сигналов к входным портам, выполнить модель контроллера и зарегистрировать выходной сигнал порта в рабочей области.
Параметры конфигурации модели контроллера, используемой для установления эталонного поведения и тестовой среды, будут изменены, как описано ниже. Блоки и параметры, используемые для задания конструкции модели контроллера и генерации производственного кода, не изменятся. Однако во избежание изменения любой части установленной модели контроллера сохраните модель и измените ее имя на rtwdemo_pmsmfoc_local.slx.
save_system('rtwdemo_pmsmfoc','rtwdemo_pmsmfoc_local.slx') close_system('rtwdemo_pmsmfoc_system',0); close_system('rtwdemo_pmsmfoc',0);
omCallMethod failed on slmsgviewer.renameTab

Для профилирования времени выполнения выберите набор тестовых входов, которые будут выполнять интересующие пути в контроллере. Один из способов получения этих тестовых входных и ссылочных выходных данных состоит в регистрации их из модели моделирования системы.
in.motor_on = out_system.logsout.getElement('motor_on').Values; in.command_type = out_system.logsout.getElement('command_type').Values; in.command_value = out_system.logsout.getElement('command_value').Values; in.sensors = out_system.logsout.getElement('sensors').Values; display(in)
in =
struct with fields:
motor_on: [1×1 timeseries]
command_type: [1×1 timeseries]
command_value: [1×1 timeseries]
sensors: [1×1 struct]
Эти сигналы теперь могут быть подключены к входным портам и импортированы в модель контроллера, так что они могут выполняться непосредственно и независимо от модели системы. Преимущество этого подхода заключается в том, что модель контроллера может быть протестирована и проверена как автономный компонент, что облегчает повторное использование и интеграцию с другими системными моделями или испытательными стендами с замкнутым контуром. Для разработки или подготовки модели контроллера к тестированию измените его параметры конфигурации для подключения входных сигналов и сигналов регистрации в рабочей области MATLAB ®. Эти изменения можно внести графически в диалоговом окне «Параметры конфигурации» модели или программно, как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'LoadExternalInput', 'on',... 'ExternalInput', 'in.motor_on, in.command_type, in.command_value, in.sensors',... 'StopTime','0.06',... 'ZeroInternalMemoryAtStartup','on',... 'SimulationMode', 'normal') save_system('rtwdemo_pmsmfoc_local.slx')
Теперь можно выполнить модель контроллера и построить график сигнала, связанного с выходным портом сравнения PWM.
out = sim('rtwdemo_pmsmfoc_local') controller_mode = out.logsout.getElement('controller_mode').Values; pwm_compare_ref = out.logsout.getElement('pwm_compare').Values; rtwdemo_pmsmfoc_plotpwmcompare(controller_mode, pwm_compare_ref)
out =
Simulink.SimulationOutput:
logsout: [1x1 Simulink.SimulationData.Dataset]
SimulationMetadata: [1x1 Simulink.SimulationMetadata]
ErrorMessage: [0x0 char]

Зарегистрированные выходные данные будут использоваться в качестве эталонного поведения для тестирования PIL.
Обратите внимание, что график аннотируется информацией о режиме контроллера на каждом шаге времени. Эта информация о режиме будет полезна при интерпретации информации о профилировании выполнения.
В этом разделе рассматривается и используется пример реализации PIL. Для начала ознакомьтесь с необходимой справочной документацией Embedded Coder ®. Затем вы скопируете пример реализации PIL в свой локальный каталог и зарегистрируете его с помощью Simulink ®. Вы рассмотрим подход, используемый для разработки внедрения PIL, и можете изучить связанные файлы, чтобы получить дополнительную информацию. При использовании платы Spectrum Digital Inc. eZdsp F28335 с Code Composer v4 и последовательным соединением можно настроить эту реализацию PIL для непосредственной работы с моделью контроллера. При использовании другого процессора эту реализацию PIL можно использовать в качестве отправной точки для создания собственной реализации.
Основы создания пользовательской реализации PIL описаны в разделе Создание конфигурации целевого подключения PIL для Simulink. Необходимо ознакомиться с основной концепцией использования API rtiostream для упрощения обмена данными между Simulink ® (сторона хоста) и встроенным процессором (сторона назначения) во время тестирования PIL. Обратите внимание, что Embedded Coder ® предоставляет драйверы на стороне хоста для реализации TCP/IP по умолчанию (для всех платформ, поддерживаемых Simulink ®), а также только для Windows ®. Создание созданного кода выполняется с помощью make-файла, как описано в разделе Настройка Makefiles шаблонов. Для создания реализации PIL необходимо выполнить несколько задач во встроенной среде, включая запись драйвера связи на целевой стороне, запись make-файла для создания сгенерированного кода и автоматизацию загрузки и выполнения встроенного исполняемого файла.

С использованием вышеуказанного подхода была создана реализация PIL для F28335 платы Spectrum Digital Inc. eZdsp. Ниже приведена сводка целевых компонентов API подключения, используемых в этой реализации.
Связь на стороне хоста - драйвер подключения на стороне хоста настроен на использование последовательной связи.
Связь на целевой стороне - связь на целевой стороне достигается с помощью рукописной последовательной реализации функций rtiostream, а также функций доступа к таймеру.
Процесс построения - для построения исполняемого приложения используется подход на основе makefile.
Средство запуска - загрузка и запуск исполняемого файла выполняется с помощью утилиты Debug Server Scripting (DSS) программы Code Composer Studio™ v4 (CCSv4).
Реализация PIL была итеративно разработана в три этапа. Ниже приведено описание этих этапов и задач, выполняемых на этих этапах. При разработке собственной реализации PIL может оказаться полезным применять аналогичный подход.
Этап 1: Создание приложения для последовательной связи с CCSv4
Установите CCSv4 и убедитесь, что он может подключаться к плате F28335 eZdsp.
Запишите встроенное приложение, которое отправляет и получает последовательные данные.
Проверьте последовательную связь между хост-компьютером и встроенным приложением.
Определите команды и параметры компилятора, компоновщика и архиватора для создания приложения с помощью make-файла.
Загрузите и запустите приложение из командной строки Windows ® с помощью утилиты DSS.
Этап 2: Внедрение и тестирование встроенного последовательного rtiostream и автоматизация запуска с MATLAB ®
Расширение последовательного приложения для реализации функций rtiostream API для эхирования данных. Запишите rtIOStreamOpen для выполнения общей инициализации платы, включая конфигурирование последовательного порта.
Проверьте отправку и получение последовательных данных встроенным процессором от MATLAB ® с помощью функции rtiostream_wrapper.
Загрузите и запустите приложение из MATLAB ® с помощью системной команды для вызова утилиты DSS.
Этап 3: Реализация и тестирование конфигурации подключения с помощью Simulink ®
Создайте класс конфигурации подключения для настройки последовательного соединения на стороне хоста, укажите, какие файлы кода целевой стороны из приложения rtiostream должны быть включены в процесс построения, укажите способ доступа к таймеру, который будет использоваться для сбора данных профилирования, и интегрируйте вызов утилиты DSS для запуска встроенного приложения.
Создание make-файла спецификации инструмента (target_tools.mk), который определяет команды и параметры компилятора, компоновщика и архиватора. Этот makefile включается в файл make шаблона (target_tools.mk).
Создание make-файла шаблона (ec_target.tmf), которая включает в себя target_tools.mk.
Определите параметры, которые могут зависеть от установки, и сохраните их как настройки MATLAB ®.
Создание файла настройки Simulink ®, указывающего, когда реализация PIL действительна
Файлы, связанные с этой реализацией PIL, включены в Embedded Coder ®, но не находятся в пути MATLAB ®. Чтобы просмотреть эти файлы, их можно скопировать в локальный каталог. Эту реализацию PIL можно зарегистрировать, добавив этот каталог к пути MATLAB ® и обновив настройки Simulink ®.
%copyfile(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'),'examplePilF28335','f') addpath(genpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'))) sl_refresh_customizations
Параметры MATLAB ® используются для указания информации о тракте и номера последовательного COM-порта хоста. При непосредственном использовании этой реализации PIL необходимо указать эти настройки в соответствии с конфигурацией.
Обратите внимание, что TI_F28xxx_SysSWDir предпочтение указывает на справочник, предоставленный Техасом Instruments™ в их Прикладном программном обеспечении Экспериментатора C2000™ Кита (sprc675.zip). Эти файлы не включены в Embedded Coder ®.
setpref('examplePilF28335','examplePilF28335Dir', fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335')); setpref('examplePilF28335','CCSRootDir', 'C:\Program Files\Texas Instruments\ccsv4'); setpref('examplePilF28335','TI_F28xxx_SysSWDir', 'C:\Program Files\Texas Instruments\TI_F28xxx_SysSW'); setpref('examplePilF28335','targetConfigFile', fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','f28335_ezdsp.ccxml')); setpref('examplePilF28335','baudRate', 115200); setpref('examplePilF28335','cpuClockRateMHz', 150); setpref('examplePilF28335','boardConfigPLL', 10); setpref('examplePilF28335','COMPort', 'COM4');
Реализация PIL теперь готова к использованию.
В этом разделе описывается конфигурирование модели контроллера для использования реализации PIL. Необходимо просмотреть файл настройки, используемый для регистрации реализации PIL, задать параметры конфигурации модели для использования реализации PIL, а также включить выходы контроллера регистрации и данные профилирования выполнения.
При запуске моделирования в режиме PIL Simulink ® проверяет допустимость любой из зарегистрированных реализаций PIL. Файл настройки определяет, какие параметры конфигурации соответствуют допустимой реализации PIL. Файл адаптации для этой реализации можно просмотреть, выполнив следующую команду.
edit(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','sl_customization.m'));
Обратите внимание, что в этом файле задаются параметры для аппаратного устройства и файла шаблона, которые необходимы для использования данной реализации PIL. Можно изменить параметры конфигурации в модели контроллера в соответствии с этими настройками. Эти изменения можно внести графически в диалоговом окне «Параметры конфигурации» модели или программно, как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'ProdHWDeviceType', 'Texas Instruments->C2000',... 'TemplateMakefile', 'ec_target.tmf',... 'GenCodeOnly', 'off',... 'SimulationMode', 'processor-in-the-loop (pil)')
Можно указать сбор информации о профилировании выполнения во время тестирования PIL путем регистрации выходных значений моделирования в качестве переменной. pilOut и регистрируют информацию профилирования выполнения как переменную executionProfile. Эти изменения можно внести графически в диалоговом окне «Параметры конфигурации» модели или программно, как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'CodeExecutionProfiling', 'on',... 'CodeExecutionProfileVariable','executionProfile',... 'CodeProfilingSaveOptions','AllData'); save_system('rtwdemo_pmsmfoc_local.slx')
Модель контроллера готова к работе в режиме PIL.
В этом разделе мы запустим модель контроллера в режиме PIL и изучим результаты профилирования поведения и выполнения. Вы убедитесь, что поведение скомпилированного кода контроллера соответствует поведению эталонного моделирования, а затем убедитесь, что выполнение кода соответствует требованиям синхронизации.
Можно запустить модель и распечатать результаты моделирования PIL. При первом запуске модели Embedded Coder ® генерирует код для алгоритма, связывает код алгоритма с кодом последовательного коммуникационного интерфейса, создает встроенное приложение, загружает приложение на плату и начинает моделирование на месте установки. Следует отметить, что во время последующего моделирования PIL код регенерируется только при изменении модели. Из-за служебных данных, связанных с последовательным интерфейсом связи, моделирование PIL может выполняться медленнее, чем модель в обычном режиме.
Команды MATLAB ®, приведенные ниже, намеренно комментируются, поскольку они требуют подключения к аппаратному обеспечению и использования встроенных средств разработки, описанных ранее. Если установлено аппаратное подключение и встроенные средства разработки, раскомментируйте и выполните эти строки для запуска модели, распечатайте результаты и убедитесь, что поведение численно эквивалентно моделированию, выполняемому в обычном режиме. В противном случае продолжите просмотр этого раздела, чтобы узнать о параметрах анализа выполнения PIL.
% UNCOMMENT THE BELOW LINES TO RUN THE SIMULATION AND PLOT THE RESULTS % if exist('slprj','dir'), rmdir('slprj','s'); end % out = sim('rtwdemo_pmsmfoc_local') % pwm_compare_pil = out.logsout.getElement('pwm_compare').Values; % rtwdemo_pmsmfoc_plotpwmcompare_pil(controller_mode, pwm_compare_pil, executionProfile)

Верхний график является выходом контроллера, PWM Compare. Следует отметить, что выходы в режиме PIL выглядят так же, как и выходы моделирования в обычном режиме, показанном в разделе «Установление эталонного поведения для модели контроллера». Выходные данные моделирования в нормальном режиме можно вычесть из выходных данных моделирования в режиме PIL, чтобы убедиться, что они численно эквивалентны:
% UNCOMMENT THE BELOW LINE TO VERIFY NUMERICAL EQUIVALENCE OF THE OUTPUTS % pilErrorWithRespectToReference = sum(abs(pwm_compare_pil.Data - pwm_compare_pil.Data))
pilErrorWithRespectToReference =
0 0 0
Нижний график представляет собой время, затраченное на выполнение модели контроллера на каждом этапе моделирования. Состояние «Stand By» требует наименьшего времени. Небольшие периодические всплески времени выполнения возникают, поскольку контроллер является многоскоростным и однозадачным. Периодические пики соответствуют времени, необходимому для выполнения кода базовой скорости и кода скорости 5 миллисекунд в одной задаче.
Поскольку контроллер должен выполняться на встроенном процессоре с частотой 25 кГц, алгоритм должен завершить его выполнение в течение 40 микросекунд (за вычетом дополнительных требований к запасу со стороны другого кода, который также может выполняться на конечном приложении). Результаты профилирования показывают, что алгоритм будет выполняться в течение времени, выделенного для этой конфигурации встроенной среды.
Сгенерированный код теперь верифицируется для получения численно эквивалентных результатов и соответствует требованиям к времени выполнения для этого тестового случая.
close_system('rtwdemo_pmsmfoc_local',0); close_system('power_utile',0);
Настройки MATLAB ®, используемые в этой реализации PIL, являются постоянными между сеансами MATLAB ®. Чтобы удалить эти настройки, выполните следующие команды.
rmpref('examplePilF28335');
rmexamplePilF28335hooks();
В этом примере показано моделирование системного уровня и генерация алгоритмического кода с использованием ориентированного на поле алгоритма управления для синхронной машины с постоянным магнитом для изучения функционального поведения алгоритма контроллера. Он также показал общий подход к целевой интеграции, функциональному тестированию и профилированию выполнения для любого встроенного процессора. Как только алгоритм был поведенчески корректным, из модели контроллера был сгенерирован код, протестирован на целевом процессоре и профилирован. Теперь код алгоритма проверен и может быть интегрирован со встроенным программным обеспечением, которое взаимодействует с оборудованием двигателя для дальнейшего тестирования.