exponenta event banner

Введение в инспектора кода Simulink

В этом примере показано, как использовать Inspector™ Simulink ® Code для проверки кода, сгенерированного на основе моделей, и выполнения задач исходного кода на основе DO-178C, вопросов программного обеспечения при сертификации воздушных систем и оборудования. Созданный код можно проверить как программно с помощью команд MATLAB, так и графически с помощью диалогового окна «Инспектор кода Simulink». В этом примере показано, как проверить программный код. В нем показано, как:

  • Подготовка модели для создания кода.

  • Создайте код для иерархии модели с помощью Embedded Coder ®.

  • Независимо проверьте созданный код с помощью инспектора кода Simulink.

  • Намеренно внесите ошибку в сгенерированный код и проверьте наличие неисправности.

Настройка временной папки для созданных файлов

Создайте временную папку во временной папке системы для создания кода и процесса контроля.

currentDir = pwd;
[tempDir, cgDir] = slcidemodir();

Открыть пример модели

Загрузить пример модели slcidemo_roll_orig, сохраните копию модели и переименуйте ее в slcidemo_roll.

load_system('slcidemo_roll_orig')
save_system('slcidemo_roll_orig', 'slcidemo_roll');
open_system('slcidemo_roll');

Это схема верхнего уровня модели. Он представляет собой основной автопилот оси крена с двумя режимами работы: удержание положения крена и удержание курса. Логика режимов для этих режимов является внешней для этой модели. Архитектура модели представляет режим удержания заголовка и базовую функцию ориентации крена в качестве ссылочных моделей. Функция управления ориентацией крена представляет собой PID-контроллер, который использует обратную связь ориентации крена и скорости крена для создания команды элерона. Входным сигналом для контроллера является либо базовый опорный угол крена, либо команда крена для отслеживания курса. Модель включает в себя:

  • Виртуальная подсистема RollAngleReference, который реализует базовый расчет угла крена. Embedded Coder ® встраивает этот расчет непосредственно в основную функцию дляslcidemo_roll.

  • Блок модели HeadingModeссылка на отдельную модель, которая вычисляет команду крена для отслеживания заголовка.

  • Блок модели BasicRollModeссылаются на отдельную модель, которая вычисляет функцию управления ориентацией крена.

Подготовка модели для создания кода и проверки

Simulink Code Inspector поддерживает ограниченный набор семантики моделирования и оптимизации кода. Чтобы проверить созданный код с помощью Simulink Code Inspector, настройте модель перед созданием кода так, чтобы модель соответствовала этому набору ограничений. Можно проверить совместимость модели с инспектором кода, используя его средство проверки совместимости. Проверка совместимости моделей выявляет и сообщает о проблемах совместимости на ранних этапах процесса разработки модели. Это раннее обнаружение может значительно сократить время и усилия для достижения удовлетворительных результатов проверки кода, необходимых для приложений с высокой целостностью.

Подготовка модели slcidemo_roll для генерации кода и проверки установите параметр конфигурации модели AdvancedOptControl к значению -SLCI. Этот параметр ограничивает оптимизацию кода, используемую встроенным кодером, подмножеством, совместимым с инспектором кода.

set_param('slcidemo_roll','AdvancedOptControl','-SLCI');

Создание объекта контроля кода config, используйте slci.Configuration функция. Используйте объект для настройки проверки совместимости и проверки кода для модели.

config = slci.Configuration('slcidemo_roll'); 

Чтобы запустить проверку совместимости, используйте checkCompatibility функция.

result=config.checkCompatibility('DisplayResults','None');
Updating Model Advisor cache...
Model Advisor cache updated. For new customizations, to update the cache, use the Advisor.Manager.refresh_customizations method.

Просмотрите результаты проверок.

for i = 1:length(result)
    fprintf('\nModel ''%s'' passed %d checks with %d issues.',...
        result{i}.system,...
        result{i}.numPass, result{i}.numWarn + result{i}.numFail)
end
Model 'slcidemo_roll' passed 68 checks with 0 issues.

Результаты проверок совместимости также можно просмотреть в окне сводного отчета HTML. Чтобы открыть сводный отчет HTML, используйте следующую команду:

ModelAdvisor.summaryReport(result);

Если модель проходит проверку на совместимость, она готова к созданию кода и проверке. Подробный отчет о проверках совместимости для каждой проверенной модели можно просмотреть, щелкнув ссылки Отчет помощника по модели (Model Advisor Report) в отчете HTML. В подробном отчете описывается результат каждой проверки, и если сообщается о какой-либо несовместимости и необходимо исправить модель, предоставляются рекомендуемые действия.

Создание кода для модели

После того как модель пройдет проверку на совместимость, создайте код из модели с помощью встроенного кодера. Модель slcidemo_roll предварительно настроен для создания кода с помощью встроенного кодера. Если модель не настроена предварительно, задайте параметр конфигурации модели. System target file кому ert.tlc, используя следующую команду:

 set_param('slcidemo_roll','SystemTargetFile','ert.tlc')

Можно создать код неявно как часть проверки кода или выполнить генерацию кода и проверку кода как отдельные шаги. Для определения необходимости создания кода перед проверкой используйте setGenerateCode функция. В этом примере шаг создания кода отделяется от шага проверки кода.

