4. 任务协同的总体架构

在AGV/AMR与WCS协同工程中,最容易被忽视却最致命的问题,是把“订单”和“设备动作”当成同一层的东西来处理。订单说“把A区的托盘送到B区月台”,而设备只认识“前进0.8米、举升120毫米、左转90度”。这两者之间隔着巨大的语义鸿沟。任务协同的总体架构,本质上就是一套把业务意图逐层翻译成物理动作的分层模型,每一层只解决自己那一层的问题,并通过清晰的接口把结果交给下一层。

这套分层模型通常由四个核心层构成:任务池、调度器、交通管制、设备适配层。它们不是简单的串联流水线,而是存在反馈与约束的双向协作关系。下面这张图展示了从订单接入到设备动作的完整分层与协作关系。

上游订单 / 上位系统 WMS · MES · ERP 下发搬运需求 订单解析 / 任务生成 任务池(Task Pool) 统一任务队列 · 优先级排序 · 任务状态机 · 依赖与超时管理 待分配 / 已分配 执行中 / 已完成 异常 / 挂起 优先级 / 截止时间 可执行任务集 调度器(Scheduler) 任务-车辆匹配 · 路径规划 · 成本评估 · 动态重调度 车辆状态 / 电量 距离 / 负载匹配 路径代价 / 时间窗 分配决策 带路径的任务指令 交通管制(Traffic Control) 路段互斥 · 交叉口预约 · 死锁预防 · 动态避让 路段占用锁 交叉口预约 优先级通行 避让指令 放行 / 等待 / 改道 设备适配层(Device Adapter) 协议转换 · 指令下发 · 状态回传 · 多品牌AGV/AMR统一接入 AGV-A 协议 AMR-B 协议 叉车-C 协议 提升机 / 输送线 状态反馈 / 异常上报 / 任务完成确认 资源约束 / 容量限制 / 优先级策略

理解这张图的关键,在于看清每一层的“输入”和“输出”分别是什么,以及层与层之间传递的到底是什么信息。

任务池:把业务意图变成可管理的任务对象

任务池不是简单的“待办列表”。它接收上游订单后,首先要做的是任务拆解与标准化。一个订单可能包含多个搬运步骤,例如“从立库出库口取托盘→送到缓存位→等待质检→再送到打包线”。任务池需要把这些步骤拆成独立的、可被调度器消费的任务对象,每个任务对象至少包含:起点、终点、货物类型、优先级、时间窗、依赖关系、当前状态。

任务池的核心职责是状态管理。一个任务从创建到完成,会经历“待分配→已分配→执行中→已完成”或“异常→挂起→重试”等状态迁移。任务池必须保证状态迁移的原子性和一致性,避免出现“调度器认为任务已分配,但任务池里还是待分配”这种不一致。在实际工程中,任务池通常用一张任务表加状态机来实现,状态迁移通过数据库事务或消息队列的确认机制来保证。

优先级排序是任务池的另一个关键能力。常见的做法是给每个任务计算一个综合优先级分数,例如:score = 基础优先级 × 权重1 + 截止时间紧迫度 × 权重2 + 等待时长 × 权重3。调度器每次从任务池拉取时,按分数从高到低取可执行任务集。这样既能保证紧急订单优先,又能避免低优先级任务被无限期饿死。

调度器:在约束条件下做最优匹配

调度器拿到可执行任务集后,要回答一个核心问题:哪个任务交给哪台车,走哪条路,什么时候执行。这是一个典型的组合优化问题。实际工程中不会追求全局最优,而是追求“足够好且实时”的可行解。

调度器的决策输入包括:车辆实时状态(位置、电量、负载、当前任务)、地图拓扑(路段长度、限速、单双向)、任务属性(起点终点、时间窗、货物重量)。决策输出是“任务-车辆-路径”的三元组。常见的匹配策略是最近可用车辆优先,但需要叠加电量约束:如果车辆剩余电量低于完成该任务所需电量的1.3倍,则不应分配,而应触发充电任务。

路径规划通常采用A*或Dijkstra算法在地图拓扑上搜索。但调度器给出的路径不是最终路径,而是一条建议路径,因为交通管制层可能会因为路段占用而要求改道。调度器与交通管制之间是“建议-确认”的关系,而不是“命令-执行”的关系。

交通管制:让多车共享同一张地图而不冲突

交通管制是分层模型中最容易被低估的一层。当多台AGV/AMR在同一张地图上运行时,如果没有交通管制,就会出现死锁、碰撞、路口堵塞。交通管制的核心机制是资源预约:把地图上的关键资源(路段、交叉口、充电桩、装卸位)抽象成可被占用的锁,车辆在执行路径前必须先申请这些锁,申请成功才能通行。

一个典型的交叉口预约流程是:车辆接近交叉口时,向交通管制层发送预约请求,包含车辆ID、预计到达时间、通过方向。交通管制层检查该交叉口在当前时间窗内是否已被其他车辆占用,如果空闲则授予通行权,并设置一个超时释放时间;如果已被占用,则返回等待指令,车辆在安全位置停车等待。超时释放机制是为了防止车辆故障后锁永远不释放。

死锁预防是交通管制的进阶能力。环形等待是常见的死锁场景:车A等车B释放路段,车B等车C,车C等车A。交通管制层需要检测这种环路依赖,并通过优先级抢占或路径重规划来打破死锁。实际工程中,通常给每台车一个动态优先级,优先级高的车辆可以要求低优先级车辆退让到避让点。

设备适配层:把统一指令翻译成设备方言

设备适配层是分层模型与物理世界之间的最后一道关口。它的核心职责是协议转换和状态归一化。不同品牌的AGV/AMR使用不同的通信协议:有的用TCP自定义二进制帧,有的用HTTP REST,有的用MQTT,有的用Modbus TCP。设备适配层为每种设备类型实现一个适配器,把上层统一的“移动指令”“举升指令”“等待指令”翻译成设备能理解的报文。

状态归一化同样重要。设备回传的状态字段各不相同:有的用0/1/2表示空闲/执行中/故障,有的用字符串"IDLE"/"RUNNING"/"ERROR"。适配层需要把这些状态统一映射成上层认识的枚举值,并附加时间戳和车辆ID,再回传给任务池和调度器。这样上层就不需要关心具体设备品牌,只需要处理统一的状态模型。

分层协作的关键原则:每一层只向上层暴露必要的接口,不暴露内部实现。任务池不需要知道车辆用的是哪种协议,设备适配层也不需要知道任务来自哪个订单。层与层之间通过明确的数据契约协作,任何一层的内部变更不应影响其他层的稳定性。

从订单到设备动作,这条链路看起来很长,但每一层都在解决一个明确的问题:任务池解决“有什么任务要管”,调度器解决“任务交给谁”,交通管制解决“多车怎么不打架”,设备适配层解决“指令怎么让设备听懂”。四层各司其职,又通过状态反馈和约束回路紧密协作,才构成了一个可运行、可扩展、可排障的任务协同总体架构。