Используйте строки в нескольких приложениях, когда вы хотите передать и манипулировать текстом. Например, при моделировании системы топливного регулирования вместо использования перечисленных данных для моделирования уровней топлива можно использовать строки, такие как "LOW"
или "EMPTY"
. Simulink® строки совместимы с MATLAB® строки.
Строки Simulink являются встроенным типом данных сигнала. Они появляются в редакторе Simulink следующим образом "strN"
(например, строка с максимальной длиной N символов) или «строка» для строк без максимальной длины (динамические строки). Длина строки может варьироваться от 1 до 32 766 символов.
Строчные сигналы Simulink по своей сути дискретны. Если ваш строчный сигнал имеет непрерывный шаг расчета, модель генерирует ошибку во время компиляции.
Simulink обрабатывает строковые переменные и выражения, такие как «a» + «b», так же, как и числовые переменные. Значение строковой переменной может быть как вектором символов, так и строкой MATLAB. Строковые переменные могут существовать в рабочих областях основы, модели и маски.
Строковые литералы заданы двойными кавычками ("Hello"
) или одинарные кавычки ('Hello'
). Чтобы соответствовать строкам MATLAB, используйте двойные кавычки. Строки появляются на портах и в блоке Display с двойными кавычками.
Строки Simulink поддерживают 256 символов набора символов 8859-1 ISO/IEC. Эти символы являются первыми 256 кодовыми точками Юникода. Simulink не поддерживает первый символ char(0)
(«NULL») и возвращает ошибку, если строка содержит этот символ.
Когда символ не может быть отображен, блок хранит фактическую информацию и выводит escape-символ со связанным октальным значением для символа. Для примера десятичное значение управляющего символа для BREAK PERMITTED HERE
равен 130. Блок отображает этот управляющий символ как сбежавший восьмерик \202
. Блок ASCII to String возвращается как сброшенные восьмеричные символы в области значений Юникод от 0000 до 001F и 007F-009F.
В этой теме описывается, как использовать строки в Simulink, включая:
Список доступных строковых блоков и блоков, характерных для строковых преобразований
Передача строковых констант в другие строковые блоки
Ядро символов в строках
Строки без максимальной длины
Взаимодействия с Stateflow®
Сгенерированный код
Ограничения
Эта тема также включает простые примеры, иллюстрирующие, как использовать строковые блоки. Примеры в этой теме позволяют отображать имена блоков. Чтобы контролировать отображение имен блоков, на вкладке Format, выберите Auto > Hide Automatic Block Names. Для примера можно использовать строковые блоки для отображения и извлечения данных о координатах и поиска шаблонов в строках.
Чтобы работать со строками в вашей модели, используйте эту таблицу:
Действие | Блок |
---|---|
Преобразуйте вектор uint8 в строчный сигнал. | |
Составьте выход строчного сигнала на основе параметра Format и входных сигналов. | |
Отсканируйте вход строку и преобразуйте ее в сигналы в соответствии с форматом, заданным Format параметром. | |
Сравните две входные строки. | |
Объедините входные строки в одну выходную строку. | |
Вывод строки, заданной параметром String. | |
Верните индекс первого вхождения строки шаблона, sub в str текстовых строк. | |
Вывод количества символов в вход строке. | |
Преобразуйте строчный сигнал в вектор uint8. | |
Преобразуйте строчный сигнал в сигнал double. | |
Преобразуйте строчный сигнал в один сигнал. | |
Преобразуйте вход строку в перечисленный сигнал. | |
Извлеките подстроку из строчного сигнала. | |
Преобразуйте входной сигнал в строчный сигнал. |
Эти блоки Simulink поддерживают строки.
Блок | Примечания |
---|---|
Bus Assignment | Невиртуальный и виртуальный. |
Bus Creator | Невиртуальный и виртуальный. |
Bus Selector | Невиртуальный и виртуальный. |
Data Store Memory | — |
Data Store Read | — |
Data Store Write | — |
Data Type Duplicate | — |
Display | Отображение строк с двойными кавычками. |
From | — |
From Workspace | Интерполяция данных не поддерживается. |
Goto | — |
Ground | Значение заземления |
Inport | Включая корневой уровень. |
Manual Variant Sink | — |
Manual Variant Source | — |
Manual Switch | Смешанные числовые и строковые типы отсутствуют. Если строк несколько, блок использует строку с самым большим размером или динамическую строку. |
MATLAB Function | — |
Merge | — |
Model | — |
Multiport Switch | Смешанные числовые и строковые типы отсутствуют. Если строк несколько, блок использует строку с самым большим размером или динамическую строку. |
Outport | Включая корневой уровень. |
Probe | — |
Signal Editor | Интерполяция данных не поддерживается. |
Signal Specification | — |
Subsystem (все изменения) | — |
Switch | Смешанные числовые и строковые типы отсутствуют. Если строк несколько, блок использует строку с самым большим размером или динамическую. |
Terminate Function | — |
Terminator | — |
Variant Source | — |
Variant Model | — |
Variant Subsystem | — |
Width | — |
Чтобы использовать текстовые данные для управления поведением диаграммы и манипулировать текстом, чтобы создать выход на естественном языке в Stateflow, используйте строки в графиках языка действий С. Stateflow предоставляет операторам манипулировать строками. Для получения дополнительной информации смотрите Управление текстовой информацией при помощи строк (Stateflow).
Чтобы задать строковые константы, используйте блок String Constant. Не используйте блок Constant, который не принимает строки. В блоке String Constant введите строку с двойными кавычками, такими как "Hello!"
в параметре String. Это то же самое, что и добавление числовой константы в параметр Constant value блока Constant.
Строки Simulink автоматически имеют дело с завершением строки. Не используйте null terminator в конце строки. Если Simulink обнаруживает символ null в любом месте строки, он генерирует ошибку. Simulink обрабатывает строки во время симуляции и генерации кода следующим образом:
Во время симуляции модель моделирует. Больше ничего делать не надо.
Во время генерации кода C программное обеспечение добавляет нулевой терминатор строки в конец строки. Для примера, если buffer size строки равен 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
массивы. Поэтому размер строки ограничивается фиксированным buffer size в сгенерированных C
код. Программа обрезает дополнительные символы и вставляет в конец терминатора строки null (для примера, на выходе блока 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++ (Embedded Coder).
Вы не можете использовать блок Data Type Conversion для преобразования типов строковых данных в другие типы данных и наоборот. Вместо этого используйте эти блоки преобразования строк.
Преобразовать | Блок |
---|---|
Строчный сигнал к векторному сигналу uint8 с сохранением символов ASCII | |
Uint8 вектора сигнал в строчный сигнал | |
Строчный сигнал к числовому сигналу двойного типа данных | |
Строчный сигнал к числовому сигналу с одним типом данных | |
Строчный сигнал к типу данных перечисленного сигнала | |
Входной сигнал в строчный сигнал |
Добавьте эти блоки к модели:
String Constant
String to ASCII
ASCII to String
Два блока Display
Соедините блоки как показано на рисунке.
В блоке String Constant введите строку, такую как "Hello!"
.
В блоке String to ASCII измените максимальный размер строки на 10.
Симулируйте модель и наблюдайте содержимое блоков Display.
Display1 показывает Hello!
преобразован в его ASCII эквивалент. Для примера, 72
является эквивалентным ASCII H
и 33
является эквивалентным ASCII !
.
Display1 заполнил оставшееся пространство до максимальной длины строки 10 нулями (нулевые символы).
Отображение показывает Hello!
после того, как блок ASCII to String повторно преобразует код ASCII в строку.
Добавьте эти блоки к модели:
String Constant
String to Enum
Display
Соедините блоки как показано на рисунке.
В блоке String Constant введите строку, такую как "Hello!"
Создайте класс перечисления Simulink с именем BasicStrings
и храните его в текущей папке с именем файла BasicStrings.m
, для примера:
classdef BasicStrings < Simulink.IntEnumType enumeration Hello(0) Red(1) Blue(2) end end
В блоке String to Enum введите класс перечисления следующим Enum: BasicStrings
.
Симулируйте модель и наблюдайте содержимое блока Display.
В этом примере показано, как можно форматировать и выводить набор данных как географические координаты с помощью блоков Compose String и Scan String. На основе scanf C
и printf
функции, блоки Compose String и Scan String аналогичны по концепции sprintf
и sscanf
функции, за основным исключением, что эти функции работают с массивами, которые блоки не делают. Для получения дополнительной информации о строковых блоках форматированных символов, смотрите Compose String и Scan String.
Блок Compose String создает строку из нескольких строк и числовых входов вместе взятых. Используйте параметр Format для форматирования выхода каждого входа, по одному оператору формата для каждого входа. Каждый оператор формата начинается со знака процента, %
, далее следует символ преобразования, для примера, %f
генерирует выход фиксированной точки. Чтобы дополнить выход строки, можно также добавить дополнительные символы в спецификацию формата, чтобы появиться в выходах.
Добавьте эти блоки к модели:
Шесть Constant
Один Compose String
Один Scan String
Семь Display
Измените значения констант блоков Constant на показанные и соедините блоки.
В параметре Format для блоков Compose String введите следующие спецификации формата:
'%g° %g'' %f" N, %g° %g'' %f" W'
The %g
и %f
операторы форматирования преобразуют числовые входы в значения с плавающей точкой. %g
является более компактной версией %f
.
Символ степени (°), N, W и '
являются дополнительными строками для отображения в выход строке.
Блок Compose String объединяет выход в порядке ввода, форматирует каждый вход согласно своему оператору формата, добавляет дополнительные строки и выводит строку, форматированную как направленную и окруженную двойными кавычками ("
).
В параметре Format для блока Scan String введите следующие спецификации формата:
'%g° %g'' %f" N, %g° %g'' %f" W'
The %g
и %f
операторы форматирования преобразуют числовые входы в значения с плавающей точкой. %g
является более компактной версией %f
.
Символ степени (°), N, W и '
являются дополнительными строками для отображения в выход строке.
Блок Scan String читает свой вход, преобразует его в соответствии с форматом, заданным спецификацией преобразования, и возвращает результаты как скаляры. Блок форматирует каждый выход в соответствии со спецификацией преобразования. Указанный текст игнорируется непосредственно перед или после спецификатора преобразования.
Чтобы найти шаблон в строке, используйте блок String Find.
Добавьте эти блоки к модели:
Два String Constant
String Find
Один Display
Соедините блоки как показано на рисунке.
В первом String Constant блоке введите строку, такую как "Hello!Goodbye!"
.
Подключение этого блока к str входному порту блока String Find заставляет блок String Find искать шаблон в этой строке.
Во втором String Constant блоке введите строку (или шаблон), которую нужно искать в первой String Constant строке, такой как "Goodbye!"
.
Подключение этого блока к sub входному порту блока означает, что String Find ищет этот шаблон с str входа.
Симулируйте модель и наблюдайте содержимое блока Display. В данном примере блок отображается 7
, которое является местом расположения буквы G
.
Чтобы извлечь строку из исходной строки, используйте блок Substring. Этот пример использует модель, описанную в Find Patterns in Strings.
Добавьте блок Substring к модели.
В блоке Substring выберите параметр Output string from 'idx' to end. Установка этого параметра извлекает строку из входа местоположения порта idx в конец строки.
Соедините новый блок как показано на рисунке.
Симулируйте модель и наблюдайте содержимое блока Display. В данном примере блок отображается "Goodbye!"
, которая является подстрокой, извлеченной начиная с idx до конца строки.
В этом примере показаны основные манипуляции с строками с использованием строковых блоков Simulink.
Для модели, которая выглядит как следующая, симулируйте ее.
Заметьте, что модель:
Создает две строки, "beginning middle end"
и "middle"
, использование String Constant блоков.
Поиск первого вхождения "middle"
(idx) и добавляет расположение первой буквы (11
) к длине "middle"
(7
). Он использует блоки String Find и String Length.
Извлечения из "beginning middle end"
подстрока, которая начинается с конца "middle"
(idx+string length = 18
), которая является строкой "end"
. Он использует блок Substring.
Сравнивает вычисленное значение "end"
с фактической строкой "end"
, который возвращает логическое значение "1"
. Он использует блоки String Constant и String Compare.
Преобразует логическое значение "1"
к его строковому эквиваленту, "true"
. Он использует блок To String.
Чтобы увидеть местоположения символов по всей модели, добавьте по одному Display блокируйте каждый к выходу блоков String Find и String Length и симулируйте его.
В дополнение к использованию строк в новых моделях можно обновить существующие модели, чтобы использовать строки. Использование строк может упростить модель и облегчить ее понимание.
Например, в старых моделях вы, возможно, использовали перечисленные типы данных для представления или передачи текста в модели. The sldemo_fuelsys
пример перечисленных констант в нескольких областях для работы с текстовыми данными.
В sldemo_fuelsys/fuel_rate_control/control_logic
Диаграмма Stateflow использует перечисленные данные для указания уровней топлива.
В sldemo_fuelsys/fuel_rate_control/airflow_calc
, чтобы обнаружить, является ли топливо низким, модель использует Enumerated Constant и Relational Operator блоки.
Вместо этого можно использовать блоки String Constant и String Compare путем установки:
Параметр String Constant
String для LOW.
Использование блока String Compare для обнаружения LOW
исходит из другой части модели.
Вместо удаления всех образцов перечисленных констант можно использовать строки в сочетании с перечисленными константами. Это позволяет вам пошагово мигрировать модель, чтобы использовать строки. В sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate
блок Multiport Switch принимает четыре перечисленных входов данных.
Если порт fuel_mode выводит строку, можно преобразовать эту строку в тип перечисленных данных, чтобы работать с выходом из блоков Constant в этой модели.
В этом примере показано, как проанализировать текстовые сообщения в формате NMEA GPS с помощью строковых блоков Simulink ®.
Обзор
Эта модель показывает, как использовать строковый тип данных и блоки, предоставленные Simulink ®, для чтения входных текстовых сообщений и извлечения числовых и текстовых данных.
Считайте заголовок сообщения и преобразуйте в перечисление
Simulink ® предоставляет блок String To Enum для преобразования строки в соответствующее значение перечисления. В этой модели строка заголовка «RMB» преобразуется в NMEASentence.RMB.
Проанализируйте текстовое сообщение с помощью блока Scan String
Один из способов анализа текстового сообщения - использовать блок Scan String. Он работает как функция sscanf на C и MATLAB ®.
Синтаксический анализ текстового сообщения с фиксированной шириной поля
Когда текстовое сообщение имеет фиксированную ширину для каждого поля данных, Simulink ® предоставляет блоки для разделения строки по индексам. После разделения строк каждое поле может обрабатываться отдельно.
В настоящее время эти возможности не поддерживаются:
Категория | Описание ограничения | Работа |
---|---|---|
Строковые массивы | Строковые массивы не поддерживаются. | Используйте строки только как скаляры. |
Символы Юникода | Строки Simulink не поддерживают весь набор Юникод. | Строки Simulink поддерживают 256 символов набора символов ISO/IEC 8859-1 (Basic Latin и Latin-1 Supplement). Эти символы являются первыми 256 кодовыми точками Юникода. |
MATLAB System, MATLAB S-Function, Stateflow MATLAB графика | Пользовательские блоки, созданные с помощью этих блоков, не поддерживают строки. | — |
Constant, Initial Condition | Эти блоки не работают со строками. | Используйте String Constant блок. |
Управляйте входом Switch, Multiport Switch, Switch Case и If блоков | Управляющий вход блока Switch не принимает строки. | Используйте входы данных этих блоков. |
Simulink.Signal, Simulink.Parameter | Блоки Simulink.Signal и Simulink.Parameter не поддерживают строки. | — |
Data Type Conversion блок | Не используйте блок Data Type Conversion для преобразования в или из строк. | Используйте блоки преобразования строк |
Logging of nonvirtual buses that contain string elements | If a nonvirtual bus contains a string element, the entire virtual bus cannot be logged. You can still log the nonstring elements. | |
To Workspace блок | Загрузите строки с помощью To Workspace. | Журнал с использованием выходного порта. |
To File блок | Загрузите строки с помощью To File. | — |
Scope и Spectrum Analyzer блоки, приложение Logic Analyzer | Блоки Scope и Spectrum Analyzer и приложение Logic Analyzer не отображают строки. | Используйте Display, Simulation Data Inspector или Sequence Viewer в Stateflow. |
S-функции | S-функции не поддерживают тип данных строк. | — |
Compose String | Scan String | String Compare | String Concatenate | String Constant | String Find | String Length | String To ASCII | String to Double | String To Enum | String to Single | stringtype
| Substring | To String