访问MATLAB用C函数和空间数据图表

Stateflow®图表在仿真软件万博1manbetx®模型有一个动作语言属性定义的语法状态和转换操作。一个图标左下角的图画布显示图表的动作语言。

  • MATLAB®作为动作语言。

  • C作为动作语言。

图表中使用C作为行动的语言,你可以调用内置的MATLAB函数,通过使用MATLAB的工作空间变量的访问毫升名称空间操作符或毫升函数。

谨慎

因为MATLAB函数不可用在目标环境中,不要使用毫升名称空间算子和毫升函数如果你打算建立一个代码生成目标。

毫升名称空间操作符

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

函数的语法如下:

(return_val1,return_val2,……]=毫升。matfunc(__arg1,最长,……)

例如,语句[a, b, c] =毫升。matfunc(x, y)通过MATLAB函数的返回值matfuncStateflow数据一个,b,c

如果你调用MATLAB函数不需要参数,你仍然必须包括括号。如果您省略括号,Stateflow软件解释作为工作空间变量,函数名,当没有找到,在模拟生成一个运行时错误。

例子

在这些例子中,x,y,z是工作空间变量和d1d2Stateflow数据:

  • 一个= ml.sin (ml.x)

    在这个例子中,MATLAB函数评估的正弦x,然后分配给Stateflow数据变量一个。然而,由于x是一个工作空间变量,您必须使用名称空间操作符来访问它。因此,ml.x而不是使用吗x

  • 一个= ml.sin (d1)

    在这个例子中,MATLAB函数评估的正弦d1,这是分配给Stateflow数据变量一个。因为d1直接是Stateflow数据,您可以访问它。

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

    表达式分配给的结果x。如果x不存在模拟之前,它是自动在MATLAB中创建工作区。

  • ml.v[5][6][7] =毫升。matfunc(ml.x [1] [3], ml.y [3], d1, d2,”字符串”)

    工作空间变量xy是数组。x [1] [3](1、3)元素的二维数组变量x。y [3]是第三个元素的一维数组变量y。最后一个参数,字符串,是一个特征向量。

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

毫升函数

对于C图表,您可以使用毫升函数来指定调用MATLAB函数。的格式毫升函数调用使用这个符号:

毫升(evalString,__arg1,最长,……);

evalString是一个表达式,MATLAB的工作区中评估。它包含一个MATLAB命令(或一组命令,每个由分号分隔)执行以及格式说明符(% g,% f,% d等)提供格式化的替换其他的参数(__arg1,最长等)evalString

中使用的格式说明符毫升函数中使用的相同的C函数printfsprintf。的毫升函数调用相当于调用MATLABeval函数与毫升如果参数名称空间算子__arg1,最长,……局限于标量或文字下面的命令:

