Engee 文档

回调

请勿将本文中描述的回调函数与库回调函数混淆: DiffEqCallbacks.jl。有关如何使用它们的更多信息,请参阅 Event Handling and Callback Functions

回调 回调函数会在模型中发生特定事件时自动调用。Engee 回调函数使用 Julia 编程语言创建。

要启用回调,请前往设置窗口 lk 5 并点击 编辑源代码 pen button graphs:

callbacks start 1 cn

所有 Engee 回调都可在打开的菜单中找到。它们默认为空,不包含任何代码:

callback start 2 cn

所有 Engee 回调函数大致可以分为 4 组:

打开模型

模型执行

保存模型

关闭模型

PreLoadFunc PostLoadFunc

InitFunc

StartFunc PauseFunc ContinueFunc StopFunc

PreSaveFunc PostSaveFunc

CloseFunc

回调函数说明 回调函数

打开模型

用于自定义模型的行为打开前后。

更多关于模型打开回调的信息

使用的回调函数PreLoadFunc(打开)和 PostLoadFunc(关闭)。

说明

  • PreLoadFunc — 在模型加载之前执行。

    由于模型尚未加载,因此无法在此模型的回调函数中使用程序控制方法。
  • PostLoadFunc — 在模型加载之后执行。由于模型参数已加载,因此可以在其中使用它们。

模型打开条件回调函数允许您:

  • 使用 PreLoadFunc 在加载模型之前准备 Engee 工作区或执行初始化任务;

  • 使用 PostLoadFunc 在加载模型之后配置模型参数或执行依赖于已加载数据的操作。

模型执行

在仿真过程中使用。

更多关于模型执行回调的信息

使用的回调函数InitFunc(初始化)、StartFunc(启动)、PauseFunc(暂停)、ContinueFunc(执行)、StopFunc(停止)。

所有这些函数都会在模型启动时执行,并且仿真至少会暂停一次。

说明

  • InitFunc - 在模型编译步骤之后执行;

  • StartFunc - 在第一个仿真步骤之前执行;

  • PauseFunc - 如果在仿真过程中出现暂停,则调用此函数;

  • ContinueFunc - 在模型暂停后启动的单个步骤中执行;

  • StopFunc - 在仿真暂停时执行。

保存模型

用于保存模型时。

更多关于模型保存回调的信息

使用的回调函数PreSave(保存前),PostSave(保存后)

说明

  • PreSave — 在保存模型之前执行;

  • PostSave — 在保存模型之后执行。

关闭模型

用于关闭模型时。

更多关于模型关闭回调的信息

使用的回调函数CloseFunc(关闭)

说明

  • CloseFunc — 在关闭模型之后执行。

模型关闭条件回调允许您:

  • 释放模型运行时使用的资源(内存或文件描述符);

  • 执行关闭模型前需要完成的任何清理任务;

  • 在关闭模型前保存模型状态(或其数据)。

诊断窗口中的消息

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

  • engee.info(msg) — 信息性消息;

  • engee.warning(msg) — 警告消息;

这些函数仅在回调函数(掩码和模型)中有效。使用插值("Value = $(x)")或 string(…​) 收集文本。
回调组示例

==== 打开模型(PreLoadFuncPostLoadFunc):

PreLoadFunc() = begin
    engee.info("打开模型")
end

PostLoadFunc() = begin
    engee.info("模型已加载")
end

模型执行(InitFuncStartFuncPauseFuncContinueFuncStopFunc):

InitFunc() = engee.info("初始化完成")
StartFunc() = engee.info("模拟正在运行")
PauseFunc() = engee.warning("模拟暂停")
ContinueFunc() = engee.info("我暂停后继续")
StopFunc() = engee.info("模拟停止")

保存模型(PreSavePostSave):

PreSave() = engee.info("保存模型…")
PostSave() = engee.info("模型已保存")

关闭模型(CloseFunc):

CloseFunc() = begin
    try
        # 释放临时资源
        engee.info("资源被释放,模型被关闭")
    catch e
        engee.warning("无法正确关闭模型:$(e)")
    end
end
另请参阅关于代码块掩码中消息的部分:guide/masks-main.adoc#mask-callbacks-diagnostics

示例

有关回调函数的示例,请访问链接:/helpcenter/stable/ru/interactive-scripts/base_simulation/demo_callback.html[link]。

Engee 中的每个回调函数都可以分配一个变量。这便于根据仿真条件跟踪执行情况。例如,在 PreLoadFunc 模型打开调用中,您可以使用以下代码:

# 模型开放变量
PreL = 1 # 在加载模型之前执行
PostL = 0 # 加载模型后执行

# 模型执行变量
Init = 0 # 它在编译模型后执行
Start = 0 # 运行到模拟的第一步
Pause = 0 # 暂停模拟时调用
Continue = 0 # 它在暂停后启动模型时一步执行
Stop = 0 # 它是在模拟停止期间执行的

# 模型保留变量
PreS = 0 # 在保存模型之前执行
PostS = 0 # 保存模型后执行

# 模型闭包变量
Close = 0 # 模型关闭后执行

此代码将变量初始化为零值。与打开模型相关的 PreL 变量等于 1,因为它的参数在模型加载前后都会加载(始终执行)。例如,在 StartFunc 模型执行回调函数中,您可以将 Start 变量设置为 1。如果此回调函数执行成功,则该变量的值将从 0(失败)变为 1(执行成功)。您可以使用“变量”窗口监控回调函数的执行情况:

callback variables 1 cn

每次执行回调函数时,变量都会更新,然后显示其值,以便分析和调试仿真过程。