Engee 文档

英国面具

面罩 —这是一个可定制的用户界面,用于创建自定义块。 可以基于任何块创建块。 工程师图书馆子系统

面罩 简化了使用和 重用块。 屏蔽块(应用了屏蔽)有自己的设置窗口,您可以在其中更改块参数。 掩码不仅允许您将参数传输到块或子系统,还允许您将参数传输到块的源代码。 功能C 功能.

面具可以让你:

  • 创建您自己的参数对话框,以便快速配置单元/子系统。

  • 更改块/子系统的外观。

  • 隐藏块/子系统的内容。

蒙版编辑器*是自定义蒙版的工具。 要打开编辑器,请右键单击块并选择 *面罩添加面具 :

masks 1 cn

编辑器将在新的浏览器窗口中打开:

mask editor 1 cn

保存遮罩后,遮罩参数显示在块设置中。 要查看块本身的参数,请单击 看看面具下面 . 要返回,请单击 查看面具 :

masks switching 1 cn

对于子系统,选项 看看面具下面 它在子系统内部传输它,而不是显示块参数。 使用方法 模型导航面板 以退出子系统。

要编辑或删除蒙版,请右键单击已创建蒙版的块的图标,然后选择 编辑掩码取下面具 :

masks main 1 cn

可以容易地调整掩模,使得当其参数的值改变时,块参数的值自动改变。 然而,相反的效果是不可能的:块参数的值不能改变掩模参数的值。 此限制通过掩码提供对块设置的控制,并防止对掩码本身的意外更改。

蒙版编辑器的界面

掩码编辑器包含两组选项卡:

  • 界面编辑器

  • 代码编辑器

界面编辑器

界面编辑器 -在"设置"窗口中添加控件、结构元素和选项卡掩码的部分。

mask editor 1 2 cn

  1. 操作-用于根据指定条件执行操作的控件。

    1. 1.1*按钮* mask button -单击时执行指定操作的控件。 按钮的逻辑在回调中设置 clickedCallback

  2. 结构元素 -用于放置和隐藏控件的容器:

    1. 2.1. 隐藏部分 hidden section masks -一个可以通过点击隐藏或打开的容器,允许您在同一时间控制多个元素的显示。

      隐藏部分 如果没有添加的控件,它将不会显示在蒙版中。 默认部分可以重命名。
  3. 控件 -从其形成块掩模的界面的主要部件。 每个控件有三个参数:

    • 参数名称 -必须匹配需要配置的掩码中变量的名称;

    • 字段名称 -将显示在设置窗口中;

    • 值或列表项-定义默认值。

    除了参数,您还可以配置属性:

    • 隐藏 -隐藏控件;

    • 计算 -分析输入的值,解释它,并存储适当的数据类型(例如,数字,字符串或数组)。 如果输入不正确的数据类型,系统将返回错误。

  1. 3.1. 输入字段 text input masks -添加带有输入文本或数值的掩码参数。 数据类型:任何;

  2. 3.2. 复选框 checkbox masks -用于标记框的区域。 数据类型:Bool;

  3. 3.3. 下拉列表 dropdown masks -显示可用选项列表,从中选择一个。 要将项目添加到下拉列表中,请在*列表项目*字段中一次输入一个,然后在每个值后按Enter。 数据类型:字符串;

    没有参数的下拉列表返回错误,并且不允许您保存掩码。
  1. *遮罩空间*是使用控件和结构元素创建遮罩的区域。 添加到该区域的所有元素将在保存后准确转移到蒙版。 要添加项目,请用鼠标拖动它们。:

    masks drag and drop cn

    要删除项目,请选择它并按 Delete.

    要添加新选项卡,请单击蒙版空间右上角的*+*。:

    new tab mask

  2. 保存按钮-保存蒙版。 或者,您可以使用键盘快捷键。 Ctrl+S (Win/Linux)和 +S (macOS)。

  3. 回调编辑器按钮打开部分 代码编辑器 .

  4. 隐藏左侧面板/显示左侧面板。

  5. 隐藏右侧面板/显示右侧面板。

代码编辑器

代码编辑器 -控制设置部分使用 回调函数(回调)。 每个控件元素都有自己独特的回调。

