编写真值表
在创建真值表后,您可以对其进行编程,使其根据您的设定执行。要编写真值表,您需要添加条件、决策和动作。有关创建真值表的详细信息,请参阅使用真值表对组合逻辑建模。
MATLAB® 中的独立 Stateflow® 图不支持真值表。有关详细信息,请参阅使用真值表对组合逻辑建模。
打开真值表进行编辑
在 Stateflow 图或 Simulink® 模型中创建真值表并为其添加标签后,可以指定其逻辑行为。这些设定同时适用于 Simulink 模型中的真值表模块和 Stateflow 图中的真值表函数。在此示例中,您指定一个真值表函数的行为。
要打开该真值表,请双击您在使用真值表对组合逻辑建模中创建的真值表函数 ttable
。
默认情况下,真值表包含一个条件表和一个动作表,二者各有一行。条件表还包含一个决策列 D1 和一个动作行。
选择动作语言
如果真值表位于使用 C 语言作为动作语言的 Stateflow 图中,则您可以为您的 Stateflow 真值表指定动作语言:
打开属性检查器。在建模选项卡的设计数据下,选择属性检查器。
在属性部分下,选择 C 或 MATLAB 作为动作语言。
使用 MATLAB 作为动作语言的 Stateflow 图仅支持使用 MATLAB 作为动作语言的真值表。
输入真值表条件
条件是在真值表中指定逻辑行为的起点。打开您的新真值表 ttable
进行编辑。从指定条件开始编写 ttable
的行为。
在条件表的条件列中输入条件。对于所输入的每个条件,可以在描述列输入可选说明。要为真值表 ttable
输入条件:
点击您要追加新行的条件表。
点击侧面板上的追加行按钮
两次。
真值表会在条件表的底部追加两个空行。
点击并拉动分隔条件表窗格与 动作表窗格的横条,使条件表窗格变大。
在条件表中,点击描述列顶部的单元格。
带闪烁文本的光标会高亮显示在该单元格中。
输入以下文本:
x is equal to 1
点击其右侧条件列中的相邻单元格。
在条件列的第一个单元格中,输入:
XEQ1:
此文本是可以包括在条件中的可选标签。每个标签必须以字母字符 (
[a-z][A-Z]
) 开始,后接任意数量的字母数字字符 ([a-z][A-Z][0-9]
) 或下划线 (_
)。按 Enter 键输入以下文本:
x == 1
此文本是真正的条件。所输入的每个条件的计算结果必须为零 (false) 或非零 (true)。您可以根据需要在条件中使用可选括号(例如
[x == 1]
)。在真值表条件中,您可以使用通过真值表函数的参数传递给真值表函数的数据。前面的条件测试参数
x
是否等于 1。您也可以使用为真值表的父对象(包括图)定义的数据。重复之前的步骤输入其他两个条件。
输入真值表决策
每个决策列(D1、D2 等)通过 AND 关系运算符将一组条件结果绑定到一起形成一个决策。决策中条件结果的可能值包括 T
(true)、F
(false) 和 -
(true 或 false)。在输入真值表条件中,您已为真值表 ttable
输入了条件。接下来继续在决策列中输入值:
点击动作表中要追加新列的决策列。
点击侧面板上的追加列按钮
三次。
点击决策列 D1 顶部的单元格。
按空格建,直到出现值
T
。按空格建可以在可能的值
F
、T
和-
之间切换。您还可以直接输入这些字符。按 1 会将值设置为T
,按 0 会将值设置为F
。按x
会将值设为-
。为决策列输入其余值:
真值表执行期间,会按从左至右的顺序进行决策测试。决策内各个条件结果的测试顺序未定义。真值表会按从上到下的顺序对每个决策的条件进行计算(首先是条件 1,然后是条件 2,以此类推)。由于这一实现在以后可能会有变化,因此请不要依赖某个特定的计算顺序。
默认决策列
ttable
最后一个决策列 D4 是此真值表的默认决策。该默认决策涵盖了之前的决策列中未测试到的其他所有决策。通过在最右侧决策列的每个单元格中输入来创建一个默认决策。这个输入条目代表条件的任何结果,T
或 F
。默认决策列必须是条件表右侧的最后一列。
输入真值表动作
真值表执行期间,会按从左至右的顺序进行决策测试。当实际结果与某一决策匹配时,即会执行在动作表的动作行中为该决策列指定的动作。然后,结束并退出真值表的执行。
在输入真值表决策中,您已为真值表输入了决策。下一步是在动作表中为每个决策输入要发生的动作。稍后,再将这些动作分配给条件表的动作行中与之对应的决策。
设置动作表
点击您要追加新行的动作表。
点击侧面板上的追加行按钮
三次。
对真值表的动作进行编程。
对真值表的动作进行编程
对于使用 MATLAB 作为动作语言的真值表,可以用 MATLAB 代码来编写动作。使用此代码,可以直接添加控制流逻辑并调用 MATLAB 函数。在下面的步骤中,您将使用 MATLAB 语法的以下功能在真值表 ttable
中编写动作:
持久变量
if ... else ... end
控制流for
循环
请按照以下步骤操作:
点击动作表 描述列顶部的单元格。
带闪烁文本的光标会高亮显示在该单元格中。
输入以下描述:
Maintain a counter and a circular vector of values of length 6. Every time this action is called, output r takes the next value of the vector.
按向右箭头键选择其右侧动作列中的相邻单元格。
输入下列文本:
A1:
先为动作输入可选标签,后接冒号 (
:
)。稍后,您要在条件表的动作行中输入这些标签,以为每个决策列指定一个动作。与条件标签一样,动作标签必须以字母字符 ([a-z][A-Z]
) 开始,后接任意数量的字母数字字符 ([a-z][A-Z][0-9]
) 或下划线 (_
)。按 Enter 键并输入以下代码:
persistent values counter; cycle = 6; coder.extrinsic("plot"); if isempty(counter) % Initialize counter to be zero counter = 0; else % Otherwise, increment counter counter = counter + 1; end if isempty(values) % Values is a vector of 1 to cycle values = zeros(1, cycle); for i = 1:cycle values(i) = i; end % For debugging purposes, call the MATLAB % function "plot" to show values plot(values); end % Output r takes the next value in values vector r = values( mod(counter, cycle) + 1);
在真值表动作中,您可以使用通过真值表函数的参数和返回值传递给真值表函数的数据。前面的动作将返回值
r
设为等于向量values
中的下一个值。您也可以使用为真值表的父对象(包括 Stateflow 图)定义的数据来指定动作。真值表动作也可以广播或发送为真值表或其父级(如 Stateflow 图本身)定义的事件。在动作表中输入其余的动作,如下所示:
如果在仿真期间执行动作
A1
,则会显示包含values
向量数据的绘图:
现在,您已准备就绪,可以将动作分配给决策。
将真值表动作分配给决策
您必须为条件表中的每个决策分配至少一个动作表中的动作。真值表使用此关联来确定决策测试结果为 true 时要执行的动作。
为决策分配动作的规则
为真值表中的决策分配动作时,适用以下规则:
您可以通过在决策列的动作行单元格中输入动作的行号或标签,来为决策指定动作。
如果使用标签来指定动作,则动作表中的该动作必须具有标签。
必须为每个决策指定至少一个动作。
决策的动作是必不可少的。每个决策至少要有一个动作设定符,指向动作表中的动作。如果不想为决策指定动作,可以指定一个不包含任何动作语句的行。
您可以为决策指定多个动作,以逗号、分号或空格分隔。
例如,对于决策列 D1,您可以指定
A1,A2,A3
或1;2;3
,以在决策 D1 为 true 时,执行前三个动作。您可以按任意顺序混合使用行号和标签操作设定符。
下面的示例同时使用行号和标签这两种动作设定符。
您可以为多个决策指定同一动作,如下所示:
条件表的动作行中的行号动作设定符会根据动作表中行顺序的变化自动进行调整。
如何将动作分配给决策
此部分说明如何将动作分配给真值表 ttable
中的决策。在本示例中,每个决策列的动作行单元格都包含一个为动作表中的动作所指定的标签。请按照以下步骤操作:
点击决策列 D1 底部的单元格,即条件表中动作行的第一个单元格。
为决策列 D1 输入动作设定符
A1
。当 D1 为 true 时,执行动作表中的动作
A1
。为其余决策列输入动作设定符:
现在,您已准备就绪,可以执行编写真值表的最后一步。
添加初始动作和最终动作
除了为决策指定动作外,您还可以为真值表函数添加初始动作和最终动作。初始动作指定任何决策测试发生之前执行的动作。最终动作指定在退出真值表之前作为最后一个动作执行的动作。要为真值表指定初始动作和最终动作,请在动作表中使用动作标签 INIT
和 FINAL
。
通过以下步骤添加初始动作和最终动作,以在真值表 ttable
的执行前后于 MATLAB 命令行窗口中显示诊断消息。
在真值表中,右键点击动作表的第 1 行,然后选择插入行。
动作表顶部会出现一个空行。
在建模选项卡中,选择追加行。
动作表底部会出现一个空行。
点击并拖拉真值表边框底部,以显示动作表的全部六行:
按如下所示,在第 1 行添加初始动作:
描述 动作 初始动作:
显示消息
INIT:
coder.extrinsic("disp");
disp("truth table ttable entered");
按如下所示,在第 6 行添加最终动作:
描述 动作 最终动作:
显示消息
FINAL:
coder.extrinsic("disp");
disp("truth table ttable exited");
虽然前面真值表示例中的初始动作和最终动作出现在动作表的第一行和最后一行,不过您实际上可以将这些操作输入到任意行。您也可以使用条件表的动作行中的动作设定符 INIT
或 FINAL
来为决策分配初始动作和最终动作。