自动变速器运行模拟
在这个例子中,我们将分析图表工具和它实现的有限自动机的逻辑,基于自动换档的原则取决于速度。
在简化的层面上,让我们考虑两种类型算法的操作差异-使用状态和使用过渡节点。
在演示开始时,我们将声明一个用于运行模型的辅助函数,并继续分析实现的算法。
# Подключение вспомогательной функции запуска модели.
function run_model( name_model)
Path = (@__DIR__) * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
model = engee.open( name_model ) # Открыть модель
model_output = engee.run( model, verbose=true ); # Запустить модель
else
model = engee.load( Path, force=true ) # Загрузить модель
model_output = engee.run( model, verbose=true ); # Запустить модель
engee.close( name_model, force=true ); # Закрыть модель
end
sleep(5)
return model_output
end
在顶层,该模型包含两个换档算法。 两个图表的输入是相同的。 这些表设定了增加或减少传输速度的阈值,以及由正弦波设定的当前速度本身的值。
接下来,让我们分别查看每个图表。 上部块使用节点的逻辑,并根据速度输出换档参数+-1,允许您增加或减少存储在循环中的档位。 两种情况下的初始转移值均为1。
在第二种情况下,根据速度,我们在不同状态之间切换,其中为输入速度模式设置合适的变速器。
现在让我们运行模型本身并分析生成的值。
run_model("car") # Запуск модели.
我们正在从simout中读取缓存的数据。
在这种情况下:
v是汽车的速度;
shift是使用节点实现的变速箱算法的换挡参数。;
gear_node-使用节点的图表传输值;
gear_state-包含状态的图表的传输值。
v = simout["car/Bias.1"];
v = collect(v);
shift = simout["car/ShiftChart.shift"];
shift = collect(shift);
gear_node = simout["car/gear"];
gear_node = collect(gear_node);
gear_state = simout["car/GearChart.gear"];
gear_state = collect(gear_state);
现在让我们继续分析接收到的数据。 让我们从速度开始。 从下图中我们可以看到,速度由0到120范围内的正弦波设置。 初始速度值不为零。 它旨在直观地演示使用节点和状态的算法之间的差异。
plot(v.time, v.value)
接下来,我们将分析使用节点的系统。 我们可以看到,这个系统在第一步的初始值不是第一档,而是第二档。 这是因为节点立即报告计数器的增量。
plot(gear_node.time, gear_node.value)
plot!(shift.time, shift.value)
现在让我们关注基于状态的系统。 初始转移值为1。 这是因为在没有初始化逻辑的状态的情况下,我们将从输入状态开始,然后每个时钟周期最多经历一个状态。
plot(gear_state.time, gear_state.value)
现在让我们比较不同的传输仿真系统计算的值。 从下面的结果中我们可以看到,前两个柱线是不同的。 这是由于上面描述的逻辑处理特征。
difference = gear_state.value-gear_node.value;
print("Различие в логике переключения передач: "*string(difference[1:3]))
结论
在这个演示中,我们分析了节点和状态逻辑的差异。 通过这个例子,我们清楚地了解了使用图表块实现的不同算法是如何处理的。