当您希望传递和操作文本时,请在多个应用程序中使用字符串。例如,在对燃油控制系统建模时,您可以使用以下字符串,而不是使用枚举数据对燃油油位进行建模“低”
或“空”
.金宝app动态仿真模块®字符串与MATLAB兼容®字符串。
金宝appSimulink字符串是一种内置的信号数据类型。它们在Simulink编辑器中显示为“strN"
(例如,最大长度为N字符)或“string”表示没有最大长度的字符串(动态字符串)。字符串长度范围是1 ~ 32,766。
金宝appSimulink字符串信号本质上是离散的。如果字符串信号具有连续采样时间,则模型会在编译时生成错误。
金宝appSimulink处理字符串变量和表达式,如“a”+“b”,与处理数值变量的方式相同。字符串变量的值可以是字符向量,也可以是MATLAB字符串。字符串变量可以存在于基础、模型和掩码工作空间中。
字符串文字用双引号指定(“你好”
)还是单引号(“你好”
).为了与MATLAB字符串保持一致,请使用双引号。字符串出现在端口和展示用双引号阻塞。
金宝appSimulink字符串支金宝app持ISO/IEC 8859-1字符集的256个字符。这些字符是Unicode的前256个代码点。Simulink不支持第一个字符字符(0)
("NULL"),如果字符串包含此字符则返回错误。
当字符无法显示时,块存储实际信息,并输出带有该字符关联八进制值的转义字符。例如,的十进制值控制字符这里允许休息
是130。块将此控制字符显示为转义八进制202年\
.这个ASCII字符串块以转义八进制字符的形式返回Unicode集合范围0000到001F和007F-009F。
本主题介绍如何在Simulink中使用字符串,包括:金宝app
可用字符串块和特定于字符串转换的块的列表
将字符串常量传递给其他字符串块
字符串中的空字符
没有最大长度的字符串
与Stateflow的交互®
生成的代码
限制
本主题还包括说明如何使用字符串块的简单示例。本主题中的示例启用显示块名称。控件上控制块名称的显示格式选项卡上,选择汽车>隐藏自动块名称.例如,您可以使用字符串块来显示和提取坐标数据,并在字符串中查找模式。
要在模型中使用字符串,请使用下面的表格:
行动 | 块 |
---|---|
将uint8矢量转换为字符串信号。 |
|
基于格式参数和输入信号。 |
|
扫描输入字符串,并按照格式参数 |
|
比较两个输入字符串。 | |
连接输入字符串以形成一个输出字符串。 |
|
属性指定的字符串一串参数 |
|
返回模式字符串第一次出现的索引附属的在文本字符串中str. |
|
输出输入字符串中的字符数。 |
|
将字符串信号转换为uint8矢量。 |
|
将字符串信号转换为双信号。 |
|
将字符串信号转换为单个信号。 |
|
将输入字符串转换为枚举信号。 |
|
从字符串信号中提取子字符串。 |
|
将输入信号转换为字符串信号。 |
这些Simu金宝applink模块支持字符串。金宝app
块 | 笔记 |
---|---|
公交车分配 |
非虚拟的和虚拟的。 |
总线的创造者 |
非虚拟的和虚拟的。 |
总线选择器 |
非虚拟的和虚拟的。 |
数据存储内存 |
— |
数据存储读取 |
— |
数据存储写 |
— |
数据类型重复 |
— |
展示 |
显示带双引号的字符串。 |
从 |
— |
从工作空间 |
不支持数据插值。金宝app |
转到 |
— |
地面 |
地面值是 |
轮廓尺寸 |
包括根级别。 |
手动变型水槽 |
— |
手动变异来源 |
— |
手动开关 |
没有混合的数字和字符串类型。如果有多个字符串,块将使用最大大小的字符串或动态字符串。 |
MATLAB函数 |
— |
合并 |
— |
模型 |
— |
多端口切换 |
没有混合的数字和字符串类型。如果有多个字符串,块将使用最大大小的字符串或动态字符串。 |
外港 |
包括根级别。 |
探针 |
— |
信号编辑器 |
不支持数据插值。金宝app |
信号规范 |
— |
子系统(所有变体) |
— |
开关 |
没有混合的数字和字符串类型。如果有多个字符串,块将使用最大大小的字符串或动态字符串。 |
终止函数 |
— |
《终结者》 |
— |
变异来源 |
— |
变体模型 |
— |
不同的子系统 |
— |
宽度 |
— |
要使用文本数据控制图表行为并操纵文本以在Stateflow中创建自然语言输出,请在C操作语言图表中使用字符串。Stateflow提供了操纵字符串的运算符。有关更多信息,请参阅通过使用字符串管理文本信息(状态流).
要指定字符串常量,请使用字符串常量块。请勿使用常数块,它不接受字符串字符串常量块,输入带有双引号的字符串,例如“你好!”
在一串参数。这与在定值Constant块的参数。
金宝appSimulink字符串自动处理字符串终止。请勿在字符串结尾使用空终止符。如果Simulink在字符串中的任何位置检测到空字符,则会生成错误。Simulink在模拟和代码生成过程中处理字符串,如下所示:
在模拟过程中,模型进行模拟。您无需执行任何其他操作。
在C代码生成期间,软件会在字符串的末尾添加一个空结束符。例如,如果字符串缓冲区大小为10,而实际字符串值为“AB”
,生成代码中的第三个字符是空结束符。
必要时,字符串块创建并使用字符串数据类型,例如,当块输出字符串类型时。您可以在不指定最大字符长度的情况下创建字符串。我们将没有最大字符长度的字符串称为动态字符串。
要为支持字符串的块创建字符串数据类型,可以:金宝app
使用输出数据类型或数据类型的参数信号的属性标签的Simuli金宝appnk块。
若要创建没有最大字符长度的字符串数据类型,请指定一串
。此操作将创建一个动态字符串。
要创建最大字符长度的字符串数据类型,例如100
,输入stringtype (100)
.你也可以用the弦型
函数在MATLAB命令行上创建字符串数据类型。
使用set_param
函数与OutDataTypeStr
参数,例如:
设置参数(gcb、'OutDataTypeStr'、'stringtype(100)'))
此函数用于创建最大长度为100个字符的字符串数据类型对象。字符串类型长度的范围为1到32766个字符(含1到32766个字符)。
例如,使用字符串常量块创建字符串输出数据类型参数设置为stringtype(31)
创建字符串数据类型str31
. 31是字符串可以包含的最大字符数。
要使用总线编辑器将总线对象的元素配置为接受字符串,请在数据类型参数时,输入字符串类型。例如,要指定最大字符长度为10的字符串数据类型,输入stringtype (10)
.这个模式相应的参数更新。要指定长度可变的动态信号,输入一串
在这一领域。您可以为总线元素创建混合使用的数字和字符串总线对象。有关使用总线编辑器创建总线对象和元素的详细信息,请参见创建并指定Simulink.Bus对象金宝app.
考虑这些字符串和生成的音符C
和C++
代码。
C
动态字符串数据类型的代码使用动态字符串数据类型的块的模拟与生成的块不同C
以以下方式编写代码:
发出信号一串
数据类型在模拟过程中具有动态大小。换句话说,字符串的大小可以在0到32766之间变化。然而,在生成的C
代码时,编码器将字符串存储为固定大小char_T
数组。因此,字符串的大小受到生成的固定缓冲区大小的限制C
软件会截断额外的字符,并在末尾插入空终止符(例如,在字符串连接块)。
编码器生成字符串不变量(参数或信号)为C
风格的双引号字符串。
字符串数据类型的信号的默认缓冲区大小是256字节(最多包含255个8位ASCII字符)。要更改此缓冲区大小,请使用动态大小字符串的缓冲区大小(字节)(金宝appSimulink编码器)配置参数。
若要覆盖单个字符串信号的模型范围设置,请使用stringtype (N)
作为信号数据类型。具有此数据类型的信号分配一个N+1
生成的字节数C
代码(N字符加上一个空终止符)。
模拟和生成没有区别C++
当字符串存储为字符串
与模拟具有相同动力学行为的对象。
C++
代码生成字符串库对于C++
代码生成,字符串
库可用于具有Embedded Coder™许可证的基于ert的目标。有关更多信息,请参见使用标准c++字符串库生成字符串块代码(嵌入式编码器).
您不能使用数据类型转换块将字符串数据类型转换为其他数据类型,反之亦然。请改用这些字符串转换块。
转化 | 块 |
---|---|
字符串信号改为uint8矢量信号,同时保留ASCII字符 |
|
Uint8矢量信号到字符串信号 |
|
字符串信号到数字信号的双重数据类型 |
|
字符串信号到数字信号的单一数据类型 |
|
字符串信号到枚举信号数据类型 |
|
输入信号到字符串信号 |
将这些块添加到模型中:
字符串常量
ASCII字符串
ASCII字符串
两个展示阻碍
如图所示连接块。
在字符串常量块,输入字符串,例如“你好!”
.
在ASCII字符串块,将最大字符串大小更改为10。
模拟模型并观察其内容展示块。
Display1显示你好!
转换为等价的ASCII码。例如,72
ASCII是否等同于H
和33
ASCII是否等同于!
.
Display1已使用零(空字符)将剩余空间填充到最大字符串长度10。
展示你好!
之后ASCII字符串块将ASCII码重新转换为字符串。
将这些块添加到模型中:
字符串常量
要枚举的字符串
展示
如图所示连接块。
在字符串常量块,输入字符串,例如“你好!”
创建一个名为金宝app基本要素
并以文件名将其存储在当前文件夹中BasicStrings.m
,例如:
< Simulink. classdef Bas金宝appicStrings在tEnumType enumeration Hello(0) Red(1) Blue(2) end end
在要枚举的字符串块,输入枚举类为枚举:BasicStrings
.
模拟模型并观察其内容展示块。
属性显示了如何格式化和输出一组数据作为地理坐标组成字符串和扫描字符串块。基于Cscanf
和printf
功能,组成字符串和扫描字符串块在概念上与把格式数据写成串
和sscanf
函数,但主要的例外是这些函数使用数组,而块不使用数组。有关字符串块格式字符的更多信息,请参见组成字符串和扫描字符串.
这个组成字符串块从多个字符串和数字输入组合而成的字符串。使用格式参数设置每个输入的输出格式,每个输入一个格式运算符。每个格式运算符以百分号开头,%gydF4y2Ba
,后面跟着转换字符,例如,%f
生成定点输出。若要补充字符串输出,还可以向格式规范中添加额外字符以显示在输出中。
将这些块添加到模型中:
六常数
一个组成字符串
一个扫描字符串
七个展示
改变常数将常量值块到所示值并连接块。
在格式参数的组成字符串块,输入以下格式规范:
'%g°%g'%f“N,%g°%g'%f“W”
这个%g
和%f
格式化操作符将数字输入转换为浮点值。%g
是更紧凑的版本%f
.
度符号(°),N、W和'
是要在输出字符串中显示的补充字符串。
这个组成字符串块按输入顺序组合输出,根据其格式运算符格式化每个输入,添加额外字符串,并输出字符串,按指示格式化并用双引号括起来("
).
在格式参数的扫描字符串块,输入以下格式规范:
'%g°%g'%f“N,%g°%g'%f“W”
这个%g
和%f
格式化操作符将数字输入转换为浮点值。%g
是更紧凑的版本%f
.
度符号(°),N、W和'
是要在输出字符串中显示的补充字符串。
这个扫描字符串块读取其输入,根据转换规范指定的格式对其进行转换,并以标量的形式返回结果。块根据其转换规范对每个输出进行格式化。它忽略转换说明符前后的指定文本。
要查找字符串中的模式,请使用字符串中找到块。
将这些块添加到模型中:
两个字符串常量
字符串中找到
一个展示
如图所示连接块。
在第一个字符串常量块,输入字符串,例如“喂!再见!”
.
把这个块连接到str输入端口字符串中找到块导致字符串中找到块以查找此字符串中的模式。
在第二个字符串常量块,输入要在第一个块中查找的字符串(或模式)字符串常量字符串,如“再见!”
.
把这个块连接到附属的块的输入端口表示字符串中找到寻找这个模式str输入。
模拟模型并观察其内容展示块。对于本例,显示块7.
,即信件的位置G
.
要从源字符串中提取字符串,请使用子字符串块。这个例子使用了中描述的模型在字符串中查找模式.
添加一个子字符串块到模型。
在子字符串块,选择从“idx”到结尾的输出字符串参数。设置此参数可将字符串从idx端口的位置输入提取到字符串的末尾。
如图所示连接新块。
模拟模型并观察其内容展示块。对于本例,显示块“再见!”
,这是从开始提取的子字符串idx直到绳子的末端。
这个例子展示了使用Simulink字符串块的基本字符串操作。金宝app
对于如下所示的模型,请对其进行模拟。
观察模型:
创建两个字符串,“开头中间结尾”
和“中间”
,使用字符串常量块。
查找第一次出现的“中间”
(idx),并添加第一个字母的位置(11
)的长度“中间”
(7.
).它使用字符串中找到和字符串长度块。
摘录“开头中间结尾”
从的结尾开始的子字符串“中间”
(idx+字符串长度=18
),即字符串“结束”
.它使用子字符串块。
比较的计算值“结束”
使用实际字符串“结束”
,它返回布尔值“1”
.它使用字符串常量和字符串比较块。
转换布尔值“1”
与字符串等价,“真正的”
.它使用字符串块。
要查看模型中角色的位置,添加一个展示块的输出字符串中找到和字符串长度方块并模拟它。
除了在新模型中使用字符串外,还可以更新现有模型以使用字符串。使用字符串可以简化模型并使其更易于理解。
例如,在旧的模型中,您可能使用枚举数据类型在模型中表示或传递文本。这个sldemo_fuelsys
在多个区域中使用文本数据的枚举常量的示例。
在sldemo_fuelsys / fuel_rate_control / control_logic
,状态流图使用枚举数据来指示燃料水平。
在sldemo燃料系统/燃料率控制/气流计算
,为了检测燃油是否不足,该模型使用枚举常数和关系操作符块。
相反,您可以使用字符串常量和字符串比较块通过设置:
这个字符串常量一串参数到低
.
使用字符串比较块来检测是否低
来自模型的另一部分。
您可以将字符串与枚举常量结合使用,而不是删除枚举常量的所有实例。这样做允许您增量地迁移模型以使用字符串。在sldemo_fuelsys / fuel_rate_control fuel_calc / feedforward_fuel_rate
这个多端口切换块接受4个枚举数据输入。
如果fuel_mode端口正在输出字符串,您可以将该字符串转换为枚举数据类型,以处理常数块在这个模型中。
此示例显示如何使用Simulink®字符串块解析NMEA GPS格式的文本消息。金宝app
概述
该模型展示了如何使用Simulink®提供的字符串数据类型和块来读取输入文本消息并提取数字和文本数据。金宝app
读取消息头并转换为枚举
金宝appSimulink®提供字符串到枚举块,以将字符串转换为相应的枚举值。在此模型中,标题字符串“RMB”转换为NMEASentence.RMB。
使用扫描字符串块解析文本消息
解析文本消息的一种方法是使用Scan String块。它的工作原理类似于C语言和MATLAB®中的sscanf函数。
使用固定字段宽度解析文本消息
当文本消息的每个数据字段具有固定宽度时,Simulink®会提供按索引拆分字符串的块。拆分字符串后,可以单独处理每金宝app个字段。
这些功能目前不受支持:金宝app
类别 | 限制描述 | 解决方案 |
---|---|---|
字符串数组 |
不支持字符串数组。金宝app |
仅将字符串用作标量。 |
Unicode字符 |
金宝appSimulink字符串不支持整个Uni金宝appcode集。 |
金宝appSimulink字符串支金宝app持ISO/IEC 8859-1字符集的256个字符(基本拉丁语和拉丁语-1补充)。这些字符是Unicode的前256个代码点。 |
MATLAB系统,matlabs函数,状态流程图 |
使用这些块创建的自定义块不支持字符串。金宝app |
— |
常数,初始条件 |
这些块不能与字符串一起使用。 |
使用字符串常量块。 |
Switch、Multiport Switch、Switch Case和If块的控制输入 |
的控制输入开关块不接受字符串。 |
使用这些块的数据输入。 |
金宝app模拟信号,金宝appSimulink.参数 |
这个金宝app模拟信号和金宝appSimulink.参数块不支持字符串。金宝app |
— |
数据类型转换块 |
请勿使用数据类型转换块来转换为字符串或从字符串转换为字符串。 |
使用字符串转换块 |
记录包含字符串元素的非虚拟总线 |
如果非虚拟总线包含字符串元素,则无法记录整个虚拟总线。您仍然可以记录非字符串元素。 |
|
到工作空间块 |
使用到工作空间. |
日志使用输出端口。 |
归档块 |
使用归档. |
— |
范围和频谱分析仪块,逻辑分析仪应用程序 |
这个范围和频谱分析仪块和逻辑分析器应用程序不显示字符串。 |
使用展示这个模拟数据检查器,或顺序查看器在Stateflow中。 |
S-函数 |
S函数不支持字符串数据类型。金宝app |
— |
金宝appSimulink实时™ |
由创建的应用程序金宝appSimulink实时用C++作为目标语言的错误输出。 |
使用C语言作为目标语言。 |
组成字符串|扫描字符串|字符串比较|字符串连接|字符串常量|字符串中找到|字符串长度|ASCII字符串|串双|字符串枚举|字符串单|弦型
|子字符串|字符串