该程序中使用事件驱动(Event-driven)的方法来接收数据,当串口接收缓冲区中有字符到达时,MsComm控件的Oncomm事件处理函数捕获到相关的通信事件,并被自动调用,在OnComm函数中加入自己的处理代码,即可把PLC中传来的数据进行处理、存储等;通过MSComm控件的SetRThreshold函数设置产生OnComm事件之前要接收的字符数,在OnComm函数中用Switch语句,即可实现对不同的响应码的不同处理。
通过定时函数和循环控制函数,周期地依次向各个PLC发送读写PLC的FINs命令码,再在OnComm函数中加入对不同PLC响应码的处理函数,就可实时地完成对PLC数据的采集。同时根据响应码的内容监视PLC的运行状态。PLC自动将检验的产品性能数据连续存入D存储区中,当存储区满时自动从头循环覆盖存放,上位机定时将PLC的D存储区的产品数据读入、处理并存人数据库。该系统中上位机1 min内可依次读完10台PLC的各自1条产品性能信息,而PLC检验完1个产品需15 min左右,故可满足相对的实时性。为保证上位机完整且不重复地读取PLC的所有产品性能数据,在各台PLC中对每种产品都定义了A,B两个存储单元,A单元存放上位机读取过的最后一条信息地址,当上位机每读完1条信息,就由上位机对此单元的内容更新;B单元存放最新的产品信息存放地址,当PLC每产生1条新信息时,就由PLC更改该单元内容;上位机在读取产品信息前,先对比A,B单元的内容,决定是否进行数据读取和读取哪个地址的数据。这样即使上位机与PLC断开一定时间后,当重新连接上,也可将以前没读到的信息读入。程序流程图如图3所示。
在上位机中向PLC发送命令码时,必须加相应的FCS校验码。该校验码是8位的二进制数转换成的2位ASCII字符。这8位数据是将1帧中校验码前所有字符的ASCII码按位连续异或的结果,转换为字符时,按照2位16进制数转换成对应的数字字符。同时,当接收到PLC自动发回的响应码时,为确保接收数据的正确性,也必须用响应码中的FCS进行校验。系统中的发送命令码、接收响应码、生成命令码和检验响应码的代码如下:
(1)发送命令码