在 OCPP 1.6 协议中,ChangeAvailability 是中央系统(Central System,即充电平台)向充电桩(Charge Point)下发的核心控制指令之一,用于远程调整充电桩整体或单个充电枪口的可用状态,是充电运营中实现设备运维、故障隔离、排班调度的关键功能。本文将结合 OCPP 1.6 官方规范,完整拆解该指令的字段定义、枚举类型、业务场景与实现细节。


一、指令概述:ChangeAvailability.req 是什么?

ChangeAvailability.req中央系统 → 充电桩的请求 PDU(协议数据单元),用于通知充电桩执行可用性变更操作。

官方文档
  • 核心作用:远程控制充电桩整体、或指定单个充电枪口(Connector)的「可充电 / 不可充电」状态。
  • 响应 PDU:充电桩收到指令后,会返回 ChangeAvailability.conf 确认执行结果(本文重点解析请求字段,响应逻辑可参考协议规范)。
  • 协议定位:OCPP 1.6 核心规范第 6.7 节定义,依赖第 7.4 节的 AvailabilityType 枚举类型。

二、ChangeAvailability.req 字段完整解析

根据 OCPP 1.6 官方规范,ChangeAvailability.req 包含 2 个必填字段,字段定义如下表:

字段名 (FIELD NAME) 字段类型 (FIELD TYPE) cardinality (CARD.) 描述 (DESCRIPTION)
connectorId integer (connectorId ≥ 0) 1..1(必填) 目标充电接口 ID,用于指定要变更状态的对象:・取值 0:代表整个充电桩(Charge Point)及其所有充电枪口的可用性变更・取值 1,2,3...:代表指定编号的单个充电枪口(Connector)的可用性变更
type AvailabilityType(枚举) 1..1(必填) 可用性变更类型,指定充电桩需要执行的状态切换操作,枚举值见下文详解

1. connectorId:目标对象精准定位

connectorId 是指令的「作用范围标识」,是实现「全局控制 / 单枪控制」的核心:

  • 全局控制场景:当 connectorId = 0 时,平台要求充电桩将整台设备设为不可用 / 可用,适用于充电桩整体故障、设备离线维护、站点停运等场景。
  • 单枪控制场景:当 connectorId = 1/2/...(即 > 0) 时,仅对指定编号的充电枪口生效,适用于单个枪口故障、枪头损坏、单枪运维等场景,不影响其他枪口正常服务。
  • 约束:connectorId 必须为非负整数,充电桩需校验 ID 合法性(如不存在的枪口 ID 需返回错误响应)。

2. type:可用性类型枚举(AvailabilityType)

type 字段是指令的「操作指令」,其值为 AvailabilityType 枚举类型,OCPP 1.6 规范中定义了 2 个合法枚举值:

枚举值 (VALUE) 描述 (DESCRIPTION) 业务场景
Inoperative Charge point is not available for charging.(充电桩 / 枪口不可用,禁止充电) 设备故障、枪头损坏、运维检修、限流停运、临时禁用
Operative Charge point is available for charging.(充电桩 / 枪口可用,允许充电) 故障修复、运维完成、恢复服务、重新启用

三、核心业务场景与交互逻辑

1. 典型应用场景

场景 指令参数示例 业务说明
单枪故障禁用 connectorId=1, type=Inoperative 1 号枪出现硬件故障,平台下发指令禁用该枪,用户无法在该枪发起充电,其他枪正常使用
整站停运维护 connectorId=0, type=Inoperative 充电桩所在站点进行停电检修,平台下发指令禁用整台设备,所有枪口停止服务
故障恢复启用 connectorId=1, type=Operative 1 号枪故障修复完成,平台下发指令恢复该枪可用,重新对外开放充电服务
整站恢复运营 connectorId=0, type=Operative 站点检修完成,平台下发指令恢复整台设备所有枪口的可用状态

2. 完整交互流程

  1. 平台下发指令:中央系统根据业务需求,向指定充电桩发送 ChangeAvailability.req,携带目标 connectorId 和目标 type
  2. 充电桩校验与执行
    • 校验 connectorId 合法性(是否为有效 ID)、type 枚举值合法性;
    • 执行状态变更:将对应枪口 / 整台设备的可用性状态更新为目标值;
    • 若枪口正在充电,需遵循协议规范处理(通常允许完成当前充电,后续禁止新充电请求,部分场景可强制终止)。
  3. 充电桩返回响应:向平台发送 ChangeAvailability.conf,携带 status 字段(Accepted/Rejected/Scheduled 等),告知指令执行结果。
  4. 平台状态同步:平台根据响应结果,更新后台设备状态,同步至用户端、运营端系统。

四、开发实现关键细节与避坑指南

