В этом примере показано, как использовать 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');