mask editor 1 3 cn

  1. 掩码参数的名称(您可以在界面编辑器中更改它们)。

  2. 字段名称-指示参数字段的标签或类型(您可以在界面编辑器中更改它)。 它提供了参数的目的或功能的更详细的描述。

  3. *回调代码空间*是为特定掩码参数配置回调的区域。

  4. 保存按钮-保存蒙版。 或者,您可以使用键盘快捷键。 Ctrl+S (Win/Linux)和 +S (macOS)。

  5. 隐藏左侧面板/显示左侧面板。

  6. 隐藏右侧面板/显示右侧面板。

回调

回调是响应某些操作而自动调用的函数。 *Engee*中的回调写入 Julia,在仿真过程中不执行,用于控制单个参数和整个掩码作为一个整体。 本地回调用于控制单个参数,全局调用用于整个掩码。:

  • 全局回调与整个掩码相关联,并且独立于特定参数执行。 全局回调是 iconDrawCallbackblockChangedCallback . 全球呼叫可以访问所有本地呼叫并可以管理它们。 例如,您可以将数据从本地呼叫传输到全局呼叫。 blockChangedCallback . 这将允许您使用全局调用来配置本地调用的操作。

  • 本地回调链接到特定的掩码参数,并且只有在更改这些参数时才会触发。 除此以外的所有回调 iconDrawCallbackblockChangedCallback ,是本地的。 本地回调只能在接口编辑器中使用它们绑定到的参数,而不能直接更改其他回调的参数( 复选框 无法管理下拉列表,全局回调用于此)。

要使用mask参数,首先需要获取它。 为此,使用了一个特殊的参数对象,它存储在变量中。 面具. 例如,获取参数 输入字段 text input masks 有一个名字 文本输入_1,您可以使用以下代码:

mask.parameters.text_input_1

参数对象有三个主要属性:

  • 名称::字符串 -字段名称(只读);

  • 价值::任何 -参数值(可用于读取和写入);

  • 隐藏::Bool -参数的可见性(可用于读取和写入)。

要更改参数,请始终为属性分配新值。 价值. 您不能直接更改现有值,因为这不会被视为更改。 例如:

  • 正确:

    mask.parameters.text_input_1.value = [1, 2, 3]
  • 不正确:

    append!(mask.parameters.text_input_1.value, 4)

要获取带有掩码的块的路径,请使用函数 恩吉。gcb()。 路径作为字符串返回。 这允许您使用代码控制块及其内部组件。 假设你需要从一个参数传递一个值 下拉列表 dropdown masks (dropdown_1)至室内机 LDL 因式分解:

LDLPath = engee.gcb() * "/LDL Factorization"
engee.set_param!(LDLPath, "NonPositive" => mask.parameters.dropdown_1.value)

这里 恩吉。gcb() 获取当前块的路径。 该路径用于查找LDL因式分解块,在从 dropdown_1 传递给参数 非正态分布 的块。 因此,功能 恩吉。gcb() 有助于将遮罩参数链接到模型的其他部分。

此外 恩吉。gcb() 要获取当前块,还使用以下内容 恩吉。gcm() 获取当前模型和 恩吉。政府资讯科技总监() 以得到当前系统。

配置蒙版的外观

要自定义蒙版的外观,请使用函数 恩吉。显示(。..). 它是从全局回调[icondraw](iconDrawCallback)中调用的,该回调是最后执行的,并形成最终的图标外观。

  • 每一个挑战 恩吉。显示(。..) 创建一个新的图像图层,该图层绘制在前一个图层之上。

  • 坐标系统统一归一化: xy 指定为块大小的百分比(范围 0..100 %).

    • (0, 0) -左下角; (100, 100) -右上角。

  • 如果未指定坐标,则使用块的中心。: x=50, y=50.


签名和参数:

# Текст
engee.show(text::AbstractString; x::Real=50, y::Real=50,
           h_align::Symbol=:center, v_align::Symbol=:middle)

# LaTeX (используйте L"...")
engee.show(text::LaTeXString; x::Real=50, y::Real=50,
           h_align::Symbol=:center, v_align::Symbol=:middle)

# SVG (строка вида svg"..." или готовый SVG-объект)
engee.show(svg; x::Real=50, y::Real=50)

# График (например, фигура из Plots.jl)
engee.show(fig; x::Real=50, y::Real=50)

#位图图像(图像。jl对象)
恩吉。显示(img;x::Real=50,y::Real=50)

