此示例显示了如何在使用MATLAB®作为操作语言的Stateflow®图表和在app Designer中创建的MATLAB应用程序之间创建接口。有关将使用C作为操作语言的Stateflow®图表连接到MATLAB应用程序的更多信息,请参阅模拟媒体播放器.
在本例中,汽车电动车窗系统根据一对车窗控制开关升高和降低乘客侧车窗。MATLAB应用程序中的开关表示驾驶员和乘客车门上的控制装置。该应用程序还包含多个指示灯,用于监控电动车窗系统的状态,以及一个用于控制车窗开关的按钮t在窗户的路径上产生障碍物。
Stateflow图应用程序界面
提供了MATLAB应用程序与Simulink®模型中的控制和工厂系统之间的双向连接。金宝app当你将应用程序中的一个开关指向一个新位置时,图表会向电动窗控制系统发送相应的“上”、“下”或“中性”命令。相反,当控制系统改变状态时,图表在应用程序中启用或禁用相应的状态灯。
要运行该示例,请打开Simulink模型并单击金宝app跑.图表应用程序界面
打开应用程序并初始化电源窗口系统中的控制和工厂系统。若要停止模拟,请单击停止或关闭应用程序。
图表应用程序界面
已配置与MATLAB应用程序通信sf\u电源\u窗口\u应用程序
.要在MATLAB应用程序和使用MATLAB作为操作语言的状态流程图之间创建一个双向连接,请遵循以下步骤。在MATLAB应用程序中:
创建自定义属性以在模拟期间与图表交互。应用程序使用此属性访问图表输入、图表输出和本地数据。有关更多信息,请参见在应用程序设计器应用程序中共享数据.
修改startupFcn
通过添加一个新的输入参数并将其值存储为您在上一步中创建的属性来回调应用程序。有关更多信息,请参见在应用程序设计器中编写回调.
在状态流程图中:
创建本地数据对象以与应用程序接口。图表在调用应用程序中的帮助程序函数时将此本地数据对象用作参数。
将在上一步中创建的本地数据对象的类型设置为继承:从表中的定义
。有关详细信息,请参阅指定状态流数据的类型.
调用外部编码器
函数来声明应用程序和任何辅助函数为外部MATLAB代码。有关更多信息,请参见在状态流图中调用MATLAB外部函数.
使用关键字运行应用程序这
作为一个参数,让应用程序在模拟过程中访问图表。将应用程序的函数调用返回的值存储为创建用于与应用程序交互的本地数据对象。
在这个例子中,电源窗口应用程序使用了一个名为图表
与图表交互应用程序界面
.应用程序的回调函数使用这个属性写入图表输出:
当您将驾驶员侧控制开关移到新位置时DriverControlValueChanged
回调设置的值开关。驱动器
和开关。驱动器关闭
.
当您将乘客侧控制开关移到新位置时乘客控制值已更改
回调设置的值switches.passenger_up
和switches.passenger_down
.
当你点击障碍按钮时,障碍按钮按下
回调设置的值障碍
到真正的
.
当你关闭应用程序时,UIFigureCloseRequest
回调设置的值停止
到真正的
.
相反,在图表中InterfaceWithApp
运行应用程序sf\u电源\u窗口\u应用程序
并将返回值存储为本地数据对象应用程序
。图表在调用helper函数时使用此本地数据对象updateLamps
.在应用程序中,这个助手函数根据图表输入的值来打开和关闭灯灯
.
动力窗控制系统使用模式逻辑来确定窗口何时移动,并向伺服电机输出统一的运动指令。为了降低生产成本,控制系统不跟踪窗口位置。相反,它依靠来自伺服电机的信号来确定窗口何时完全打开或完全关闭,或何时遇到障碍。
控制系统满足以下性能要求:
窗户必须在5秒内完全打开或关闭。
当窗口达到完全打开或完全关闭的位置时,电机必须停止。
当车窗向上移动时,电机必须能够检测到障碍物。当电机检测到车窗路径上有障碍物时,必须将车窗降低一秒钟或直到车窗完全打开。
在任何方向连续移动10秒后,电机必须停止。该要求为车窗机构、电机和驱动器提供故障安全保护。
如果按下控制开关不到半秒,或按下时间超过一秒,则松开开关时车窗必须停止。
如果控制开关按下时间超过半秒,在一秒之前松开,窗口必须完全打开或关闭,除非有新的命令或障碍物打断它。这个要求代表了电动窗的自动模式能力。
驾驶员侧控制优先于乘客侧控制。
障碍物检测优先于驾驶员侧和乘客侧控制。
Stateflow图控制系统
为满足这些需求的事件驱动控制器建模。该图表由两个状态组成(开关
和逻辑
)并行分解。这些状态对图表输入的变化作出反应,决定电源窗口系统的运行模式,并管理激活伺服电机的输出信号。
国家开关
读取图表输入值并广播本地事件以更改电动车窗系统的操作模式。有关更多信息,请参阅广播本地事件以同步并行状态.
在仿真的每一个时间步长,状态调用真值表函数checkSwitches
确定驾驶员侧和乘客侧控制开关的位置。这取决于输入结构的值开关
,这个函数广播向上的
,向下
,中性
事件。由于当驾驶员侧控制装置不在“空档”位置时,该功能忽略来自乘客侧控制装置的任何输入,因此,根据要求7的规定,驾驶员侧控制装置优先于乘客侧控制装置。
以类似的方式,状态调用图形函数detectObstacles
来确定伺服电机中电枢电流的强度。如果现在的
是小的和非零的,一个障碍是存在的,所以功能广播事件障碍
.相反,如果值现在的
如果较大,则窗口已达到完全打开或完全关闭位置,因此函数将广播事件终点站
.因为图表显示detectObstacles
之前checkSwitches
根据要求8的规定,障碍物检测优先于驾驶员侧和乘客侧的控制。
国家逻辑
采用故障检测算法来保护窗口硬件和窗口路径中的任何障碍。这个州包含三个子州,停止
,移动
,EmergencyDown
,表示动力窗系统的运行模式。
最初,国家停止
是活跃的。这个状态包含两个平行的子状态模式
和位置
.
模式
确定电力系统何时准备好接受来自控制开关的新命令。当两个控制开关都处于“中立”位置时,系统就可以接受新的命令了。
位置
记录窗口是完全打开、完全关闭还是处于中间位置。该图表通过记录伺服电机到达其范围的终点时窗口的移动方向来确定。
停止
在事件广播之前保持活动状态向上的
或向下
指示来自控制开关之一的命令。只要窗口没有完全打开或完全关闭,这些事件就会触发状态转换移动
.然而,事件向上的
当窗口已完全关闭时,视为无效。同样,事件向下
当窗口完全打开时无效。
国家移动
是活动的,当窗口处于运动状态时。这种状态实现了与自动窗移动和故障检测相关的几个电动窗要求。这个状态有两个平行的子状态方向
和模式
.
方向
确定窗口应该移动的方向并调用函数go.up
和go.down
,如适当。这些功能设置了控制伺服电机和app中“上”和“下”状态灯的输出信号的值。
模式
实现要求5和6规定的电动窗的自动和手动模式。这个状态有三个互斥的子状态(初始化
,汽车
,手册
).最初,亚态初始化
是活跃的。子状态等待广播中性
事件,这表明控制开关已返回到“空挡”位置。如果广播发生在半秒之内初始化
事件变为活动时,会触发到停止
状态,表示窗口必须停止移动。如果广播发生在。的半秒之后,但在。的一秒之前初始化
当事件变为活动状态时,将触发到子状态的转换汽车
,表示电动窗系统处于自动模式运行。这个子状态保持活动状态,直到被事件广播中断终点站
(当车窗完全打开或完全关闭时),障碍
(当车窗遇到障碍物时),或向上的
或向下
(当系统从一个控制开关接收到一个新命令时)。最后,如果广播没有在初始化
变得活跃,时间的逻辑表达后(1秒)
触发到子状态的转换手册
.这个子状态保持活动状态,直到广播事件中性
触发转换回停止
状态。
无论系统处于自动模式还是手动模式,图表都直接从移动
到停止
在事件的广播中终点站
或者当移动
运动时间比FAILSAFE_TIMEOUT
秒,按要求2和4规定。默认情况下,该常量的值设置为10。
当窗口遇到障碍物时,施加在窗口上的力增加了伺服电机上的负载,导致电枢电流上升。通过监测电枢电流的急剧增加,系统检测窗口路径中的障碍。
在这个例子中,一个Simulink子系金宝app统模拟了伺服电机。窗口的位置由积分器(金宝app模型)饱和极限为0(完全打开)和10(完全关闭)的块。由于该块的输入增益为2,窗口在5秒内完全打开和关闭,如要求1所规定。当积分器块达到饱和点时,系统输出电枢电流
增加到10。此值指示窗口是完全打开还是完全关闭。
要在窗口的路径中引入一个障碍,请单击障碍当窗口向上移动时,应用程序中的按钮。的应用程序界面
图的响应是向伺服电机发送一个正信号,这反过来产生一个小的电枢电流上升。在控制系统
图,功能detectObstacles
在当前中注册此更改并广播事件障碍
.在逻辑
状态时,此事件触发从子状态的转换移动
到亚态EmergencyDown
.当这个子状态处于活动状态时,系统将窗口向下移动一秒钟或直到窗口完全打开。然后,图表转换回子状态停止
,表示窗口必须停止移动,如要求3所规定。
之后|焕然一新|发送|这|外部编码器
(MATLAB编码器)|积分器(金宝app模型)