При необходимости передачи текста и управления им используйте строки в нескольких приложениях. Например, при моделировании системы управления топливом вместо использования перечисленных данных для моделирования уровней топлива можно использовать строки, такие как "LOW" или "EMPTY". Строки Simulink ® совместимы со строками MATLAB ®.
Строки Simulink - это встроенный тип данных сигнала. Они отображаются в редакторе Simulink как "strN" (например, строка с максимальной длиной N символов) или «строка» для строк без максимальной длины (динамические строки). Длина строки может составлять от 1 до 32 766 символов.
Сигналы строки симулятора по своей сути являются дискретными. Если строковый сигнал имеет непрерывное время выборки, модель генерирует ошибку во время компиляции.
Simulink обрабатывает строковые переменные и выражения, такие как «a» + «b», так же, как и числовые переменные. Значение строковой переменной может быть как символьным вектором, так и строкой MATLAB. Строковые переменные могут существовать в базовых, модельных и маскирующих рабочих пространствах.
Строковые литералы задаются двойными кавычками ("Hello") или одиночные цитаты ('Hello'). Для согласования со строками MATLAB используйте двойные кавычки. Строки появляются на портах и в блоке Display с двойными кавычками.
Строки Simulink поддерживают 256 символы набора символов ISO/IEC 8859-1. Эти символы являются первыми 256 кодовыми точками Юникода. Simulink не поддерживает первый символ char(0) («NULL») и возвращает ошибку, если строка содержит этот символ.
Если символ не может быть отображен, блок сохраняет фактическую информацию и выводит escape-символ со связанным восьмеричным значением для символа. Например, символ управления десятичным значением для BREAK PERMITTED HERE составляет 130. Блок отображает этот управляющий символ как выделенный восьмеричный \202. Блок от ASCII до String возвращается в виде ускользающих восьмеричных символов в диапазоне набора Юникода от 0000 до 001F и 007F-009F.
В этом разделе описывается использование строк в Simulink, в том числе:
Список доступных строковых блоков и блоков, специфичных для строковых преобразований
Передача строковых констант в другие строковые блоки
Пустые символы в строках
Строки без максимальной длины
Взаимодействие с Stateflow ®
Сгенерированный код
Ограничения
В этом разделе также приведены простые примеры использования строковых блоков. Примеры в этом разделе позволяют отображать имена блоков. Для управления отображением имен блоков на вкладке «Формат» выберите «Авто» > «Скрыть автоматические имена блоков». Например, блоки строк можно использовать для отображения и извлечения данных координат и поиска образцов в строках.
Для работы со строками в модели используйте следующую таблицу:
| Действие | Блок |
|---|---|
Преобразование вектора uint8 в строковый сигнал. | |
Создайте выходной строковый сигнал на основе параметра Format и входных сигналов. | |
Отсканируйте входную строку и преобразуйте ее в сигналы в соответствии с форматом, заданным параметром Format. | |
| Сравните две входные строки. | |
Объедините входные строки, чтобы сформировать одну выходную строку. | |
Вывод строки, указанной параметром String. | |
Возвращает индекс первого вхождения вложенного элемента строки шаблона в текстовой строке str. | |
Вывод количества символов во входной строке. | |
Преобразование строкового сигнала в вектор uint8. | |
Преобразование строкового сигнала в двойной сигнал. | |
Преобразование строкового сигнала в одиночный. | |
Преобразование входной строки в перечислимый сигнал. | |
Извлеките подстроку из строкового сигнала. | |
Преобразование входного сигнала в строковый. |
Эти блоки Simulink поддерживают строки.
| Блок | Примечания |
|---|---|
Назначение шины | Невиртуальный и виртуальный. |
Автор шины | Невиртуальный и виртуальный. |
Селектор шины | Невиртуальный и виртуальный. |
Память хранилища данных | — |
Чтение хранилища данных | — |
Запись в хранилище данных | — |
Дублирование типа данных | — |
Показ | Отображение строк с двойными кавычками. |
От | — |
Из рабочей области | Интерполяция данных не поддерживается. |
Goto | — |
Земля | Значение земли - |
Inport | Включая уровень корня. |
Приемник варианта вручную | — |
Источник варианта вручную | — |
Ручное переключение | Смешанные числовые и строковые типы отсутствуют. При наличии нескольких строк в блоке используется строка с наибольшим размером или динамическая строка. |
Функция MATLAB | — |
Слияние | — |
Модель | — |
Мультипортовый коммутатор | Смешанные числовые и строковые типы отсутствуют. При наличии нескольких строк в блоке используется строка с наибольшим размером или динамическая строка. |
Вспомогательный порт | Включая уровень корня. |
Исследование | — |
Редактор сигналов | Интерполяция данных не поддерживается. |
Спецификация сигнала | — |
Подсистема (все варианты) | — |
Выключатель | Смешанные числовые и строковые типы отсутствуют. При наличии нескольких строк в блоке используется строка с наибольшим размером или динамическая строка. |
Завершить функцию | — |
Терминатор | — |
Источник варианта | — |
Модель исполнения | — |
Вариационная подсистема | — |
Width | — |
Чтобы использовать текстовые данные для управления поведением диаграммы и обработки текста для создания вывода на естественном языке в Stateflow, используйте строки в диаграммах языка действий C. Stateflow предоставляет операторам возможность манипулировать строками. Дополнительные сведения см. в разделе Управление текстовой информацией с помощью строк (Stateflow).
Для задания строковых констант используется блок «Строковая константа». Не используйте блок константы, который не принимает строки. В блоке «Строковая константа» введите строку с двойными кавычками, например "Hello!" в параметре String. Это аналогично добавлению числовой константы в параметре Constant value блока Constant.
Строки Simulink автоматически связаны с окончанием строки. Не используйте нуль-терминатор в конце строки. Если Simulink обнаруживает нулевой символ в любом месте строки, это приводит к ошибке. Simulink обрабатывает строки во время моделирования и генерации кода следующим образом:
Во время моделирования модель моделируется. Больше ничего делать не надо.
Во время генерации кода C программное обеспечение добавляет нуль-терминатор в конец строки. Например, если размер буфера строки равен 10, а действительное значение строки равно "AB"третий символ в сгенерированном коде является нулевым терминатором.
При необходимости строковые блоки создают и используют строковые типы данных, например, когда блок выводит строковый тип. Строки можно создавать без указания максимальной длины символов. К динамическим строкам относятся строки без максимальной длины символов.
Чтобы создать строковые типы данных для блоков, поддерживающих строки, можно:
Используйте параметр Тип выходных данных (Output data type) или Тип данных (Data type) на вкладке Атрибуты сигнала (Signal Attributes) блока Simulink.
Чтобы создать строковый тип данных без максимальной длины символов, укажите string. Это действие создает динамическую строку.
Создание строкового типа данных с максимальной длиной символов, например 100, введите stringtype(100). Вы также можете использовать stringtype в командной строке MATLAB для создания строкового типа данных.
Используйте set_param функции с помощью OutDataTypeStr параметр, например:
set_param(gcb,'OutDataTypeStr','stringtype(100)')
Эта функция создает объект строкового типа данных длиной не более 100 символов. Длина строкового типа может составлять от 1 до 32 766 символов включительно.
Например, с помощью блока String Constant можно создать строку с параметром Output data type, имеющим значение stringtype(31) создает строковый тип данных str31. 31 - максимальное количество символов в строке.
Чтобы настроить элемент объекта шины на принятие строк с помощью редактора шины, в параметре DataType элемента шины введите тип строки. Например, чтобы указать строковый тип данных, максимальная длина символов которого равна 10, введите stringtype(10). Параметр Mode обновляется соответствующим образом. Для задания динамического сигнала переменной длины введите string в этой области. Для элементов шины можно создать числовые и строковые объекты шины смешанного использования. Дополнительные сведения о создании объектов и элементов шины с помощью редактора шин см. в разделе Создание и указание объектов Simulink.Bus.
Учитывать эти примечания для строк и сгенерированных C и C++ код.
C Код для типа данных динамической строкиМоделирование блоков, использующих динамический строковый тип данных, отличается от созданного C код следующими способами:
Сигналы с string тип данных имеет динамические размеры во время моделирования. Другими словами, размер строки может варьироваться от 0 до 32766. Однако в сгенерированном C код, кодер хранит строки в виде строк фиксированного размера char_T массивы. Поэтому размер строки ограничен фиксированным размером буфера в сгенерированном C код. Программа усекает дополнительные символы и вставляет нуль-терминатор в конце (например, на выходе блока String Concatenate).
Кодер генерирует инварианты строки (параметры или сигналы) в виде C-стиль строк с двойными кавычками.
Размер буфера по умолчанию для сигнала со строковым типом данных составляет 256 байт (содержит не более 255 8-битных символов ASCII). Чтобы изменить размер буфера, используйте параметр конфигурации Buffer size of dynamically-size string (bytes) (Simulink Coder).
Чтобы переопределить настройку в масштабах всей модели для отдельного строкового сигнала, используйте stringtype(N) в качестве типа данных сигнала. Сигналам с этим типом данных назначается буфер N+1 байт в сгенерированном C код (N символов плюс один нуль терминатора).
Разница между моделированием и генерированием отсутствует C++ код, когда строки хранятся как std::string объекты с тем же динамическим поведением, что и моделирование.
C++ Библиотека строк создания кодаДля C++ формирование кода, std::string доступна для целевого объекта на основе ERT с лицензией Embedded Coder™. Дополнительные сведения см. в разделе Создание кода для блоков строк с помощью стандартной библиотеки строк C++ (встроенный кодер).
Блок преобразования типов данных нельзя использовать для преобразования строковых типов данных в другие типы данных и наоборот. Вместо этого используйте эти блоки преобразования строк.
| Преобразовать | Блок |
|---|---|
Строковый сигнал к векторному сигналу uint8 с сохранением символов ASCII | |
Uint8 векторного сигнала в строковый сигнал | |
Строковый сигнал к числовому сигналу двойного типа данных | |
Строковый сигнал для числового сигнала одиночного типа данных | |
Строковый сигнал для перечисляемого типа данных сигнала | |
Входной сигнал в строковый сигнал |
Добавьте в модель следующие блоки:
Строковая константа
Строка в ASCII
ASCII в строку
Два блока отображения
Подключите блоки, как показано на рисунке.

