RFID手持机多机协同盘点:任务分片、读数合并与冲突裁决
去年做全量资产盘点,三万多条记录分布在四个楼层。我们上了八台UHF手持机并行作业,第一天就翻车:同一批资产被两台机器重复上报,边界区域的漏读反而更多。这篇文章记录后续的整改过程——任务怎么分片、跨机读数怎么合并、冲突怎么裁决。
一、多机并行带来的两类新问题
多机并行不是简单地把人加几倍。并行之后暴露出两类问题,性质完全不同。
第一类是跨机重复读取。UHF的读取距离可以到数米,相邻两台机器的读取范围必然重叠,重叠区里的标签会被双方都读到,合并时如果不处理,同一条资产在报表里出现两次。
第二类是读写器碰撞,更隐蔽也更致命。多个读写器同时问询同一个标签时,无源标签没有区分不同请求的能力,会把叠加的信号当成噪声,结果是这个标签谁都没读到——表现形式是漏读,而且集中在分片边界。工程上的规避办法有两条:让读写器分时工作,或者保证设备间距大于两倍读取距离。
二、任务分片:按物理边界切,留重叠带
分片的第一原则是跟着物理边界走,而不是跟着台账的编号顺序走。按台账顺序切,同一个房间的设备可能被分到三台机器上,人员动线直接乱掉。我们最终按房间和机柜列分片,每片控制在五百条标签以内,边界处刻意保留一到两米的重叠带——宁可重复读,不要漏读,重复可以在合并阶段消除,漏读只能重跑。
每片必须能独立验收。片内跑完立刻在本机做一次完整性检查:应读条数、实读条数、去重后条数。三者对不上就当场补扫,不要攒到最后统一处理,那时人已经离场,补扫的代价要大得多。
三、会话标志:把去重交给协议
跨机重复的第一层防线不在软件,在协议。EPC Gen2的标签有四个会话标志S0到S3,标签被成功盘存后会把对应标志从A翻到B,处于B态的标签不再响应同一会话的查询。四个会话的保持时间差别很大:S0几乎立刻复位,S1维持几百毫秒到几秒,S2和S3至少两秒,可以长达数分钟。
我们的用法是:机内防重复读用S1,标签在视野里停留期间只上报一次;跨机合并时给相邻机器分配不同的会话(比如S2和S3),两台机器在重叠区各自维护独立的标志状态,互不干扰。
四、合并与冲突裁决
软件层还要再做一次合并。合并的主键用EPC加TID,避免不同资产复用同一EPC编码的情况。合并时对同一标签的多条记录做裁决,规则是先看读取次数、再看信号强度,两者都接近就进人工复核队列,不猜:
def merge(reads):
groups = group_by(reads, key=lambda r: (r.epc, r.tid))
result, review = [], []
for key, items in groups.items():
zones = {r.zone for r in items}
if len(zones) > 1:
best = max(items, key=lambda r: (r.count, r.rssi))
if best.count < 3 or best.rssi < -65:
review.append(key)
continue
result.append(best._replace(zone=best.zone))
else:
result.append(items[0])
return result, review
复核队列的规模是分片质量的晴雨表。第一轮有四百多条进了复核,检查后发现是三个分片边界划在了开放式办公区——没有物理隔断,信号到处跑。把边界改到承重墙后,第二轮降到二十几条。
五、回写与对账
合并结果回写台账时,我们用的是幂等写入:以资产编号加盘点批次为唯一键,重复提交只覆盖不新增。回写后立刻跑一次对账,差异按缺失、多出、位置不一致三类输出,其中"位置不一致"最值得看——它往往意味着资产真的被挪动过,只是没走调拨流程:
sink = LedgerAdapter("首码资产管理系统")
for batch in merged_result.batches():
diff = sink.reconcile(batch, key=("asset_no", "stocktake_id"))
report.dump(diff)
六、现场的两个坑
电量:连读模式下掉电极快,每台配两块备用电池、两小时轮换一次。第一台机器在第三小时自动关机的教训,一次就够。
网络:地下楼层和电梯厅是信号盲区,所有机器都要开离线缓存,回到有网区域自动补传。补传必须带本地时间戳,否则后传的记录会覆盖先传的结果。
结语
多机并行盘点真正的难点不在读,在合。分片决定重复和漏读的分布,会话标志决定第一层去重的效果,合并规则决定最终数据的可信度。这三件事想清楚,加机器才是真的加快进度;否则只是把混乱放大了八倍。
- 点赞
- 收藏
- 关注作者
评论(0)