项目介绍:根据这么多年的IT经验,需求通过与用户沟通发现的,机会也是这样出来的。仓库的小伙子跟我倒苦水,动不动实物盘点,几千颗物料,都忙疯了,而且,新的物料一入库,作为公司的标准流程,现有的旧物料都需要盘点一遍。
公司的流程定义没有问题,但是真正的落实确实难度比较大,总不能一直不断的加人来解决这个问题吧?那肯定不行,而且现在经济形势不好,也不是说加就加的。
分析:作为供应链部门考量的一个重点,账面与实物匹配至关重要,一方面可以准确的支持生产,另一方面也是涉及物品安全。那么,怎么才能够既又呢? 既保障数据正确,又减去一线员工的工作强度。这是一个问题。
于是,我考虑到了RFID,这个技术应该将比条码要上了一个台阶。传统的条码扫描需要人员手工一个个对准条码扫描。RFID技术只要在附件就可以感应,实现快速扫描。
对于RFID的介绍,这里我不再介绍,网上搜索一下,相关的资料很多。
说干就干,在了解了相关的技术后,找供应商借了RFID设备,这里我们选用了UHF高频设备,型号为深圳成为Chainway UR4,
UHF一般有三个工作模式,主动式,被动式,触发式,功能强大,根据我们的需求,我涉及的定时扫描仓库物品,采用的是被动式,也就是下图所说的命令工作模式。这个模式就是定时的扫描固定区域,采集这个区域的所有标签。
拿到设备后,供应商提供了一些SDK和Demo,这里的Demo主要有C#和Java的,当然也有安卓studio的。移动端现在基本上安卓偏多。供应商也封装了C# dll, 自行开发的话用C#还是比较方便的。
这款UHF支持串口和有线网口,在设备管理领域,Python是最擅长的,笔者决定通过Python来与UHF设备互动。翻遍了供应商提供的开发包,没找到现成的Python实例,只能自己干了。
目前看来,有两个思路,1. 通过python 调用C# dll。2. Python 直接通过Socket发送通讯协议然后等待获取返回值。把这几个思路跟业内几个资深大拿稽工,朱工交流了一遍,他们都是在开发领域浸淫多年,骨灰级开发者,一致认为没有必要绕弯子,直接Python开干。这样做还有一个好处,Python调用Socket是通用方法,对于其他类似设备(不限于UHF)都是通用的,一般通过网络调试助手调试的设备,也是可以通过Python Socket来实现的。
采用第二种方式,直接一点说就是不断的收发操作,要发送指令,肯定要有通讯协议,幸运的是,供应商非常配合的提供了ISO18000-6C的通讯协议,有了这个,直接发送就是了。当然,如有没有通讯协议,那可能就需要通过抓包工具实现了,方法总是有的,可能就是实现方式上面复杂一点。
整个盘点流程设计:
今天我们这边重点记录如何实现采集指定区域内的标签,步骤如下:
1. 硬件准备UHF,需要安装到指定区域,这款设备最多支持4根天线,这里我只用了1根天线,最大的感应区域大约为20米,因尚未大规模测试,我预计10米左右无遮挡肯定没问题。另外,RFID因功率较大,不建议走POE方式,建议单独供电。
2. 设备安装完成后,配置IP,注意,需要重启后生效,通过Ping命令看看是否成功。修改IP也需要通过供应商提供的Demo工具连上操作,这些都可以在供应商提供的操作手册中找到。
3. Python + Socket 代码实现:
import socket
import binascii
import time
s=socket.socket() #创建socket对象
host='10.202.*.*' #UHF设备IP
port=8888 #指定端口号
send_data_start=b"\xC8\x8C\x00\x0A\x82\x27\x10\xBF\x0D\x0A" #采集启动代码
send_data_stop=b"\xC8\x8C\x00\x08\x8C\x84\x0D\x0A" #停止采集
data=b''
timestamp1=time.time() #获取当前时间戳
time_limit=10
#处理获取的数据
def convert_to_list(source):
EPC=[]
result=source.split("c88c")
for line in result:
line=line[10:34]
EPC.append(line)
print("去重前EPC标签编号:"+str(len(EPC)))
result2=list(set(EPC))
del(result2[0])
print("去重后EPC标签编号:",result2)
return result2
try:
s.connect((host,port)) #设备连接
print("设备连接成功")
s.send(send_data_start) #发送代码
while True:
recvData=s.recv(1024) #接收返回的数据
m=int(time.time()-timestamp1) #获取当前时间戳
print("计时:"+str(m))
if m>time_limit: #到达指定计时后停止接收,跳出循环
break
data+=recvData
s.send(send_data_stop) #发送停止指令
recvStop=s.recv(1024)
response_stop=binascii.hexlify(recvStop).decode("utf-8") #转换为16进制
print("停止位发送状态:"+response_stop)
s.close()
response_hex=binascii.hexlify(recvData).decode("utf-8")
print(response_hex)
print(type(response_hex))
print(type(recvData))
print(len(response_hex))
response_hex2=binascii.hexlify(data).decode("utf-8")
result=convert_to_list(response_hex2)
print("数据接收总EPC数量:"+str(len(result)))
except Exception as e:
print("错误:",str(e))
s.close()
代码说明:设计的步骤是连上UHF设备,发送采集命令,等待10秒后,停止采集。
与官方Demo测试对比结果如下图:
对比起来,获取的标签数量差别不大,基本上没有问题。
小结:
万里长征第一步,RFID有很多功能还等待挖掘,先把第一步迈出来。无比期待把这个功能整合到MRO物料管理中。目前来看,RFID是智能仓储的基石,也是IT向智能化供应链管理迈出的重要一步。