第4章 FCT功能测试:核心功能验证、治具与测试软件架构

FCT,全称Functional Circuit Test,功能电路测试。说白了,就是验证你的药盒能不能干活。

我见过不少团队,硬件设计完了,软件也调通了,结果一到产线就翻车。为什么?因为FCT没做好。你想想看,药盒这种产品,出错了可是要出人命的。所以FCT这一关,必须扎扎实实过。

4.1 FCT到底测什么?

FCT不是简单的“通电看看亮不亮”。它要验证的是:

  • 核心功能完整性:每个药仓能不能正常开合?电机转不转?
  • 传感器准确性:药仓有没有药?门关没关好?这些信号必须准。
  • 通信接口正常:蓝牙连得上吗?WiFi能配网吗?串口数据对不对?
  • 电源管理:电池电压正常吗?充电电路工作吗?
  • 异常处理:卡药了怎么办?低电量报警灵不灵?

核心原则:FCT要覆盖用户能遇到的所有正常场景,以及可能出现的异常场景。少测一个,就是一颗雷。

我记得有一次,一个药盒项目在产线上FCT全过了,结果用户反馈说“药盒半夜自己开仓”。查了半天,原来是FCT没测休眠唤醒后的状态保持。嗯,从那以后,我的FCT用例里永远多一条:休眠唤醒后状态验证

4.2 治具设计:FCT的骨架

治具,就是用来固定产品、连接测试设备的“架子”。别小看它,治具设计不好,FCT效率直接腰斩。

4.2.1 治具的核心组成

组件作用我的建议
定位夹具固定产品,保证每次位置一致用防静电材料,别刮花外壳
探针模组接触测试点,传输信号探针选型要看寿命,至少10万次
负载模拟模拟真实负载(如电机、传感器)用可调负载,方便切换测试条件
气动/电动机构自动压合、开盖等动作气动便宜,电动精度高,看预算选

小技巧:治具上留一个“快速换型”设计。不同型号的药盒,换几个定位块就能测,不用重新做治具。我见过一个工厂,光治具就做了30套,浪费啊。

4.2.2 探针布局的坑

探针不是随便戳的。我曾经吃过一次亏:探针顶到了电容的焊盘,直接把电容怼短路了。从那以后,我定了个规矩:

  • 探针必须避开高密度元件区域
  • 测试点直径不小于1mm
  • 探针压力控制在100-150g,太大伤焊盘,太小接触不良
  • 每个测试点留一个“冗余探针”,万一有一根断了,还能测

4.3 测试软件架构:FCT的大脑

治具是骨架,软件就是大脑。没有好的软件架构,FCT就是一盘散沙。

4.3.1 我常用的三层架构

我个人习惯把FCT软件分成三层:

  1. 硬件抽象层(HAL):封装所有硬件操作,比如读GPIO、写I2C、控制继电器。换硬件时,只改这一层。
  2. 测试用例层:每个测试项是一个独立函数。比如“test_motor_open()”、“test_sensor_detect()”。
  3. 调度执行层:管理测试流程,记录结果,生成报告。

为什么要这么分?你想想看,如果所有代码揉在一起,产线说“加一个测试项”,你得改半天。分层之后,加一个用例就是写一个函数,然后注册到调度器里。简单、干净。

4.3.2 一个简单的测试用例示例

// 测试药仓电机是否正常
bool test_motor_open(uint8_t chamber_id)
{
    // 1. 发送开仓指令
    send_command(chamber_id, CMD_OPEN);
    
    // 2. 等待电机到位信号(超时5秒)
    if (wait_for_signal(chamber_id, SIG_OPEN_DONE, 5000))
    {
        // 3. 验证霍尔传感器状态
        if (read_hall_sensor(chamber_id) == HALL_OPEN)
        {
            log_result("Chamber %d open: PASS", chamber_id);
            return true;
        }
    }
    
    // 超时或状态不对,报失败
    log_result("Chamber %d open: FAIL", chamber_id);
    return false;
}

注意:超时时间一定要设。我见过一个案例,电机卡住了,测试软件一直等,整个产线停了10分钟。后来加了超时,卡住就报错,产线继续跑。

4.3.3 测试流程管理

测试流程不是死的。我建议用配置文件来定义流程:

# test_sequence.yaml
- name: "电源检测"
  function: test_power
  params: {voltage_min: 3.3, voltage_max: 3.6}
  
- name: "蓝牙连接"
  function: test_bluetooth
  params: {timeout: 10}
  
- name: "药仓1电机"
  function: test_motor_open
  params: {chamber_id: 1}
  
- name: "药仓2电机"
  function: test_motor_open
  params: {chamber_id: 2}

这样改流程不用改代码,产线工程师自己就能调。我曾经在产线蹲过三天,就是为了把流程调顺。后来改成配置文件,再也不用半夜被叫起来改代码了。

4.4 数据记录与追溯

FCT不只是“过”和“不过”。每一台药盒的测试数据都要存下来。为什么?

  • 质量追溯:用户退货了,你能查到这台机器当时测了哪些项,数据是多少。
  • 趋势分析:如果连续10台机器都在同一个测试项上失败,说明产线有问题,得赶紧停线排查。

我建议的数据格式:

{
  "sn": "MEDBOX20241001A001",
  "test_time": "2024-10-01 14:30:25",
  "result": "PASS",
  "items": [
    {"name": "power", "value": 3.35, "unit": "V", "result": "PASS"},
    {"name": "motor_1", "value": 120, "unit": "mA", "result": "PASS"},
    {"name": "sensor_1", "value": 1, "unit": "", "result": "PASS"}
  ]
}

经验之谈:数据要存两份。一份本地,一份上传服务器。本地防断网,服务器方便分析。我见过一个工厂,服务器挂了,所有数据丢了,那叫一个惨。

4.5 避坑指南

最后,分享几个我踩过的坑:

  • 治具接地:一定要接地。不接地的话,静电能把芯片打坏。我曾经一个月烧了5块板子,后来发现是治具没接地。
  • 测试顺序:先测电源,再测功能。电源都不对,后面的测试全是白费。
  • 异常处理:测试软件要能处理“测试中拔掉产品”的情况。不然产线工人手一抖,软件崩了,整条线等你重启。
  • 人机界面:给产线工人的界面要简单。红绿指示灯+蜂鸣器就够了。别搞复杂菜单,工人没时间看。

嗯,FCT这一块,说难不难,说简单也不简单。关键是细节。你把治具做稳了,软件架构搭好了,数据管住了,产线就能跑得顺。下一章,我们聊聊老化测试,那又是另一番天地。