这里:

  • x, y -层的参考点的位置(以百分比为单位)。

  • h_对齐 -相对于文本/乳胶的水平对齐 (x,y): :左, :中心 (默认情况下), :对.

  • v_对齐 -垂直文本对齐/乳胶: :顶部, :中间 (默认情况下), :底部.

h_对齐/v_对齐应用于文本和LaTeX。 对于SVG/图形/图像,使用显式坐标和层顺序。

价值 x/y 超出范围 0..100 允许,但是层可以延伸超出图标的边界。


例子:

  • 居中的多行文本(默认值)。 要使示例工作,必须将具有参数的字段添加到掩码编辑器中。 m_comm_baudRate:

    engee.show("ПОСЛЕДОВАТЕЛЬНЫЙ ПОРТ\nИмя порта: $(m_com)\nСкорость: $(m_baudRate)")
  • 标题在右下角:

    engee.show("RITM-COM"; x=100, y=0, h_align=:right, v_align=:bottom)
  • 两个SVG层,一个在另一个之上(顶部和中心):

    engee.show(svg"..."; y=100)
    engee.show(svg"...")
  • 右上角的乳胶配方:

    engee.show(L"\lvert u \rvert"; x=98, y=98, h_align=:right, v_align=:top)

*Engee*为所有内容类型使用一个标准化坐标系(0-100);没有*Autoscale*和*Pixel*模式。 挑战 恩吉。展览 没有坐标,相当于 x=50,y=50 (对于文本/乳胶以及 h_align=:中心, v_align=:中).

回调概述

更改参数值时启动掩码回调的顺序(不按使用 clickedCallback)下一个:

  1. 对于每个更改的参数,它被称为 validateCallback . 它首先执行,以确保参数具有有效值,然后再执行任何进一步的操作。

  2. 对于每个更改的参数,它被称为 valueChangedCallback . 在每个这样的调用之后,对于值在内部发生变化的所有参数 n.价值,价值,再次打电话 validateCallback ,因为改变值可能会影响其他参数。

  3. 本地回调完成后,将启动全局回调。 blockChangedCallback . 对于其内部已更改值的每个参数 blockChangedCallback的,再次打电话 validateCallback .

  4. 最后,它运行 iconDrawCallback ,根据当前参数值生成图标的外观。

通过对象进行的更改 面具 (例如, 面具。参数。text_input_1。值=10),不要立即应用于块。 所有参数更改都在掩码内部累积,然后在完成回调和适当检查后处理。 有效回传. 因此,如果在同一个回调中,您可以通过以下方式更改参数 面具 并在同一时间你调用程序控制功能(恩吉。set_param!, 恩吉。gcb() 等。),然后这些函数在应用通过 面具.

回调是单独处理的 clickedCallback :

  • 它仅在按下按钮时才被调用。;

  • 它适用于一次性操作:文件生成,内部块的软件配置,参数同步等。;

  • 它可以访问普通变量和对象的掩码参数。 面具 及软件控制功能(恩吉。gcb() 和其他人。);

  • 如果在里面 点击返回 掩模参数的值发生变化,并且也为这些参数启动级联。:

    validateCallback→valueChangedCallback→blockChangedCallback→iconDrawCallback.

了解回调的运行顺序对于块掩码正常工作非常重要,因为更改一个参数可能会影响其他参数。 遵循序列确保所有依赖关系都被考虑在内,并且块正常工作。


iconDrawCallback — 块外观的形成

Details

回调;回调 iconDrawCallback的 负责呈现块图标。 在里面:

  • 您可以将掩码参数值读取为常规局部变量(文本输入_1, dropdown_1 等。);

  • 您无法访问对象 面具 (面具。参数。..);

  • 您无法使用模型的软件管理功能(恩吉。gcb(), 恩吉。gcm(), 恩吉。政府资讯科技总监() 和其他人)。

通过 iconDrawCallback的 不能更改模型结构、添加/删除块和端口或更改参数属性。 它仅用于图像生成。

与之合作 iconDrawCallback 该功能必须使用 恩吉。表演(). 名称错误的图标 iconDrawCallback 它看起来像这样:

display callback 5

