Строки Simulink

Используйте строки в нескольких приложениях, когда вы хотите передать и манипулировать текстом. Например, при моделировании системы топливного регулирования вместо использования перечисленных данных для моделирования уровней топлива можно использовать строки, такие как "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 в строчный сигнал.

ASCII to String

Составьте выход строчного сигнала на основе параметра Format и входных сигналов.

Compose String

Отсканируйте вход строку и преобразуйте ее в сигналы в соответствии с форматом, заданным Format параметром.

Scan String

Сравните две входные строки.

String Compare

Объедините входные строки в одну выходную строку.

String Concatenate

Вывод строки, заданной параметром String.

String Constant

Верните индекс первого вхождения строки шаблона, sub в str текстовых строк.

String Find

Вывод количества символов в вход строке.

String Length

Преобразуйте строчный сигнал в вектор uint8.

String to ASCII

Преобразуйте строчный сигнал в сигнал double.

String to Double

Преобразуйте строчный сигнал в один сигнал.

String to Single

Преобразуйте вход строку в перечисленный сигнал.

String to Enum

Извлеките подстроку из строчного сигнала.

Substring

Преобразуйте входной сигнал в строчный сигнал.

To String

Эти блоки 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

Строки Simulink и Stateflow

Чтобы использовать текстовые данные для управления поведением диаграммы и манипулировать текстом, чтобы создать выход на естественном языке в Stateflow, используйте строки в графиках языка действий С. Stateflow предоставляет операторам манипулировать строками. Для получения дополнительной информации смотрите Управление текстовой информацией при помощи строк (Stateflow).

Строковые константы

Чтобы задать строковые константы, используйте блок String Constant. Не используйте блок Constant, который не принимает строки. В блоке String Constant введите строку с двойными кавычками, такими как "Hello!" в параметре String. Это то же самое, что и добавление числовой константы в параметр Constant value блока Constant.

Строки Simulink и нулевые символы

Строки 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

String To ASCII

Uint8 вектора сигнал в строчный сигнал

ASCII to String

Строчный сигнал к числовому сигналу двойного типа данных

String to Double

Строчный сигнал к числовому сигналу с одним типом данных

String to Single

Строчный сигнал к типу данных перечисленного сигнала

String To Enum

Входной сигнал в строчный сигнал

To String

Преобразуйте строку в ASCII и обратно в строку

  1. Добавьте эти блоки к модели:

    • String Constant

    • String to ASCII

    • ASCII to String

    • Два блока Display

  2. Соедините блоки как показано на рисунке.

  3. В блоке String Constant введите строку, такую как "Hello!".

  4. В блоке String to ASCII измените максимальный размер строки на 10.

  5. Симулируйте модель и наблюдайте содержимое блоков Display.

    • Display1 показывает Hello! преобразован в его ASCII эквивалент. Для примера, 72 является эквивалентным ASCII H и 33 является эквивалентным ASCII !.

    • Display1 заполнил оставшееся пространство до максимальной длины строки 10 нулями (нулевые символы).

    • Отображение показывает Hello! после того, как блок ASCII to String повторно преобразует код ASCII в строку.

Преобразование строки в тип перечисленных данных

  1. Добавьте эти блоки к модели:

    • String Constant

    • String to Enum

    • Display

  2. Соедините блоки как показано на рисунке.

  3. В блоке String Constant введите строку, такую как "Hello!"

  4. Создайте класс перечисления Simulink с именем BasicStrings и храните его в текущей папке с именем файла BasicStrings.m, для примера:

    classdef BasicStrings < Simulink.IntEnumType
    enumeration
        Hello(0)
        Red(1)
        Blue(2) 
        end
    end 
  5. В блоке String to Enum введите класс перечисления следующим Enum: BasicStrings.

  6. Симулируйте модель и наблюдайте содержимое блока Display.

Отображение и извлечение координатных данных

В этом примере показано, как можно форматировать и выводить набор данных как географические координаты с помощью блоков Compose String и Scan String. На основе scanf C и printf функции, блоки Compose String и Scan String аналогичны по концепции sprintf и sscanf функции, за основным исключением, что эти функции работают с массивами, которые блоки не делают. Для получения дополнительной информации о строковых блоках форматированных символов, смотрите Compose String и Scan String.

Блок Compose String создает строку из нескольких строк и числовых входов вместе взятых. Используйте параметр Format для форматирования выхода каждого входа, по одному оператору формата для каждого входа. Каждый оператор формата начинается со знака процента, %, далее следует символ преобразования, для примера, %f генерирует выход фиксированной точки. Чтобы дополнить выход строки, можно также добавить дополнительные символы в спецификацию формата, чтобы появиться в выходах.

  1. Добавьте эти блоки к модели:

    • Шесть Constant

    • Один Compose String

    • Один Scan String

    • Семь Display

  2. Измените значения констант блоков Constant на показанные и соедините блоки.

  3. В параметре Format для блоков Compose String введите следующие спецификации формата:

    '%g° %g'' %f" N, %g° %g'' %f" W'
    • The %g и %f операторы форматирования преобразуют числовые входы в значения с плавающей точкой. %g является более компактной версией %f.

    • Символ степени (°), N, W и ' являются дополнительными строками для отображения в выход строке.

    Блок Compose String объединяет выход в порядке ввода, форматирует каждый вход согласно своему оператору формата, добавляет дополнительные строки и выводит строку, форматированную как направленную и окруженную двойными кавычками (").

  4. В параметре Format для блока Scan String введите следующие спецификации формата:

    '%g° %g'' %f" N, %g° %g'' %f" W'
    • The %g и %f операторы форматирования преобразуют числовые входы в значения с плавающей точкой. %g является более компактной версией %f.

    • Символ степени (°), N, W и ' являются дополнительными строками для отображения в выход строке.

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

Поиск шаблонов в строках

Чтобы найти шаблон в строке, используйте блок String Find.

  1. Добавьте эти блоки к модели:

    • Два String Constant

    • String Find

    • Один Display

  2. Соедините блоки как показано на рисунке.

  3. В первом String Constant блоке введите строку, такую как "Hello!Goodbye!".

    Подключение этого блока к str входному порту блока String Find заставляет блок String Find искать шаблон в этой строке.

  4. Во втором String Constant блоке введите строку (или шаблон), которую нужно искать в первой String Constant строке, такой как "Goodbye!".

    Подключение этого блока к sub входному порту блока означает, что String Find ищет этот шаблон с str входа.

  5. Симулируйте модель и наблюдайте содержимое блока Display. В данном примере блок отображается 7, которое является местом расположения буквы G.

Извлечение строки

Чтобы извлечь строку из исходной строки, используйте блок Substring. Этот пример использует модель, описанную в Find Patterns in Strings.

  1. Добавьте блок Substring к модели.

  2. В блоке Substring выберите параметр Output string from 'idx' to end. Установка этого параметра извлекает строку из входа местоположения порта idx в конец строки.

  3. Соедините новый блок как показано на рисунке.

  4. Симулируйте модель и наблюдайте содержимое блока 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 в этой модели.

Синтаксический анализ текстового сообщения GPS NMEA

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

Обзор

Эта модель показывает, как использовать строковый тип данных и блоки, предоставленные Simulink ®, для чтения входных текстовых сообщений и извлечения числовых и текстовых данных.

Считайте заголовок сообщения и преобразуйте в перечисление

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

Проанализируйте текстовое сообщение с помощью блока Scan String

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

Синтаксический анализ текстового сообщения с фиксированной шириной поля

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

Ограничения строк 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-функции не поддерживают тип данных строк.

См. также

| | | | | | | | | | | | |

Похожие темы