% The input argument is false to specify that the code generation and
% inspection are separate steps
 config.setGenerateCode(false);

Чтобы создать код из модели, используйте slbuild функция.

 slbuild('slcidemo_roll');
### Starting serial model reference code generation build
### Starting build procedure for: slcidemo_attitude
### Successful completion of code generation for: slcidemo_attitude
### Starting build procedure for: slcidemo_heading
### Successful completion of code generation for: slcidemo_heading
### Starting build procedure for: slcidemo_roll
### Successful completion of code generation for: slcidemo_roll

Build Summary

Code generation targets built:

Model              Action          Rebuild Reason                       
========================================================================
slcidemo_attitude  Code generated  slcidemo_attitude.c does not exist.  
slcidemo_heading   Code generated  slcidemo_heading.c does not exist.   

Top model targets built:

Model          Action          Rebuild Reason                                    
=================================================================================
slcidemo_roll  Code generated  Code generation information file does not exist.  

3 of 3 models built (0 models already up to date)
Build duration: 0h 0m 51.565s

Просмотр созданного кода в подробном HTML-отчете.

web(fullfile(cgDir,'slcidemo_roll_ert_rtw','html','slcidemo_roll_codegen_rpt.html'));

Сгенерированный код можно просмотреть в представлении Код (Code) и обеспечить визуальную двунаправленную прослеживаемость между исходной моделью и сгенерированным кодом. Чтобы просмотреть созданный код в представлении «Код», откройте в модели приложение Embedded Coder.

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

set_param('slcidemo_roll','UpdateModelReferenceTargets','AssumeUpToDate');
save_system('slcidemo_roll')

Проверка созданного кода

После создания кода из модели с помощью встроенного кодера можно проверить код с помощью Simulink Code Inspector для соответствия целям исходного кода в стандарте DO-178C. По умолчанию инспектор кода Simulink предполагает, что код предварительно создается в папках по умолчанию, в которые Embedded Coder записывает свои файлы. Если требуется указать альтернативное местоположение, используйте функции. setCodePlacement и setCodeFolder. В этом примере используйте функцию setReportFolder чтобы поместить отчеты проверки кода в локальную папку отчетов и указать slcidemo_roll в качестве модели верхнего уровня.

% Set top-model
config.setTopModel(true);
% Set code inspection report folder
config.setReportFolder(fullfile('.','report'));
% Inspect the code generated from the model
result = config.inspect('DisplayResults','None');
fprintf('Model %s status: %s\n',result.ModelName, result.Status);
Model slcidemo_roll status: PASSED

Инспектор кода проверяет созданный код, чтобы проверить структурную эквивалентность и двунаправленную прослеживаемость между исходной моделью и сгенерированным кодом. После проверки создается подробный сводный отчет HTML. Дополнительные сведения об отчетах по проверке кода см. в разделе Отчеты по проверке кода.

Просмотр HTML-отчета проверки кода.

web(fullfile('.', 'report','slcidemo_roll_report.html'));

Если общим результатом проверки модели является «Пройдено», это означает, что проверка кода завершена. Если для модели возвращено состояние «Предупреждение» (Warning) или «Сбой» (Failed), исправьте или повторите проверку модели. В этом случае общий результат проверки проходит.

Ввести преднамеренную ошибку в код

Simulink Code Inspection сравнивает созданный код с исходной моделью для проверки структурной эквивалентности. Он создает отчет о сбое проверки, если исходная модель и сгенерированный код не являются структурно эквивалентными.

Чтобы создать отчет о сбое проверки, вставьте преднамеренную ошибку в созданный код. Изменение логического блока оператора внутри RollAngleReference подсистема в сгенерированном коде от операции OR () до операции AND (& &), используя пример функции утилитыslcidemo_modifycode.

% Copy the example utitity function slcidemo_modifycode to temporary folder
cd(currentDir); 
copyfile( 'slcidemo_modifycode.m' ,tempDir);
cd(tempDir);
% Modify the generated code
cfile = fullfile(cgDir,'slcidemo_roll_ert_rtw','slcidemo_roll.c');
slcidemo_modifycode(cfile,'<S1>/Or','||','&&');
Before:     if ((rtU_Phi >= 6.0F) || (rtU_Phi <= -6.0F)) {
After :     if ((rtU_Phi >= 6.0F) && (rtU_Phi <= -6.0F)) {

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

hilite_system('slcidemo_roll/RollAngleReference/Or');

Повторно проверьте измененный сгенерированный код.

result = config.inspect('DisplayResults','None');
fprintf('Model %s status: %s\n',result.ModelName, result.Status);
Model slcidemo_roll status: FAILED

Инспектору кода Simulink не удается проверить измененный созданный код, так как он больше не соответствует модели. См. подробный отчет о проверке.

web(fullfile('.','report','slcidemo_roll_report.html'));

Очистка примерных папок и файлов

Закройте модели и удалите временные папки и файлы.

close_system('slcidemo_roll_orig',0)
close_system('slcidemo_roll',0)
cd(currentDir);
rmdir(tempDir,'s');