iconDrawCallback 它可以显示文本,数字,图形,图像或公式(LaTeX)。 例如:

  • 数字输出(文本类似):

    engee.show(text_input_1)

    display callback 1 cndisplay callback 2

  • SVG输出:

    engee.show(
        svg"""
        <svg xmlns="http://www.w3.org/2000/svg"
             width="78%" height="80%"
             viewBox="0 0 26 27"
             preserveAspectRatio="none">
            <path vector-effect="non-scaling-stroke"
                  d="M13 0.5L13 25.7282"
                  stroke="#DDDDDD"
                  stroke-linecap="round" />
            <path vector-effect="non-scaling-stroke"
                  d="M0.5 13H25.5"
                  stroke="#DDDDDD"
                  stroke-linecap="round" />
            <path vector-effect="non-scaling-stroke"
                  d="M24.1894 8.46273L13 8.46273L13 17.4628L2.18942 17.4627"
                  stroke="#212121"
                  stroke-linecap="round" />
        </svg>
        """
    )

    custom block 1

    以下规则用于SVG图标:

    • 视图框 必须匹配块图标的原始大小。;

    • 阔度/身高:

      • 100% -适用于有 没有边界:真的;

      • 等于块大小-对于所有其他情况;

    • SVG根元素必须具有 preserveAspectRatio="无";

    • 如果图标要随块旋转,则根SVG必须具有属性 风格="";

    • 所有绘制线条的元素都必须具有 vector-effect="non-scaling-stroke" -这可以在缩放和旋转时保留线条的厚度。

    违反这些规则可能会导致图标在块大小或方向更改时扭曲。

    建议对块使用SVG图标,因为它们占用更少的空间并自动调整到块大小而不会损失质量。
  • 胶乳配方的输出。 为此,请使用大写字母 和引号 "". 公式是按照经典的LaTeX语法用引号写成的。:

    engee.show(L"\lvert u \rvert")

    custom block 2

  • 图形输出:

    x = range(0, 2*pi, 1000);
    y = sin.(x);
    engee.show(plot(x, y))

    display callback 3

  • 图像输出:

    img = "...base64-text..."
    engee.show(Images.load(IOBuffer(base64decode(img))))

您可以使用函数更改块端口的签名 恩吉。port_label() 通过回调机制。 下面的示例演示如何在块图标上显示文本并为不同的端口设置签名。:

engee.show("Some text")                 # Вывод текста на иконку блока
engee.port_label("input", 1, "foo_1")   # Подпись 'foo_1' для первого входного порта
engee.port_label("input", 2, "foo_2")   # Подпись 'foo_2' для второго входного порта
engee.port_label("output", 1, "bar")    # Подпись 'bar' для выходного порта
如果掩码添加或删除端口(多态块行为),请参阅该部分 更新库块和恢复端口连接

blockChangedCallback — 更改任何遮罩参数后执行

Details

它在任何掩码参数更改时启动,但在执行所有其他回调之后。 作为一个全局回调,它可以访问变量和掩码对象。

例子::

  • 更改子系统中的参数:

    LDLPath = engee.gcb() * "/LDL Factorization"
    
    mode = dropdown_1
    if mode == "Ignore"
        engee.set_param!(LDLPath, "NonPositive" => "Ignore")
    elseif mode == "Warning"
        engee.set_param!(LDLPath, "NonPositive" => "Warning")
    elseif mode == "Error"
        engee.set_param!(LDLPath, "NonPositive" => "Error")
    end

    这里,掩模参数的值与*LDL因式分解*块的参数同步。 模式 -存储参数当前值的变量 dropdown_1. 例如,如果将下拉列表中的参数值更改为 警告错误,那么对于子系统中的*LDL因式分解*块,相同的参数将类似地改变。

valueChangedCallback — 参数值更改时执行

Details

valueChangedCallback 需要使用函数隐藏参数或更改子系统状态 恩吉。gcb(). 当关联参数的值更改时,将触发回调。 如果相应控件的参数名称与回调代码匹配,则会链接参数,例如:

valuechangedfcn callback 1 cnvaluechangedfcn callback 2

例子::

  • 隐藏参数:

    mask.parameters.text_input_1.hidden = checkbox_1

    这里按下时参数是隐藏的 复选框 它是可见的,当 复选框 被压住了。

  • 更改子系统状态(使用 软件控制功能):

    if checkbox
        mask.parameters.checkbox.hidden = false
        engee.add_block("/Basic/Ports & Subsystems/Model", engee.gcb() * "/Model")
    else
        mask.parameters.checkbox.hidden = true
        engee.delete_block(engee.gcb() * "/Model")
    end

    连接在这里设置有 复选框 (复选框_1),当启用时(复选框处于活动状态),它将*Model*块添加到子系统中,并在关闭时删除(复选框未选中)。