1. 字段校验规则

  • connectorId:必须为非负整数,充电桩需校验 ID 范围(如设备仅支持 2 个枪口,则 connectorId 只能为 0/1/2,其他值返回 Rejected)。
  • type:必须严格匹配枚举值(Operative/Inoperative),大小写敏感,非法值需返回错误响应。
  • cardinality 约束:两个字段均为 1..1禁止缺失、多传或传空值,否则视为非法请求。

2. 充电中状态处理

当指令下发时,若目标枪口 / 整台设备正在进行充电,充电桩需遵循以下逻辑:

  • 推荐处理:允许当前充电会话正常结束,禁止新的充电请求,状态变更对后续请求生效;
  • 特殊场景:若平台要求强制终止,需结合 RemoteStartTransaction/RemoteStopTransaction 指令配合实现,ChangeAvailability 本身不强制终止当前充电。

3. 状态持久化

充电桩需将变更后的可用性状态持久化存储,即使设备重启、离线后重新上线,状态仍需保持,避免状态丢失导致服务异常。

4. 状态同步机制

平台需通过 StatusNotification 报文(充电桩主动上报的状态通知),校验充电桩是否成功执行了 ChangeAvailability 指令,确保平台与设备状态一致。


五、Java 代码实现示例(Spring Boot 环境)

以下是基于 OCPP 1.6 规范的 ChangeAvailability.req 实体类与枚举定义,可直接用于后端开发:

1. AvailabilityType 枚举类

/**
 * OCPP 1.6 AvailabilityType 枚举
 * 对应 ChangeAvailability.req 的 type 字段
 */
public enum AvailabilityType {
    /**
     * 不可用,禁止充电
     */
    Inoperative,
    /**
     * 可用,允许充电
     */
    Operative
}

2. ChangeAvailabilityRequest 实体类

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

/**
 * OCPP 1.6 ChangeAvailability.req 请求实体
 */
public class ChangeAvailabilityRequest {

    /**
     * 目标接口ID,0代表整台充电桩,1,2...代表单个枪口
     */
    @NotNull(message = "connectorId 不能为空")
    @Min(value = 0, message = "connectorId 必须为非负整数")
    private Integer connectorId;

    /**
     * 可用性类型
     */
    @NotNull(message = "type 不能为空")
    private AvailabilityType type;

    // Getter & Setter
    public Integer getConnectorId() {
        return connectorId;
    }

    public void setConnectorId(Integer connectorId) {
        this.connectorId = connectorId;
    }

    public AvailabilityType getType() {
        return type;
    }

    public void setType(AvailabilityType type) {
        this.type = type;
    }
}

3. 服务层处理逻辑示例

import org.springframework.stereotype.Service;

@Service
public class ChargePointAvailabilityService {

    /**
     * 处理 ChangeAvailability.req 请求
     * @param request 请求实体
     * @param chargePointId 充电桩ID
     * @return 执行结果
     */
    public ChangeAvailabilityResponse handleChangeAvailability(ChangeAvailabilityRequest request, String chargePointId) {
        Integer connectorId = request.getConnectorId();
        AvailabilityType type = request.getType();

        // 1. 校验connectorId合法性
        if (!isValidConnectorId(chargePointId, connectorId)) {
            return new ChangeAvailabilityResponse(AvailabilityStatus.Rejected);
        }

        // 2. 执行状态变更
        updateAvailabilityStatus(chargePointId, connectorId, type);

        // 3. 返回成功响应
        return new ChangeAvailabilityResponse(AvailabilityStatus.Accepted);
    }

    /**
     * 校验connectorId是否合法
     */
    private boolean isValidConnectorId(String chargePointId, Integer connectorId) {
        // 业务逻辑:根据充电桩配置,校验connectorId是否在有效范围内
        // 示例:充电桩支持2个枪口,允许的connectorId为0,1,2
        return connectorId >= 0 && connectorId <= 2;
    }

    /**
     * 更新充电桩/枪口可用性状态
     */
    private void updateAvailabilityStatus(String chargePointId, Integer connectorId, AvailabilityType type) {
        // 业务逻辑:持久化状态到数据库,同步到缓存,通知设备执行状态变更
        System.out.println(String.format("更新充电桩[%s] %s 状态为: %s",
                chargePointId,
                connectorId == 0 ? "整台设备" : String.format("%d号枪口", connectorId),
                type));
    }
}

六、总结

ChangeAvailability 是 OCPP 1.6 协议中平台侧远程控制设备状态的核心指令,通过 connectorId 实现「全局 / 单枪」的精准控制,通过 AvailabilityType 实现「可用 / 不可用」的状态切换,是充电运营平台实现设备运维、故障管理、服务调度的基础能力。

开发过程中需重点关注:

  • 字段合法性校验,避免非法指令导致设备异常;
  • 充电中状态的兼容处理,保障用户充电体验;
  • 状态持久化与平台 - 设备状态同步,确保数据一致性。

延伸阅读

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