2026a

# 模型回调


模型回调是在特定时机自动执行的 Julia 脚本。

当前,您可以为模型的以下两种时机设置回调脚本:

  • PreModelCheck:模型检查前
  • PostSimStop:模型仿真停止后

使用此功能,可帮助您执行一些简单的任务,减轻建模与仿真过程中的操作负担。例如:

  • 在仿真前,自动读取/计算得到一系列数据,供模型仿真使用;
  • 在仿真后,自动将结果进行进一步分析处理,并绘制图像/保存。

注意

要使得模型回调脚本被正确执行,您需要通过 Syslab 启动 Sysplorer。

# 创建模型回调

  1. 打开您需要创建回调脚本的模型;

  2. 在顶部菜单栏建模页单击模型配置,或在模型画布空白处右键菜单中单击配置


  3. 模型配置对话框中,您可以找到模型回调标签页,输入 Julia 脚本并保存。若您输入的脚本不为空白,且“启用回调”开关是开启状态,则脚本将在其对应时机被发送至 Syslab 执行。

注意

回调脚本被保存时,其正确性不会被检查。 若脚本中存在错误,对应的报错信息将在脚本被执行时打印在 Syslab Julia 终端中。

# 工作目录

回调脚本的当前目录为 Syslab 的当前目录。因此,当您在回调脚本中以相对路径进行文件读写相关操作时,这些相对路径的起点将为 Syslab 当前工作目录。

# 需配合设置的选项

  • 检查前同步工作区: 为确保您在回调脚本中创建的变量能够被模型引用,请开启此选项;

  • 目标工作区: 为确保您模型中的 FromWorkspace 与 ToWorkspace 模块能正确地访问 Julia 工作区,请将此选项设置为 Julia 工作区

注意

对于 Modelica 模型,当任意一个时机的回调脚本被配置并启用时,“允许访问基础工作区”选项将被自动启用。

# 示例

参考示例模型 ModelCallback_Example.mo

此示例模型被设置了 PreModelCheck 与 PostSimStop 两个回调脚本,分别如下:

# PreModelCheck - 生成仿真过程需要用到的参数及信号数据

# 将被用于 SineWave 模块
amp1 = rand() * 5; # 0~5 的随机数
freq1 = rand() * 3; # 0~3 的随机数
amp2 = rand() * 8; # 0~8 的随机数
freq2 = rand() * 5; # 0~5 的随机数

# 将被用于 FromWorkspace 模块
t = 0.01:0.01:10;
using TyCommunication;
noise = TyCommunication.wgn(size(t)[1], 1, 1);
simin = [t noise];
# PostSimStop - 对仿真结果进行进一步处理并绘图

using TyPlot;
subplot(2,1,1);
plot(out.tout, out.simout);

using TyMath;
Y = TyMath.fft(out.simout);
L = Float64(size(out.tout)[1]);
T = out.tout[2] - out.tout[1];
Fs = 1/T;

P2 = abs.(Y/L);
P1 = P2[1:Int(floor(L/2))+1];
P1[2:end-1] = 2*P1[2:end-1];

f = Fs*(0:floor((L/2)))/L;
subplot(2,1,2);
plot(f, P1);
title("simout 的单侧振幅图");
xlabel("f (Hz)");
ylabel("|P1(f)|");

# 限制信息

  • 当多个模型之间存在引用关系时,仅有被翻译/仿真的顶层模型的回调脚本会被执行;
  • 当 Sysblock 模型被 Modelica 模型引用(即混合模型场景)时,Sysblock 模型中的回调脚本不会被执行;
  • 回调脚本中,不建议包含耗时操作;
  • 回调脚本中,不允许调用 Julia SysplorerAPI;
  • 包含回调脚本的模型,不支持被 Julia SysplorerAPI 调用仿真。