validateCallback — 检查参数值的正确性(验证)

Details

回调验证值的有效性 validateCallback 并且,如果值不正确,则显示错误。 除了AssertionError之外的所有错误消息都将被视为回调本身的错误,而不是输入数据的错误。:

validatorcallback 1 1 cn

使用变量检查参数值的正确性 价值. validateCallback 它总是从宏开始 @assert

validateCallback 仅适用于控件 输入字段 text input masks 它附加到他的回调。 valueChangedCallback .

例子::

  • 检查值的正确性:

    @assert value > 0 "Значение должно быть больше нуля"
  • 检查输入的类型:

    @assert value isa Number "Значение должно быть числом"

clickedCallback — 按一下按钮就可以执行

Details

每次在屏蔽块的设置窗口中单击按钮时,都会调用回调一次。 它适用于一次性操作:文件生成,内部块的软件配置,参数同步等。 它不存储状态,也不绑定到掩码变量。

例子::

try
    path = joinpath(pwd(), "hello.txt")
    open(path, "w") do io
        write(io, "hello from button_1\n")
    end
    engee.show("Saved: hello.txt")
catch e
    engee.show("Error: $(e)")
end

这里:

  • 点击按钮创建一个文件hello。模型当前工作文件夹中的txt(pwd())。

  • 将字符串写入文件 来自button_1的你好.

  • 显示消息 保存:你好。txt的 在创建了掩码的块的图标上。

更新块和恢复端口连接

打开模型时,掩码编辑器会根据库中的当前版本自动更新块。 更新后,将执行掩码回调,并且块采用掩码参数指定的形式。 这对于添加或删除端口(多态块)的掩码很重要。

升级过程包括三个步骤:

  1. *更新库块。*块配置与其当前定义同步。

  2. *重复掩码回调。*蒙版的应用就像您刚刚更改了其参数一样。 在这一步,掩码可以添加或移除端口,以及改变子系统结构。

  3. *恢复连接。*掩码编辑器尝试返回更新前连接到端口的行。 为此,每个端口都需要一个稳定的程序名称(见下文)。

端口的软件名称(简短实用)

它是什么以及为什么需要::软件端口名称是一个稳定的端口标识符,不依赖于其在图标上的位置,并由编辑器用于在块结构更改时自动恢复连接。

当它被使用::如果您正在创建基于子系统的多态块或使用*Chart*块(有限自动机),这很重要—在这些情况下,掩码可以添加或删除端口,并且线的恢复取决于稳定

程序名称来自哪里,您可以更改哪些内容?:

  • 在库的原子块中-端口的程序名称已经在库本身中设置(例如,在块中*正弦波*,增益Engee函数C函数)。 这些名称是固定的,不能通过更改来更改。

  • 在masked subsystem中--端口的程序名与端口内部块的名称相匹配(在港, 外港, 连接端口). 您可以通过重命名相应的内部块端口来设置或更改它。

  • 在掩码块*图表--程序名称对应于符号表中的信号的名称。 您还可以通过编辑*图表*块设置中的字符来控制此名称。

不要重命名已在模型中使用的块中的端口的程序名称。:这可能会在升级期间中断连接恢复。

向后兼容性

编辑器尝试在更新块后自动恢复连接。 但是,如果端口的程序名称已更改或丢失,则可能无法返回所有线路(通信)。

如果您正在基于子系统创建多态块,请遵循简单的规则:

  • 使用稳定的编程端口名称。;

  • 添加或删除端口时,在所有版本的块中为"逻辑单一"端口保留相同的名称。;

  • 不要不必要地重命名程序名称。

诊断窗口中的消息

在掩码回调中,您可以将消息发送到 模型诊断窗口 model diagnosis main 使用函数:

  • engee.info(味精) --资讯讯息;

  • 恩吉。警告(味精) --警告信息;

