有限自动机中的用户总线
该项目演示了在Chart块中使用自定义总线的可能性。
自定义总线-类型的结构化信号 BusSignal. 此类型允许您将逻辑相关的信号组合到单个结构中,总线,其中的每个元素对应于特定的名称,数据类型和维度。
使用宏 @__DIR__ 定义包含交互式脚本的路径:
In [ ]:
demoroot = @__DIR__;
模型描述
让我们考虑一个有限状态机实现块逻辑的简单模型 Saturation 限制来自上方和下方的输入信号:
|
输入信号 |
输出信号 |
|
下限<=输入信号<=上限 |
的输入信号 |
|
输入信号<下限 |
下限 |
|
输入信号>上限 |
上限 |
让用户总线发送到图表块的输入 InputBus 包含信号:
signal数据的类型Float64-输入信号;limits数据的类型LimitBus(嵌入式总线):upper数据的类型Float64-上限;lower数据的类型Float64-下限。
并在图表块的输出处,形成自定义总线。 OutputBus 包含信号:
signal数据的类型Float64-输出信号;is_saturated数据的类型Bool-饱和的标志。
.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):
.png)
让我们转到Chart块并在模型数据编辑器中创建输入和输出信号(在"有限自动机"选项卡上)。:
.png)
我们将使用自定义总线设置数据类型,如下所示:
.png)
让我们以过渡图的形式表示块逻辑。:
.png)
要访问Chart块内的总线元素,使用点条目,例如:
InputBus.signal > InputBus.limits.upperOutputBus.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]:
结论
该项目演示了在基于有限自动机库的模型开发中使用自定义总线:
*工作区中的轮胎声明;
*设置图表块的字符;
*访问状态机中的用户总线。