4.2.2 软件握手的实现
在进行DNC加工时必须进行流量控制,以防止PC机串口发送超速而造成数控系统的溢出报警,此处采用软件握手来实现对流量的控制。其设计方法是在发送循环中加入DoLoop循环结构,通过不断读取输入缓冲区并查找是否收到数控系统发来的暂停发送(13H)或恢复发送信号(11H)来决定是否继续发送数据,该循环结构的程序代码如下:
Do
bufwait:Comml.Input‘读取输人缓冲区
If InStr(bufwait,Chr$(&H13))>0Then
wait=True
End If‘判断是否暂停发送
If InStr(bufwait,Chr$(&H11))>0Then
wait=False
End If‘判断是否收恢复发送
DoEvents‘先将控制权交给Windows
Loop While wait=True‘
以上程序代码中必须事先定义bufwait为字符串变量,wait为布尔型变量。
4.2.3 检查输出缓冲区
在通过串口发送一个程序段之前还必须检查输出缓冲区中是否有未发送完的字节,否则可能会使得输出缓冲区中不断堆积新的数据而导致溢出。实现以上功能的设计方法是在软件握手的功能后加入一个DoLoop循环结构,通过不断检查MSComm控件中的OutBufferCount属性是否为0来决定是否继续发送数据,该循环结构的程序代码如下:
Do
outcount=Comml.OutBufferCount‘读取输出缓冲区的字节数
If outcount=0 Then
sendempty=False
Else
sendempty=True
End If‘判断是否是零字节
读取输出缓
DoEvents‘先将控制权交给Windows
Loop While sendempty=True
以上程序代码中必须事先定义outcount为整形变量,sendempty为布尔型变量。
4.2.4 检查文件发送或接收是否结束
在发送文件的过程中要想知道是否发送结束可以检查FOR循环的当前循环次数是否为总循环次数,但是在接收文件的过程中因为事先并不知道数控系统发送的程序有多大,因此必须采用其它方法来解决该问题。
FANUC数控系统对程序传输的通信协议做了如下规定:程序的开头和结尾必须采用“%”来表示程序传输的开始和结束。因此要想知道程序是否发送或接收完毕可以通过查找程序中的“%”这一字符来实现,在文件发送循环中实现该功能的程序代码如下:
j=InStr(buf,“%”)‘返回发送数据中“%”字符的地址
If j>0 Then
counter=counter+1‘对“%”字符计数
If times=1 Then
j=j+1
If InStr(j,bur,“%”)>0 Then
counter=counter+1
End If
End If‘对总发送次数为1的情况作“%”字符的2次检查
End If‘检查文件是否发送结束
If counter=2 Then
msgvalue=MsgBox(“传输完毕”,vbOKOnly+vbInformation,“消息”)
If msgvalue=vbOK Then
Frame3.Enabled=True
Comm1.PortOpen=False‘关闭串口,结束发送过程
ProgressBar1.Visible=False
Label1.Visible=False
Command1.Enabled=True
Commanc3.Enabled=True
Command4.Enabled=True
End If
Exit Sub
End If
以上程序代码中必须事先定义buf为字符串变量,j、counter、times和msgvalue为整形变量。设计中还考虑到了如果发送的程序过短(总发送次数times变量为1),可能在发送的字符串变量buf中存在2个“%”字符,因此对于该情况必须在查找到第一个“%”之后对剩余的字符串再查找一次,以确定是否还有第二个“%”字符。如果找到2个“%”字符(计数器变量counter为2),则提示用户程序传输完毕。检查接收文件是否结束的程序代码与检查发送文件是否结束的程序代码类似,在此不再赘述。
4.2.5 文件接收的自动化
当接收程序处于等待状态时,在操作人员按下数控系统的发送程序按键后,该软件的文件接收过程即自动开始。为了实现文件接收过程的自动化,应使用MSComm控件的OnComm过程来处理数据的接收。在通信参数初始化中应设置MSComm控件的RThreshold属性为1,以保证串口一旦接收到字符即引发OnComm过程接收数据并对收到的数据进行处理。为方便将来数据的处理,在OnComm过程中应使用字节型数组以二进制方式接收并暂存数据,实现该功能的部分程序代码如下:
Select Case Comm1.CommEvent
Case comEvReceive‘判断串口是否收到数据
slen=Comm1.InBufferCount‘读取输入缓冲区收到的字节数
Comm1.InputLen=slen‘设置读取字节长度为收到的字节数
ReDimbytlnput(slen)‘重新定义字节数组的长度
tmp=Comm1.Input
bytInput=tmp‘读取输入缓冲区数据至字节数组
processdata‘调用数据处理函数
以上程序代码中必须事先定义slen为整形变量,tmp为变体型变量,bytInput()为字节型数组。processdata为数据处理函数,该函数的功能为过滤无需显示的字符并将数据在RichTextBox控件的文本框中显示。
5 结束语
本文作者在介绍PC机与数控系统进行串行通信时其硬件连接要求和数控系统的通信参数设置方法的基础上,利用VB6.0软件实现了DNC加工状态下的程序发送和程序接收备份功能。该软件在FANUC 0iMATE-MC数控上经过测试,运行正常。同时该软件提供了丰富的通信参数选项,因此在其它型号的FANUC数控系统上或通信协议相同的其它厂商的数控系统上均能正常运行,这大大提高了该软件的通用性。