这些函数只在回调(掩码和模型)中工作。 消息可以通过字符串插值("价值=$(价值)")或 字符串(…​).
在回调中使用掩码的示例
  • 通知有关参数更改(blockChangedCallback):

    LDLPath = engee.gcb() * "/LDL Factorization"
    mode = dropdown_1
    engee.set_param!(LDLPath, "NonPositive" => mode)
    engee.info("LDL NonPositive обновлен: $(mode)")
  • 警告可能不需要的值(valueChangedCallback):

    if checkbox_1
        engee.warning("Экспериментальный режим включен")
    else
        engee.info("Экспериментальный режим выключен")
    end
  • 报告一次性操作的结果(clickedCallback):

    try
        path = joinpath(pwd(), "hello.txt")
        open(path, "w") do io
            write(io, "hello from button_1\n")
        end
        engee.info("Файл сохранен: $(abspath(path))")
    catch e
        engee.warning("Не удалось сохранить файл: $(e)")
    end

例子:

当使用掩码块(例如,块 3DOF (体轴))重要的是要考虑掩码参数和工作区变量的相互作用:

  1. 掩码参数的某些名称可能与工作区变量重叠。 在这种情况下,掩码中的值将优先于工作区中具有相同名称的变量。

  2. 如果在工作区中定义参数变量之前打开模型,则遮罩参数值可以重置为其默认值。 但是,变量的后续声明不会自动更新掩码中的值。

  3. 屏蔽块的参数不是在模型的初始化阶段进行验证,而是在手动参数更改期间进行验证。 例如:

    validateCallback
      @assert value isa Number "Значение должно быть 标量ом"
      @assert value isa Float64 "Значение должно иметь тип Float64"

如果使用了未知变量或参数包含无效值(例如,未声明的变量或不适合的数据类型),则界面会报告错误-参数以红色框突出显示,并附带说明:

mask debugger 1

将mask参数传递给C功能块的源代码的示例
  1. 将*C函数*块放在*Engee*工作区中。 右键单击块并选择 面罩添加面具 .

  2. 在掩码界面编辑器中,添加*输入字段* text input masks.

  3. 转到掩码代码编辑器并选择左侧选项菜单中的选项 输入字段 (默认情况下它是 文本输入_1)并将其移动到掩模空间。 这样做两次,以便*C函数*块的每个参数都有自己的输入字段。:

    blockchanged c function 4 cn

  4. 在回调 blockChangedCallback使用以下代码:

    # Установка пути к текущему блоку
    CFunctionPath = engee.gcb()
    
    # Получение значений параметров масок
    param1 = text_input_1
    param2 = text_input_2
    
    # Формирование кода на Cи в зависимости от значений параметров
    c_code = """
    int add_numbers(int param1, int param2) {
        return param1 + param2;
    }
    int result = add_numbers($param1, $param2);
    """
    
    # Установка параметра "OutputCode" в блоке C Function
    engee.set_param!(CFunctionPath, "OutputCode" => c_code)

    blockchanged c function cn

    在此代码中,使用函数设置当前*C函数*块的路径 恩吉。gcb(),之后从读取值 文本输入_1文本输入_2,其对应于param1和param2块的参数。 然后创建一行定义函数的C代码 add_number,添加两个整数,并使用输入的值来计算结果。 在帮助下 恩吉。set_param! *C函数*块的"OutputCode"参数更新,设置生成的代码。

  5. 现在,在编辑掩码参数时,*C函数*块的参数也会发生变化,并且它们的更改值最终会出现在OutputCode选项卡中的源代码中。:

blockchanged c function 1 cn

blockchanged c function 3 cn

对于*C功能块的源代码的其他选项卡实现了类似的方法。* - 起始码终端码,以及用于*Engee功能块的选项卡* — 执行代码[医]超级密码.

您可以使用的不仅仅是数字值,例如:

engee.set_param!(engee.gcb(), "OutputCode"=>"print($text_input_1)")

为此,在掩码界面编辑器中,创建或编辑参数时,必须指定一个值,该值的数据类型随后将更改。 如果数据类型不匹配,系统将显示错误。:

error mask 1 cn

确保选中"计算"复选框非常重要,因为这将允许掩码在保存后保存参数数据类型。:

mask param save cn

