В этом примере показано, как использовать 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);
Чтобы сгенерировать код из модели, используйте 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
Инспектор кода смотрит сгенерированный код, чтобы проверить структурную эквивалентность и двустороннюю отслеживаемость между исходной моделью и сгенерированным кодом. После контроля Это генерирует подробный сводный отчет 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');