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