PLC及PC与RFID射频识别读写器串行通讯的实现
在具体实现上述思路时,要注意以下技术细节:
本文引用地址:http://www.amcfsurvey.com/article/87674.htm1) 根据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 //如果终止属性不为真
Begin
dwEvtMask:=0;
Wait := WaitCommEvent(hcom,dwevtmask,lpol); //等待串口事件
if Wait Then
begin
Synchronize(DataProcessing); //同步串口事件
end;
end;
上述程序一旦检测到串口事件,就调用DataProcessing方法读串口数据,并写入数组,供程序其它部分调用,另外还要检测何时退出线程,程序如下:
procedure Tmainform.DataProcessing
begin
clear := CLEARCOMMERROR(hcom,lperrors,@comms); //清除串口错误
if Clear Then
Begin //处理接收数据
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。
5 结束语
本文介绍了可编程控制器及微机与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 Developer’s Guide, Sams Publishing(USA),2002
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论