Сгенерируйте исходный код компонента для экспорта во внешнюю кодовую базу

Если у вас есть программное обеспечение Embedded Coder®, можно сгенерировать функциональный исходный код от моделирования компонентов, чтобы использовать во внешней кодовой базе. Сгенерированный код не включает код планирования поддержки (например, ступенчатая функция). Управление логикой за пределами среды Simulink® вызывает сгенерированный функциональный код.

Моделирование опций

Можно сгенерировать функциональный код, чтобы экспортировать для этих компонентов моделирования:

  • Модели экспорта функций (модель, содержащая функциональные блоки, которые состоят исключительно из подсистем вызова функций, блоков модели вызова функции или других моделей экспорта функций, как описано в Обзоре Моделей Экспорта функций (Simulink)),

  • Подсистемы экспорта функций (виртуальная подсистема, которая содержит подсистемы вызова функций),

Чтобы экспортировать код, который генератор кода производит для этих компонентов моделирования, компоненты моделирования должны удовлетворить конкретные требования.

Для моделей, спроектированных в более ранних релизах, генератор кода может экспорты функций от инициированных подсистем. Требования утвердили для подсистем экспорта функций, также применяются к экспорту функций от инициированных подсистем, за следующими исключениями:

  • Инкапсулируйте инициированные подсистемы, от которых вы предназначаете к экспортам функций в виртуальной подсистеме верхнего уровня.

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

  • Экспорты функций, Которые Использование Абсолютное или Прошедшее время не применяется к экспорту функций от инициированных подсистем.

Требования

  • Решатель модели должен быть фиксированным шагом дискретный решатель.

  • Необходимо сконфигурировать каждый блок Inport корневого уровня, который инициировал подсистему вызова функций, чтобы вывести триггер вызова функции. Эти блоки Inport не могут соединиться с блоком Asynchronous Task Specification.

  • Модель или подсистема, должен содержать только следующие блоки на корневом уровне:

    • Блоки вызова функции (такие как Подсистема вызова функций, Функция Simulink, S-функции и блоки Model Вызова функции на корневом уровне, если параметр конфигурации модели решателя Tasking and sample time options> Periodic sample time constraint установлен в Ensure sample time independent)

    • Inport и блоки Outport (порты)

    • Постоянные блоки (включая блоки, которые решают к константам, тем, которые Добавляют),

    • Блоки с шагом расчета Inf

    • Слияние и блоки памяти хранилища данных

    • Виртуальные блоки связи (такой как, Разделение Вызова функции, Мультиплексор, Демультиплексор, Создатель Шины, Селектор Шины, Спецификация Сигнала и виртуальные подсистемы, которые содержат эти блоки),

    • Блоки средства просмотра сигнала, такие как блоки Осциллографа (только подсистемы экспорта функций)

  • Когда постоянный блок появляется в верхнем уровне модели или подсистемы, необходимо установить параметр конфигурации модели Optimization> Default parameter behavior для модели или содержащий модель к Inlined.

  • Блоки в модели или подсистеме должны поддержать генерацию кода.

  • Блоки, которые используют абсолютное или прошедшее время, должны быть в периодической подсистеме вызова функций с дискретным шагом расчета, заданным на соответствующем блоке Inport корневого уровня вызова функции. Смотрите Экспорты функций Который Использование Абсолютное или Прошедшее время.

  • Данные сигнализируют, что пересекаются, контур экспортируемой системы не может быть виртуальной шиной и не может быть реализован как Goto-от связь. Данные сигнализируют, что пересекаются, контур экспорта должен быть скаляром, мультиплексированным, или невиртуальная шина.

Кроме того, для моделей экспорта функций, вы не можете сгенерировать код для основанной на уровне модели, которая включает несколько экземпляров модели экспорта функций. Например, вы не можете сгенерировать код для модели тестовой обвязки, которую вы используете в планировании допускающих повторное использование моделей экспорта функций в процессе моделирования.

Для подсистем экспорта функций применяются следующие дополнительные требования:

  • Триггерный сигнал, который пересекает контур подсистемы экспорта функций, должен быть скаляром. Сигналы входных и выходных данных, которые не действуют как триггеры, не должны быть скаляром.

  • Когда постоянный сигнал управляет выходным портом подсистемы экспорта функций, сигнал должен задать класс памяти.

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

