关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > PLC及PC与RFID射频识别读写器串行通讯的实现

PLC及PC与RFID射频识别读写器串行通讯的实现

作者:王宏时间:2008-09-03来源:中国传动网收藏

  在具体实现上述思路时,要注意以下技术细节:

本文引用地址:http://www.amcfsurvey.com/article/87674.htm

  1) 根据读写器通讯协议的特点,读写器每执行一个主机发来的指令,无论是读标识还是写标识,都会返回一定字节的响应数据,用以确认命令已执行或返回标识中存储的数据。因此,主机读或写标识数据都需要先写(串口命令)后读(返回的串口数据)。

  2) 为了使程序体现模块化的设计思想,易于调试和维护,可以把各种命令预先存入命令数组中,而把主机对串口的命令和捕捉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

数字通信相关文章:数字通信原理


通信相关文章:通信原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