AnyMath 文档
Notebook

有限自动机中的用户总线

该项目演示了在Chart块中使用自定义总线的可能性。

自定义总线-类型的结构化信号 BusSignal. 此类型允许您将逻辑相关的信号组合到单个结构中,总线,其中的每个元素对应于特定的名称,数据类型和维度。

使用宏 @__DIR__ 定义包含交互式脚本的路径:

In [ ]:
demoroot = @__DIR__;

模型描述

让我们考虑一个有限状态机实现块逻辑的简单模型 Saturation 限制来自上方和下方的输入信号:

输入信号

输出信号

下限<=输入信号<=上限

的输入信号

输入信号<下限

下限

输入信号>上限

上限

让用户总线发送到图表块的输入 InputBus 包含信号:

  • signal 数据的类型 Float64 -输入信号;
  • limits 数据的类型 LimitBus (嵌入式总线):
    • upper 数据的类型 Float64 -上限;
    • lower 数据的类型 Float64 -下限。

并在图表块的输出处,形成自定义总线。 OutputBus 包含信号:

  • signal 数据的类型 Float64 -输出信号;
  • is_saturated 数据的类型 Bool -饱和的标志。
buses_chart--1790945236851.png

在工作区中定义自定义总线:

In [ ]:
LimitBus = BusSignal((:upper, :lower), (Float64, Float64), ((), ()), :LimitBus);
InputBus = BusSignal((:signal, :limits), (Float64, LimitBus), ((), ()), :InputBus);
OutputBus = BusSignal((:signal, :is_saturated), (Float64, Bool), ((), ()), :OutputBus);

并在总线创建者块设置中指定正确的数据类型(LimitBus 和 InputBus)和总线选择器(OutputBus):

image.png

让我们转到Chart块并在模型数据编辑器中创建输入和输出信号(在"有限自动机"选项卡上)。:

image.png

我们将使用自定义总线设置数据类型,如下所示:

image.png

让我们以过渡图的形式表示块逻辑。:

buses_chart--1790945920417.png

要访问Chart块内的总线元素,使用点条目,例如:

  • InputBus.signal > InputBus.limits.upper
  • OutputBus.is_saturated = true

运行模拟

加载模型 buses_chart.engee:

In [ ]:
buses_chart_model = engee.load("$demoroot/buses_chart.engee");

让我们运行她的模拟。:

In [ ]:
simulation_results = engee.run(buses_chart_model);

我们将在模拟结束后关闭模型:

In [ ]:
engee.close(buses_chart_model, force = true);

模拟结果

导入模拟结果:

In [ ]:
buses_chart_model_signal_t = simulation_results["signal"].time;
buses_chart_model_signal_y = simulation_results["signal"].value;
In [ ]:
buses_chart_model_is_saturated_t = simulation_results["is_saturated"].time;
buses_chart_model_is_saturated_y = simulation_results["is_saturated"].value;

让我们构建图表:

In [ ]:
plot(buses_chart_model_signal_t, buses_chart_model_signal_y, label = "的输出信号")
plot!(buses_chart_model_is_saturated_t, buses_chart_model_is_saturated_y, label = "饱和的标志")
Out[0]:

结论

该项目演示了在基于有限自动机库的模型开发中使用自定义总线:

*工作区中的轮胎声明;
*设置图表块的字符;
*访问状态机中的用户总线。