Если вы хотите к коду экспорта функций для компонента моделирования с блоками, которые используют абсолютное или прошедшее время, те блоки должны быть в подсистеме вызова функций что:

  • Вы конфигурируете для периодического выполнения

  • Вы конфигурируете блок Inport корневого уровня с дискретным шагом расчета

Сконфигурировать подсистему вызова функций для периодического выполнения:

  1. В подсистеме вызова функций щелкните правой кнопкой по блоку Trigger и выберите Block Parameters из контекстного меню.

  2. Установите параметр Sample time type на periodic.

  3. Установите Sample time на ту же заданную гранулярность (непосредственно или наследованием) в инициаторе вызова функции.

  4. Нажмите OK или Apply.

Для получения дополнительной информации смотрите Расчет Абсолютного и Прошедшего времени (Simulink Coder).

Ограничения для подсистем экспорта функций

  • Параметры блока Subsystem не управляют именами файлов, содержащих сгенерированный код. Имена файлов начинаются с имени экспортируемой подсистемы.

  • Параметры блока Subsystem не управляют именами функций верхнего уровня в сгенерированном коде. Каждое имя функции отражает имя сигнала, который инициировал функцию, или (для сигнала без имени) отражает блок, из которого происходит сигнал.

  • Можно экспортировать системы вызова функции для интерфейса класса C++ кода упаковка только, когда ее функциональная спецификация установлена в Default step method. Смотрите Настраивают Сгенерированные Интерфейсы Класса C++. Экспортируемая функция совместима с однопоточным выполнением. Чтобы избежать потенциальных условий состязания данных для разделяемых сигналов, вызовите все члены для класса от того же потока выполнения.

  • Генератор кода поддерживает блок SIL или PIL в режиме Accelerator, только если его инициатор вызова функции не встраивается в режиме Accelerator. Примеры невстроенных инициаторов включают графики Stateflow®.

  • Блок инициатора S-функции Уровня 2, такой как диаграмма Stateflow или встроенный Блок Function-Call Generator, должен управлять блоком SIL.

  • Можно экспортировать асинхронное (шаг расчета) система вызова функции, но программное обеспечение не поддерживает блок SIL или PIL для асинхронной системы.

  • Использование TLC функционирует LibIsFirstInit был удален для подсистем экспорта функций.

Рабочий процесс

Чтобы сгенерировать код для экспортируемой функции, выполните итерации через задачи, перечисленные в этой таблице.

ЗадачаДействиеБольше информации
1Рассмотрите свою оценку внешних характеристик кода и требований интегрирования.Выберите внешний рабочий процесс интеграции кода
2Проверьте, что модель или подсистема, которую вы экспортируете, удовлетворяют требованиям экспорта функции.Требования
3Адресные сведения соединяют интерфейсом с требованиями путем изменения модели или подсистемы. Обменивайтесь Данными Между Внешним Кодом C/C++ и Типовым кодексом Simulink или Сгенерированным кодом
4При необходимости сконфигурируйте прототипа функции.Настройте Интерфейсы Функции Точки входа для Simulink Функциональные и Функциональные Блоки Вызывающей стороны и, для фиксированного шага основанные на уровне модели, Настройте Сгенерированные Интерфейсы Функции C или Настройте Сгенерированные Интерфейсы Класса C++
5При необходимости обновите модель, чтобы поместить внешний специализированный код в сгенерированные системные функции. Поместите Внешний Код C/C++ в Сгенерированный код
6Проверьте, что функции ведут себя и выполняют как ожидалось в процессе моделирования путем создания и использования модели тестовой обвязки. Модель тестовой обвязки планирует выполнение функций в процессе моделирования.Сконфигурируйте Модель, Сгенерируйте Код и Симулируйте и, если у вас есть программное обеспечение Simulink Test™, Тест, Авторский (Simulink Test)
7Сконфигурируйте модель или подсистему для генерации кода.Сгенерируйте Код Используя Embedded Coder®, Сгенерируйте Код Который Внешний вид Соответствий Внешнего Кода, andModel Настройка
8Сгенерируйте код и отчет генерации кода.Генерация кода
9Рассмотрите интерфейс сгенерированного кода и статические метрики кода.Анализируйте сгенерированный код интерфейсные и статические метрики кода
10Создайте исполняемую программу, которая включает экспортируемый функциональный код.Создайте интегрированный код вне окружения Simulink
11Проверьте, что исполняемая программа ведет себя и выполняет как ожидалось. 

