机器人出口美国要哪些认证?用 70 行 Python 把 FCC、UL、UN 38.3 写成自检脚本(KeepRobots 工程笔记)

0 阅读17分钟

KeepRobots 工程笔记,不是法律意见,条文截至 2026-10-23,原文链接见文末。

不少团队的美国认证计划只有一行: 无线用带 FCC ID 的现成模组,主板找实验室做 SDoC ,几周就能搞定。

对 2026-07-28 以后、在美国境外生产的新款 AMR、人形和四足,这一行走不通了。47 CFR 2.903(c)(2) 写明,FCC 受控清单的禁令 连本来可以走 SDoC 的设备也包括在内 。就算模组有 FCC ID、EMC 测得再好,新型号也拿不到授权。2026-10-13 起又多了一条线:只要板子上有一颗受控清单点名实体生产的逻辑元件,不是机器人的设备也可能被卡住。

问题不在于少做了哪一项认证,而在于 这些合规项之间有先后关系,排第一的那项卡住了,后面的全白做 。Wiki 上的清单表达不了这种先后关系,代码可以。下面用一段 70 行的 Python,把「一台机器人进美国要过哪些合规项」写成规则和自检函数,拿 4 台 虚构机型 跑一遍。

image.png


一、先看结果:四台虚构机型,四种结局

四台机器都是编的,参数只用来演示规则:

  • 虚构 AMR-X1 :中国产的新款仓储 AMR,整机加充电桩 180 kg,Wi-Fi 用已认证模组,标志只有 CE 和 CCC,电池包有 UN 38.3 测试摘要。
  • 虚构 DLV-S2 :中国产送餐机器人,2025 年就拿到了 FCC 授权,有 ETL 标志,电池包没有自己的测试摘要(只有电芯的),在加州也卖。
  • 虚构 ARM-C6 :中国产固定式协作臂,新型号,无线部分没用整模组方案,只有 CE。
  • 虚构 ARM-C7 :和 C6 一样,唯一区别是通信板出自受控清单点名的某家实体,并假设律师已判断:该实体若自己生产整机也会被禁(两点都是假设)。

运行 python3 us_cert_check.py 的输出是 Markdown 表,原样贴在下面:

虚构 AMR-X1(中国产新仓储 AMR):4 项 BLOCK/GAP

状态项目说明
BLOCK受控清单·机器人新型号拿不到授权,SDoC 也不行 2.903(a)、(c)(2);除非 DoW 有条件批准
ASK受控清单·元件拿 BOM 逐项核对 2.903(b)(2)
BLOCKFCC 有意辐射体模组 FCC ID 复用;看不到时外壳贴 Contains FCC ID 15.212(a)(1)(vi)(A)
BLOCKFCC 数字电路Class A/B:SDoC 或认证 15.101 表 1
GAPNRTL 标志只有 CCC/CE,不算 NRTL 1910.303(a);充电桩单独看
ASK机器人专项标准UL 3100
OK锂电池 UN 38.3电池包要自己的测试和摘要,电芯测过不算 173.185(a)(1)、(a)(3)

虚构 DLV-S2(中国产送餐机,2025 年已授权):1 项 BLOCK/GAP

状态项目说明
OK受控清单·机器人老型号可继续进口/销售;相同零件维修不受限(FCC FAQ)
OKFCC 有意辐射体模组 FCC ID 复用;看不到时外壳贴 Contains FCC ID 15.212(a)(1)(vi)(A)
OKFCC 数字电路Class A/B:SDoC 或认证 15.101 表 1
OKNRTL 标志已有 NRTL 标志;充电桩单独看
ASK机器人专项标准UL 3300(+ UL 62368-1/60335-1)
GAP锂电池 UN 38.3电池包要自己的测试和摘要,电芯测过不算 173.185(a)(1)、(a)(3)
ASK充电器能效加州 Title 20 / MAEDbS 登记是否覆盖,逐款判断

虚构 ARM-C6(中国产固定式协作臂):1 项 BLOCK/GAP

