简介:这份PDF资料聚焦自动化立体仓库的出入库能力与堆垛机节拍,面向物流工程、仓储规划及自动化设备设计人员,帮助解决仓库效率评估与参数选型问题。内容围绕平托盘尺寸规格与材料、货态尺寸计算及码垛方式、单元货格尺寸确定等核心模块展开,详细讲解侧向间隙取值、横梁式与牛腿式货架载货示意、对缝与交错等码垛方法,并给出托盘标准规格表与货格尺寸代号说明,可直接用于立体仓库方案设计与节拍核算。资源包共1个PDF文件,约1.33MB,内容为可编辑的WORD整理版,图文并茂便于查阅引用。目前已有106人学习,适合需要系统掌握出入库能力计算与堆垛机节拍优化方法的读者参考。
1. 自动化立体仓库出入库能力和堆垛机节拍:一份 PDF 背后真正要算清的三笔账
很多人第一次拿到《自动化立体仓库出入库能力和堆垛机节拍》这类资料,第一反应是找公式,第二反应是套 Excel。但真到项目上你会发现,算不出来往往不是因为公式难,而是因为一开始就没分清三笔账:堆垛机单机循环时间、系统出入库能力、以及两者之间的耦合系数。这三笔账算错任何一笔,方案评审时都会被问住。
这篇笔记面向三类人:正在做立库方案选型的集成商工程师、被要求核算产能的甲方设备管理员、以及想从 PLC 调试转做系统规划的技术人员。我会把 PDF 里通常只给结论的部分拆开——单循环和双循环到底差多少、水平与垂直速度怎么折算成节拍、巷道数堆垛机数怎么匹配出入库峰值、以及为什么仿真跑出来 120 托/小时现场只能做到 80。读完你能自己搭一张可复算的节拍表,也能判断供应商给的产能数字有没有注水。
2. 堆垛机节拍是怎么算出来的:从单循环到双循环的完整推导
2.1 先分清三个时间概念,否则后面全错
堆垛机节拍的核心不是「跑一趟要多久」,而是「平均每完成一次存取任务占用多少时间」。这里必须区分三个量:
- 单循环时间(Single Cycle Time, SC):堆垛机从巷道口(P&D 站台)出发,到目标货位取或放一托货,再空车或载货返回巷道口。一次只服务一个任务。
- 双循环时间(Dual Cycle Time, DC):堆垛机从巷道口出发,先到货位 A 取货(或放货),再移动到货位 B 放货(或取货),最后返回巷道口。一次服务两个任务。
- 复合循环时间(Combined Cycle Time, CC):实际运行中任务队列是混合的,平均时间介于 SC 和 DC 之间,取决于任务配对率。
很多资料直接给一个「堆垛机速度 120m/min」就让你算产能,这是典型的偷懒。速度只是输入,节拍才是输出。我一般会先建一张表,把每个动作拆成「加速段 + 匀速段 + 减速段」,因为堆垛机的水平行走和垂直升降都是伺服驱动,存在加减速斜坡,短距离移动时匀速段根本来不及出现。
2.2 水平与垂直运动的折算:为什么不能简单用距离除以速度
堆垛机的水平行走(X 轴)和垂直升降(Y 轴)是同时动作的,但两者速度不同、加速度不同,实际到达时间取决于「谁先到位」。常见做法是分别计算 X 和 Y 的运动时间,取较大值作为该段行程时间,再加上货叉伸缩时间。
下面是一个可复用的 Python 计算片段,输入是距离、最大速度、加速度,输出是运动时间。这个函数假设梯形速度曲线,先判断能否达到最大速度:
def motion_time(distance, v_max, accel): """ 计算梯形速度曲线下的运动时间 distance: 移动距离 (m) v_max: 最大速度 (m/s) accel: 加速度 (m/s^2) 返回: 运动时间 (s) """ # 加速到最大速度所需距离 d_accel = v_max ** 2 / (2 * accel) if distance >= 2 * d_accel: # 能达到最大速度:加速 + 匀速 + 减速 t_accel = v_max / accel d_cruise = distance - 2 * d_accel t_cruise = d_cruise / v_max return 2 * t_accel + t_cruise else: # 达不到最大速度:三角形速度曲线 v_peak = (distance * accel) ** 0.5 return 2 * v_peak / accel # 示例:水平行走 30m,最大速度 2m/s,加速度 0.5m/s^2 t_x = motion_time(30, 2.0, 0.5) # 垂直升降 12m,最大速度 0.8m/s,加速度 0.4m/s^2 t_y = motion_time(12, 0.8, 0.4) print(f"水平时间: {t_x:.2f}s, 垂直时间: {t_y:.2f}s, 取大: {max(t_x, t_y):.2f}s")逻辑说明:d_accel是加速段和减速段各占的距离,如果总距离大于两倍加速距离,说明中间有匀速段;否则速度还没到最大值就要开始减速,峰值速度由(distance * accel) ** 0.5决定。参数说明:v_max和accel必须用国际单位,现场资料常给 m/min,记得除以 60。货叉伸缩时间通常取 4~8 秒(单伸位)或 6~12 秒(双伸位),这个值直接问供应商要实测数据,不要用样本册上的「理论值」。
2.3 单循环与双循环的差距:一个具体算例
假设某巷道堆垛机参数:水平最大速度 2m/s,加速度 0.5m/s²;垂直最大速度 0.8m/s,加速度 0.4m/s²;货叉伸缩单次 6s;巷道口到最远货位水平 45m、垂直 18m;平均货位位置取最远距离的 60%。
单循环:从巷道口到平均货位,取放货一次,返回。时间 = 2 × max(水平时间, 垂直时间) + 2 × 货叉时间。
双循环:从巷道口到货位 A(取货),再到货位 B(放货),返回。时间 = 第一段行程 + 货位 A 到货位 B 的行程 + 返回行程 + 3 次货叉动作(取、放、取或放)。
用上面的函数算一下:
# 平均货位距离 d_x_avg = 45 * 0.6 # 27m d_y_avg = 18 * 0.6 # 10.8m t_h = motion_time(d_x_avg, 2.0, 0.5) t_v = motion_time(d_y_avg, 0.8, 0.4) t_travel = max(t_h, t_v) t_fork = 6.0 # 单循环 sc = 2 * t_travel + 2 * t_fork print(f"单循环时间: {sc:.1f}s, 理论单机能力: {3600/sc:.1f} 托/小时") # 双循环:假设两个货位间距离为平均距离的 40% d_x_between = 45 * 0.4 * 0.5 # 简化估算 t_between = motion_time(d_x_between, 2.0, 0.5) dc = t_travel + t_between + t_travel + 3 * t_fork print(f"双循环时间: {dc:.1f}s, 理论单机能力: {2*3600/dc:.1f} 托/小时")按这组参数,单循环大约 50s,单机理论 72 托/小时;双循环大约 75s,单机理论 96 托/小时。注意双循环的「托/小时」是任务数,不是循环数。实际项目中任务配对率通常只有 40%~70%,所以真实能力在 80~88 托/小时之间。供应商如果直接拿双循环理论值报产能,现场大概率翻车。
3. 系统出入库能力怎么匹配:巷道数、堆垛机数与峰值流量的关系
3.1 从单机节拍到系统能力:别忽略 WMS 和输送线的节拍
堆垛机不是孤岛。一托货从入库口到货位,要经过输送线、提升机、P&D 站台、堆垛机;出库反向同理。系统出入库能力是这条链上最慢环节决定的,不是堆垛机单机能力乘以台数。
常见做法是画一张「节拍链」表,把每个环节的节拍列出来,找瓶颈。比如:
| 环节 | 单次节拍 | 并行数 | 折算能力(托/小时) |
|---|---|---|---|
| 入库输送线 | 12s | 1 | 300 |
| 提升机 | 20s | 1 | 180 |
| P&D 站台 | 15s | 2 | 480 |
| 堆垛机 | 50s | 4 | 288 |
| 出库输送线 | 10s | 1 | 360 |
这张表里提升机是瓶颈,系统能力被压到 180 托/小时,堆垛机再多也没用。我一般会先算单巷道能力,再乘以巷道数,但前提是 WMS 的任务分配逻辑能均衡各巷道负载。如果 WMS 按「就近原则」派任务,热门货位所在巷道会过载,其他巷道闲置,系统实际能力可能只有理论值的 60%。
3.2 峰值流量与平均流量的比值:设计时留多少余量
立库设计最容易被忽略的是「峰值系数」。平均出入库能力 200 托/小时,不代表峰值 200 托/小时就能扛住。电商仓的峰值系数通常 1.5~2.5,制造业原料库 1.2~1.5,成品库 1.3~1.8。
我一般按这个流程定巷道数:
- 统计历史出入库数据,取 95 分位的小时流量作为设计峰值。
- 用单机双循环能力乘以配对率修正,得到单巷道实际能力。
- 设计峰值除以单巷道实际能力,向上取整得到巷道数。
- 再按平均流量反算堆垛机利用率,低于 60% 说明选型偏大,高于 85% 说明没有余量。
def estimate_aisles(peak_flow, avg_flow, single_cycle_capacity, pairing_rate=0.6): """ 估算所需巷道数 peak_flow: 设计峰值流量 (托/小时) avg_flow: 平均流量 (托/小时) single_cycle_capacity: 单机单循环理论能力 (托/小时) pairing_rate: 双循环配对率 """ # 双循环能力 = 单循环能力 * (1 + 配对率) dual_capacity = single_cycle_capacity * (1 + pairing_rate) # 实际能力打 0.85 折(考虑任务等待、故障、维护) actual_capacity = dual_capacity * 0.85 aisles = int(peak_flow / actual_capacity) + 1 utilization = avg_flow / (aisles * actual_capacity) return aisles, actual_capacity, utilization aisles, cap, util = estimate_aisles(300, 180, 72, 0.6) print(f"建议巷道数: {aisles}, 单巷道实际能力: {cap:.1f}, 平均利用率: {util:.1%}")参数说明:pairing_rate是双循环配对率,取决于 WMS 的任务队列深度,队列越深配对率越高,一般取 0.5~0.7。0.85是可用率折扣,包含故障、换班、任务等待。这个折扣不是拍脑袋,是从多个项目的历史 OEE 数据里反推的,新手可以直接用,熟手可以根据自己项目的维护水平调整到 0.8~0.9。
3.3 输送线和提升机的节拍匹配:最容易被低估的瓶颈
堆垛机算得再准,输送线跟不上也是白搭。输送线节拍取决于托盘间距、输送速度和积放逻辑。常见链式输送机速度 12~18m/min,托盘间距 1.2m,理论节拍 4~6s,但实际因为积放、合流、分流,有效节拍往往 10~15s。
提升机是另一个隐形瓶颈。往复式提升机单次循环包括「接货 + 提升 + 卸货 + 返回」,通常 15~25s。如果提升机同时服务多层,节拍还要乘以层数。我见过一个项目,堆垛机能力 90 托/小时,提升机只有 120 托/小时,但提升机要服务 4 层,实际每层只有 30 托/小时,系统能力被压到 30。
提示:算系统能力时,先把所有环节的节拍列成表,找最小值,再回头看堆垛机选型是否合理。不要先定堆垛机再补输送线。
4. 避坑与排查:节拍核算里最常见的五个翻车点
4.1 现象:仿真跑 120 托/小时,现场只有 80
原因:仿真用的货位分布是均匀随机,实际出入库集中在热门 SKU 所在区域,堆垛机频繁短距离移动,加减速占比高,匀速段跑不起来。另外仿真忽略了货叉伸缩的等待时间和 WMS 任务下发延迟。
解决:仿真时按 ABC 分类设置货位访问频率,A 类货位放在巷道口附近,但访问频率设为 B 类的 3~5 倍。WMS 任务下发延迟按 1~3s 计入。如果仿真软件不支持非均匀分布,手动在 Excel 里按区域加权算平均行程。
4.2 现象:双循环配对率设 0.8,实际只有 0.4
原因:配对率取决于同一巷道内同时有入库和出库任务。如果 WMS 按「先到先服务」派任务,入库和出库任务往往不在同一巷道,配对率自然低。
解决:在 WMS 里加一条「同巷道配对优先」规则,或者设置任务缓冲池,等同一巷道凑齐一对再下发。代价是任务等待时间增加,需要权衡。我一般建议配对率按 0.5~0.6 设计,留余量。
4.3 现象:堆垛机水平速度标称 180m/min,实际跑不到
原因:标称速度是空载最高速,满载时为了防摇摆会降速,通常打 7~8 折。另外加减速距离不够时,根本到不了最高速。
解决:向供应商要「满载速度曲线」和「不同距离下的实测节拍表」,不要只看样本册。自己用 2.2 节的函数复算,如果供应商给的数据和复算差 20% 以上,要求现场实测。
4.4 现象:货叉伸缩时间按 4s 算,实际 8s 以上
原因:单伸位和双伸位货叉时间差一倍,双伸位还要考虑货叉先后伸出的顺序。另外货叉伸缩有加减速,不是匀速。
解决:单伸位按 5~7s,双伸位按 8~12s,具体看载重和货叉类型。如果供应商给的是「理论最快值」,加 30% 余量。
4.5 现象:系统能力达标,但订单履约率不达标
原因:出入库能力是「吞吐量」,订单履约还取决于「排序」和「齐套」。出库任务可能因为某个 SKU 在另一个巷道而等待,堆垛机空闲但订单出不来。
解决:把「巷道间协同」纳入考核,WMS 要有跨巷道任务合并逻辑。如果订单需要多个巷道的货,要么串行等待,要么用输送线合流。这部分超出堆垛机节拍范畴,但做方案时必须一起考虑。
5. 把节拍表做成可复算的工具:一个 Excel 加 Python 的混合工作流
5.1 用 Python 生成参数化节拍表,Excel 只做展示
我习惯用 Python 做计算内核,Excel 做参数输入和结果展示。这样改参数不用改公式,也不怕 Excel 公式被误删。下面是一个最小可用的脚本框架:
import json def build_cycle_table(params): """ 根据参数生成节拍表 params: 包含堆垛机参数、货位分布、任务配比的字典 """ results = [] for aisle in params["aisles"]: t_h = motion_time(aisle["avg_x"], aisle["v_x"], aisle["a_x"]) t_v = motion_time(aisle["avg_y"], aisle["v_y"], aisle["a_y"]) t_travel = max(t_h, t_v) sc = 2 * t_travel + 2 * aisle["fork_time"] dc = t_travel + motion_time(aisle["between_x"], aisle["v_x"], aisle["a_x"]) + t_travel + 3 * aisle["fork_time"] actual = (sc * (1 - params["pairing_rate"]) + dc * params["pairing_rate"]) / 2 results.append({ "aisle": aisle["id"], "sc": round(sc, 1), "dc": round(dc, 1), "actual": round(actual, 1), "capacity": round(3600 / actual, 1) }) return results # 参数示例 params = { "pairing_rate": 0.6, "aisles": [ {"id": "A1", "avg_x": 27, "avg_y": 10.8, "v_x": 2.0, "a_x": 0.5, "v_y": 0.8, "a_y": 0.4, "fork_time": 6, "between_x": 9} ] } for row in build_cycle_table(params): print(row)逻辑说明:actual是按配对率加权后的平均循环时间,capacity是折算的小时能力。参数说明:between_x是双循环中两个货位之间的平均水平距离,一般取平均行程的 30%~50%。这个脚本可以直接扩展成多巷道、多层的版本,输出 JSON 或 CSV 给 Excel 用。
5.2 验证方法:用现场实测数据反推配对率和可用率
工具算出来的数字,必须用现场数据校准。我一般会做三件事:
- 从 WMS 导出连续 7 天的任务记录,包含任务下发时间、开始时间、完成时间、巷道号、任务类型。
- 按小时统计每个巷道的实际完成托数,和工具算的理论值对比。
- 反推两个系数:实际配对率 = 双循环任务数 / 总循环数;可用率 = 实际完成托数 / 理论完成托数。
如果可用率低于 0.75,先查故障记录和换班记录;如果配对率低于 0.4,查 WMS 任务分配逻辑。这两个系数校准后,工具算出来的数字才能用于方案评审。
5.3 一个具体技巧:用「等效距离」简化多货位计算
实际货位有几千个,逐个算不现实。我一般用「等效距离」:把所有货位按访问频率加权,算出一个平均行程距离。如果货位分布是均匀的,等效距离约等于最大距离的 0.5~0.6 倍;如果 A 类货位集中在巷道口,等效距离可能只有 0.3 倍。
这个技巧的代价是精度,但对方案阶段的快速估算足够。到了详细设计阶段,再用仿真软件跑真实货位分布。我自己的习惯是:方案阶段用等效距离 + Python 脚本,10 分钟出结果;详细设计阶段用仿真,但仿真参数必须用现场数据校准过。
注意:等效距离法不适用于「货位访问频率极端不均」的场景,比如 A 类货位占 10% 但访问量占 70%。这种情况直接用仿真,或者手动分区域加权。
最后说一个我踩过的坑:曾经按供应商给的「双循环理论值」报了产能,现场验收时差了 25%,被甲方追着整改了两个月。后来我养成了一个习惯——任何产能数字,先问三个问题:单循环还是双循环?配对率多少?可用率折扣多少?这三个数对不上,数字再漂亮也不信。希望帮到你。
本文还有配套的精品资源,点击获取