Выберите подход интегрирования

Несколько подходов доступны для кода производящей функции для экспорта во внешнюю среду разработки. Следующая таблица сравнивает подходы. Выберите подход, который выравнивается лучше всего с вашими требованиями интегрирования. Для получения дополнительной информации о том, как создать модели экспорта функций, см. Обзор Моделей Экспорта функций (Simulink). Для получения дополнительной информации о генерации кода для подсистем вызова функции смотрите, Генерируют Исходный код Компонента для Экспорта во Внешнюю Кодовую базу.

Условие или требованиеИспользованиеБольше информации
  • Трассируемость между моделированием элементов и сгенерированным кодом

  • Локальные входные параметры (Блок Inport) и выходные параметры (Блок Outport)

Подсистема вызова функций
  • Управление сгенерированным прототипом функции

  • Формальные входные параметры (Аргумент блоки Inport) и выходные аргументы (Блоки Выходного порта аргумента)

  • Локальные входные параметры (Блок Inport) и выходные параметры (Блок Outport)

Функциональный блок Simulink
Код отвечает на событие инициализацииИнициализируйте Функциональный блок
Код отвечает на событие сбросаСбросьте Функциональный блок
Код включает функции точки входа вне того, что генератор кода производит по умолчанию (model_initialize, modelшаг, и model_terminate)S-функцияS-функции и генерация кода (Simulink Coder)
Среда выполнения одна модели, чтобы использовать в качестве тестовой обвязки и экспортировать код, сгенерированный для фрагментов моделиПодсистема экспорта функций

Сгенерируйте код функции C для модели экспорта функций

В этом примере показано, как сгенерировать функциональный код для отдельных функциональных блоков Simulink и подсистем вызова функций в модели, не генерируя планирование кода.

Сгенерировать функциональный код для экспорта:

  1. Создайте модель, которая содержит функции для экспорта.

  2. Создайте модель тестовой обвязки, которая планирует выполнение функций в процессе моделирования.

  3. Симулируйте модель, которая содержит функции при помощи модели тестовой обвязки.

  4. Сгенерируйте код для модели, которая содержит функции.

Создайте модель, которая содержит функции для экспорта

Модель с функциями для экспорта должна удовлетворить архитектурным ограничениям на корневом уровне модели. На корневом уровне допустимые блоки:

  • Inport

  • Выходной порт

  • Подсистема вызова функций

  • Функция Simulink

  • Goto

  • От

  • Слияние

Генератор кода производит функциональный код для Подсистемы вызова функций и Функциональных блоков Simulink, и Инициализируйте и Функциональные блоки Сброса. Для блока Function-call Subsystem вы соединяете входные порты блока, чтобы базироваться блоки Inport, которые утверждают сигналы вызова функции. Подсистема выполняется на основе сигнала вызова функции, что это получает. Функциональный блок Simulink выполняется в ответ на выполнение соответствующего блока Function Caller или диаграммы Stateflow. Инициализировать Функциональный блок выполняется на модели, инициализируют событие, и Функциональный блок Сброса выполняется на пользовательском событии сброса.

Для экспорта функций, модели rtwdemo_functions содержит две подсистемы вызова функций (f1_alg и f2_alg) и Функциональный блок Simulink (f3) для экспорта функций. Модель также содержит Инициализировать Функциональный блок (Initialize Function) и Функциональный блок Сброса (Reset Function). Чтобы вычислить начальные условия для блоков с состоянием в других частях модели, блоки Средства записи состояния используются в Функциональных блоках Инициализирования и Сброса.

open_system('rtwdemo_functions')

Создайте модель, которая содержит функциональный блок вызывающей стороны

