主要内容

访问MATLABC图中的函数和工作空间数据

Stateflow®Simulink中的金宝app图表®模型具有一个操作语言属性,该属性定义状态和转换操作的语法。图表画布左下角的图标表示图表的操作语言。

  • MATLAB®作为动作语言。

  • C作为动作语言。

在使用C作为操作语言的图表中,可以调用内置的MATLAB函数并通过使用毫升名称空间运算符或毫升函数。

谨慎

因为MATLAB函数在目标环境中不可用,所以不要使用毫升命名空间操作符和毫升如果计划构建代码生成目标,则使用。

毫升名称空间操作符

对于C图表,使用毫升命名空间操作符使用标准点(.)引用MATLAB变量和函数的符号。例如,语句A = ml.x返回MATLAB工作区变量的值x到statflow数据一个

对于函数,语法如下:

[return_val1, return_val2,...= ml.function_name(arg1,arg2,…)

例如,语句[a, b, c] = ml。函数(x, y)传递MATLAB函数的返回值函数到statflow数据一个b,c

如果所调用的MATLAB函数不需要参数,则仍然必须包含圆括号。如果省略括号,Stateflow软件将函数名解释为工作空间变量,如果没有找到该工作空间变量,将在模拟期间生成运行时错误。

例子

在这些例子中,xy,z工作区变量和d1而且d2为状态流数据:

  • A = ml.sin(ml.x)

    本例中,MATLAB函数求sin的值x,然后将其分配给statflow数据变量一个.然而,由于x是工作空间变量,必须使用名称空间操作符来访问它。因此,ml.x用来代替justx

  • A = ml.sin(d1)

    本例中,MATLAB函数求sin的值d1,它被分配给statflow数据变量一个.因为d1是状态流数据,您可以直接访问它。

  • Ml.x = d1*d2/ml.y

    表达式的结果被赋值x.如果x在模拟之前不存在,它是在MATLAB工作空间中自动创建的。

  • Ml.v [5][6][7] = ml.f(ml.x[1][3],ml.y[3])

    工作区变量x而且y是数组。x [1] [3](1、3)元素的二维数组变量x。y [3]一维数组的第三个元素是变量吗y

    调用返回的值f赋值给元素(5、6、7)对于工作区数组,v.如果v在模拟之前不存在,它是在MATLAB工作空间中自动创建的。

毫升函数

对于C图表,可以使用毫升函数指定对MATLAB函数的调用。的格式。毫升函数调用使用以下表示法:

毫升(evalString__arg1最长,……);

evalString是在MATLAB工作空间中求值的表达式。它包含要执行的一个MATLAB命令(或一组命令,每个命令由分号分隔)以及格式说明符(% g% f% d,等等),这些参数提供了对其他参数(__arg1最长等)变成evalString

中使用的格式说明符毫升函数与C函数中使用的相同printf而且sprintf.的毫升函数调用相当于调用MATLABeval函数与毫升命名空间操作符__arg1最长,……在以下命令中被限制为标量或字面量:

ml.eval (ml.sprintf (evalString__arg1最长,……)

中使用的格式说明符毫升函数必须匹配实参的数据类型,或者实参的类型必须可以提升为格式说明符表示的类型。

状态流软件假设标量返回值从毫升命名空间操作符和毫升在此上下文中将函数调用用作参数。看到图表如何推断ml表达式的返回大小

例子

在这些例子中,x为MATLAB工作空间变量,d1而且d2为状态流数据:

  • A = ml("sin(x)")

    在本例中,毫升函数调用MATLAB函数求sin的值x在MATLAB工作空间中。然后将结果分配给statflow数据对象一个.因为x是工作区变量,以及sin (x)在MATLAB工作空间中求值,你直接输入字符串吗“sin (x)”

  • Sfmat_44 = ml("rand(4)")

    在本例中,返回一个4乘4的方阵,矩阵由0到1之间的随机数组成,并分配给statflow数据对象sf_mat44.在模拟之前,必须将此数据对象定义为4 × 4数组。否则,将在运行时发生大小不匹配错误。

  • A = ml("sin(%f)",d1)

    本例中,MATLAB函数求sin的值d1在MATLAB工作空间中,并将结果分配给statflow数据对象一个.因为d1是状态流数据,它的值被插入字符串参数“罪(%)”使用格式表达式% f.如果d1= 1.5,则在MATLAB工作空间中求值的表达式为罪(1.5)

  • A = ml("f(%g,x,%f)",d1,d2)

    在本例中,表达式为theevalString如前面的格式语句所示。Stateflow数据d1而且d2插入表达式中f(% g, x, % f)”通过使用格式说明符% g而且% f,分别。

毫升表达式

对于C图表,您可以混合使用毫升命名空间操作符和毫升函数表达式以及较大表达式中的状态流数据。下面的例子平方正弦而且余弦的角度在工作空间变量X并补充说:

a = ml.power(ml.sin(ml. x),2) + ml(“权力”(cos (X), 2)

第一个操作数使用毫升命名空间操作符来调用函数。它的论点是ml.X,因为X在MATLAB工作空间中。第二个操作数使用毫升函数。因为X,则它将出现在evalString表达式为X.每个操作数的平方是用MATLAB来完成的权力函数,该函数有两个参数:平方的值和幂值2。

使用毫升命名空间操作符和毫升函数可以用作参数毫升命名空间操作符和毫升函数表达式。下面的示例嵌套毫升三个不同层次的表达:

A = ml.power(ml.sin(ml。X + ml(“因为(Y)”)), 2)

在编写你的毫升表达式中设置的优先级二元运算.函数的幂表达式周围使用括号运算符,当您将它们与其他算术运算符结合使用时。

状态流软件在更新或模拟模型时检查操作中的数据大小不匹配的表达式。因为返回值为毫升表达式直到运行时才知道,Stateflow软件必须推断其返回值的大小。看到图表如何推断ml表达式的返回大小

哪一个毫升我应该使用吗?

的符号在大多数情况下毫升名称空间操作符更直接。但是,使用毫升函数调用确实提供了一些优势:

  • 使用毫升函数动态构造工作区变量。

    下面的流程图创建了四个新的MATLAB矩阵:

    用四次迭代实现for循环的流程图。"height=

    循环在MATLAB工作空间中创建四个新的矩阵变量。默认转换初始化状态流计数器到0,而顶部两个结点之间的过渡段将其增加1。如果小于5,回到顶部结的过渡段求值毫升函数调用ml("A%d = rand(%d)",i,i)的当前值.当大于或等于5,则底部两个连接之间的过渡段发生并停止执行。

    转换执行以下MATLAB命令,这些命令创建一个工作区标量(A1)和三个矩阵(A2A3A4):

    A1 =兰特(1)A2 =兰特(2)A3 =兰特(3)A4 =兰特(4)
  • 使用毫升函数与完整的MATLAB符号。

    的符号不能使用完整的MATLAB符号毫升命名空间操作符,示例如下:

    ml.A = ml.magic(4);B = ml(" a + a '");

    这个示例设置工作区变量一个变成一个神奇的4乘4矩阵毫升名称空间算子。Stateflow数据B则设置为一个它的转置矩阵,一个“,这将产生一个对称矩阵。因为毫升名称空间操作符不能计算表达式一个“,毫升函数代替。但是,您可以调用MATLAB函数转置毫升命名空间操作符:

    ml.A = ml.magic(4);B = ml.A + ml.转置(ml.A)

    的单元格数组或包含冒号的下标表达式不能使用参数毫升名称空间算子。但是,这些可以包含在毫升函数调用。

毫升数据类型

类型的状态流数据毫升在内部使用MATLAB类型mxArrayC图表。您可以将Stateflow层次结构中可用的任何类型的数据分配(存储)给某个类型的数据毫升.这些类型包括在Stateflow层次结构中定义的或从MATLAB工作区返回的任何数据类型毫升命名空间操作符或毫升函数。

使用规则毫升数据类型

这些规则适用于类型的statflow数据毫升

  • 你可以初始化毫升来自MATLAB工作区的数据就像Stateflow层次结构中的其他数据一样(请参阅从MATLAB基础工作区初始化数据).

  • 的任何数值标量或数组毫升Stateflow层次结构中的数据可以与层次结构中的任何其他数据一起参与任何类型的一元操作和任何类型的二进制操作。

    如果毫升数据参与任何与其他数据的数值运算时,其大小毫升方法中的返回数据一样,必须从使用数据的上下文中推断数据毫升命名空间操作符和毫升函数。看到图表如何推断ml表达式的返回大小

  • 你无法定义毫升范围内的数据常数

    在“数据属性”对话框和“状态流数据类型的模型资源管理器”中禁用此选项毫升

  • 你可以使用毫升数据用于构建模拟目标,但不用于构建可嵌入代码生成目标。

  • 如果数据类型为毫升包含一个数组,你可以通过这些规则通过索引访问数组的元素:

    1. 只能为含有数值元素的数组建立索引。

    2. 只能根据数值数组的维数建立索引。

      换句话说,您只能通过单个索引值访问一维数组。不能访问具有单个索引值的多维数组。

    3. 数组的每个维度的第一个索引值是1,而不是C语言数组中的0。

    在接下来的例子中,mldata状态流数据类型是毫升ws_num_array是一个2乘2的MATLAB工作空间数组与数值,和ws_str_array是一个2乘2的MATLAB工作空间数组,具有字符向量值。

    Mldata = ml.ws_num_array;/* OK */ n21 = mldata[2][1];/ *好数值数据类型毫升* /N21 = mldata[3];/* not ok2×2数组数据* /Mldata = ml.ws_str_array;/* OK */ s21 = mldata[2][1];/* not ok字符向量数据类型毫升* /
  • 毫升数据不能有C图之外的范围;也就是说,您不能定义的范围毫升数据作为来自Simulink的金宝app输入输出到Simulin金宝appk

工作区数据的占位符

这两个毫升命名空间操作符和毫升函数可以直接在MATLAB工作空间中访问数据,并将其返回到C图。但是,在MATLAB工作空间中维护数据可能会使Stateflow用户与工作空间中已经存在的其他数据发生冲突。因此,使用毫升数据类型,您可以维护毫升数据在图表中,并将其用于MATLAB计算C图表。

例如,在下面的语句中,mldata1而且mldata2状态流数据是类型吗毫升

Mldata1 = ml.rand(3);Mldata2 = ml.转置(mldata1);

在这个例子的第一行,mldata1接收MATLAB函数的返回值兰德,在本例中,它返回一个3 × 3的随机数数组。请注意,mldata1未指定为数组或以任何方式指定大小。它可以接收任何MATLAB工作空间数据或任何MATLAB函数的返回,因为它被定义为类型为Stateflow的数据毫升

在例子的第二行,mldata2,也是Stateflow数据类型毫升,接收矩阵中的转置矩阵mldata1.它被赋给MATLAB函数的返回值转置在这mldata1是论证。

请注意,如果前面的示例使用MATLAB工作空间数据(wsdata1而且wsdata2)而不是状态流毫升保存生成的矩阵的数据:

Ml.wsdata1 = ml.rand(3);Ml.wsdata2 = ml.转置(ml.wsdata1);

在这种情况下,每个工作区数据必须通过毫升名称空间算子。

图表如何推断回报率大小毫升表达式

在C图表中,使用的状态流表达式毫升命名空间操作符和毫升函数求值在MATLAB工作空间运行时。以下表达式类型返回的数据的实际大小只有在运行时才知道:

  • MATLAB工作空间数据或函数的使用毫升名称空间运算符或毫升函数调用

    例如,表达式返回值的大小毫升。var毫升。函数(),或毫升(evalString__arg1最长,……),在那里var是MATLAB的工作空间变量和函数是一个MATLAB函数,直到运行时才能知道。

  • 类型的状态流数据毫升

  • 返回类型为statflow数据的图形化函数毫升

当这些表达式出现在操作中时,Stateflow代码生成将创建临时数据以保存中间返回值,以计算它们属于的完整表达式。因为这些返回值的大小直到运行时才知道,所以Stateflow软件必须使用上下文规则来推断创建临时数据的大小。

在运行期间,如果其中一个命令的实际返回值与存储它的临时变量的推断大小不同,就会出现大小不匹配错误。为了防止运行时错误,请使用以下指导方针来使用MATLAB命令或程序编写操作毫升数据:

指导方针 例子

MATLAB命令或表达式中数据的返回值必须与对等表达式的返回值相匹配。

在表达式中毫升。函数() * (x + ml.y),如果x是3 × 2矩阵吗毫升。函数()而且ml.y也被假设为3 × 2矩阵。如果其中一个返回不同大小的值(标量除外),则在运行时产生错误。

返回标量的表达式永远不会产生错误。

可以在更大的表达式中组合矩阵和标量,因为MATLAB命令使用标量展开。

在表达式中ml, x + y,如果y是3 × 2矩阵ml.x返回一个标量,结果值是的标量值相加的结果ml.x献给每一位y生成大小为的矩阵y,即3 × 2矩阵。

同样的规则也适用于减法(-),乘法(),除(/),以及任何其他二进制操作。

类型的MATLAB命令或状态流数据毫升可以是这些独立的表达层的成员,为此需要确定返回大小:

参数

每个函数参数的表达式是一个更大的表达式,其返回MATLAB命令或类型的statflow数据的大小毫升必须确定。

在表达式中z +函数(x + ml.y)的大小ml.y是否与大小无关z,因为ml.y在函数参数级别使用。但是,返回大小为函数(x + ml.y)一定要搭配大小的z,因为它们处于相同的表达水平。

数组索引

数组索引的表达式是一个独立的表达式级别,大小必须为标量。

在表达式中x +数组[y]的大小y是否与大小无关x因为y而且x都处于不同的表达水平。同时,y必须是标量。

索引数组元素访问的返回值必须是标量。

表达式x [1] [1],在那里x是3 × 2数组,必须计算为标量。

函数调用的MATLAB函数的输入参数的表达式中使用的MATLAB命令或数据元素毫升命名空间操作符根据大小进行解析。此解决方案对表达式本身使用对等表达式规则(前面的规则1),因为没有可用的大小定义原型。

在函数调用中毫升。函数(x + ml.y),如果x是一个3 × 2数组,ml.y必须返回3 × 2数组或标量。

表达式中图形函数的输入参数所使用的MATLAB命令或数据元素由函数原型解析其大小。

如果图形函数gfunc有原型gfunc__arg1,在那里__arg1是一个2 × 3的状态流数据数组,调用表达式gfunc(ml.y + x),要求两者ml.y而且x在运行时计算为2 × 3数组(或标量)。

毫升函数调用只能接受标量或字符向量文字参数。属性的参数的任何MATLAB命令或数据毫升函数必须返回一个标量值。

在表达式中A = ml("sin(x)"),毫升函数调用MATLAB函数求sin的值x在MATLAB工作空间中。状态流数据变量一个存储结果。

在赋值操作中,右边表达式的大小必须与左边表达式的大小匹配,只有一个例外。如果左边的表达式是一个单独的MATLAB变量,例如ml.x或类型的状态流数据毫升,右边的表达式决定了两个表达式的大小。

在表达式中S = ml。函数(x),在那里x是3 × 2矩阵年代是标量状态流数据,毫升。函数(x)必须返回一个标量来匹配左边的表达式,年代.然而,在表达式中Ml.y = x + s,在那里x是一个3 × 2的数据数组和年代标量,左边的表达式,工作区变量y,被分配一个3 × 2数组的大小,以匹配右边表达式的大小,x +年代,一个3 × 2的数组。

在赋值中,左侧的statflow列向量与右侧相同大小的MATLAB行或列向量兼容。

行维数为1的矩阵被认为是行向量。你定义的一维或列维为1的矩阵被认为是列向量。

在表达式中S = ml。函数(),在那里毫升。函数()返回一个1 × 3矩阵,如果年代向量的大小3.,转让有效。

如果无法通过上述任何规则解析较大表达式中的MATLAB命令或数据元素的返回大小,则假定它们返回标量值。

在表达式中Ml.x = ml.y + ml.z,上述规则都不能用来推断一个共同的大小ml.xml.y,ml.z.在这种情况下,两者都有ml.y而且ml.z假定返回标量值。即使ml.y而且ml.z在运行时返回匹配的大小,如果它们返回非标量值,则会导致大小不匹配错误。

上述规则用于解析成员MATLAB命令或类型的statflow数据的大小毫升在更大的表达式中,仅应用于期望该成员具有数值的情况。对于非数字返回,将导致运行时错误。

请注意

成员MATLAB命令或类型的数据毫升在较大的表达式中,只有当数值值(标量或数组)参与数值表达式时,它们才被限制为数值。

表达式X + ml。str,在那里毫升。str是一个字符向量工作空间变量,产生运行时错误说明毫升。str不是数值类型。

存在特殊情况,在这种情况下,没有发生大小检查来解析作为较大表达式一部分的MATLAB命令或数据表达式的大小。使用以下表达式不需要在运行时强制执行大小检查:

  • 毫升。var

  • 毫升。函数()

  • 毫升(evalString__arg1最长,……)

  • 类型的状态流数据毫升

  • 返回类型为statflow数据的图形函数毫升

在这些情况下,将返回值赋值到赋值语句或函数实参的左边,而不检查两者之间的大小不匹配:

  • 左边是MATLAB工作空间变量的赋值

    例如,在表达式中Ml.x = ml.yml.y是任意大小和类型(结构、单元格数组、字符向量等)的MATLAB工作空间变量。

  • 左边为类型数据的赋值操作毫升

    例如,在表达式中M_x = ml。函数()m_x状态流数据类型是毫升

  • MATLAB函数的输入参数

    例如,在表达式中毫升。函数(ml.x m_xgfunc())m_x状态流数据类型是毫升ml.x是任意大小和类型的MATLAB工作空间变量,以及gfunc()是返回类型的状态流数据的状态流图形函数吗毫升.虽然对输入类型不进行大小检查,但如果传入的数据不是预期的类型,则函数调用将导致错误毫升。函数()

  • 指定为类型的状态流数据的图形化函数的参数毫升在它的原型声明中

    请注意

    如果将上述情况中的输入替换为非matlab数值状态流数据,则转换为毫升类型出现。