Используйте строки в нескольких приложениях, когда это необходимо, чтобы передать и управлять текстом. Например, при моделировании топливной системы управления, вместо того, чтобы использовать перечисленные данные, чтобы смоделировать топливные уровни, можно использовать строки как "LOW"
или "EMPTY"
. Simulink® строки совместимы с MATLAB® строки.
Строки Simulink являются встроенным типом данных сигнала. Они появляются в Редакторе Simulink как "strN"
(например, строка с максимальной продолжительностью символов N) или "строка" для строк без максимальной длины (динамические строки). Длины строки могут лежать в диапазоне от 1 до 32 766 символов.
Строчные сигналы Simulink по сути дискретны. Если ваш строчный сигнал имеет время непрерывной выборки, модель генерирует ошибку во время компиляции.
Simulink обрабатывает строковые переменные и выражения, такие как "a" + "b", тот же способ, которым это обрабатывает числовые переменные. Значение строковой переменной может быть и вектором символов и строкой MATLAB. Строковые переменные могут существовать в основе, модели и рабочих областях маски.
Строковые литералы заданы с двойными кавычками ("Hello"
) или одинарные кавычки ('Hello'
). Чтобы быть сопоставимыми со строками MATLAB, используйте двойные кавычки. Строки появляются на портах и в блоке Display с двойными кавычками.
Строки Simulink поддерживают 256 символов ISO/IEC 8859-1 набор символов. Эти символы являются первыми 256 кодовыми точками Unicode. Simulink не поддерживает первый символьный char(0)
("NULL") и возвращает ошибку, если строка содержит этот символ.
Когда символ не может быть отображен, блок хранит фактическую информацию и выводит символ ESC со связанным восьмеричным значением для символа. Например, управляющий символ десятичного значения для BREAK PERMITTED HERE
130. Блок отображает этот управляющий символ как завершенный восьмеричный \202
. Блок ASCII to String возвращает, как оставлено octals символы в области значений набора Unicode 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 | Основывайтесь значением является |
In Bus Element | Включая корневой уровень. |
Inport | Включая корневой уровень. |
Manual Variant Sink | — |
Manual Variant Source | — |
Manual Switch | Никакие смешанные числовые и строковые типы. Если существует несколько строк, строка использования блока с самым большим размером или динамическая строка. |
MATLAB Function | — |
Merge | — |
Model | — |
Multiport Switch | Никакие смешанные числовые и строковые типы. Если существует несколько строк, строка использования блока с самым большим размером или динамическая строка. |
Out Bus Element | Включая корневой уровень. |
Outport | Включая корневой уровень. |
Probe | — |
Signal Editor | Интерполяция данных не поддерживается. |
Signal Specification | — |
Subsystem (все изменения) | — |
Switch | Никакие смешанные числовые и строковые типы. Если существует несколько строк, строка использования блока с самым большим размером или динамическим. |
Terminate Function | — |
Terminator | — |
Variant Source | — |
Variant Model | — |
Variant Subsystem | — |
Width | — |
Чтобы использовать текстовые данные для поведения диаграммы управления и управлять текстом, чтобы создать естественный язык выход в Stateflow, используйте строки в графиках языка действия C. Stateflow обеспечивает операторы, чтобы управлять строками. Для получения дополнительной информации смотрите, Управляют Текстовой информацией при помощи Строк (Stateflow).
Чтобы задать строковые константы, используйте блок String Constant. Не используйте блок Constant, который не принимает строки. В блоке String Constant введите строку с двойными кавычками, такими как "Hello!"
в параметре String. Это совпадает с добавлением числовой константы в параметре Constant value блока Constant.
Строки Simulink автоматически имеют дело с завершением строки. Не используйте пустой терминатор строки в конце строки. Если Simulink обнаруживает нулевой символ где-нибудь в строке, он генерирует ошибку. Simulink обрабатывает строки в процессе моделирования и генерацию кода можно следующим образом:
В процессе моделирования модель симулирует. Вы не должны делать ничего больше.
Во время генерации кода C программное обеспечение добавляет пустой терминатор строки в конец строки. Например, если buffer size строки равняется 10, и действительным значением строки является "AB"
, третий символ в сгенерированном коде является пустым терминатором строки.
По мере необходимости представьте блоки в виде строки, создают и используют типы данных String, например, когда блок выводит строковый тип. Можно создать строки, не задавая максимальную продолжительность символов. Мы обращаемся к строкам без максимальной продолжительности символов как динамические строки.
Чтобы создать типы данных String для блоков, которые поддерживают строки, вы можете:
Используйте Output data type или параметр Data type на вкладке Signal Attributes блока Simulink.
Чтобы создать тип данных String без максимальной продолжительности символов, задайте string
. Это действие создает динамическую строку.
Создать тип данных String с максимальной продолжительностью символов, таких как 100
, войти stringtype(100)
. Можно также использовать stringtype
функция на командной строке MATLAB, чтобы создать тип данных String.
Используйте set_param
функция с OutDataTypeStr
параметр, например:
set_param(gcb,'OutDataTypeStr','stringtype(100)')
Эта функция создает объект типа данных String продолжительность имеющая 100 символов. Длины строкового типа могут лежать в диапазоне от 1 до 32 766 символов, включительно.
Например, с помощью блока String Constant, чтобы создать строку с набором параметров Output data type к stringtype(31)
создает тип данных String str31
. 31 максимальное количество символов, которые может иметь строка.
Сконфигурировать элемент Simulink.Bus
объект принять строки с помощью Редактора Шины, для параметра DataType Simulink.BusElement
возразите, введите строковый тип. Например, чтобы задать тип данных String, максимальная продолжительность которого символов равняется 10, введите stringtype(10)
. Параметр Mode обновляется соответственно. Чтобы задать динамический сигнал с переменной длиной, введите string
. Можно создать смешанное числовое использование и представить объекты в виде строки для элементов шины. Для получения дополнительной информации о создании Bus
и BusElement
объекты с Редактором Шины, смотрите Bus Editor.
Рассмотрите эти примечания для строк, и сгенерировал C
и C++
код.
C
Код для динамического типа данных StringСимуляция блоков, которые используют динамический тип данных String, отличается от сгенерированного C
код этими способами:
Сигналы с string
тип данных имеет динамические размеры в процессе моделирования. Другими словами, размер строки может варьироваться между 0 и 32766. Однако в сгенерированном C
код, кодер хранит строки как фиксированный размер char_T
массивы. Поэтому размер строки ограничивается фиксированным buffer size в сгенерированном C
код. Программное обеспечение обрезает дополнительные символы и вставляет пустой терминатор строки в конце (например, в выходе блока String Concatenate).
Кодер генерирует инварианты строки (параметры или сигналы) как C
- разработайте дважды заключенные в кавычки строки.
Buffer size по умолчанию для сигнала с типом данных String составляет 256 байтов (содержит самое большее 255 8-битных символов ASCII). Чтобы изменить этот buffer size, используйте Buffer size динамически измеренной строки (байты) (Simulink Coder) параметр конфигурации.
Чтобы заменить установку всей модели для отдельного строчного сигнала, используйте stringtype(N)
как тип данных сигнала. Сигналы с этим типом данных выделяются буфер N+1
байты в сгенерированном C
код (символы N плюс один пустой терминатор строки).
Нет никакого различия между симуляцией и не сгенерировало C++
код, когда строки хранятся как std::string
объекты, которые имеют то же динамическое поведение как симуляция.
C++
Библиотека строки генерации кодаДля C++
генерация кода, std::string
библиотека доступна для основанной на ERT цели с лицензией Embedded Coder™. Для получения дополнительной информации смотрите, Генерируют Код для Блоков Строки при помощи Стандарта Библиотека Строки C++ (Embedded Coder).
Вы не можете использовать блок Data Type Conversion, чтобы преобразовать типы данных String в другие типы данных и с другой стороны. Вместо этого используйте эти блоки преобразования строк.
Преобразовывать | Блок |
---|---|
Строчный сигнал к 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.
В этом примере показано, как можно отформатировать и вывести набор данных как географические координаты с помощью блоков Scan String и Compose 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'
%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 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. Этот пример использует модель, описанную в Шаблонах Находки в Строках.
Добавьте блок 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 Length и String Find.
Извлечения из "beginning middle end"
подстрока, которая начинает с конца "middle"
(idx+string length = 18
), который является строкой "end"
. Это использует блок Substring.
Сравнивает расчетное значение "end"
с фактической строкой "end"
, который возвращает булево значение "1"
. Это использует блоки String Compare и String Constant.
Преобразует булево значение "1"
к его эквивалентной строке, "true"
. Это использует блок To String.
Чтобы видеть местоположения символов в модели, добавьте один блок Display каждый в выход String Find и блоков String Length и симулируйте его.
В дополнение к использованию строк в новых моделях можно обновить существующие модели, чтобы использовать строки. Используя строки может упростить модель и облегчить понимать.
Например, в более старых моделях, вы, возможно, использовали перечисленные типы данных, чтобы представлять или передать текст в вашей модели. sldemo_fuelsys
перечислимые константы в качестве примера в нескольких областях, чтобы работать с текстовыми данными.
В sldemo_fuelsys/fuel_rate_control/control_logic
, диаграмма Stateflow использует перечисленные данные, чтобы указать на топливные уровни.
В sldemo_fuelsys/fuel_rate_control/airflow_calc
, чтобы обнаружить, если топливо является низким, модель использует блоки Relational Operator и Enumerated Constant .
Вместо этого можно использовать String Constant и блоки String Compare путем установки:
Параметр String String Constant к LOW
.
Используя блок String Compare, чтобы обнаружить, если LOW
прибывает из другой части модели.
Вместо того, чтобы удалить все экземпляры перечислимых констант, можно использовать строки в сочетании с перечислимыми константами. Выполнение так позволяет вам инкрементно перемещать свою модель, чтобы использовать строки. В sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate
, блок Multiport Switch принимает четыре перечислимых ввода данных.
Если порт fuel_mode выводит строку, можно преобразовать ту строку в перечислимый тип данных, чтобы работать с выходом от блоков Constant в этой модели.
В этом примере показано, как проанализировать текстовые сообщения в формате GPS NMEA с помощью блоков строки Simulink®.
Обзор
Эта модель показывает, как использовать тип данных String и блоки, обеспеченные Simulink®, чтобы считать входные текстовые сообщения и извлечь числовой и текстовые данные.
Считайте заголовок сообщения и преобразуйте в перечисление
Simulink® обеспечивает блок String To Enum, чтобы преобразовать строку в соответствующую перечислимую величину. В этой модели строка заголовка "китайский юань" преобразована в NMEASentence.RMB.
Проанализируйте текстовое сообщение с помощью блока Scan String
Один способ проанализировать текстовое сообщение состоит в том, чтобы использовать блок Scan String. Это работает как функция sscanf в C и MATLAB®.
Проанализируйте текстовое сообщение с фиксированной шириной поля
Когда текстовое сообщение зафиксировало ширину для каждого поля данных, Simulink® обеспечивает блоки, чтобы разделить строку индексом. После того, как строки были разделены, каждое поле может быть обработано отдельно.
Эти возможности в настоящее время не поддержаны:
Категория | Описание ограничения | Работа вокруг |
---|---|---|
Массив строк | Строковые массивы не поддерживаются. | Используйте строки только в качестве скаляров. |
Символы Unicode | Строки Simulink не поддерживают целый набор Unicode. | Строки Simulink поддерживают 256 символов ISO/IEC 8859-1 набор символов (Основное латинское и латинское 1 дополнение). Эти символы являются первыми 256 кодовыми точками Unicode. |
MATLAB System, MATLAB S-Function, Stateflow график MATLAB | Пользовательские блоки, созданные с этими блоками, не поддерживают строки. | — |
Constant, Initial Condition | Эти блоки не работают со строками. | Блок Use String Constant. |
Управляйте входом Switch, Multiport Switch, Switch Case и блоков If | Вход управления блока Switch не принимает строки. | Используйте вводы данных этих блоков. |
|
| — |
Блок Data Type Conversion | Не используйте блок Data Type Conversion, чтобы преобразовать в или от строк. | Используйте блоки преобразования строк |
Logging of nonvirtual buses that contain string elements | If a nonvirtual bus contains a string element, the entire 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-функции не поддерживают тип данных String. | — |