Используйте блок Function Caller, чтобы вызвать Simulink Function block. Блок Function Caller может быть в той же модели или в различной модели как Функциональный блок Simulink.

Несколько Функциональных блоков Вызывающей стороны могут вызвать Simulink Function block. Можно поместить блок Function Caller в подсистеме вызова функций. Во время генерации кода генератор кода экспортирует функцию от подсистемы вызова функций.

Модель rtwdemo_caller экспортирует подсистему вызова функций, которая содержит блок Function Caller.

open_system('rtwdemo_caller')

Создайте модель тестовой обвязки для симуляции

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

rtwdemo_export_functions модели тестовая обвязка. Модель:

  • Планирует Функциональный блок Simulink с блоком Function Caller в rtwdemo_caller.

  • Предоставляет сигналы вызова функции другим моделям в этом примере, чтобы запланировать содержимое модели, включая модель инициализируют и события сброса.

open_system('rtwdemo_export_functions')

Симулируйте модель тестовой обвязки

Проверьте, что модель, содержащая функции, которые вы хотите экспортировать, выполняется, как вы ожидаете путем симуляции модели тестовой обвязки. Например, симулируйте rtwdemo_export_functions.

sim('rtwdemo_export_functions')

Сгенерируйте функциональный код и отчет

Откройте приложение Embedded Coder. Затем сгенерируйте код и отчет генерации кода для функций, что вы хотите экспортировать. Например, сгенерируйте код для rtwdemo_functions.

rtwbuild('rtwdemo_functions')
### Starting build procedure for: rtwdemo_functions
### Successful completion of code generation for: rtwdemo_functions

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

Из отчета генерации кода рассмотрите сгенерированный код.

  • ert_main.c пример основная программа (среда выполнения) для модели. Этот код показывает, как вызвать экспортируемые функции. Код также показывает, как инициализировать и выполнить сгенерированный код.

  • rtwdemo_functions.c вызывает функцию инициализации, включая Initialize Function, и экспортируемые функции для компонентов модели f1_alg, f2_alg, и f3.

  • rtwdemo_functions.h объявляет структуры данных модели и открытый интерфейс к экспортируемым функциям точки входа и структурам данных.

  • f3.h совместно используемый файл, который объявляет интерфейс вызова для функции Simulink f3.

  • rtwtypes.h задает типы данных, структуры и макросы, которых требует сгенерированный код.

Запишите интерфейсный код

Откройте и рассмотрите Отчет Интерфейса Кода. Чтобы записать интерфейсный код для вашей среды выполнения, используйте информацию в том отчете.

  1. Включайте сгенерированные заголовочные файлы путем добавления директив #include rtwdemo_functions.h, #include f3.h, и #include rtwtypes.h.

  2. Запишите входные данные в сгенерированный код для блоков модели Inport.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков модели Outport.

Input port:

  • rtU.U1 из типа real_T с размерностью 1

  • rtU.U2 из типа real_T с размерностью 1

Функции точки входа:

  • Инициализируйте функцию точки входа, void rtwdemo_functions_initialize(void). При запуске вызовите эту функцию однажды.

  • Сбросьте функцию точки входа, void rtwdemo_functions_reset(void). Вызовите эту функцию по мере необходимости.

  • Экспортируемая функция, void f1(void). Вызовите эту функцию по мере необходимости.

  • Экспортируемая функция, void f2(void). Вызовите эту функцию по мере необходимости.

  • Функция Simulink, void f3(real_T rtu_u, real_T *rty_y). Вызовите эту функцию по мере необходимости.

Выходные порты:

  • rtY.Accumulator1 из типа int8_T с размерностью [2]

  • rtY.Accumulator2 из типа int8_T с размерностью [2]

  • rtY.TicToc10 из типа int8_T с размерностью 1

Больше о

Закройте модели в качестве примера

bdclose('rtwdemo_export_functions')
bdclose('rtwdemo_functions')
bdclose('rtwdemo_caller')

Сгенерируйте код функции и класса C++ для модели экспорта функций

В этом примере показано, как сгенерировать функциональный код для модели экспорта функций, которая включает подсистему вызова функций. Генератор кода производит функцию и код класса, который не включает код планирования.

