一个典型的信号有效性选择与故障处理模块,常见于汽车电子或嵌入式系统中的信号处理逻辑(如 AUTOSAR 或 Simulink 模型中)。我们来逐步分析:
🔍 一、模块名称
这个模块可以称为:
valid_signal_selection(有效信号选择模块)
它负责在正常情况下使用新信号,在出现故障时切换到默认值或保持旧信号。
📌 二、功能说明
✅ 主要功能:
- 根据故障标志决定是否使用新的输入信号。
- 如果检测到任何故障,则输出一个“有效信号”(
valid_signal)为默认值或上一时刻的信号。 - 同时生成一个
fault_flg(故障标志),用于后续系统判断是否进入故障状态。
🔧 输入信号解释:
| 编号 | 名称 | 类型 | 描述 |
|---|---|---|---|
| 1 | new_signal | 输入 | 新的原始信号(例如传感器数据) |
| 2 | new_signal_valid_flg | 输入 | 新信号的有效性标志(有效=1,无效=0) |
| 3 | def_value | 输入 | 默认值(当信号不可用时使用) |
| 4 | msg_instant_fault | 输入 | 消息瞬时故障(如通信丢失) |
| 5 | msg_fault | 输入 | 消息持续故障 |
| 6 | CanBus_instant_fault | 输入 | CAN总线瞬时故障 |
| 7 | CanBus_fault | 输入 | CAN总线持续故障 |
🔁 输出信号:
| 编号 | 名称 | 类型 | 描述 |
|---|---|---|---|
| 1 | fault_flg | 输出 | 故障标志位(1表示有故障) |
| 2 | valid_signal | 输出 | 经过处理后的有效信号 |
🔄 内部逻辑详解:
1. 故障标志fault_flg的生成:
fault_flg = NOT(new_signal_valid_flg) OR msg_fault OR CanBus_fault即只要以下任一条件成立,就认为当前信号不可信:
- 新信号无效
- 消息层故障
- CAN总线故障
2. 有效信号选择逻辑:
if fault_flg == 1: valid_signal = def_value // 使用默认值 else: valid_signal = new_signal // 使用新信号但注意图中有两个黑框(可能是状态机或记忆单元),且old_signal被反馈回来,说明:
- 当前输出的
valid_signal会被保存为old_signal(通过1/z延迟单元) - 在某些实现中,可能不是直接用
def_value,而是用old_signal来避免突变
⚠️ 图中def_value是通过single模块传入,可能是常量或配置值。
💡 关键点总结:
- 故障优先级高:一旦发生故障,立即切换到安全值(
def_value)。 - 防抖设计:使用
old_signal可能是为了防止信号跳变(比如在故障恢复后平稳过渡)。 - 实时性要求高:适合用 C 实现于 MCU 上运行。
🧩 三、C语言实现
以下是该模块的C语言函数实现,适用于嵌入式环境(如汽车ECU):
#include <stdbool.h> // 定义输入/输出结构体 typedef struct { float new_signal; // 新信号 bool new_signal_valid_flg; // 新信号有效性标志 float def_value; // 默认值 bool msg_instant_fault; // 消息瞬时故障 bool msg_fault; // 消息持续故障 bool CanBus_instant_fault; // CAN瞬时故障 bool CanBus_fault; // CAN持续故障 } InputSignals; typedef struct { float valid_signal; // 有效输出信号 bool fault_flg; // 故障标志 } OutputSignals; // 全局变量:用于存储上一周期的 old_signal static float old_signal = 0.0f; // 函数:valid_signal_selection void valid_signal_selection(const InputSignals *in, OutputSignals *out) { bool ifault_flg = false; // 临时故障标志 // 1. 计算故障标志:如果新信号无效 或 任意故障存在,则置位 if (!in->new_signal_valid_flg || in->msg_instant_fault || in->CanBus_instant_fault || in->msg_fault || in->CanBus_fault) { ifault_flg = true; } // 2. 判断是否需要使用默认值 if (ifault_flg) { out->valid_signal = in->def_value; } else { out->valid_signal = in->new_signal; } // 3. 更新故障标志输出 out->fault_flg = ifault_flg; // 4. 将本次输出作为下一次的 old_signal(模拟 1/z 单元) old_signal = out->valid_signal; }🛠️ 四、补充说明
✅ 如何调用?
InputSignals input = { .new_signal = 10.5f, .new_signal_valid_flg = true, .def_value = 0.0f, .msg_instant_fault = false, .msg_fault = false, .CanBus_instant_fault = false, .CanBus_fault = false }; OutputSignals output; valid_signal_selection(&input, &output); printf("Valid Signal: %.2f\n", output.valid_signal); printf("Fault Flag: %s\n", output.fault_flg ? "Yes" : "No");⚙️ 五、扩展建议
- 若需支持平滑过渡,可加入滤波器(如低通滤波)。
- 若
def_value不是固定值,可从配置表读取。 - 可添加故障计数器防止误触发。
- 在 AUTOSAR 中,此类逻辑通常由RTE + SWC实现。
✅ 总结
| 项目 | 内容 |
|---|---|
| 模块名 | valid_signal_selection |
| 功能 | 故障安全的信号选择机制 |
| 核心逻辑 | 故障时输出默认值,正常时输出新信号 |
| 适用场景 | 汽车ECU、传感器融合、CAN通信处理 |
| 实现方式 | C语言函数 + 状态记忆(old_signal) |
如果你有具体的信号类型(比如整型、枚举、结构体)、采样率、或者想加入延时滤波,我可以进一步优化代码。需要吗?