В блоке «Строковая константа» введите строку, например "Hello!".
В блоке String to ASCII измените максимальный размер строки на 10.
Моделирование модели и наблюдение за содержимым блоков отображения.
Display1 шоу Hello! преобразовано в эквивалент ASCII. Например, 72 - ASCII-эквивалент H и 33 - ASCII-эквивалент !.
Display1 заполняет оставшееся пространство до максимальной длины строки 10 нулями (нулевыми символами).
Дисплеи Hello! после того, как блок ASCII to String повторно преобразует код ASCII в строку.

Добавьте в модель следующие блоки:
Строковая константа
Строка в перечисление
Показ
Подключите блоки, как показано на рисунке.

В блоке «Строковая константа» введите строку, например "Hello!"
Создание класса перечисления Simulink с именем BasicStrings и сохранить его в текущей папке с именем файла BasicStrings.m, например:
classdef BasicStrings < Simulink.IntEnumType
enumeration
Hello(0)
Red(1)
Blue(2)
end
end В блоке String to Enum введите класс перечисления как Enum: BasicStrings.
Моделирование модели и наблюдение за содержимым блока «Отображение».

В этом примере показано, как можно форматировать и выводить набор данных в виде географических координат с помощью блоков «Создать строку» и «Сканировать строку». На основе С scanf и printf функции, блоки Compose String и Scan String аналогичны по концепции sprintf и sscanf функции, за основным исключением того, что эти функции работают с массивами, чего не делают блоки. Дополнительные сведения о символах, отформатированных строковыми блоками, см. в разделе Создание строки и проверка строки.
Блок Compose String создает строку из нескольких строковых и цифровых входных данных. Параметр Format используется для форматирования выходных данных каждого ввода, при этом для каждого ввода используется один оператор форматирования. Каждый оператор формата начинается со знака процента, %, за которым следует символ преобразования, например, %f генерирует вывод фиксированной точки. Чтобы дополнить вывод строки, можно также добавить дополнительные символы в спецификацию формата для отображения в выводе.
Добавьте в модель следующие блоки:
Шесть констант
Одна составленная строка
Одна строка сканирования
Семь дисплеев
Измените значения констант блока «Константа» на значения, показанные на рисунке, и подключите блоки.