ml.eval (ml.sprintf (evalString,__arg1,最长,……)

格式说明符中使用毫升函数必须匹配的参数的数据类型或参数的类型必须被提升为代表的类型格式说明符。

Stateflow软件假定标量返回值毫升名称空间操作符和毫升函数调用时,在这种情况下作为参数。看到图表推断毫升表达式的返回大小如何

例子

在这些例子中,x是一个MATLAB工作空间变量,d1d2Stateflow数据:

  • 一个=毫升(sin (x))

    在这个例子中,毫升函数调用MATLAB函数评估的正弦x在MATLAB工作区。结果是那么Stateflow数据赋值给变量一个。因为x是一个工作空间变量,然后呢sin (x)评估在MATLAB工作区,你直接进去吗evalString参数(“sin (x)”)。

  • =毫升(“罪(%)”,d1)

    在这个例子中,MATLAB函数评估的正弦d1在MATLAB工作区和分配结果Stateflow数据变量一个。因为d1Stateflow数据,插入它的价值呢evalString参数(“罪(%)”使用表达式的格式)% f。这意味着,如果d1= 1.5,MATLAB工作区中的表达式计算罪(1.5)

  • =毫升('matfunc(% g”,英语字母“x % f), d1, d2)

    在这个例子中,表达式matfunc(% g”,英语字母“x % f)”evalString前面所示格式的声明。Stateflow数据d1d2插入表达式的格式说明符% g% f,分别。“英语字母”是一个文字封闭的两个双引号,因为它是评价表达式的一部分,已包含在单引号。

  • sfmat_44 =毫升(兰德(4))

    在这个例子中,一个4×4平方矩阵0到1之间的随机数并分配给Stateflow数据返回sf_mat44。Stateflow数据sf_mat44之前必须定义为一个4×4数组模拟。如果它的大小是不同的,在运行时生成一个失配误差大小。

毫升表达式

对于C图表,您可以混合毫升名称空间操作符和毫升函数表达式以及Stateflow数据在较大的表达式。下面的例子广场正弦余弦工作空间变量的一个角度X并将它们添加:

ml.power (ml.sin (ml.X), 2) +毫升(的权力(cos (X), 2)”)

第一个操作数使用毫升名称空间操作符调用函数。它的参数是ml.X,因为X在MATLAB的工作区。第二个操作数使用毫升函数。因为X在工作区中,它出现在evalString表达式为X。执行每个操作数的平方与MATLAB权力价值函数,该函数接受两个参数:广场,和功率值,2。

表达式使用毫升名称空间算子和毫升函数可以作为参数毫升名称空间操作符和毫升函数表达式。下面的例子巢毫升表达式在三个不同的层次:

一个= ml.power (ml.sin (ml。X +毫升(cos (Y))), 2)

写你的毫升表情,遵循的优先级的水平二元运算。使用括号表达式与周围的力量^运营商当你与其他算术运算符一起使用它们。

Stateflow软件检查表达式的数据大小不匹配你的行动在图表和在运行时解析。因为返回的值毫升表达式是不知道直到运行时,Stateflow软件必须推断出它们的返回值的大小。看到图表推断毫升表达式的返回大小如何

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

在大多数情况下,符号的毫升名称空间操作更简单。然而,使用毫升函数调用并提供一些优点:

  • 使用毫升函数来动态地构建工作空间变量。

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

    循环MATLAB的工作区中创建了四个新矩阵变量。默认初始化过渡Stateflow计数器为0,而前两个路口之间的过渡段增加1。如果小于5,过渡段回到顶部结评估毫升函数调用毫升(' % d =兰德(% d) ',我,我)的当前值。当大于或等于5,底部两个路口之间的过渡段和执行停止时发生。

    过渡执行以下MATLAB命令,创建一个工作区标量(A1)和三个矩阵(A2,A3,A4):

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

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

    ml.A = ml.magic (4) B =毫升(“+”)

    这个例子设置工作空间变量一个一个神奇的4×4矩阵使用毫升名称空间算子。Stateflow数据B然后设置的吗一个及其转置矩阵,一个“产生一个对称矩阵。因为毫升名称空间算子不能对表达式求值一个“,毫升函数是用来替代。然而,您可以调用MATLAB函数转置毫升名称空间算子的等价表达式如下:

    B = ml.A + ml.transpose (ml.A)

    作为另一个示例中,您不能使用参数与单元数组或下标表达式,包括冒号毫升名称空间算子。然而,这些可以包括在一个毫升函数调用。

毫升数据类型

Stateflow数据的类型毫升内部类型与MATLAB类型mxArray对于C图表。你可以分配(存储)Stateflow层次结构中的任何类型的数据的数据类型毫升。这些类型包括任何Stateflow层次结构中定义的数据类型或返回的MATLAB工作区毫升名称空间操作符或毫升函数。

使用规则毫升数据类型

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

  • 你可以初始化毫升数据从MATLAB工作区就像Stateflow层次结构中的其他数据(见从MATLAB基础工作空间初始化数据)。

  • 任何数值标量或数组毫升Stateflow层次结构中的数据可以参与任何形式的一元运算和任何一种二元运算中的任何其他数据的层次结构。

    如果毫升数据参与任何数值操作与其他数据的大小毫升数据必须从上下文推断出它,正如返回的数据毫升名称空间操作符和毫升函数。看到图表推断毫升表达式的返回大小如何

  • 你不能定义毫升数据与范围常数

    这个选项是禁用数据属性对话框在Model Explorer Stateflow数据类型毫升

  • 您可以使用毫升数据建立仿真目标而不是建立一个可嵌入代码生成目标。

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

    1. 你只能指数与数值数组元素。

    2. 你可以仅仅通过指数数值数组的维度。

      换句话说,您可以访问只有一维数组由单个索引值。你不能访问一个多维数组与单个索引值。

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

    在后面的例子中,mldata是一个Stateflow数据类型的毫升,ws_num_array是一个2×2 MATLAB工作区与数值数组,然后呢ws_str_array是一个2×2 MATLAB工作区与特征向量数组值。

    mldata = ml.ws_num_array;/ *好* / n21 = mldata [2] [1];/ *好的数值数据类型的ml * / n21 = mldata [3];/ *不可以2×2数组数据* / mldata = ml.ws_str_array;/ *好* / s21 = mldata [2] [1];/ *不可以为特征向量数据类型的毫升* /
  • 毫升数据不能有一个范围外C图;也就是说,你不能定义的范围毫升数据作为输入模型万博1manbetx输出仿真软件万博1manbetx

持有人对空间数据的地方

这两个毫升名称空间算子和毫升MATLAB工作区中的函数可以直接访问数据,并将它返回给C图。然而,在MATLAB工作区中维护数据可以给Stateflow用户冲突与其他数据已经在工作区中居民。因此,与毫升数据类型,您可以维护毫升图表中的数据,在C语言中使用MATLAB计算图表。

作为一个例子,在以下语句,mldata1mldata2Stateflow数据类型的吗毫升:

mldata1 = ml.rand (3);mldata2 = ml.transpose (mldata1);

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

在这个例子中,第二行mldata2的Stateflow数据类型毫升,接收矩阵的转置矩阵mldata1。这是指定的MATLAB函数的返回值转置在这mldata1是参数。

注意符号的差异如果前面的示例使用MATLAB空间数据(wsdata1wsdata2)而不是Stateflow毫升数据保存生成的矩阵:

ml.wsdata1 = ml.rand (3);ml.wsdata2 = ml.transpose (ml.wsdata1);

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

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

在C语言中图表、Stateflow表达式使用毫升名称空间算子和毫升在MATLAB函数评估在运行时工作区中。返回的数据的实际尺寸以下表达式类型在运行时只知道:

  • 使用MATLAB工作区数据或函数毫升名称空间操作符或毫升函数调用

    例如,表达式的返回值的大小毫升。var,毫升。函数(),或毫升(evalString,__arg1,最长,……),在那里var是一个变量和MATLAB工作区吗函数是一个MATLAB函数,不能认识到运行时。

  • Stateflow数据的类型毫升

  • 图形函数,返回Stateflow数据的类型毫升

当这些表达式出现在行动,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命令或Stateflow数据的类型毫升可这些独立的成员的表达水平,为解决返回尺寸是必要的:

参数

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

在表达z +函数(x + ml.y)的大小ml.y是独立的大小z,因为ml.y用于函数参数水平。然而,返回的大小函数(x + ml.y)必须匹配的大小z,因为他们都是在相同的表达水平。

数组索引

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

在表达x +数组[y]的大小y是独立的大小x因为yx处于不同水平的表达。同时,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 Stateflow数据数组,调用表达式,gfunc(ml.y + x),要求ml.yx评估2×3数组(或标量)在运行时。

毫升函数调用可以只标量文字或字符向量参数。任何MATLAB命令或数据,指定一个参数毫升函数必须返回一个标量值。

在表达一个=毫升(sin (x)),毫升函数调用MATLAB函数评估的正弦x在MATLAB工作区。Stateflow数据变量一个商店的结果。

大小的分配,右边的表达式必须匹配左边的表达式的大小,但有一个例外。如果左边的表达式是一个MATLAB变量,如ml.x或Stateflow数据的类型毫升,右边表达式的大小决定了表达式。

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

在一个任务,Stateflow列向量左边兼容MATLAB行或列向量相同大小的右边。

一个矩阵定义的行维度1被认为是一个行向量。一个矩阵定义与一维或一列维度1被认为是一个列向量。

在表达s =毫升。函数(),在那里毫升。函数()返回一个1×3矩阵,如果年代是一个向量的大小3赋值是有效的。

如果你不能解决的回报大小MATLAB命令或数据元素在一个更大的表达式的任何先前的规则,他们认为返回标量值。

在表达ml.x = ml.y + ml.z之前,没有一个规则可以用来推断一个普遍的大小ml.x,ml.y,ml.z。在这种情况下,两者都有ml.yml.z假定返回标量值。即使ml.yml.z返回匹配的大小在运行时,如果他们返回nonscalar值,大小不匹配错误的结果。

前面的规则解决大小的MATLAB命令或Stateflow数据类型的成员毫升在一个更大的表达式仅适用于数值的情况预计的成员。对于非数字的回报,一个运行时错误的结果。

请注意

MATLAB命令或数据类型的成员毫升在一个更大的表达式是有限的数值(标量或数组)只有参与数值表达式。

表达式x +毫升。str,在那里毫升。str是一个特征向量空间变量,会产生一个运行时错误说明毫升。str不是一个数字类型。

发生特殊情况存在,没有尺寸检查解决MATLAB命令或数据的大小表达式,表达式的一部分。使用以下表达式不需要在运行时执行尺寸检查:

  • 毫升。var

  • 毫升。函数()

  • 毫升(evalString,__arg1,最长,……)

  • Stateflow数据的类型毫升

  • 图形函数返回一个Stateflow数据的类型毫升

在这些情况下,返回分配给一个赋值语句的左边或没有检查的函数参数发生大小两者之间的不匹配:

  • 一项任务中,左边是一个MATLAB工作空间变量

    例如,在表达式ml.x = ml.y,ml.y是一个MATLAB工作空间变量的任何大小和类型(结构、单元阵列特征向量,等等)。

  • 一项任务的左手边是一个数据类型毫升

    例如,在表达式m_x =毫升。函数(),m_x是一个Stateflow数据类型的毫升

  • MATLAB函数的输入参数

    例如,在表达式毫升。函数(ml.x m_xgfunc()),m_x是一个Stateflow数据类型的毫升,ml.x是一个MATLAB工作空间变量的任何大小和类型,然后呢gfunc()是一个Stateflow图形函数,返回一个Stateflow数据类型的毫升。尽管尺寸检查不发生输入类型,如果传入的数据不是预期的类型,错误函数调用的结果毫升。函数()

  • 参数指定为Stateflow数据的图形函数的类型毫升在其原型声明

    请注意

    如果你输入在前面的情况下替换non-MATLAB数字Stateflow数据,转换到一个毫升类型出现。