将mask参数传递给Engee函数块的源代码的示例
  1. 从块组装模型 正弦波, 功能终结者 并打开 录音 signal logging 1 信号如图:

    engee function mask model 1

  2. 在*Engee函数*块的源代码中,添加以下代码:

    engee function mask model 2 cn

    struct Block <: AbstractCausalComponent end
    
    function (c::Block)(t::Real, x)
        return gain .* x
    end
  3. 打开*Engee函数*块的掩码编辑器,为此,单击该块,选择 面罩添加面具 . 在掩码编辑器中,添加 输入字段 text input masks,命名增益参数并设置其值,例如3:

    engee function mask model 3 cn

  4. 在*Engee函数*块的参数中,设置增益参数的值,如图所示:

    engee function mask model 4 cn

    此方法允许您使用块设置中的掩码参数的值,将其添加到源代码并应用参数名称以获取指定的值。:

    engee function mask model 5 cn

  5. 让我们通过运行模型的模拟来使用图表来测试这种方法。:

    engee function mask model 6 cn

  6. 增益参数的值确实为3,这意味着掩码与*Engee函数*块的源代码完美配合。

可配置子系统的_example(*Subsystem*块)_

蒙版可以应用在块的顶部。 子系统. 让我们考虑一个需要控制子系统块参数的情况。 如果一个数值参数被传递给掩码,那么通常的函数(算术,sin,abs,round等。)可以应用于它。 例如,块参数 正弦波:

  • 默认情况下,子系统除了*Treat as atomic unit之外没有其他参数*:

    without mask 1

    转到子系统并将*正弦波*块添加到其中。

  • 右键单击子系统图标并选择 面罩添加面具 .

  • 在掩码界面编辑器中,添加 下拉列表 dropdown masks. 将基于样本和基于时间的参数添加到列表中。:

    sine wave mask example 2 cn

  • 在掩码代码编辑器中,转到全局选项卡和回调 iconDrawCallback添加如下代码:

    engee.show(dropdown_1)

    此代码将在子系统图标上显示dropdown_1参数(下拉列表参数)的当前值。

  • 在回调 blockChangedCallback使用以下代码:

    SinePath = engee.gcb() * "/Sine Wave"
    
    mode = dropdown_1
    if mode == "Time based"
    engee.set_param!(SinePath, "SineType" => "Time based")
    elseif mode == "Sample based"
    engee.set_param!(SinePath, "SineType" => "Sample based")
    end

    此代码修改参数 "SineType" 子系统中的*正弦波*块,取决于dropdown_1掩码参数的值:如果选择 "基于时间",正在安装 "SineType""基于时间" 如果 "基于样本" 然后 "SineType""基于样本".

通过更改屏蔽子系统中*Sine type*参数的值,此参数会在*Sine Wave*块中自动更改。

基于时间的选择

选择基于样本的

sine wave mask example 1

sine wave mask example 3 1

sine wave mask example 3

sine wave mask example 1 1

将mask参数传递给Chart块的示例

掩码参数可以传递到块 图表. 例如,从块创建模型 常数, 子系统至 CSV 如图所示:

chart mask model 1

将*Chart*块添加到子系统。 要将其连接到输入(中1)和退出(输出1)子系统,打开*图表*块并创建 输入)和(输出端口通过 设置窗口 debug article icon 1. 还要添加两个局部变量:

  • *local_input*带值 输入;

  • *local_c*带值 c.

这些变量将从子系统掩码接收值。

之后,创建 条件 stateflow state. 给它一个名称,并使用局部变量,输入和输出编写表达式。 确保状态中的变量名称与*Chart*块的设置中指定的名称匹配。 结果是具有配置的输入、输出和变量的有限状态机模型。:

chart mask model 6 cn

现在子系统内部的模型将如下所示:

chart mask model 4

使用掩码,创建以下内容 输入字段 text input masks 对于*图表块*:

chart mask model 5 cn

使用以下方法导航到模型的顶层 导航栏对于*Subsystem*块,使用以下内容创建掩码 输入字段 text input masks:

chart mask model 2 cn

运行模型 start button. 在模拟结束时 文件浏览器 file browser 7 将创建一个CSV文件,显示时间模拟的结果。:

time,1
0.0,22.0
0.01,22.0
0.02,22.0
0.03,22.0
0.04,22.0
0.05,22.0
0.06,22.0
0.07,22.0
0.08,22.0
...
9.96,22.0
9.97,22.0
9.98,22.0
9.99,22.0
10.0,22.0

结果是 22,这证实了*图表块状态下表达式计算的正确性*: local_c=c=6 (来自*子系统*掩码), local_input=输入=15 (从*图表*块掩码),它们的总和是 21,而*Constant*块增加了更多 1,获取最终值 22.