В параметре Format для блоков Compose String введите следующие спецификации формата:
'%g° %g'' %f" N, %g° %g'' %f" W'
%g и %f операторы форматирования преобразуют числовые входные данные в значения с плавающей запятой. %g является более компактной версией %f.
Символ степени (°), N, W и ' являются дополнительными строками для отображения в выходной строке.
Блок Compose String объединяет выходные данные в порядке ввода, форматирует каждый ввод в соответствии с оператором формата, добавляет дополнительные строки и выводит строку, отформатированную как направленную и окруженную двойными кавычками (").
В параметре Format блока Scan String введите следующие параметры формата:
'%g° %g'' %f" N, %g° %g'' %f" W'
%g и %f операторы форматирования преобразуют числовые входные данные в значения с плавающей запятой. %g является более компактной версией %f.
Символ степени (°), N, W и ' являются дополнительными строками для отображения в выходной строке.
Блок Scan String считывает входные данные, преобразует их в соответствии с форматом, заданным спецификацией преобразования, и возвращает результаты в виде скаляров. Блок форматирует каждый вывод в соответствии со спецификацией преобразования. Он игнорирует указанный текст непосредственно перед спецификатором преобразования или после него.

Чтобы найти образец в строке, используйте блок «Поиск строки».
Добавьте в модель следующие блоки:
Две строковые константы
Поиск строки
Один дисплей
Подключите блоки, как показано на рисунке.

В первом блоке String Constant введите строку, например "Hello!Goodbye!".
Подключение этого блока к входному порту str блока поиска строк приводит к тому, что блок поиска строк ищет шаблон в этой строке.
Во втором блоке String Constant введите строку (или шаблон) для поиска в первой строке String Constant, например "Goodbye!".
Подключение этого блока к порту субвхода блока означает, что String Find ищет этот шаблон на входе str.
Моделирование модели и наблюдение за содержимым блока «Отображение». В этом примере отображается блок 7, которое является местом нахождения письма G.

Чтобы извлечь строку из исходной строки, используйте блок подстроки. В этом примере используется модель, описанная в разделе Поиск образцов в строках.
Добавьте в модель блок подстроки.
В блоке Substring выберите строку Output из idx для завершения параметра. Установка этого параметра извлекает строку из местоположения, введенного в порт idx, до конца строки.
Подключите новый блок, как показано на рисунке.

Моделирование модели и наблюдение за содержимым блока «Отображение». В этом примере отображается блок "Goodbye!", которая является выделенной подстрокой, начиная idx до конца строки.

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

Обратите внимание, что модель:
Создает две строки, "beginning middle end" и "middle", используя блоки String Constant.
Поиск первого вхождения "middle" (idx) и добавляет расположение первой буквы (11) к длине "middle" (7). Он использует блоки «Поиск строки» и «Длина строки».
Выписки из "beginning middle end" подстрока, начинающаяся с конца "middle" (idx+string length = 18), которая является строкой "end". Используется блок подстроки.
Сравнивает вычисленное значение "end" с фактической строкой "end" , который возвращает логическое значение "1". Он использует блоки String Constant и String Compare.
Преобразует логическое значение "1" к его строковому эквиваленту, "true". Он использует блок To String.
Чтобы просмотреть расположение символов в модели, добавьте по одному блоку отображения в выходные данные блоков «Поиск строки» и «Длина строки» и смоделируйте их.

В дополнение к использованию строк в новых моделях можно обновить существующие модели для использования строк. Использование строк позволяет упростить модель и упростить ее понимание.
Например, в старых моделях для представления или передачи текста в модели можно использовать перечислимые типы данных. sldemo_fuelsys пример перечисляемых констант в нескольких областях для работы с текстовыми данными.
В sldemo_fuelsys/fuel_rate_control/control_logic, диаграмма Stateflow использует перечисленные данные для указания уровней топлива.


В sldemo_fuelsys/fuel_rate_control/airflow_calcдля определения низкого уровня топлива модель использует блоки Перечисленная константа (Enumerated Constant) и Реляционный оператор (Relational Operator).

Вместо этого можно использовать блоки «Строковая константа» и «Сравнение строк», задав следующие параметры:
Параметр String Constant String для LOW.
Использование блока сравнения строк для определения LOW исходит из другой части модели.
Вместо удаления всех экземпляров перечисляемых констант можно использовать строки в сочетании с перечисляемыми константами. Это позволяет постепенно переносить модель для использования строк. В sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rateблок многопортового коммутатора принимает четыре перечисленных входных сигнала данных.

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

В этом примере показано, как анализировать текстовые сообщения в формате NMEA GPS с использованием строковых блоков Simulink ®.
Обзор
В этой модели показано, как использовать строковый тип данных и блоки Simulink ® для чтения входных текстовых сообщений и извлечения числовых и текстовых данных.

Чтение заголовка сообщения и преобразование в перечисление
Simulink ® предоставляет блок String To Enum для преобразования строки в соответствующее значение перечисления. В этой модели строка заголовка «RMB» преобразуется в NMEASentence.RMB.

Анализ текстового сообщения с помощью блока Scan String
Одним из способов анализа текстового сообщения является использование блока Scan String. Он работает как функция sscanf в C и MATLAB ®.

Анализ текстового сообщения с фиксированной шириной поля
Если текстовое сообщение имеет фиксированную ширину для каждого поля данных, Simulink ® предоставляет блоки для разделения строки по индексу. После разделения строк каждое поле может обрабатываться отдельно.

В настоящее время эти возможности не поддерживаются:
| Категория | Описание ограничения | Работа |
|---|---|---|
Строковый массив | Массивы строк не поддерживаются. | Используйте строки только в качестве скаляров. |
Символы Юникода | Строки Simulink не поддерживают весь набор Unicode. | Строки Simulink поддерживают 256 символов набора символов ISO/IEC 8859-1 (основные латинские и Latin-1 дополнения). Эти символы являются первыми 256 кодовыми точками Юникода. |
Система MATLAB, S-функция MATLAB, диаграмма состояния MATLAB | Пользовательские блоки, созданные с этими блоками, не поддерживают строки. | — |
Константа, Начальное условие | Эти блоки не работают со строками. | Используйте блок «Строковая константа». |
Управляющий вход блоков коммутатора, мультипортового коммутатора, регистра коммутатора и If | Управляющий вход блока Switch не принимает строки. | Используйте входные данные этих блоков. |
Simulink. Сигнал, Simulink. Параметр | Блоки Simulink.Signal и Simulink.Parameter не поддерживают строки. | — |
Блок преобразования типов данных | Не используйте блок «Преобразование типа данных» для преобразования в строки или из них. | Использовать блоки преобразования строк |
Регистрация невиртуальных шин, содержащих строковые элементы | Если невиртуальная шина содержит строковый элемент, то невозможно зарегистрировать всю виртуальную шину. По-прежнему можно регистрировать нестроковые элементы. | |
В блок рабочей области | Загрузите строки с помощью параметра «В рабочую область». | Зарегистрируйтесь с использованием выходного порта. |
В блок файла | Загрузите строки с помощью параметра «В файл». | — |
Блоки Scope и Spectrum Analyzer, приложение Logic Analyzer | Блоки Scope и Spectrum Analyzer и приложение Logic Analyzer не отображают строки. | Используйте окно Просмотр (Display), Инспектор данных моделирования (Simulation Data Inspector) или Просмотр последовательности (Sequence Viewer) в окне Поток состояний (Stateflow). |
S-функции | S-функции не поддерживают строковый тип данных. | — |
Создать строку | Сканировать строку | Сравнение строк | Конкатенат строки | Строковая константа | Поиск строки | Длина строки | Строка в ASCII | Строка для удвоения | Строка в перечисление | Строка в одну | stringtype | Подстрока | Натягивать