状态项目说明
N/A受控清单·机器人不在定义内(固定式/本土生产等),留书面判断
ASK受控清单·元件拿 BOM 逐项核对 2.903(b)(2)
TODOFCC 有意辐射体整机发射部分认证:Wi-Fi/蓝牙 15.201(b),蜂窝 Part 22/24/27
TODOFCC 数字电路Class A/B:SDoC 或认证 15.101 表 1
GAPNRTL 标志只有 CE,不算 NRTL 1910.303(a);充电桩单独看
ASK机器人专项标准UL 1740 + R15.06-2025

虚构 ARM-C7(同 C6,但通信板触发 2.903(b)(2)):4 项 BLOCK/GAP

状态项目说明
N/A受控清单·机器人不在定义内(固定式/本土生产等),留书面判断
BLOCK受控清单·元件含清单实体所产逻辑元件 2.903(b)(2),2026-10-13 起
BLOCKFCC 有意辐射体整机发射部分认证:Wi-Fi/蓝牙 15.201(b),蜂窝 Part 22/24/27
BLOCKFCC 数字电路Class A/B:SDoC 或认证 15.101 表 1
GAPNRTL 标志只有 CE,不算 NRTL 1910.303(a);充电桩单独看
ASK机器人专项标准UL 1740 + R15.06-2025

四个反直觉的地方:

  1. AMR-X1 的工程准备最省事,结局却最差 。两项 FCC 本来都是常规 TODO,因为受控清单那一行是 BLOCK,被一起标成了 BLOCK。唯一的出路是美国战争部(原称国防部,2025 年起启用这一名称,下文简称 DoW)的有条件批准。
  2. DLV-S2 是老型号,反而最安全 。受控清单只管新型号,已授权型号照样进口和销售。它的问题出在一个很普通的地方:电池包没有自己的 UN 38.3 测试摘要,到了货代那里就会卡住。
  3. ARM-C6 不受机器人这一条管 。固定式机械臂不在 DA 26-786 的定义里,它要补的是 NRTL 和 UL 1740 这条线。
  4. ARM-C7 只差一块板 。它不是「先进机器人」,但如果律师确认 2.903(b)(2) 两个条件都满足,结局就和 AMR-X1 一样。其他三台的元件行是 ASK,意思是这一项脚本判断不了,要拿 BOM 逐项核对。

状态说明:BLOCK 是被前置项卡死;GAP 是缺材料,能补;TODO 是常规要做;ASK 是要问认证机构;N/A 是不适用,但要留一份书面判断。

image.png


二、代码(70 行,标准库,Python 3.8+)

"""机器人进美国合规自检(工程笔记,不是法律意见;规则截至 2026-10-23)"""
from dataclasses import dataclass, field

@dataclass
class Robot:
    name: str
    ground_mobile: bool            # 地面移动、自主导航(AMR/人形/四足)
    kg_with_dock: float            # 整机 + 底座/充电桩
    sensors: bool                  # 环境感知传感器
    net_kbps: int                  # 最高网络速率(有线/无线/蜂窝都算)
    us_made: bool                  # 满足 48 CFR 25.101(a) domestic end product
    authorized: bool               # 2026-07-28 前已拿到 FCC 授权的老型号
    radios_all_certified_modules: bool
    workplace: bool                # 放在客户员工工作的场所
    marks: set = field(default_factory=set)   # 已有标志:CE/CCC/UL/ETL...
    category: str = "other"
    lithium: bool = True
    un383_pack_report: bool = False
    sold_in_ca: bool = False
    covered_entity_logic_parts_prohibited: bool = False  # 2.903(b)(2) 两个条件都要满足,由律师判断

NRTL = {"UL", "ETL", "CSA-US", "TUV-US"}
STD = {"delivery": "UL 3300(+ UL 62368-1/60335-1)", "amr": "UL 3100",
       "arm": "UL 1740 + R15.06-2025", "other": "视产品而定,问 NRTL"}

def covered(r):  # DA 26-786 附录 C 定义的简化版:按生产地
    return (r.ground_mobile and r.kg_with_dock * 2.2046 > 4.4 and r.sensors
            and r.net_kbps >= 200 and not r.us_made)

def check(r):
    rows, cov, new = [], covered(r), not r.authorized
    rows.append(("受控清单·机器人", ("BLOCK" if new else "OK") if cov else "N/A",
        ("新型号拿不到授权,SDoC 也不行 2.903(a)、(c)(2);除非 DoW 有条件批准" if new else
         "老型号可继续进口/销售;相同零件维修不受限(FCC FAQ)") if cov else "不在定义内(固定式/本土生产等),留书面判断"))
    if ent := new and r.covered_entity_logic_parts_prohibited:
        rows.append(("受控清单·元件", "BLOCK", "含清单实体所产逻辑元件 2.903(b)(2),2026-10-13 起"))
    elif new: rows.append(("受控清单·元件", "ASK", "拿 BOM 逐项核对 2.903(b)(2)"))
    st = "BLOCK" if new and (cov or ent) else ("OK" if r.authorized else "TODO")
    radio = ("模组 FCC ID 复用;看不到时外壳贴 Contains FCC ID 15.212(a)(1)(vi)(A)" if r.radios_all_certified_modules
             else "整机发射部分认证:Wi-Fi/蓝牙 15.201(b),蜂窝 Part 22/24/27")
    rows.append(("FCC 有意辐射体", st, radio))
    rows.append(("FCC 数字电路", st, "Class A/B:SDoC 或认证 15.101 表 1"))
    if r.workplace:
        ok = bool(r.marks & NRTL)
        rows.append(("NRTL 标志", "OK" if ok else "GAP", "已有 NRTL 标志;充电桩单独看" if ok
                     else f"只有 {'/'.join(sorted(r.marks)) or '无'},不算 NRTL 1910.303(a);充电桩单独看"))
    rows.append(("机器人专项标准", "ASK", STD.get(r.category, STD["other"])))
    if r.lithium: rows.append(("锂电池 UN 38.3", "OK" if r.un383_pack_report else "GAP",
                               "电池包要自己的测试和摘要,电芯测过不算 173.185(a)(1)、(a)(3)"))
    if r.sold_in_ca: rows.append(("充电器能效", "ASK", "加州 Title 20 / MAEDbS 登记是否覆盖,逐款判断"))
    return rows

FLEET = [  # 四台都是虚构机型,参数为演示而编
    Robot("虚构 AMR-X1(中国产新仓储 AMR)", True, 180, True, 1000, False, False,
          True, True, {"CE", "CCC"}, "amr", un383_pack_report=True),
    Robot("虚构 DLV-S2(中国产送餐机,2025 年已授权)", True, 45, True, 300, False, True,
          True, True, {"CE", "ETL"}, "delivery", sold_in_ca=True),
    Robot("虚构 ARM-C6(中国产固定式协作臂)", False, 30, True, 1000, False, False,
          False, True, {"CE"}, "arm", lithium=False),
    Robot("虚构 ARM-C7(同 C6,但通信板触发 2.903(b)(2))", False, 30, True, 1000, False, False,
          False, True, {"CE"}, "arm", lithium=False, covered_entity_logic_parts_prohibited=True),
]

if __name__ == "__main__":
    for r in FLEET:
        rows = check(r)
        bad = sum(s in ("BLOCK", "GAP") for _, s, _ in rows)
        print(f"\n**{r.name}:{bad} 项 BLOCK/GAP**\n\n| 状态 | 项目 | 说明 |\n|---|---|---|")
        for item, s, why in rows:
            print(f"| {s} | {item} | {why} |")

设计上只有一个关键点: FCC 两行的状态 st 由受控清单两行的结果推出来,不单独判断 。这样合规项之间的先后关系就写在代码里了,排期时不会再出现「EMC 已经测完、证书却出不来」的情况。

想接进自己的流程,可以把 FLEET 换成从 BOM 或 PLM 导出的 YAML,有 BLOCK 时用 sys.exit(1) 退出,放进发货前的检查里。


三、依据,以及代码简化了什么

