Engee 文档
Notebook

冗余传感器的系统

在这个演示示例中,让我们看看如何使用有限状态机库的图表块创建重复传感器系统的模型。

冗余传感器由于冗余而增加了系统的可靠性:如果一个传感器发生故障,则会被其他传感器替换,这在航空,工业和机器人技术中至关重要。 这样的系统的建模使得能够分析容错性,优化数据处理算法,并确定稳定操作所需的最小传感器数量。 冗余传感器的使用降低了事故风险,提高了关键系统的测量精度。

模型描述

该模型包含两个图表块,用于模拟传感器故障检测和从传感器生成输出数据的逻辑。 输入信号有:传感器数据和故障信号。

sensors-07.07.25 20_39_02.png

故障检测

在图表块中使用两个并行状态对传感器进行建模。

我们以1号传感器为例来分析故障检测算法。 默认情况下,传感器处于活动状态。 但是,如果输入信号是 sensor1Failure 如果大于0,则传感器变为非活动状态。 1号传感器在5个仿真步骤中保持不活动状态。 但在每一步,输入信号被测试。 sensor1Failure. 如果信号仍然为零,5步倒计时将再次开始。 在这段时间内,输出数据仅从从2号传感器接收到的数据中产生,如果它是活动的。

image.png

形成实际输出信号的逻辑

输出信号是使用过渡图生成的。 并且使用以下逻辑来确定。

输出信号的实际值是通过对两个传感器信号求平均来获得的,以便降低测量噪声。 如果两个传感器都有效,则输出为sensor1和sensor2之和的平均值。 如果其中一个传感器不是活动的,也就是说,来自它的数据没有被发送,来自第二个传感器的数据被发送到输出。 如果两个传感器都不活动,则输出将为0。

image.png

模型的仿真

使用系统参数定义运行脚本。

In [ ]:
engee.script.run("/user/start/examples/state_machines/dual_sensors/_set_params.ngscript");
In [ ]:
function start_model_engee()
    try
        engee.close("dual_sensors", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/dual_sensors.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/dual_sensors.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

下载并运行模型以从变量中获取建模数据 simout.

In [ ]:
start_model_engee();
In [ ]:
result = collect( simout )
Out[0]:
5-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("dual_sensors/s2_fail")
 WorkspaceArray{Float64}("dual_sensors/s1_fail")
 WorkspaceArray{Float64}("dual_sensors/sens1_data")
 WorkspaceArray{Float64}("dual_sensors/sens2_data")
 WorkspaceArray{Float64}("dual_sensors/out")

绘制来自1号传感器和2号传感器的数据图。

In [ ]:
plot(
    plot(result[3].time, result[3].value, lab = "Данные с датчика №1"),
    plot(result[4].time, result[4].value, lab = "Данные с датчика №2", c = "red"),
    layout = (1,2)
)
Out[0]:

我们将显示有关传感器故障的信号。

In [ ]:
plot(result[2].time, [result[2].value result[1].value], lab = ["Сбой датчика №1" "Сбой датчика №2"])
Out[0]:

二传感器的所得测量信号。

In [ ]:
plot(result[5].time, result[5].value, lab = "Данные с датчиков")
Out[0]:

结论

结果,我们得到了某个信号的测量图。 来自第一和第二传感器的个别信号由于传感器故障而具有缺失值。 测量信号的所得值具有约7秒的零值。 这是由于两个传感器在这个时间点都不活动。

示例中使用的块