代码生成的第一步是编译框图。这个阶段类似于C或c++程序的阶段。编译器执行类型检查和预处理。同样,仿真软件金宝app®引擎验证块端口的输入/输出数据类型是否一致,块之间的线宽是否符合预期厚度,连接块的样本次数是否一致。
Simu金宝applink引擎沿信号线将数据从一个块传播到下一个块。传播的数据包括
数据类型
线的宽度
样品时间
您可以通过键入来验证Simulink块支持的数据类型金宝app金宝app
在MATLAB®提示,或者(从Help浏览器)单击上面的命令。
Simu金宝applink引擎通常从源块派生信号属性。例如,import块的参数对话框指定了块的信号属性。
在本例中,Inport块的端口宽度为3,采样时间为0.01秒,数据类型为双精度,信号是复杂的。
下图通过一个简单的框图显示了与import块关联的信号属性的传播。
在本例中,Gain和Outport块继承为import块指定的属性。
源块中继承的采样时间(例如,根输入端口)有时会导致意外和非预期的采样时间分配。由于块可能指定继承的采样时间,因此一开始可用的信息通常不足以完全编译框图。
在这种情况下,Simulink引擎会将金宝app已知或指定的采样时间传播到已继承采样时间但尚未指定采样时间的块。因此,发动机将继续填充空白(未知采样时间),直到将采样时间分配给尽可能多的块。仍然没有采样时间的块将指定默认采样时间。
对于完全确定性模型(不使用上述规则设置采样时间的模型),您应该明确指定源块的采样时间。源块包括根输入端口块和没有输入端口的块。您不必设置子系统输入端口采样时间。但是,在创建模块化系统时,您可能需要这样做。
未连接的输入隐式地连接到地。对于接地块和接地连接,采样时间始终为常数(正
).
所有块都有一个继承的采样时间(T年代= 1)。它们的样本时间是Tf-T我) / 50。
默认情况下,显示采样时间颜色时,常数块呈现洋红色,表示块输出在模拟过程中具有常数值。在模拟过程中,其输出值也是恒定的下游块,例如获得如果块使用继承的样例时间,则类似地显示为品红色。为这些块生成的代码部分取决于块参数的可调性。
如果设置了模型配置参数默认参数的行为来内联
,块参数在生成的代码中不可调。由于块输出是恒定的,代码生成器消除了由于恒定折叠而产生的块代码。如果代码生成器无法折叠代码,或者如果您选择设置以禁用恒定折叠,则模块代码将显示在模型初始化功能中。生成的代码效率更高,因为它在执行期间不计算这些块的输出。
但是,如果配置块或模型,使块参数作为可调变量显示在生成的代码中,则代码生成器将以不同的方式表示块。块参数是可调的,例如:
设置参数默认参数的行为来可调
.默认情况下,数值块参数显示为全局参数结构的可调字段。
您可以使用可调参数,例如金宝appSimulink.参数
对象,该对象使用的存储类不是汽车
,作为一个或多个数字块参数的值。无论您为模型配置参数选择何种设置,这些块参数都是可调的默认参数的行为.
如果块参数是可调的,则生成的代码必须在执行期间计算块输出。因此,块代码出现在模型中步
函数。如果模型使用多个离散速率,则块代码将出现在输出函数中,用于使用块输出的最快下游速率。
当输入块是触发或函数调用子系统的信号源时,您可以使用闩锁选项在子系统执行时保留输入值。输入块闩锁选项包括:
为 | 使用 |
---|---|
触发子系统 | 通过延迟外部信号锁存输入 |
函数调用子系统 | 锁存输入用于函数调用子系统输出的反馈信号 |
当选择子系统块参数时锁存输入用于函数调用子系统输出的反馈信号对于函数调用子系统,代码生成器
在生成的代码中保留闩锁,不管可能设置的优化是什么
将锁存代码放置在子系统输出/更新函数的开始位置
有关这些选项的更多信息,请参阅轮廓尺寸.
一旦Simulin金宝appk引擎编译了框图,它就会创建一个
文件(类似于从C或c++文件生成的对象文件)。的模型
.rtw
文件包含模型的连接信息以及信号属性。因此,中的定时引擎可以确定何时应执行具有不同速率的块。模型
.rtw
不能通过直接调用模型中的块(在手写代码中)来重写此执行顺序。例如,在下一个图中disconnected_trigger
左侧的模型将其触发器端口连接到地,这可能导致块继承恒定采样时间。调用触发器函数,f ()
,直接从用户代码不起作用。相反,您应该使用函数调用生成器来指定f ()
,如连接的U触发器
右边的模特。
代替函数调用生成器,您可以使用另一个可以驱动触发器端口的块。然后,您应该调用模型的主入口点来执行触发器函数。
对于多速率模型,代码生成器的一个常见用途是分别为各个模型生成代码,然后在生成的代码模块之间手工编写I/O代码。这种方法将模型之间的数据一致性的负担交给了模型的开发人员。另一种方法是让Simulink和代码生成器保持速率之间金宝app的数据一致性,并生成用于多任务环境的多速率代码。速率转换块能够接口周期和异步信号。的描述金宝app仿真软件编码器™块库,看到异步事件.有关多速率代码生成的更多信息,请参见多任务执行建模.
代数循环是变量之间的循环依赖关系。这就避免了直接计算它们的值。例如,在方程组的例子中
X = y + 2
y = - x
的值x
和y
不能直接计算。
要解决这个问题,要么反复尝试潜在的解决方案金宝搏官方网站x
和y
(以一种智能的方式,例如,使用基于梯度的搜索)或“解”方程组。在前面的例子中,将系统解成显式形式将导致
2x=2
y = - x
x = 1
y = 1
当具有直接馈通的块的输出(例如获得,总和,产品,转移Fcn)作为输入反馈到同一块。Simu金宝applink引擎通常能够解决包含代数循环的模型,例如下一个图。
代码生成器不会生成解决代数循环的代码。这个限制包括在反馈路径中使用代数约束块的模型。然而,Simulink引擎金宝app通常可以通过在包含方程的模型中以特定方式对方程进行分组,从而消除产生的代数循环。它通过分离更新和输出函数来实现这一点,以避免循环依赖。有关详细信息,请参见代数循环概念.
虽然Simulink金宝app引擎可以最小化涉及原子和启用子系统的代数循环,但对于某些触发的子系统需要特别考虑。下面的模型和触发的子系统中显示了一个可以生成代码的示例。
默认的Simulink行金宝app为是为子系统组合输出和更新方法,这会创建一个明显的代数循环,即使子系统中的Unit Delay块没有直接的馈通。
如果可行,您可以允许Simulink金宝app引擎通过拆分触发子系统和启用触发子系统的输出和更新方法来解决问题。如果希望代码生成器利用此功能,请选择subsystem block parameter(子系统块参数)最小化代数循环出现次数. 选择此参数可避免循环中涉及的触发子系统中出现代数循环警告。
请注意
如果选中此框,则为该子系统生成的代码可能包含拆分输出和更新方法,即使该子系统实际上没有参与循环。此外,如果直接馈通块(如增益块)连接到上述触发子系统中的输入端口,Simulink引擎无法解决问题,代码生成器也无法生成代码。金宝app
模型配置参数最小化代数循环出现次数也可用。选择它使代码生成器能够为包含的模型生成代码模型涉及代数循环的块。