规则原文依据代码里简化了什么
机器人受控(按生产地)FCC DA 26-786 附录 C;47 CFR 2.903(a)、(c)(2)只判 5 个条件,没写远程/自主运行、控制软件、医疗器械等排除项
元件受控(按实体)47 CFR 2.903(b)(2),91 FR 57798,2026-10-13 生效「是否属于清单实体所产、实体自产整机是否会被禁」整个交给人工判断
有意辐射体Wi-Fi/蓝牙:15.201(b) TCB 认证;蜂窝:Part 22/24/27(22.377、24.51、27.51),同样要认证,通常由 TCB 发证不区分频段和模组类型
无意辐射体15.101 表 1:Class A/B 数字设备 SDoC 或认证不判 Class A 还是 B
模组标签15.212(a)(1)(vi)(A):模组 FCC ID 从外面看不到时才要外标签;电子显示另见 (vi)(B)只提示,不检查标签实物
电气安全29 CFR 1910.303(a)、1910.399NRTL 名单写死成 4 个简写
锂电池运输49 CFR 173.185(a)(1)、(a)(3)、(a)(5)不区分装机电池、随机电池、备件电池;不查 Wh 标识

下面讲几条工程上最容易踩坑的地方。

1. 两条受控线:机器人按生产地,元件按实体

第一条是机器人线 。DA 26-786 把「境外生产的先进机器人设备」加进了受控清单,取得 DoW 有条件批准的除外。「境外生产」指的是不满足 48 CFR 25.101(a) 的「domestic end product」, 按生产地判断,不按公司身份 。加拿大工厂、欧洲工厂生产的也算境外。定义排除了网联车辆、无人机、医疗器械和固定式机器人(关节、并联、直角坐标和 SCARA),ARM-C6 和 C7 在这条线上都是 N/A。

第二条是元件线 。FCC 2026-09-11 发布、10-13 生效的新规(91 FR 57798)改写了 2.903(b):设备里只要有一颗由受控清单 点名实体 生产的「逻辑元件」,并且假如整机由这家实体生产就会被禁,整机就拿不到新授权。「逻辑元件」借用了数字设备的定义,指时钟超过 9 kHz、用数字技术的模块、子板和芯片等;外壳、紧固件、电阻、线束和普通电芯不算。

两条线的关系,新规原文说得很清楚:元件规则只适用于按实体点名的条目, 不适用于按生产地划线的条目 (无人机、路由器、机器人这类),除非生产元件的实体本身也被单独点名。新规只管新提交的授权申请,不影响已授权设备。所以 BOM 评审要同时问两个问题:整机在哪生产?板上的逻辑元件是谁生产的?

同一份新规还有两点和工程有关:清单实体对自家设备做任何修改,都不能走许可变更,要重新完整认证(2.932(f)、2.1043(a));在线市场以后要在售卖页显示 FCC ID,有实物或货权的平台 2027-03-01 起执行,只靠卖家声明的平台 2027-06-01 起执行。

老型号 不受影响。FCC 的事实说明写明进口、销售和使用照旧;FCC 常见问题也写明,不禁止维修已授权设备,也不禁止用 相同零件 替换部件。改硬件就要小心了:2026-10-22,FCC 用个案豁免(DA 26-1146)允许 Intel 对其已授权的境外产 AGV 做硬件变更和维护。这件事要靠单独豁免才能做,说明改硬件不是默认可以的,改版之前先问律师。

有条件批准这条路确实有人走通了。截至 2026-10-21,FCC 一共公告了 5 项机器人有条件批准 :

公告日期对象
DA 26-95709-09Husqvarna AB 割草机器人平台(305v/310v/420v/440v IQ)
DA 26-99609-18ANSCER Robotics AMR(AR250/AR650/AR1250)
DA 26-106310-02Matic Robots 地面清洁机器人 + 充电桩
DA 26-111410-16Volley Automation 的 AGV/AMR
DA 26-113010-21Vulcan Robotics 的 Sourccey 移动机器人平台

