本文以 EMS(Escort Memory Systems)的 RFID 射频识别读写器 LRP830为例,分别介绍了可编程控制器及微机与 RFID 射频识别读写器进行串行通讯,从而读取标识数据的具体实现方法:PLC 通过串行 I/O 通讯协议与 RFID 读写器实现串行通讯,PC 通过 Windows多线程技术与 RFID 读写器实现串行通讯文中给出了实例RFID 射频识别在我国的应用才刚刚开始,前景非常广阔本文所述方法具有一定代表性,对于推动 RFID 射频识别技术在工业自动化等领域的应用,具有一定的积极意义RFID 射频识别系统简介RFID 的全称是 Radio Frequency Identification,即射频识别 ,它利用无线电射频实现可编程控制器(PLC)或微机(PC )与标识间的数据传输, 从而实现非接触式目标识别与跟踪一个典型的 RFID 射频识别系统包括四部分:标识、天线、控制器和主机(PLC 或 PC) ,系统结构图见图1图1 RFID 射频识别系统结构图标识一般固定在跟踪识别对象上,如托盘、货架、小车、集装箱,在标识中可以存储一定字节的数据,用于记录识别对象的重要信息。
当标识随识别对象移动时,标识就成为一个移动的数据载体以 RFID 在计算机组装线上的应用为例,标识中可以记录机箱的类型(立式还是卧式) 、所需配件及型号(主板、硬盘、CD-ROM 等) 、需要完成的工序等又如在邮包的自动分拣和跟踪应用中,可以在标识中存储邮包的始发地、目的地、路由等信息天线的作用是通过无线电磁波从标识中读数据或写数据到标识中天线形状大小各异,大的可以做成货仓出口的门或通道,小的可以小到1mm控制器用于控制天线与 PLC 或 PC 间的数据通信,有的控制器还带有数字量输入输出,可以直接用于控制控制器与天线合称读写器PLC 或 PC 根据读写器捕捉到的标识中的数据完成相应的过程控制,或进行数据分析、显示和存储本文即以具有代表性的美国 EMS(Escort Memory Systems)公司的13.56MHz 无源 RFID 射频识别读写器 LRP830为例,介绍了 PLC 及 PC 与 RFID 读写器进行串行通讯,从而获取标识数据,用于控制或数据处理的具体实现方法RFID 射频识别读写器的命令集及串行通讯协议以 LRP830读写器为例,LRP830是 EMS 13.56MHz 无源系列射频读写器中的一种,它的标识和天线可以在水下或高温腐蚀环境中正常工作,可以一次读写99个标识,最大读写距离63.5cm。
它带有两个串口,一个 DeviceNet 接口,4个 DI 隔离输入,4个 DI 隔离输出,保护等级 IP66,NEMA4封装,非常适合于在工业自动化中应用LRP830读写器上的串口是合在一起的,通过专用电缆可以分接出 COM1和 COM2两个串口,两个串口作用不同,COM1用作通讯口,从 PLC 或 PC 接收命令并返回响应数据, 可以配置为 RS232、RS422或 DeviceNet 接口COM2用于配置系统参数(如读写模式、波特率等)或下载系统升级程序LRP830可以与所有 EMS 的 FastTrackTM 系列无源标识结合使用,每个标识中可以存储48个字节的数据,另外还有8个字节用于存储只读的唯一的序列号(出厂前由厂方设定) LRP830提供了单标识读写命令集(见表1) ,多标识读写命令与此类似表1 单标识命令集RFID 读写器与 PC 串行通讯仍以 EMS RFID 读写器 LRP830为例与 PC 机相连时,LRP830的 COM1/COM2与 PC 机的9针串口COM1/COM2的连接对应关系见表4表4 LRP830的串口与 PC 串口连接对应关系在 PC 机上开发串口通讯程序,可以使用现有的通讯控件(如 VB 的 Mscomm) ,也可以使用高级编程语言结合 Windows API 实现。
本文用 Delphi 6在 Windows2000环境中,应用多线程技术实现了 PC 与 RFID 读写器间的串行通信使用 Delphi 的优点是,Delphi 对许多 Windows 底层 API 函数作了封装,简化了程序代码使用多线程的优点是,程序编写比较灵活,而且串口监听线程不影响主线程其它任务的执行程序结构框图见图4图4 PC 与 RFID 读写器串行通信程序框图在具体实现上述思路时,要注意以下技术细节:1) 根据 RFID 读写器通讯协议的特点,读写器每执行一个主机发来的指令,无论是读标识还是写标识,都会返回一定字节的响应数据,用以确认命令已执行或返回标识中存储的数据因此,主机读或写标识数据都需要先写(串口命令)后读(返回的串口数据) 2) 为了使程序体现模块化的设计思想,易于调试和维护,可以把各种 RFID 命令预先存入命令数组中,而把主机对 RFID 串口的命令和捕捉 RFID 读写器命令响应编制成单独的子程序,在调用它之前,先调用命令字赋值子程序3) 对主线程的说明:在主线程中用 CreateFile 函数建立串口事件,设置缓冲区和通信参数,创建串口监听线程用 WriteFile 写串口函数完成通过 RFID 读写器写数据到标识中。
部分程序如下:hcom := CreateFile(pchar(Whichcom), GENERIC_WRITE Or GENERIC_READ,0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); //产生串口事件setupcomm(hcom,TOTALBYTES,TOTALBYTES); //设置缓冲区getcommstate(hcom,lpdcb);lpdcb.BaudRate:=BAUDRATE; //波特率lpdcb.StopBits := STOPBIT; //停止位lpdcb.ByteSize := BYTESIZE; //每字节有几位lpdcb.Parity :=PARITY; //奇偶校验setcommstate(hcom,lpdcb); //设置串口Mycomm := Tcomm2.Create(False); //创建串口监听线程WriteFile(hcom, WriteBuffer,sizeof(WriteBuffer),lpBytesSent, 0);//写标识命令……4) 对串口监听线程的说明:程序中用到的方法主要有 Synchronize 和 Terminate。
Synchronize 是 Delphi 提供的一种安全调用线程的方法,它把线程的调用权交给了主线程,从而避免了线程间的冲突,这是一种最简单的线程间同步的方法,可以省去用其它语言编程时需要调用的多个 Windows API 函数,例如 createEvent(创建同步事件) ,Waitforsingleobject(等待同步事件置位) ,resetevent(同步事件复位) , PostMessage(向主线程发送消息)等用 Delphi 编写多线程通讯程序的优点是显而易见的例如以下语句即可实现串口监听线程:While (not Terminated) do //如果终止属性不为真BegindwEvtMask:=0;Wait := WaitCommEvent(hcom,dwevtmask,lpol); //等待串口事件if Wait ThenbeginSynchronize(DataProcessing); //同步串口事件end;end;上述程序一旦检测到串口事件,就调用 DataProcessing 方法读串口数据,并写入数组,供程序其它部分调用,另外还要检测何时退出线程,程序如下:procedure Tmainform.DataProcessing beginclear := CLEARCOMMERROR(hcom,lperrors,@comms); //清除串口错误if Clear ThenBegin //处理接收数据ReadFile(hcom,ReadBuffer,Comms.cbInQue,LPReadNumber,0);ReceBytes[I+ArrayOffset] := ReadBuffer[I];//读串口缓冲区数据并写入数组gameover := (ReceBytes[I+ArrayOffset-1]=Byte($FF)) and (ReceBytes[I+ArrayOffset]=Byte($FF)); //终止条件if gameover then terminate; //退出线程……End;End;其中,Terminate 将线程的 Terminated 属性设置为 True。
线程一旦检测到 Terminated 属性为 True,就会结束线程,去执行 Onterminate 事件,在 Onterminate 事件中对采集到的RFID 标识数据进行处理由于 RFID 读写器的 ABxS 协议的命令响应的最后两个字节都是FF,所以可以将收到连续的两个 FF 作为终止线程的条件之一程序应用举例:以持续读标识中所有48字节数据命令为例,在程序中用 WriteBuffer 数组保存该命令,对WriteBuffer 数组的各个元素赋值如下:WriteBuffer[0] := Byte($AA); WriteBuffer[1] := Byte($0D); //连续读标识命令字头WriteBuffer[2] := Byte($00); WriteBuffer[3] := Byte($00); //从第一个字节开始读WriteBuffer[4] := Byte($00); WriteBuffer[5] := Byte($30); //读48个字节数据WriteBuffer[6] := Byte($00); WriteBuffer[7] := Byte($02); //延时2秒WriteBuffer[8] := Byte($ff); WriteBuffer[9] := Byte($ff); //连续读标识命令字执行持续读标识命令后,程序以 WriteBuffer 数组写串口,RFID 读写器执行此命令,并返回响应数据(见图5) 。
图5 持续读标识命令执行结果从图5窗口中可以看到,前4个字节 AA OD FF FF 就是 LRP830读写器对持续读命令的确认信息,然后是数据报文头 AA OD 和标识中48个字节的数据(每字节数据前加00) ,最后是数据报文尾 FF FF结束语本文介绍了可编程控制器及微机与 RFID 射频识别读写器进行串行通讯,从而获取标识中的数据的具体实现方法:PLC 通过串行 I/O 通讯协议与 RFID 读写器实现串行通讯,PC 通过 Windows 多线程技术与 RFID 读写器实现串行通讯本文所述方法具有通用性,对于其它厂家的 PLC 和 RFID 系统也有一定的参考价值RFID 射频识别技术在我国工业自动化等领域的应用才刚刚开始,前景非常广阔本文对于促进该技术的推广应用具有一定的积极意义参考文献[1] ESCORT MEMORY SYSTEMS, LRP830-Series Long-Range Passive Reader/Writers Operator’s Manual, July,2000[2] Marco Cantù, Mastering Delphi 6, SYBEX Inc.(USA), 2001[3] Steve Teixeira and Xavier Pacheco,Borland Delphi™ 6 Develope。