Введение в Simulink Code Inspector

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

  • Подготовьте модель к генерации кода.

  • Сгенерируйте код для иерархии модели при помощи Embedded Coder®.

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

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

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

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

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');

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

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

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

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

Подготовьте модель к генерации кода и контролю

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

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

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 в отчете HTML. В подробном отчете результат каждой проверки описан, и если о каких-либо несовместимостях сообщают, и необходимо зафиксировать модель, рекомендуемый действия обеспечиваются.

Сгенерируйте код для модели

После того, как ваша модель передает проверки совместимости, сгенерируйте код из модели при помощи Embedded Coder. Модель slcidemo_roll предварительно сконфигурирован, чтобы сгенерировать код при помощи Embedded Coder. Если ваша модель не предварительно сконфигурирована, установите параметр конфигурации модели 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);

Чтобы сгенерировать код из модели, используйте rtwrebuild (Simulink Coder) функция.

 rtwbuild('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 43.085s

Просмотрите сгенерированный код в подробном отчете HTML.

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

Можно просмотреть сгенерированный код в Представлении кода и достигнуть визуальной двусторонней отслеживаемости между исходной моделью и сгенерированным кодом. Чтобы просмотреть сгенерированный код в Представлении кода, откройте приложение Embedded Coder в модели.

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

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

Смотрите сгенерированный код

После генерации кода из модели при помощи Embedded Coder можно проверить код с помощью Simulink Code Inspector, чтобы удовлетворить целям исходного кода в DO - 178C стандарт. По умолчанию Simulink Code Inspector принимает, что код предварительно сгенерирован в папки по умолчанию, где 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 сравнивает сгенерированный код со своей исходной моделью, чтобы проверить структурную эквивалентность. Это генерирует не пройдено отчет верификации, если исходная модель и сгенерированный код не структурно эквивалентны.

Чтобы сгенерировать не пройдено отчет верификации, вставьте намеренную ошибку в сгенерированный код. Измените блок логического оператора в RollAngleReference подсистема в сгенерированном коде от операции OR () к операции И (&&), при помощи служебной функции в качестве примера 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 Code Inspector не удается проверить модифицированный сгенерированный код, когда это больше не соответствует с моделью. См. подробный отчет верификации.

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

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

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

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