基于RFID技术的物料输送系统应用研究
摘 要:针对物料输送系统的要求,提出了将RFID技术与物料输送系统相结合的设计方案。并详细设计了RFID读卡器的硬件电路,包括主要元件的选型和功能模块的介绍,特别是天线部分的相关元器件选型;完整规划了单片机软件的设计流程,其中一部分为RFID读卡器的读卡流程,另一部分为通过Modbus协议与PLC通信的过程;而PLC主站梯形图的设计主要考虑到节能和有效运输的要求。实际使用证明,整个系统运行良好,柔性较高。
关键词:射频识别;柔性制造系统;物料输送系统;可编程控制器
中图分类号:TP23 文献标志码:A 文章编号:2095-1302(2014)05-0027-03 0 引 言
随着市场竞争的日益加剧,传统制造系统少品种大批量的生产方式正逐步向柔性制造方向转变,系统的柔性对系统的生存越来越重要[1]。物料输送系统为柔性制造系统输送物料,发挥着至关重要的作用。
射频识别(Radio Frequency Identification,RFID)是一种非接触式识别技术。由于传统条形码设备的易损性和低安
全性,而RFID具有非接触性、无方向性、永久使用、对环境敏感度低[2]等特性,使得RFID技术在零售、物流、交通、图书馆智能化管理[3]等领域应用越来越广泛。RFID的工作频率分为低频段(30~300 kHz)、中高频段(3~30 MHz)和超高频与微波标签(433.92、862(902)~928 MHz,2.45GHz、5.8 GHz),同时具有多种防冲突算法[4]。 将RFID技术应用于固定安装的滚筒输送线,实时地采集生产作业中的信息,通过优化调度处理,将有效地改善整个系统的柔性。
1 RFID读卡器的硬件设计
RFID读卡器采用中频13.56 MHz的无线频率传输数据,电子标签与读卡器最远距离约为30~40 mm,可满足企业的一般保密要求。微控制器选用51系列芯片,读卡芯片为NXP Semiconductors公司最新生产的MFRC522芯片。其整体方案框图如图1所示。
综合读卡器和PLC的距离以及传输的安全和可靠,选用可长距离通信且抗干扰能力强的RS485通信介质,其使用双绞线通信时,可靠传输距离为1 km。每个读卡器都有一个拨码开关为其编号,以方便PLC主站识别RFID读卡器从站。 图1 RFID读卡器框图
天线的设计是至关重要的,其相应分立元件的参数选取和PCB布局应注意对称。总体面积的大小以及铜线的宽度等
都需要考虑[5,6]。图2所示为天线的等效电路。 图2 天线等效电路
天线的品质因子是天线设计的重要参数,其定义为: (1) 其中: (2)
式(1)中,LANT,RANT分别为天线的等效电感和电阻,可用阻抗分析仪测量。fR=13.56 MHz。带宽定义为: (3)
而定义时间带宽积必须不小于1,即: (4)
当使用Miller编码时,脉宽T=3 μs。 由(3)式和(4)式可得:Q≤fR?T=40.68。 取Q=35。为降低品质因子Q,需添加一外部电阻: 为了将输入阻抗Z匹配到50 Ω,需串联电容CS和并联电容CP。其中:
2 RFID读卡器的软件设计
图3所示是RFID读卡器的软件设计流程图。其中单片机上电初始化主要包括配置串口和MFRC522芯片的内部寄存器。当电子标签进入读卡器的寻卡范围内,MFRC522芯片通过天线与电子标签经过一系列的握手识别并建立通信[7]。由于周围环境的电磁干扰,会导致多次读出的序列号不
一致,可通过软件滤波来解决,即通过多次读取来比较处理。 图3 RFID读卡器软件设计流程 读卡程序部分源代码如下: void read_card(void) {
RC522Ready(); //配置相关参数
M500PcdConfigISOType('A'); //配置卡片类型 //为A卡
Card_type=unknowncard; success=0;
card_req=ComRequestA(); //有无卡请求? if(card_req) //有请求 {
unsigned char i; flag=1;
ComAnticoll(); //防冲突 RFID_Buffer[0]=Card_SN[0]; RFID_Buffer[1]=Card_SN[1]; RFID_Buffer[2]=Card_SN[2]; RFID_Buffer[3]=Card_SN[3]; success=0;
for(i=0;i<20;i++) //多次比较判断
{
ComAnticoll();
if((RFID_Buffer[0]==Card_SN[0]) &&(RFID_Buffer[1]==Card_SN[1]) &&(RFID_Buffer[2]==Card_SN[2]) &&(RFID_Buffer[3]==Card_SN[3])) {
success++;
RFID_Buffer[0]=Card_SN[0]; RFID_Buffer[1]=Card_SN[1]; RFID_Buffer[2]=Card_SN[2]; RFID_Buffer[3]=Card_SN[3]; }
else break; }
if((Card_type!=unknowncard)&&(success>18)) //滤波 {
RFID_Buffer1[0]= RFID_Buffer[0]; RFID_Buffer1[1]= RFID_Buffer[1]; RFID_Buffer1[2]= RFID_Buffer[2]; RFID_Buffer1[3]= RFID_Buffer[3];