В этом примере показано, как использовать Inspector™ Simulink ® Code для проверки кода, сгенерированного из моделей, и для достижения целей исходного кода из 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, ссылка на отдельную модель, которая вычисляет команду roll для отслеживания заголовка.
Блок Model BasicRollMode, ссылка на отдельную модель, которая вычисляет функцию управления положением крена.
Simulink Code Inspector поддерживает ограниченный набор семантики моделирования и оптимизации кода. Чтобы проверить сгенерированный код с помощью Simulink Code Inspector, сконфигурируйте модель перед генерацией кода так, чтобы модель соответствовала этому ограничительному множеству. Можно проверить совместимость модели с Code Inspector с помощью проверки ее совместимости. Проверка совместимости моделей обнаруживает и сообщает о проблемах совместимости на ранних этапах процесса разработки модели. Это раннее обнаружение может значительно сократить время и усилия для достижения удовлетворительных результатов инспекций кода, необходимых для приложений повышенной надежности.
Чтобы подготовить slcidemo_roll модели для генерации кода и контроля установите параметр конфигурации модели AdvancedOptControl к значению -SLCI. Этот параметр ограничивает оптимизацию кода, используемую Embedded Coder, подмножеством, которое совместимо с Code Inspector.
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);
Чтобы сгенерировать код из модели, используйте 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'));
Можно просмотреть сгенерированный код в представлении кода и достичь визуальной двусторонней отслеживаемости между исходной моделью и сгенерированным кодом. Чтобы просмотреть сгенерированный код в представлении кода, откройте приложение 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
Code Inspector просматривает сгенерированный код, чтобы проверить структурную эквивалентность и двустороннюю отслеживаемость между исходной моделью и сгенерированным кодом. После проверки он генерирует подробный сводный отчет HTML. Для получения дополнительной информации об отчетах по инспекции кода смотрите Инспекцию кода Reports
Просмотрите HTML верификации кода.
web(fullfile('.', 'report','slcidemo_roll_report.html'));
Если общим результатом проверки модели является Passed, это означает, что инспекция кода завершена. Если для модели возвращается статус Предупреждение (Warning) или статус Неудача (Failed), исправьте или поработайте вокруг отчетных условий и повторно осмотрите модель. В этом случае пройден общий результат проверки.
Simulink Code Inspection сравнивает сгенерированный код со своей исходной моделью, чтобы проверить структурную эквивалентность. Он генерирует неудачный отчет о верификации, если исходная модель и сгенерированный код не являются структурно эквивалентными.
Чтобы сгенерировать неудачный отчет о верификации, вставьте преднамеренную ошибку в сгенерированный код. Измените логический блок Operator внутри 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 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');