消息是一个Stateflow®对象,用于在本地或图表之间进行数据通信。从发件人图表中,您可以发送或转发邮件。在接收图表中,队列接收消息并将其保存,直到图表能够对其进行评估。
使用Stateflow运算符,您可以访问消息数据,并发送、接收、丢弃或转发消息。您还可以确定消息是否有效,并查找队列中的消息数。
访问消息数据
状态流消息有一个数据字段。要读取或写入有效消息的消息数据字段,请使用点符号语法:
message_name.data
如果发送消息时未首先为消息数据赋值,则数字数据的默认值为0。对于枚举数据,默认值是定义的枚举部分中列出的第一个值,除非在定义的方法部分中另有指定。
您无法访问仍在队列中或已丢弃的消息的消息数据。
发送消息
要发送消息,请使用send操作符:
send(message_name)
例如,在此图表中,状态A中的进入操作发送数据值为3的消息M。如果消息是本地消息,则该消息将进入本地消息队列。如果消息范围为Output,则图表会通过输出端口将消息发送到接收图表的输入消息队列。
在单个时间步骤中,可以通过输出端口或本地队列发送多条消息。
以下模型中,我将message中data数组所有元素赋值为3,然后将第二个元素赋值为4.
看下生成代码,完全正确
监视过渡和动作
消息可以监视转换或on类型的状态操作。在时间步长期间,当第一次评估监视消息时,图表会将消息从队列中删除,并使消息有效。当消息有效时,其他转换或操作可以访问消息数据,但不会从队列中删除另一条消息。
用消息监视转换
在此图表中,消息M监视从状态a到状态B的转换。当这两个条件都成立时,转换发生:
队列中存在一条消息。
消息的数据值等于3。
如果不存在消息,或者数据值不等于3,则不会发生转换。如果存在消息,则无论是否发生转换,都会将其从队列中删除。
用消息监视on动作中的状态
在此图表中,消息M监视状态a中的开启操作。当状态a变为活动状态时,如果这两个条件都为真,则会增加x值:
队列中存在一条消息。
消息的数据值等于3。
如果不存在消息,或者数据值不等于3,那么x的值不会改变。如果存在消息,则无论是否修改了x,都会将其从队列中删除。
接收消息
要接收消息,请使用receive操作符:
receive(message_name)
如果存在有效的消息M,则receive(M)返回true。如果有效消息不存在,但队列中有消息,则图表将从队列中删除该消息,receive(M)返回true。如果有效消息不存在,并且队列中没有消息,则receive(M)返回false。
例如,在此图表中,状态A中的操作过程检查队列中的消息M,如果这两个条件都为真,则增加x值:
队列中存在一条消息。
消息的数据值等于3。
如果不存在消息,或者数据值不等于3,那么x的值不会改变。如果存在消息,则无论是否修改了x,都会将其从队列中删除。
丢弃消息
要丢弃有效消息,请使用丢弃运算符:
discard(message_name)
图表丢弃一条消息后,可以在同一时间步长从队列中删除另一条消息。图表无法访问已丢弃消息的数据。
例如,在此图表中,处于状态A的操作期间会检查队列中的消息M。如果存在消息,则图表会将其从队列中删除。如果消息的数据值等于3,则图表将丢弃该消息。
转发消息
要将消息从输入队列转发到输出端口,或转发到本地消息队列或从本地消息队列转发消息,请使用转发运算符:
forward(input_message_name, output_message_name)
图表转发消息后,可以在同一时间步长从队列中删除另一条消息。
转发输入消息
在此图表中,状态A检查输入队列中的消息M_In。如果存在消息,则图表会从队列中删除该消息,并将其转发到输出端口M_out。图表转发消息后,该消息在状态A下不再有效。
转发本地消息
在此图表中,状态A检查输入队列中的消息M_In。如果存在消息,则图表将消息转发到本地消息队列M_local。在0.3秒的延迟之后,从状态a到状态B的转换将消息从M_local消息队列中移除,并将其转发到输出端口M_out。
确定消息是否有效
要检查消息是否有效,请使用isvalid运算符:
isvalid(message_name)
如果图表已将消息从队列中删除,且未转发或丢弃,则消息有效。请使用isvalid运算符检查消息在包含多个状态流程图的Simulink®模型中是否有效。
例如,此图表首先执行状态A,如丢弃消息中所述。当图表执行状态B时,操作期间检查消息M是否有效。如果消息有效且数据值等于6,则图表将丢弃该消息。
确定队列的长度
要检查消息队列中的消息数,请使用长度运算符:
length(message_name)
例如,在此图表中,处于状态A的操作期间会检查队列中的消息M。如果存在消息,则图表会将其从队列中删除。如果队列中正好有七条消息,则图表会增加x的值。
确定队列何时溢出
要检查消息是否因发送到已满的队列而丢失,请使用溢出运算符:
overflowed(message_name)
在每个时间步长中,当图表向队列添加消息或从队列中删除消息时,会设置此运算符的值。在同一时间步骤中发送或检索消息之前使用溢出运算符是无效的。
默认情况下,当消息队列溢出时,模拟会因错误而停止。要防止出现运行时错误并允许溢出的运算符对丢弃的消息做出动态反应,请将“队列溢出诊断”属性的值设置为“警告”或“无”。
检查输入消息溢出
要检查输入消息队列的溢出状态,请首先从队列中删除一条消息。你可以:
使用消息和溢出的运算符监视转换。
用消息监视转换,并在目标状态的输入操作中调用溢出的运算符。
使用消息监视操作的状态,并在操作中调用溢出的运算符。
在状态操作中,使用receive运算符,后跟overflow运算符。
在同一时间步骤中检索输入消息之前调用溢出的运算符会导致运行时错误。
检查输出消息溢出
要检查输出消息队列的溢出状态,请首先向队列中添加一条消息。你可以:
使用send运算符,后跟溢出的运算符。
使用前向运算符,后跟溢出运算符。
在同一时间步中发送或转发输出消息之前调用溢出的运算符会导致运行时错误。
检查本地消息溢出
要检查本地消息队列的溢出状态,请在调用溢出运算符之前向队列中添加消息或从队列中删除消息。在同一时间步骤中发送或检索本地消息之前调用溢出的运算符会导致运行时错误。