屏蔽回调
此示例侧重于在屏蔽块中使用回调。
模拟环境中的掩模
面具是一个可定制的用户界面,简化了块的使用,以及它的重用。 屏蔽块有自己的设置窗口,您可以在其中更改各种参数。
使用面具,您可以:
*创建一个设置窗口,用于快速更改子系统或块参数。
*隐藏子系统的内容并保护其免受意外更改。
*通过调整其图标来更改块的外观。
此外,掩码经常与用户库一起使用。
创建子系统
让我们创建一个子系统,进入它并添加三个块-"增益因子","加法"和"常数"。 我们会打电话给入口 x 和 y,将输入信号乘以系数 k 并为其添加一个常数。 b:
让我们将子系统称为"线性函数",输入当前仿真时间,并记录输出并将其添加到信号可视化模块:
如果我们尝试运行这个模型,那么我们当然会看到一个模拟错误。 毕竟,变量 k 和 b 未在工作区中定义。
子系统屏蔽
而不是在命令行、脚本或模型回调中分配它们,让我们右键单击子系统并在掩码部分单击"添加掩码"。
因此,在一个新的浏览器窗口中打开了一个配置蒙版的工具--蒙版编辑器。 它由一个界面编辑器和一个代码编辑器组成。
界面编辑器允许您向块设置窗口添加各种控件、结构元素和操作。
默认情况下,在界面编辑器中创建了一个名为"主选项卡"的选项卡和一个用于隐藏"主组"的部分。
您可以重命名它们。:
*或双击选项卡名称,更改它,然后按Enter键。
*或者,选择一个节并在设置面板中更改节名称参数。
单击"+"按钮将创建另一个选项卡。
添加控件
控制包括:
*输入字段;
*复选框;
*下拉列表。
您可以将元素从"库"面板拖到"设置"窗口中,方法与向画布添加块时的方法相同。
如果需要删除某个项目,请选择它并按Delete键。
如果选择控件,例如输入字段,则可以在"设置"面板中更改其参数。
参数名称是您在块中访问的变量的名称。 在我们的例子中,有两个这样的变量。 - k 和 b.
让我们设置第一个参数的名称并写入 k. 将"字段名称"更改为"角度系数",并将默认值设置为5。
添加另一个输入字段。 我们将参数名称设置为 b,我们表明这是一个自由成员,并定义默认值:
如果你现在运行模拟,它将完成没有错误,尽管没有变量。 k 和 b 在工作区中,因为现在它们被定义在掩码中。
反过来,您可以轻松调整参数值,因为为此您不必打开命令行或切换到子系统。
掩码回调
单击"代码编辑器"选项卡后,掩码回调编辑器打开。:
回调分为全局和本地。
全局回调应用于整个掩码:
iconDrawCallback-当您需要根据当前参数值重绘块图标时调用。blockChangedCallback-在一个或多个掩模参数被改变之后执行。
本地回调绑定到特定的掩码参数,并在其值更改后触发。
选择参数 k 在左边的面板中,我们会看到我们可以设置两个本地回调函数。:
valueChangedCallback-参数值更改时执行;validateCallback-验证参数(即验证输入值的正确性)。
参数验证
回调;回调 validateCallback 它必须从宏开始 @assert. 您可以指定逻辑表达式和后面的错误文本。 例如,将参数值与零进行比较:
@assert value > 0 "Значение должно быть больше нуля"
如果您现在尝试将角度系数的值更改为负值,则会显示错误。:
隐藏参数
让我们删除验证并在界面编辑器中添加另一个控件-一个复选框。 让我们命名变量 is_direct 在名称中,我们将写入"直接比例",并指出默认情况下应激活复选框。
让我们回到代码编辑器并编写回调函数。 更改复选框的值时,我们将隐藏参数。 b 从面具,或显示它。
要做到这一点,让我们转向一个特殊的对象。 mask.parameters,其中存储掩码参数。 我们对参数感兴趣 b 所以让我们在点之后写下他的名字。
如果我们想更改b的值,我们需要引用属性 value. 例如,我们可以写 mask.parameters.b.value = 42. 之后,每次复选框的状态发生变化时,参数 b 指定的值将被分配:
mask.parameters.b.value = 42
但是我们不想赋值,而是从掩码中隐藏参数。 因此,我们必须参考属性 hidden 并为其分配一个布尔值。 如果复选框 is_direct 取值 true,参数 b 不应显示:
mask.parameters.b.hidden = is_direct
让我们保存蒙版,并确保现在自由成员的显示取决于复选框的值。 但是如果我们运行模型,我们会看到参数 b 它只是从掩模中消失,但在模拟期间继续考虑其值。
我们来修好它。:
-
定义一个名称为变量
constant_path并将路径保存到其中的"常量"块。 -
并且还记下以下条件。 如果复选框处于活动状态,则将常量的值设置为零。 否则,我们将为其分配一个参数。
b.
mask.parameters.b.hidden = is_direct
constant_path = joinpath(engee.gcb(), "Константа")
if is_direct
engee.set_param!(constant_path, "Value" => "0.0")
else
engee.set_param!(constant_path, "Value" => "b")
end
一方面,此示例显示您可以在掩码回调中使用编程控制方法。 另一方面,它演示了应用"隐藏"属性的方法之一。
让我们保存掩码,并确保现在当复选框被激活时,参数值为 b 对仿真结果没有影响。 当取消激活复选框时,"自由成员"参数将保存最后输入的值。
自定义外观
最后,我想向您展示如何使用回调。 iconDrawCallback. 要自定义蒙版的外观,请使用函数 engee.show.
在[文档](https://engee.com/helpcenter/stable/ru/guide/masks-main.html#engee-show )你会发现许多自定义块外观的例子。 您可以输出文本、LaTeX公式、图形和图像。 此外,您可以调整水平和垂直对齐方式,在块上显示几层图像,并更改端口签名。
让我们在街区上划一条线 y = kx + b 我们将把参数值插入其中。 只有当"直接比例"复选框被停用时,我们才会显示自由项的值。:
text = "y = $(k)x"
if !is_direct
text = text * " + $(b)"
end
engee.show(text)
让我们保存掩码,并确保在更改参数时更新块图标。:
结论
在这个例子中,我们研究了屏蔽块,并熟悉了各种类型的回调。 我们学习了如何验证参数、隐藏参数和自定义块的外观。