主要内容

动态仿真模块字符串

当您希望传递和操作文本时,在多个应用程序中使用字符串。例如,当对燃油控制系统建模时,您可以使用字符串,而不是使用枚举数据来建模燃油水平“低”“空”.动态仿真模块®字符串与MATLAB兼容®字符串。

Simulink字符串是一种内置信号数据类型。它们在Simulink编辑器中以“strN(例如,最大长度为的字符串N字符)或“string”表示没有最大长度的字符串(动态字符串)。字符串长度范围为1到32,766个字符。

Simulink字符串信号本质上是离散的。如果字符串信号具有连续采样时间,则模型在编译时生成错误。

Simulink处理字符串变量和表达式,如"a" + "b",与它处理数值变量的方式相同。字符串变量的值既可以是字符向量,也可以是MATLAB字符串。字符串变量可以存在于基本工作区、模型工作区和掩码工作区中。

字符串文字用双引号指定(“你好”)或单引号(“你好”).为了与MATLAB字符串一致,请使用双引号。字符串出现在端口和显示块用双引号。

Simulink字符串支持256个ISO/IEC 8859-1字符集。这些字符是Unicode的前256个编码点。Simulink不支持首字符char (0)("NULL"),如果字符串包含此字符则返回错误。

当一个字符不能显示时,该块存储实际信息并输出一个转义字符和该字符的相关八进制值。例如,的十进制值控制字符将允许在这里是130。该块将此控制字符显示为转义的八进制202年\.的ASCII字符串block返回转义的八进制字符,Unicode设置范围为0000到001F和007F-009F。

本节介绍如何在Simulink中使用字符串,包括:

  • 可用的字符串块和特定于字符串转换的块的列表

  • 将字符串常量传递到其他字符串块

  • 字符串中的空字符

  • 没有最大长度的字符串

  • 与Stateflow交互®

  • 生成的代码

  • 限制

本主题还包括演示如何使用字符串块的简单示例。本主题中的示例支持显示块名称。控件上控制块名称的显示格式选项卡上,选择汽车>隐藏自动块名称.例如,您可以使用字符串块来显示和提取坐标数据,并在字符串中查找模式。

要在模型中处理字符串,请使用以下表格:

行动

将uint8矢量转换为字符串信号。

ASCII字符串

的基础上组成输出字符串信号格式参数和输入信号。

组成字符串

扫描输入字符串,并将其转换为按指定的格式的信号格式参数。

扫描字符串

比较两个输入字符串。

字符串比较

连接输入字符串形成一个输出字符串。

字符串连接

属性指定的字符串字符串参数。

字符串常量

返回模式字符串第一次出现的索引在文本字符串中str

字符串中找到

输出输入字符串中的字符数。

字符串长度

将字符串信号转换为uint8向量。

ASCII字符串

将字符串信号转换为双信号。

字符串双

将字符串信号转换为单个信号。

字符串单

将输入字符串转换为枚举信号。

字符串枚举

从字符串信号中提取子字符串。

子字符串

将输入信号转换为字符串信号。

字符串

这些Simulink块支持字符串。

笔记

总线分配

Nonvirtual和虚拟。

总线的创造者

Nonvirtual和虚拟。

总线选择器

Nonvirtual和虚拟。

数据存储内存

- - - - - -

数据存储读取

- - - - - -

数据存储写

- - - - - -

数据类型重复

- - - - - -

显示

用双引号显示字符串。

- - - - - -

从工作空间

不支持数据插值。

转到

- - - - - -

地面

地面值是""(空字符串)。

在公共汽车元素

包括根水平。

轮廓尺寸

包括根水平。

手动变体水槽

- - - - - -

手动变异来源

- - - - - -

手动开关

没有混合数字和字符串类型。如果有多个字符串,则块使用最大的字符串或动态字符串。

MATLAB函数

- - - - - -

合并

- - - - - -

模型

- - - - - -

多端口切换

没有混合数字和字符串类型。如果有多个字符串,则块使用最大的字符串或动态字符串。

公共汽车元素

包括根水平。

外港

包括根水平。

探针

- - - - - -

信号编辑器

不支持数据插值。

信号规范

- - - - - -

子系统(所有的变化)

- - - - - -

开关

没有混合数字和字符串类型。如果有多个字符串,则块使用最大的字符串或动态字符串。

终止函数

- - - - - -

《终结者》

