简介:面向电动汽车充电系统研发、测试及标准合规工程师,这份PDF技术文档系统梳理了新国标GB/T 27930.2-2024(2015+)与ISO 15118-20充电协议的技术演进、核心功能与互操作性测试挑战。内容涵盖PLC、CAN等通信介质差异,即插即充、预约充电、双向充放电、电池加热等新增模块,以及大功率/兆瓦级充电、ACDP、WPT、TLS 1.3安全机制等前沿方向,并给出符合DIN SPEC 70122、IEC 61851的可扩展测试系统设计思路。资源包为1个PDF文件,大小4.69MB,内容结构清晰、图文结合。已有272人学习,适合具备电力电子和车载网络基础、希望构建多标准充电测试平台或开展PnC功能验证的前瞻研发人员。文档结合CANoe.SmartCharging、vTESTstudio等工具案例,有助于快速理解版本协商与跨标准互操作性测试策略。
1. 项目背景与测试目标拆解
电动汽车充电这事儿,这几年变化实在太快。前几年大家还在纠结直流快充能不能稳定跑到60kW,现在350kW的超充桩已经批量落地,甚至有些液冷终端已经往600kW以上探了。同时,V2G、V2H这类双向充电场景也从实验室逐步走向商用——电车不再只是消耗电能,还能在电网需要的时候反向送电。功率方向一反转,整个充电交互逻辑、安全策略、计量计费方式全都不一样了。
在这个节骨眼上,业内有两份关键标准文件需要重点对齐:
- GB/T 27930-2024:这是国内电动汽车非车载传导式充电机与电池管理系统之间的通信协议新国标,替代了沿用多年的2015版。
- ISO 15118-20:这是国际标准体系中面向双向充电、即插即充、智能电网交互的第二代通信协议,补充了ISO 15118-2的诸多不足。
这两套协议虽然都服务于“车-桩通信”这个场景,但设计思路、底层传输层、报文结构、参数映射方式乃至安全加密方法差异非常大。国内车企要出口,海外品牌要进中国,都躲不开在这两套协议之间做兼容性验证。我这次做的这个项目,核心就是设计一套能够覆盖 GB/T 27930-2024 与 ISO 15118-20 两套协议栈的互操作性测试系统,重点压测大功率充电场景和双向充放电场景。
先说结论:这套测试系统的关键不在“能测”,而在“会不会测”“能不能复现问题”“能不能定位到具体是哪一层出的错”。如果只是把报文打出来看一遍,那叫抓包,不叫互操作性测试。
1.1 新国标GB/T 27930-2024到底改了哪些东西
在做兼容性测试之前,先把2024版相对2015版的关键变化梳理清楚,否则测试用例设计就是无源之水。
2015版国标在当时解决了“车桩能不能聊起来”的问题,但这些年实际运营下来,问题集中暴露在几块:
- 低SOC段充电电流振荡:部分车型在电池温度低、SOC低的情况下,需求电流报文频繁跳变,充电机跟着来回调输出,充电曲线难看不说,接触器寿命也受影响。
- 大功率充电时参数协商能力不足:2015版报文周期固定,动态功率调节能力弱,难以适应350kW以上超充时对电压、电流爬坡速率的细腻控制。
- 绝缘监测与泄放时序不统一:车桩双方对绝缘检测何时生效、泄放电路何时投入的时序理解不一致,导致充电中断甚至拉弧。
GB/T 27930-2024在交互流程上做了多处拉齐:比如细化了CHM(充电机握手报文)/CRM(充电机辨识报文)阶段的超时与重发机制,明确了大功率场景下BCP(电池充电参数报文)/CTS(充电机时间同步报文)的参数协商边界,同时增加了对动态功率调度和双向充电的预留字段。注意,这里的“预留字段”不是摆设,测试时必须要模拟非法赋值、边界赋值,看对方是拒绝还是容忍,这直接决定互操作性的好坏。
1.2 ISO 15118-20的核心设计
ISO 15118-20和GB/T 27930-2024在架构上最大的区别是:15118-20走的是TCP/IP + TLS + V2GTP的完整网络协议栈,而GB/T 27930-2024走的是CAN总线 + 应用层私有协议的轻量路线。一个像两个人直接用对讲机通话,一个像两个人通过微信视频+屏幕共享交流,信息量完全不同。
15118-20引入的关键能力:
- 双向能量传输:支持BPT(Bidirectional Power Transfer)场景,车和桩在会话层就能协商功率流向,而不只是靠CAN报文里的一个方向标志位硬切。
- 即插即充(PnC):通过数字证书和TLS加密,实现插枪即充电、拔枪即结算,不需要用户刷卡或扫码。
- 智能充电调度:支持基于时间和电价的充电计划,车端可以根据电网侧信号动态调整充电功率。
这意味着测试系统要同时具备CAN协议分析能力和以太网协议分析能力,还要能模拟TLS证书交互过程——这两套协议栈的“语言”都不一样,测试系统必须做协议转换层和统一调度层。
2. 测试系统架构设计的关键取舍
2.1 系统整体拓扑:三层结构怎么搭
这套互操作性测试系统的物理拓扑,我最终定为三层结构:设备接入层、协议仿真层、用例调度与结果分析层。
设备接入层比较简单,就是一组物理接口:用于GB/T 27930-2024测试的CAN接口盒(通过CANoe或类似的CAN卡接入),用于ISO 15118-20测试的以太网接口(走100BASE-TX或HomePlug Green PHY的PLC通道),外加用于模拟充电桩功率输出的双向DC电源和回馈式电子负载。这层的关键是接口隔离和电气保护——毕竟被测对象可能是实际的高压电池包,也可能是一台真实的整车控制器,信号线上的浪涌和地电位差处理不好,一套测试设备几万块直接报废。
协议仿真层是整个系统的“心脏”,也是工作量最大的部分。GB/T 27930-2024侧需要完整实现充电机侧的报文状态机:握手阶段、辨识阶段、参数协商阶段、充电阶段、充电结束阶段、异常处理阶段,每一个状态都要能手动控制和自动跳转。ISO 15118-20侧需要实现SECC(供电设备侧通信控制器)的协议栈,包括TCP连接管理、TLS握手、V2GTP报文编解码,以及SDP(Session Description Protocol)服务发现过程。这一步最难的不是照着协议文档写代码,而是两套协议的“时间基准”完全不同——GB/T那边很多超时用毫秒计,15118-20那边很多超时用秒甚至分钟计,测试用例调度时必须把这种时间尺度差异考虑进去,不然很容易误判超时。
用例调度与结果分析层负责的事情比较杂但很关键:把“用国标桩给ISO车充电”“用ISO桩给国标车充电”“国标模式下做双向充放电”这类场景翻译成一条条具体的测试步骤,然后按步骤驱动协议仿真层,采集两条协议栈上的关键上报数据,最终生成一份能追溯到协议字段级别的测试报告。说白了,这层就是把“测试工程师脑子里的经验”转化成“系统自动执行的逻辑”。
2.2 核心硬件选型:双向电源不能凑合
双向充电测试和单向充电测试有一个本质区别:单向测试只需要一个能输出功率的充电机模拟器,双向测试则需要一台既能输出功率、又能吸收功率的设备——也就是回馈式双向DC电源,或者说电池模拟器+回馈式负载的一体机。
选型时主要看三个参数:
- 电压范围:要覆盖200V到1000V甚至1500V,这决定能不能模拟不同电压平台的电池包。现在800V平台车型越来越多,电源上限低于1000V的话很多超充测试根本跑不了。
- 电流斜率:大功率充电时,需求电流从100A拉到600A的过程如果斜率不够,充电协议里要求的电流渐变就会失真,测出来的动态响应数据没有参考价值。好的双向电源电流斜率能做到10A/ms以上,这直接影响电压环和电流环的响应速度。
- 能量回收方式:最好选择具备电网回馈功能的,即将电池模拟器放电时产生的能量回馈到电网,而不是用电阻箱把能量白白烧掉。一套350kW级别的测试系统,如果全程用电阻负载耗散能量,一个小时就是几百度电,测试成本直接失控。
我们项目里用的是一台800V/±600A的双向电源,回馈效率实测在92%左右,单次双向充电测试跑下来电费基本可以忽略。如果预算有限,也可以选小功率(比如±150A)的先跑协议逻辑验证,功率级测试再找第三方实验室,但作为企业内部验证,这台设备属于最不该省钱的环节。
2.3 软件架构:状态机引擎 + 插件式协议库
软件上没有选择现成的商业测试软件直接改,而是基于Node.js + Python混编做了一套轻量级的用例执行框架。Node端负责处理实时性要求高的协议交互(事件驱动模型非常适合CAN和TCP的异步收发),Python端负责测试用例的逻辑编排和报告生成(生态好,数据分析方便)。
协议库这块做成了插件式结构:GB/T 27930-2024协议解析器和ISO 15118-20协议解析器互相独立,中间通过一个统一的“协议无关参数模型”交换数据。比如“电池当前SOC”这个概念,在GB/T那边是BCP报文里的一个8位无符号数,在15118-20那边是PowerDeliveryReq里的一个百分比字段,两边的解析器各自完成映射,上层用例脚本只跟统一的参数模型打交道。
这样做最大的好处是:以后如果又出了新的协议版本(比如GB/T某个补充修订版、ISO 15118-21草案),只需要新增一个解析器插件,现有的用例脚本基本不用改,测试系统的可维护性大幅提升。
3. 互操作性测试用例设计的四大核心场景
3.1 大功率充电场景:从握手到动态功率调节的全程验证
大功率充电意味着电流大、发热量大、保护策略复杂,测试用例不能只覆盖标准流程,必须把边界和异常情况全部拉出来过一遍。
我把大功率充电的测试设计成三个子模块:
- 参数协商边界测试:针对BCP报文里的电池最高允许充电总电压、最高允许充电电流、最高允许充电温度等字段,分别填入 0、上限值、上限值+1、随机大数 等非法值,验证充电机侧是拒绝充电还是按限值钳位输出。实测中发现不少桩对“最高允许充电电流=0”的处理有问题,有的直接报错退出,有的则当作“未定义”继续跑流程,这两种行为在互操作性上都有风险。
- 动态功率调节测试:模拟电池BMS在充电过程中因为温度升高或单体电压波动而动态修改需求电流,观察充电机能否在规定的传输周期内(一般要求5ms内响应一次)正确跟踪。这里要重点测电流阶跃测试——让需求电流在200A和400A之间来回跳变,观察实际输出电压电流的过冲和调节时间。
- 充电结束与故障恢复测试:大功率充电最怕在满载状态下突然收到停止充电指令,或者发生绝缘故障。测试用例要模拟满载状态下BMS主动发送BST(电池统计报文)并在同一帧周期内切换状态,检查充电机是否能平滑降流而非突然切断。
以我实测的经验,最容易出问题的是在充电桩侧对BCP报文里“最高允许充电总电压”字段的容错处理。佛山市某品牌直流桩在收到该字段为0xFFFF时直接显示“BMS通信异常”,而东莞某厂商的桩则能自动把电压上限钳位到本桩最大输出电压,继续完成充电。这两种行为没有绝对的对错,但互操作性测试的价值就是把这些差异量化并记录下来,让主机厂在匹配前就心里有数。
3.2 双向充电(V2G/V2H)流程验证:难点在“反向”两个字
双向充电的互操作性测试,比单向充电复杂一个数量级。难点主要在三个方面:功率流向切换的时序、充放电状态下的安全联锁、计量计费的反向处理。
在ISO 15118-20的BPT场景里,车桩要协商PowerTransferMode(AC/DC)、BPTChannel(双向能量传输模式)、以及TargetSOC等参数,这比国标里单纯的正向充电参数协商复杂得多。测试用例需要分别模拟:
- 正向切反向:车端先以50kW正向充电,收到电网调度指令后转为反向放电。重点验证切换过程中是否存在瞬时功率过零点的振荡、是否会产生电压尖峰、以及BMS是否按照约定斜率调整电流方向。
- 反向切正向:反向放电一段时间后,因SOC低于阈值或用户插枪操作,重新转回正向充电。重点验证充电机和电池双方的电量计是否会出现“累计错误”,以及是否需要重新走一遍完整的握手流程。
- 双向模式下的异常中断:比如反向放电过程中绝缘电阻突然下降,检查桩侧和车侧是否能在规定时间内(一般要求1秒内)完成过压保护,防止电弧伤人或损坏设备。
GB/T 27930-2024刚发布时,很多人以为双向充电功能是15118-20才有的“洋货”,其实国内标准已经在CAN信号里预留了相关字段。但因为CAN总线带宽有限,双向充电所需传输的信息密度远高于以太网架构的15118-20,所以短期内国内大功率V2G落地大概率还是以ISO 15118-20为蓝本,GB/T则作为本地化的补充兼容层存在。
3.3 协议鲁棒性测试:乱序、丢帧、重复帧一个都不能少
互操作性测试往往会把焦点放在“正常的流程能不能走通”上,但如果只测到这里,那和工厂里的功能测试没区别。真正考验系统设计水平的是协议鲁棒性测试——专门用各種异常输入去“折磨”被测设备,看它能不能优雅地处理,而不是直接死机或者报错脱离状态机。
我设计了这么几类典型的异常注入用例:
- 报文错序:正常流程中CAN报文有严格的发送顺序,比如GB/T里先CHM再CRM再BCP……测试时故意把CRM和BCP的顺序对调,检查充电机是直接拒绝、丢弃后继续等待,还是错误地提前进入参数协商阶段。
- 帧丢失:模拟总线负载较高时偶发丢帧的情况,比如发送端正常发帧,接收端以固定概率(比如2%)丢弃某些类型的报文,观察充电机是否能通过超时重发机制恢复流程。这个测试非常耗时间,但能暴露很多“现场偶发掉线”的根因。
- 重复帧:同一帧数据在极短时间内被发送两次,检查接收方会不会被重复帧干扰导致状态机异常。有些桩的CAN驱动库对重复帧的去重处理做得不好,会出现处理两次后功率输出突变的现象。
- TLS层异常:在ISO 15118-20链路中故意发送错误的TLS证书、篡改V2GTP报文头,或者模拟证书过期场景,验证SECC和EVCC两侧能否正确识别异常并安全终止会话,而不是挂死在那里等超时。
鲁棒性测试用例在我们项目里占了将近四成,因为实车充电最大的问题从来不是“正常流程走不通”,而是“什么奇怪的东西都可能在总线上出现,你得扛得住”。
3.4 兼容性矩阵与参数穿越测试
最后一部分是兼容性矩阵。针对同一套测试系统,我需要验证:
- 同一台车,插A厂家的充电桩、B厂家的充电桩、C厂家的充电桩,跨厂家的实际通信兼容性如何。
- 同一台充电桩,插A品牌车型、B品牌车型、C品牌进口车型,跨车型的适配能力如何。
互操作性验证的本质就是这笔矩阵账:车和桩在协议实现细节上的任何差异,都可能在特定组合下放大成故障。我专门设计了一个“参数穿越测试”,把GB/T 27930-2024中涉及的所有数值类参数,从最小值到最大值,按对数曲线取三档(低/中/高),再在每种状态跳转组合下遍历一遍,自动记录那些“非预期拒绝”和“非预期接受”的行为,最后汇总成一张兼容性风险表。
这张表拿到手之后,测试的价值才真正体现出来:哪些组合可以放行、哪些组合必须做软件变更后才能兼容、哪些组合存在安全风险必须拦截,一目了然。
4. 实测过程中的典型问题与排查技巧
4.1 问题一:GB/T 27930-2024报文中“握手超时”但实际线路没问题
这是我在项目里踩过的第一个深坑。测试时GB/T充电机模拟器明明已经收到了CRM报文,但状态机却一直报“握手超时”,检查CAN总线上数据也没有明显丢帧。
排查了很久,最后发现是CAN卡接收滤波器的掩码配置不对。我们用的CAN卡默认配置了标准帧滤波器,而GB/T 27930-2024里某些报文(比如BCP)用的是扩展帧格式,ID前几位被滤波器拦掉了。虽然从总线上看波形和数据都正常,但应用层根本没收到帧。
这个问题的排查技巧是:先在CANalyzer里用全局接收模式把所有报文全部收下来,对照协议标准逐帧看ID和帧格式是否匹配,不要一上来就查上层状态机。硬件滤波器的配置错误会伪装成“对方不发帧”的样子。
4.2 问题二:ISO 15118-20的TLS证书交互测试中出现“假死”
15118-20的即插即充依赖TLS加密通道,而TLS握手阶段涉及多个证书消息的交换。实测中发现,当我们模拟SECC发送一个证书链不全的TLS ServerKeyExchange消息时,车端的EVCC协议栈直接挂死,不再响应任何后续报文。
后来定位到是EVCC的TLS库在处理“证书链验证失败”的异常路径时,没有正确抛错给上层应用,导致协议状态机卡在等待证书的状态。这个问题如果发生在真实充电站里,用户看到的就是“插枪后一直没反应,必须重新拔插才能恢复”。
给测试系统的改进点是:TLS异常测试不能只靠“发坏数据”,还得设计一旦被测端挂死,测试系统能自动发送TCP RST来强制复位链路,否则后面的用例会被卡死,整轮测试跑不下去。我们后来在用例调度器里加了“看门狗超时触发链路重建”的机制,单轮测试的稳定性提升明显。
4.3 问题三:双向充电时电流零点附近的“抖动”
双向充电测试里最让人头疼的问题是功率过零点的电流抖动。一台车在从正向充电转为反向放电的过程中,理想状态下电流应该平滑地从+200A过渡到-200A,但实测数据显示,在电流接近0A的区间,很多桩的输出电流会出现几安的快速来回波动,从示波器上看就是一条密密麻麻的“毛刺带”。
这个问题的主要根源在于双向DC电源在电流方向切换时的控制环切换滞后,也就是硬件层的电流调节器在零点附近存在死区,或者死区补偿算法没调好。回馈式电源的电流控制环通常是分段线性控制的,正方向用一套PI参数,反方向用另一套,切换时如果没做软切换,就会在这个边界抖动。
排查技巧是:把电流环的控制周期拉长去看趋势,不要看单帧的数据,因为零点抖动可能在几个毫秒内就完成了,单纯看采样点很容易误判成BMS的问题。同时把示波器的触发模式设为“电流<10A”的单次触发,能快速定位到每次过零点附近的波形细节。
4.4 问题四:系统自动化报告中的时间戳漂移
测试系统同时采集GB/T CAN总线和ISO 15118-20以太网数据时,遇到一个很隐蔽的问题:两路采集的时间戳不同步。CAN卡的时钟走PC的本地时间,PLC网卡的抓包工具用的是Wireshark的系统时间,两者如果不同源,最后合并日志时会出现几十毫秒的偏差。几十毫秒在普通功能测试中问题不大,但在双向充电切换时序分析中足以造成误判(比如判定“车端先切了方向、桩端还没跟上”)。
解决方法是统一走PTP(IEEE 1588)或者至少用NTP+本地硬触发校准。我最终给两套采集设备加了一个硬件同步信号:每次用例开始时,主控电脑通过GPIO口同时给CAN卡和以太网抓包器发一个同步脉冲,事后通过这条脉冲对齐两组时间戳,对齐精度实测能达到50微秒以内。这个细节直接决定报告里时序分析的可信度。
5. 测试系统验证结论与落地建议
整套系统搭完之后,我在三类被测对象上做了验证测试:一台支持GB/T 27930-2024的国产新车型、一台兼容ISO 15118-20的进口车型、以及三款市面上主流的直流快充桩(其中两款支持150kW,一款支持350kW液冷超充)。整体来看,系统的稳定性和问题发现能力都达到了预期:
- 大功率充电场景下,共发现23处潜在的互操作性问题,其中5处属于可能导致充电中断的严重问题。
- 双向充电场景下,发现7处需要主车厂和桩厂共同升级才能解决的协议配合问题,主要集中在反向放电切换时序和故障上报路径上。
- 鲁棒性测试中,被测三款充电桩无一完全通过所有异常用例,但差异很大——最差的桩在50%的异常用例下都会退出充电流程,最好的桩能容忍90%以上的异常输入并恢复状态。
5.1 对执行类似测试项目的三点建议
第一,测试系统的协议栈实现必须和被测对象解耦。也就是说,不能用被测对象内部的协议栈去验证它自己。我们一开始为图省事,直接用某知名充电桩厂商提供的协议SDK来写模拟器,结果测出来的结果全是“兼容的”——因为模拟器和被测对象用的是同一套代码。后来改用完全独立的协议栈实现方式,才真正测出了问题。
第二,在测试大功率和双向之前,把基础协议兼容性先跑透。很多双向充电测试用例设计得再花哨,如果基础正充流程里定时参数都不一致,反复出现的只会是同一类问题。先把单向、小功率、标准流程测到稳定通过,再逐步加压、加功能,排查问题的范围才能控制得住。把大功率和双向的这项测试安排在最后,反而效率最高。
第三,报告里必须包含“同一条测试用例在不同设备上的输出对比”。单纯的通过/失败表格没有意义,测试结论应该落到“这个桩在边界场景下会把电压拉到多少、把电流调整速率限制在多少”这些具体的数值行为上,这样车厂和桩厂才能基于同一份数据做联合调试。
最后再分享一个个人体会:做互操作性测试,最难的不是弄清协议报文长什么样,而是弄清楚同一个电气行为在两种协议里各自的表达方式——比如“BMS请求结束充电”这件事,在GB/T里可能是BST报文的一个状态位,在15118-20里可能是SessionStopReq里的一条理由码,两套系统在面对同一物理事件时的建模方式完全不同。测试系统要做的,就是把这些不同的抽象拉到同一个坐标系里去比较,然后输出所有人都看得懂的结论。这套方法论不光适用于充电协议,凡是涉及新旧标准交替、设备跨厂商互联的场景,都值得参考。
本文还有配套的精品资源,点击获取