Сгенерировать функциональный код для экспорта:

  1. Создайте модель, которая содержит функции для экспорта.

  2. Создайте модель тестовой обвязки, которая планирует выполнение функций в процессе моделирования.

  3. Симулируйте модель, которая содержит функции при помощи модели тестовой обвязки.

  4. Сгенерируйте код для модели, которая содержит функции.

Создайте модель, которая содержит функции и интерфейс класса C++ для экспорта

Модель с функциями для экспорта с интерфейсом класса модели C++ должна удовлетворить архитектурным ограничениям на корневом уровне модели. Для генерации класса C++ блоки, которые допустимы на корневом уровне:

  • Inport

  • Выходной порт

  • Подсистема вызова функций

  • Goto

  • От

  • Слияние

Примечание: Подсистема вызова функций Экспорта с интерфейсом класса C++ не поддерживает Функциональные блоки Simulink.

Генератор кода производит функциональный код для блока Function-Call Subsystem. Для блока Function-call Subsystem вы соединяете входные порты блока, чтобы базироваться блоки Inport, которые утверждают сигналы вызова функции. Подсистема выполняется на основе сигнала вызова функции, что это получает.

rtwdemo_cppclass_functions модели содержит подсистемы вызова функций f1, f2, и f3 для экспорта функций.

open_system('rtwdemo_cppclass_functions')

Создайте модель тестовой обвязки для симуляции

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

rtwdemo_cppclass_export_functions модели тестовая обвязка. Модель предоставляет сигналы вызова функции другим моделям в этом примере, чтобы запланировать содержимое модели.

open_system('rtwdemo_cppclass_export_functions')

Симулируйте модель тестовой обвязки

Проверьте, что модель, содержащая функции, которые вы хотите экспортировать, выполняется, как вы ожидаете путем симуляции модели тестовой обвязки. Например, симулируйте rtwdemo_cppclass_export_functions.

sim('rtwdemo_cppclass_export_functions')

Сгенерируйте функциональный код и отчет

Сгенерируйте код и отчет генерации кода для функций, что вы хотите экспортировать. Например, сгенерируйте код для rtwdemo_cppclass_functions.

rtwbuild('rtwdemo_cppclass_functions')
### Starting build procedure for: rtwdemo_cppclass_functions
### Successful completion of build procedure for: rtwdemo_cppclass_functions

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

Из отчета генерации кода рассмотрите сгенерированный код.

  • ert_main.cpp пример основная программа (среда выполнения) для модели. Этот код показывает, как вызвать экспортируемые функции. Код также показывает, как инициализировать и выполнить сгенерированный код.

  • rtwdemo_cppclass_functions.cpp вызывает функцию инициализации, включая Initialize Function, и экспортируемые функции для компонентов подсистемы модели f1, f2, и f3.

  • rtwdemo_cppclass_functions.h объявляет структуры данных модели и открытый интерфейс к экспортируемым функциям точки входа и структурам данных.

  • rtwtypes.h задает типы данных, структуры и макросы, которых требует сгенерированный код.

Запишите интерфейсный код

Откройте и рассмотрите Отчет Интерфейса Кода. Чтобы записать интерфейсный код для вашей среды выполнения, используйте информацию в том отчете.

  1. Включайте сгенерированные заголовочные файлы путем добавления директив #include rtwdemo_cppclass_functions.h и #include rtwtypes.h.

  2. Запишите входные данные в сгенерированный код для блоков модели Inport.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков модели Outport.

Input port:

  • rtU.U1 из типа real_T с размерностью 1

  • rtU.U2 из типа real_T с размерностью 1

  • rtU.U3 из типа real_T с размерностью 1

Функции точки входа:

  • Инициализируйте функцию точки входа, void initialize(void). При запуске вызовите эту функцию однажды.

  • Экспортируемая функция, void t_1tic_A(void). Вызовите эту функцию по мере необходимости.

  • Экспортируемая функция, void t_1tic_B(void). Вызовите эту функцию по мере необходимости.

  • Экспортируемая функция, void t_1tic_C(void). Вызовите эту функцию по мере необходимости.