- - - - - -

变异来源

- - - - - -

变体模型

- - - - - -

不同的子系统

- - - - - -

宽度

- - - - - -

字符串常量

方法指定字符串常量字符串常量块。请勿使用常数块,它不接受字符串。在字符串常量块,输入带有双引号的字符串,例如“你好!”字符串参数。方法中添加一个数值常数的做法是一样的恒定值常量块的参数。

动态仿真模块字符串和空字符

Simulink字符串自动处理字符串终止。不要在字符串的末尾使用空结束符。如果Simulink在字符串的任何地方检测到空字符,它会产生一个错误。Simulink在模拟和代码生成过程中处理字符串的方法如下:

  • 在仿真过程中,模型进行仿真。您不需要做其他任何事情。

  • 在C代码生成过程中,软件在字符串的末尾添加一个空终止符。例如,如果字符串缓冲区大小是10,而真正的字符串值是“AB”,生成的代码中的第三个字符是空终止符。

字符串数据类型

根据需要,字符串块创建和使用字符串数据类型,例如,当块输出字符串类型时。可以在不指定最大字符长度的情况下创建字符串。我们将没有最大字符长度的字符串称为动态字符串。

要为支持字符串的块创建字符串数据类型,您可以:

  • 使用输出数据类型数据类型的参数信号的属性选项卡。

    • 要创建没有最大字符长度的字符串数据类型,请指定字符串.此操作创建一个动态字符串。

    • 要创建具有最大字符长度的字符串数据类型,例如One hundred.,输入stringtype (100).你也可以使用stringtype函数创建一个字符串数据类型。

  • 使用set_param函数与OutDataTypeStr参数,例如:

    set_param (gcb, OutDataTypeStr”、“stringtype(100)”)

    此函数创建一个最大长度为100个字符的字符串数据类型对象。字符串类型的长度可以从1到32,766个字符(包括在内)。

例如,使用字符串常量控件创建一个字符串输出数据类型参数设置为stringtype (31)创建字符串数据类型str31.31是字符串可以拥有的最大字符数。

总线对象中的字符串

的一个元素仿真软件。公共汽车对象使用类型编辑器接受字符串数据类型参数的仿真软件。公共汽车Element对象,输入字符串类型。例如,要指定最大字符长度为10的字符串数据类型,请输入stringtype (10).的模式相应的参数更新。要指定一个可变长度的动态信号,输入字符串.您可以为总线元素创建混合使用的数字和字符串对象。有关创建的更多信息公共汽车BusElement对象,请参见式编辑器

字符串和生成的代码

考虑这些字符串和生成的注释Cc++代码。

模拟和生成的区别C动态字符串数据类型的代码

模拟使用动态字符串数据类型的块与生成的块不同C用以下方法进行编码:

  • 信号与字符串数据类型在模拟过程中具有动态大小。换句话说,字符串的大小可以在0到32766之间变化。然而,在生成的C编码时,编码器将字符串存储为固定大小char_T数组。因此,字符串的大小受生成的固定缓冲区大小的限制C代码。该软件截断额外的字符并在末尾插入一个空终止符(例如,在的输出处)字符串连接块)。

  • 编码器将字符串不变量(参数或信号)生成为C风格的双引号字符串。

  • 字符串数据类型的信号的默认缓冲区大小是256字节(最多包含255个8位ASCII字符)。要更改此缓冲区大小,请使用动态大小字符串的缓冲区大小(字节)(仿真软件编码器)配置参数。

  • 若要覆盖单个字符串信号的模型范围设置,请使用stringtype (N作为信号数据类型。具有此数据类型的信号被分配到缓冲区N+1在生成的字节C代码(N字符加上一个空终止符)。

  • 模拟和生成之间没有区别c++当字符串存储为std:: string具有与模拟相同动态行为的对象。

c++代码生成字符串库

c++代码生成,std:: string库可用于具有嵌入式Coder™许可证的基于ert的目标。有关更多信息,请参见使用标准c++字符串库为字符串块生成代码(嵌入式编码)

字符串数据类型转换

您不能使用数据类型转换块将字符串数据类型转换为其他数据类型,反之亦然。相反,使用这些字符串转换块。

转换

字符串信号转换为uint8矢量信号,同时保留ASCII字符

ASCII字符串

Uint8矢量信号到字符串信号

ASCII字符串

字符串信号为数值信号的双数据类型

字符串双

字符串信号到数值信号的单一数据类型

字符串单

字符串信号到枚举信号数据类型

字符串枚举

输入信号到字符串信号

字符串

转换字符串到ASCII和回字符串

  1. 将这些块添加到模型中:

    • 字符串常量

    • ASCII字符串

    • ASCII字符串

    • 两个显示

  2. 如图所示连接这些块。

  3. 字符串常量块,输入字符串,如“你好!”

  4. ASCII字符串块,将最大字符串大小更改为10。

  5. 模拟模型并观察模型的内容显示块。

    • Display1显示你好!转换成等价的ASCII码。例如,72是等价的ASCII码H33是等价的ASCII码

    • Display1用零(空字符)将剩余空间填充到最大长度为10的字符串。

    • 显示器显示你好!ASCII字符串block将ASCII码重新转换为字符串。

将字符串转换为枚举数据类型

  1. 将这些块添加到模型中:

    • 字符串常量

    • 字符串枚举

    • 显示

  2. 如图所示连接这些块。

  3. 字符串常量块,输入字符串,如“你好!”

  4. 创建一个名为BasicStrings并将其与文件名一起存储在当前文件夹中BasicStrings.m,例如:

    classdef BasicStrings < Simulink。在tEnumType enumeration Hello(0) Red(1) Blue(2) end end
  5. 字符串枚举块时,输入枚举类as枚举:BasicStrings

  6. 模拟模型并观察模型的内容显示块。

显示和提取坐标数据

方法将一组数据格式化并输出为地理坐标组成字符串扫描字符串块。基于Cscanfprintf功能,组成字符串扫描字符串块在概念上与sprintfsscanf函数,主要的例外是这些函数使用数组,而块不使用数组。有关字符串块格式字符的更多信息,请参见组成字符串扫描字符串

组成字符串块从多个字符串和数字输入组合构造一个字符串。使用格式参数格式化每个输入的输出,每个输入使用一个格式化操作符。每个格式操作符都以百分号开头,% gydF4y2Ba,后面跟着转换字符,例如,% f生成定点输出。为了补充字符串输出,还可以向格式规范添加额外的字符,以便出现在输出中。

  1. 将这些块添加到模型中:

    • 六个常数

    • 一个组成字符串

    • 一个扫描字符串

    • 七个显示

  2. 改变常数块常量值到显示的那些,并连接块。

  3. 格式参数的组成字符串块,输入这些格式规格:

    '%g°%g " %f" N, %g°%g " %f" W'
    • % g% f格式化操作符将数值输入转换为浮点值。% g是更紧凑的版本吗% f

    • 度符号(°)、N、W和是要在输出字符串中显示的补充字符串。

    组成字符串块按输入顺序组合输出,根据其格式操作符对每个输入进行格式化,添加额外的字符串,并输出按指示格式格式化并用双引号().

  4. 格式参数的扫描字符串块,输入以下格式规格:

    '%g°%g " %f" N, %g°%g " %f" W'
    • % g% f格式化操作符将数值输入转换为浮点值。% g是更紧凑的版本吗% f

    • 度符号(°)、N、W和是要在输出字符串中显示的补充字符串。

    扫描字符串块读取其输入,根据转换规范指定的格式对其进行转换,并将结果作为标量返回。块根据其转换规范格式化每个输出。它忽略紧接在转换说明符之前或之后的指定文本。

在字符串中寻找模式

方法可在字符串中查找模式字符串中找到块。

  1. 将这些块添加到模型中:

    • 两个字符串常量

    • 字符串中找到

    • 一个显示

  2. 如图所示连接这些块。

  3. 在第一个字符串常量块,输入字符串,如“喂!再见!”

    将此块连接到str接口的输入端口字符串中找到块导致字符串中找到块以查找此字符串中的模式。

  4. 在第二个字符串常量块,输入要在第一个块中查找的字符串(或模式)字符串常量字符串,如“再见!”

    将此块连接到块的输入端口表示字符串中找到寻找这个模式str输入。

  5. 模拟模型并观察模型的内容显示块。对于本例,显示块7,也就是那封信的所在地G

提取一个字符串

方法可从源字符串中提取字符串子字符串块。本示例使用中描述的模型在字符串中寻找模式

  1. 添加一个子字符串块到模型。

  2. 子字符串块,选择从'idx'到结束的输出字符串参数。设置此参数将从idx端口的位置输入提取字符串到字符串的末尾。

  3. 如图所示连接新块。

  4. 模拟模型并观察模型的内容显示块。对于本例,显示块“再见!”,这是提取的子字符串开始idx到弦的末端。

获取关键字后面的文本

这个例子展示了使用Simulink字符串块的基本字符串操作。

对于一个看起来像下面这样的模型,模拟它。

观察模型:

  • 创建两个字符串,“开头中间结尾”“中间”,使用字符串常量块。

  • 的第一次出现“中间”idx)并添加第一个字母的位置(11的长度“中间”7).它使用字符串中找到字符串长度块。

  • 摘录“开头中间结尾”的末尾开始的子字符串“中间”Idx +字符串长度= 18),这是字符串“结束”.它使用子字符串块。

  • 的计算值比较“结束”用实际的字符串“结束”,它返回布尔值“1”.它使用字符串常量字符串比较块。

  • 转换布尔值。“1”对它的字符串等效,“真正的”.它使用字符串块。

要查看整个模型中角色的位置,请添加一个显示的输出字符串中找到字符串长度块并模拟它。

更改现有模型以使用字符串

除了在新模型中使用字符串外,您还可以更新现有模型以使用字符串。使用字符串可以简化模型,使其更容易理解。

例如,在较老的模型中,您可能使用枚举数据类型来表示或传递模型中的文本。的燃油容错控制系统建模示例模型sldemo_fuelsys在多个区域中枚举用于处理文本数据的常量。

sldemo_fuelsys / fuel_rate_control / control_logic,状态流图使用枚举数据来指示燃料水平。

sldemo_fuelsys / fuel_rate_control / airflow_calc,以检测燃料是否不足,模型使用枚举常量关系操作符块。

相反,您可以使用字符串常量字符串比较块通过设置:

  • 字符串常量字符串参数

  • 使用字符串比较块来检测来自于模型的另一部分。

您可以将字符串与枚举常量结合使用,而不是删除枚举常量的所有实例。这样做允许您增量地迁移模型以使用字符串。在sldemo_fuelsys / fuel_rate_control fuel_calc / feedforward_fuel_rate,多端口切换块接受四个枚举数据输入。

如果fuel_mode端口输出字符串时,可以将该字符串转换为枚举数据类型,以使用来自常数块。

解析NMEA GPS文本消息

这个例子展示了如何使用Simulink®字符串块解析NMEA GPS格式的文本消息。

概述

该模型展示了如何使用Simulink®提供的字符串数据类型和块来读取输入文本消息并提取数字和文本数据。

读取消息头并转换为枚举

Simulink®提供String To Enum块将字符串转换为相应的枚举值。在这个模型中,报头字符串“RMB”被转换为NMEASentence.RMB。

使用扫描字符串块解析文本消息

解析文本消息的一种方法是使用Scan String块。它像C和MATLAB中的sscanf函数一样工作。

解析具有固定字段宽度的文本消息

当文本消息的每个数据字段有固定的宽度时,Simulink®提供块来按索引分割字符串。在拆分字符串之后,可以分别处理每个字段。

动态仿真模块字符串的局限性

这些功能目前不受支持:

类别 限制描述 解决方案

字符串数组

不支持字符串数组。

只使用字符串作为标量。

Unicode字符

Simulink字符串不支持整个Unicode集。

Simulink字符串支持256个字符的ISO/IEC 8859-1字符集(基础拉丁语和拉丁-1补充)。这些字符是Unicode的前256个编码点。

MATLAB的s函数

用该块创建的自定义块不支持字符串。

- - - - - -

常数初始条件

这些块不适用于字符串。

使用字符串常量块。

的控制输入开关多端口切换开关情况,如果

的控制输入开关Block不接受字符串。

使用这些块的数据输入。

仿真软件。信号仿真软件。参数

仿真软件。信号,仿真软件。参数对象不支持字符串。

- - - - - -

数据类型转换

请勿使用数据类型转换块转换为字符串或从字符串。

使用字符串转换块

到文件

方法加载字符串到文件块。

- - - - - -

范围频谱分析仪blocks, Logic Analyzer app

范围频谱分析仪block和Logic Analyzer应用程序不显示字符串。

使用显示,仿真数据检查,或者是顺序查看器在Stateflow。

另请参阅

功能

相关的话题

Baidu
map