这 5 项里没有人形,也没有四足。申请条件之一是要提交美国本土化生产计划。

2. 用已认证模组能省掉什么,省不掉什么

模组方案能省掉的是 发射部分的重复认证 。标签要求是有条件的:模组贴着自己的 FCC ID 标签,装进主机后从外面看不到时,主机外壳要有指向模组的标签(15.212(a)(1)(vi)(A)),措辞 FCC 给了例子:「Contains Transmitter Module FCC ID: XYZMODEL1」或者「Contains FCC ID: XYZMODEL1」。模组用电子方式显示 FCC ID 的,另按 (vi)(B) 处理。

省不掉的是主机自己的主控等数字电路,它们属于无意辐射体,要按 15.101 走 SDoC 或认证。所以代码里有意辐射体和数字电路分成了两行。还要记住:模组有 FCC ID 只说明它当年拿到了授权,不说明它的生产实体不在清单上,元件线要单独查。

3. NRTL:CE 和 CCC 都不算

美国没有一部联邦法律规定所有电器必须做 UL。但 OSHA 对雇主有要求:工作场所的电气设备要经过「approved」,按 1910.399 的定义,通常就是由 NRTL 列名或贴标。UL 只是 NRTL 之一,Intertek(ETL)、CSA Group、TÜV 等也在 OSHA 的名单上。

所以这一项一般不是海关拦你,而是客户的采购、物业和电气检查员拦你。正式判断以 OSHA NRTL 名单和证书上的「us」标识为准。两个常见误判:适配器带 UL 认可零件标志不等于整机已经列名;充电桩要单独看。

4. UN 38.3:电芯测过,电池包也要测

49 CFR 173.185(a)(1) 原文写的是,电池 不论所用电芯是否属于已测试型号 ,本身都要按 UN 38.3 测试;(a)(3) 要求制造商和后续分销商都能提供测试摘要。DLV-S2 的 GAP 就出在这里。另外,(a)(5) 规定 2024-05-10 起锂离子电池外壳要标出瓦时(Wh)额定值,备件电池别漏了。装机电池、随机备用电池、单独寄的备件电池,运输要求各不相同,发货前要和货代逐项确认。

5. 代码里没写的

  • UL 3300、UL 3100、UL 1740 选哪一份 由认证机构根据产品决定,所以这一项在代码里永远是 ASK。据我们所知,人形和四足目前没有专门的认证类别。
  • 加拿大是另一套体系 :ISED 编号、ICES-003、带「c」的标志、英法双语,FCC 证书不能代替 ISED 证书。截至查证日,没有找到加拿大有类似受控清单的措施。
  • 联邦 DOE 消费品电池充电器标准(10 CFR 430.32(z))只是能效那一行的背景,商用充电桩落不落在范围内,要逐款判断。

四、怎么用这段代码

  1. 先跑受控清单两行。新型号得到 BLOCK 的,先不要排 EMC 和安规测试,先找美国律师出书面判断。元件线要拿着 BOM 和受控清单逐项对。
  2. 结果是 GAP 的项,交给认证实验室报价排期。很多 NRTL 在国内有实验室,可以问能不能一次出美国和加拿大的双标(cULus、c-CSA-us 等)。
  3. 发货前用 FCC ID 查询(fcc.gov/oet/ea/fccid)核对每个模组的编号,并拍下铭牌照片。美国的大客户采购、物业和电气检查员都会要。

规则是按截至 2026-10-23 的公开原文整理的, 具体型号适不适用、怎么认证,请以美国律师和认证实验室的意见为准 。FCC 有条件批准的名单还在增加,规则也在改,用之前请先查最新公告。


本文由 KeepRobots 团队撰写。KeepRobots 是温哥华的机器人现场服务公司,给别家生产的机器人做北美部署、售后和备件存放,不生产也不卖机器人,不做认证、不代办认证。写这类笔记,是因为在现场核对铭牌、FCC ID 和 NRTL 标志本来就是上门部署要做的第一步,标签缺了,部署就做不下去。

相关阅读

参考来源 (查证日期 2026-10-23)