3. 使用真值表实现逻辑决策
任务说明
在Simulink/Stateflow中,当控制逻辑表现为“多输入条件组合决定输出”时,使用真值表(Truth Table)比逐个编写if-else转移更直观、易维护。本案例创建一个包含3个布尔输入(A、B、C)和1个布尔输出(Y)的真值表,实现逻辑:Y = (A && B) || C,并通过真值表驱动Stateflow中的状态转移——当输出为真时进入ACTIVE状态,否则停留在IDLE状态。
环境依赖
- MATLAB R2020b或更新版本(含Stateflow许可证)
- Simulink与Stateflow工具箱
实现步骤
- 在MATLAB命令窗口输入
sfnew创建空白Stateflow图。 - 双击图表进入编辑界面,从左侧面板拖入一个Truth Table块。
- 双击真值表块,按下方代码定义输入、输出与条件表。
- 在图表中添加两个状态
IDLE和ACTIVE,用默认转移连接(初始转移指向IDLE)。 - 从
IDLE到ACTIVE的转移条件写为[Y == true],从ACTIVE回到IDLE的条件写为[Y == false]。 - 在图表中添加输入事件或输入端口:右键图表→Add Input Port,添加
A、B、C三个布尔输入;添加输出端口Y。
关键完整代码
以下为真值表块内部定义(在Truth Table属性对话框中填写):
% 输入定义
A = {Inputs, 'boolean'};
B = {Inputs, 'boolean'};
C = {Inputs, 'boolean'};
% 输出定义
Y = {Outputs, 'boolean'};
% 条件表(每行:A B C | Y)
ConditionTable = [
true true true | true;
true true false | true;
true false true | true;
true false false | false;
false true true | true;
false true false | false;
false false true | true;
false false false | false;
];
% 动作表(每行对应条件表为真时的输出赋值)
ActionTable = {
'Y = true;';
'Y = true;';
'Y = true;';
'Y = false;';
'Y = true;';
'Y = false;';
'Y = true;';
'Y = false;';
};
在真值表属性对话框中,将Condition Table和Action Table分别粘贴到对应编辑区,并设置输入/输出名称与上述代码一致。
运行与验证
- 在Simulink模型中添加一个Signal Builder或Constant块组合,为A、B、C提供测试序列。
- 添加Scope连接到输出Y和当前状态(可通过Stateflow的Active State输出端口获取)。
- 点击Run仿真,仿真时间设为10秒。
通过判定标准:观察Scope波形,当输入组合满足(A&&B)||C为真时,状态输出显示为ACTIVE(通常编码为1或2),Y输出为高电平;否则状态为IDLE,Y为低电平。例如测试序列:A=1,B=1,C=0时Y应为1且状态为ACTIVE;A=1,B=0,C=0时Y应为0且状态为IDLE。
预期输出示例
对于输入组合A=true, B=false, C=true,真值表第3行匹配,输出Y=true,状态从IDLE转移到ACTIVE。该结果由真值表定义直接唯一推出,可用于核对模型配置是否正确。