Выходные порты:

  • rtY.TicToc1 из типа int8_T с размерностью [2]

  • rtY.TicToc2 из типа int8_T с размерностью [2]

  • rtY.TicToc10 из типа int8_T с размерностью 1

Больше о

Закройте модели в качестве примера

bdclose('rtwdemo_cppclass_export_functions')
bdclose('rtwdemo_cppclass_functions')

Сгенерируйте код для подсистем экспорта функций

Сгенерировать код для подсистемы экспорта функций:

  1. Проверьте, что подсистема, для которой вы генерируете код, удовлетворяет требованиям экспорта.

  2. В диалоговом окне Configuration Parameters:

    1. Установите параметр System target file на основанный на ERT системный конечный файл, такой как ert.tlc.

    2. Если вы хотите блок SIL со сгенерированным кодом, в целях верификации, устанавливаете параметр конфигурации модели Create block на SIL.

    3. Нажмите OK или Apply.

  3. Щелкните правой кнопкой по блоку подсистемы и выберите C/C++ Code > Export Functions из контекстного меню.

    Операция создает новую модель, subsystem.slx, это содержит содержимое исходной подсистемы и создает ScratchModel это содержит блок Model. Этот блок ссылается на недавно созданный subsystem.slx модель.

    Код Сборки для подсистемы: Subsystem диалоговое окно открывается. Это диалоговое окно не характерно для подсистем экспорта функций. Генерация кода не запрашивает ввод информации в диалоговом окне.

  4. Нажмите Build, чтобы создать недавно созданный subsystem.slx модель.

    Генератор кода производит код и помещает его в рабочую папку.

    Если вы устанавливаете Create block на SIL на шаге 2b Simulink открывает новое окно, которое содержит Блок s-function, который представляет сгенерированный код. Этот блок имеет тот же размер, форму и коннекторы как исходная подсистема.

Генерация кода и дополнительное создание блока теперь завершены. Можно протестировать и использовать код и дополнительный блок, как вы делаете для сгенерированного кода ERT и Блока s-function. Для дополнительных задач рабочего процесса смотрите, Указывают, что Пользовательское Инициализирует Имя функции и Задает Пользовательское Описание.

Укажите, что пользовательское инициализирует имя функции

Можно задать пользовательское имя для инициализировать функции экспортируемой функции в качестве аргумента к rtwbuild команда. Команда принимает следующую форму:

blockHandle = rtwbuild('subsystem', 'Mode', 'ExportFunctionCalls',..
             'ExportFunctionInitializeFunctionName', 'fcnname')

fcnname задает имя функции. Например, если вы задаете имя 'myinitfcn', процесс сборки испускает код, похожий на:

/* Model initialize function */
void myinitfcn(void){
...
}

Задайте пользовательское описание

Можно ввести пользовательское описание для экспортируемой функции при помощи диалогового окна Block Properties блока Inport.

  1. Щелкните правой кнопкой по блоку Inport, который управляет портом управления подсистемы, для которой вы экспортируете код.

  2. Выберите Properties.

  3. Во вкладке General, в поле Description, вводят ваш описательный текст.

Во время функционального экспорта текст, который вы вводите, испускается к сгенерированному коду в заголовке для блока Inport. Например, если вы открываете пример программы rtwdemo_exporting_functions и введите описание в диалоговом окне Block Properties для порта t_1tic_A, генератор кода производит код, который похож на:

/*
 * Output and update for exported function: t_1tic_A
 *
 *  My custom description of the exported function
*/
void t_1tic_A(void)
{
...
}

Оптимизируйте код, сгенерированный для подсистем экспорта функций

Чтобы оптимизировать код, сгенерированный для подсистемы экспорта функций, задайте класс отдельной системы хранения для каждого входного сигнала и выходного сигнала, который пересекает контур подсистемы.

Для каждой подсистемы вызова функций, которую вы экспортируете:

  1. Щелкните правой кнопкой по подсистеме.

  2. Из контекстного меню выберите Block Parameters (Subsystem).

  3. Выберите вкладку Code Generation.

  4. Установите Function packaging на Auto.

  5. Нажмите OK или Apply.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте